diff --git a/dialects/sqlite/schema.go b/dialects/sqlite/schema.go index 7a622133..1b120d0e 100644 --- a/dialects/sqlite/schema.go +++ b/dialects/sqlite/schema.go @@ -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 }