Refactor sqlite schema
This commit is contained in:
		
							parent
							
								
									0ec761558c
								
							
						
					
					
						commit
						1d6ee71300
					
				@ -1,7 +1,7 @@
 | 
			
		||||
package sqlite
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"strings"
 | 
			
		||||
	"fmt"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// AutoMigrate auto migrate database
 | 
			
		||||
@ -18,30 +18,65 @@ func (dialect *Dialect) AutoMigrate(value interface{}) (err error) {
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// HasTable check if has table in current schema
 | 
			
		||||
func (dialect *Dialect) HasTable(tableName string) bool {
 | 
			
		||||
	var count int
 | 
			
		||||
	currentDatabase, tableName := currentDatabaseAndTable(dialect, tableName)
 | 
			
		||||
	_ = dialect.DB.QueryRow("SELECT count(*) FROM INFORMATION_SCHEMA.TABLES WHERE table_schema = ? AND table_name = ?", currentDatabase, tableName).Scan(&count)
 | 
			
		||||
	return count > 0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// CreateTable create table for value
 | 
			
		||||
func (dialect *Dialect) CreateTable(value interface{}) error {
 | 
			
		||||
	// s := schema.Parse(value)
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// CurrentDatabase get current database name
 | 
			
		||||
func (dialect *Dialect) CurrentDatabase() (name string) {
 | 
			
		||||
	_ = dialect.DB.QueryRow("SELECT DATABASE()").Scan(&name)
 | 
			
		||||
	return
 | 
			
		||||
// HasTable check if has table
 | 
			
		||||
func (dialect *Dialect) HasTable(tableName string) bool {
 | 
			
		||||
	var count int
 | 
			
		||||
	_ = dialect.DB.QueryRow("SELECT count(*) FROM sqlite_master WHERE type='table' AND name=?", tableName).Scan(&count)
 | 
			
		||||
	return count > 0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func currentDatabaseAndTable(dialect *Dialect, tableName string) (string, string) {
 | 
			
		||||
	if strings.Contains(tableName, ".") {
 | 
			
		||||
		splitStrings := strings.SplitN(tableName, ".", 2)
 | 
			
		||||
		return splitStrings[0], splitStrings[1]
 | 
			
		||||
	}
 | 
			
		||||
	return dialect.CurrentDatabase(), tableName
 | 
			
		||||
// HasColumn check if has column in table
 | 
			
		||||
func (dialect *Dialect) HasColumn(tableName string, columnName string) bool {
 | 
			
		||||
	var count int
 | 
			
		||||
	_ = dialect.DB.QueryRow(fmt.Sprintf("SELECT count(*) FROM sqlite_master WHERE tbl_name = ? AND (sql LIKE '%%\"%v\" %%' OR sql LIKE '%%%v %%');\n", columnName, columnName), tableName).Scan(&count)
 | 
			
		||||
	return count > 0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// HasIndex check if has index in table
 | 
			
		||||
func (dialect *Dialect) HasIndex(tableName string, indexName string) bool {
 | 
			
		||||
	var count int
 | 
			
		||||
	_ = dialect.DB.QueryRow(fmt.Sprintf("SELECT count(*) FROM sqlite_master WHERE tbl_name = ? AND sql LIKE '%%INDEX %v ON%%'", indexName), tableName).Scan(&count)
 | 
			
		||||
	return count > 0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// HasForeignKey check if has foreign key in table
 | 
			
		||||
func (dialect *Dialect) HasForeignKey(tableName string, foreignKeyName string) bool {
 | 
			
		||||
	return false
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// RemoveIndex remove index from table
 | 
			
		||||
func (dialect *Dialect) RemoveIndex(tableName string, indexName string) error {
 | 
			
		||||
	_, err := dialect.DB.Exec(fmt.Sprintf("DROP INDEX %v", indexName))
 | 
			
		||||
	return err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ModifyColumn modify column
 | 
			
		||||
func (dialect *Dialect) ModifyColumn(tableName string, columnName string, typ string) error {
 | 
			
		||||
	_, err := dialect.DB.Exec(fmt.Sprintf("ALTER TABLE %v ALTER COLUMN %v TYPE %v", tableName, columnName, typ))
 | 
			
		||||
	return err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// CurrentDatabase get current database name
 | 
			
		||||
func (dialect *Dialect) CurrentDatabase() (name string) {
 | 
			
		||||
	var (
 | 
			
		||||
		ifaces   = make([]interface{}, 3)
 | 
			
		||||
		pointers = make([]*string, 3)
 | 
			
		||||
		i        int
 | 
			
		||||
	)
 | 
			
		||||
	for i = 0; i < 3; i++ {
 | 
			
		||||
		ifaces[i] = &pointers[i]
 | 
			
		||||
	}
 | 
			
		||||
	if err := dialect.DB.QueryRow("PRAGMA database_list").Scan(ifaces...); err != nil {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	if pointers[1] != nil {
 | 
			
		||||
		name = *pointers[1]
 | 
			
		||||
	}
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user