github.com/RevenueMonster/sqlike@v1.0.6/sql/dialect/dialect.go (about) 1 package dialect 2 3 import ( 4 "reflect" 5 "strings" 6 "sync" 7 8 "github.com/RevenueMonster/sqlike/reflext" 9 "github.com/RevenueMonster/sqlike/sql" 10 "github.com/RevenueMonster/sqlike/sql/codec" 11 "github.com/RevenueMonster/sqlike/sql/driver" 12 sqlstmt "github.com/RevenueMonster/sqlike/sql/stmt" 13 "github.com/RevenueMonster/sqlike/sql/util" 14 "github.com/RevenueMonster/sqlike/sqlike/actions" 15 "github.com/RevenueMonster/sqlike/sqlike/indexes" 16 "github.com/RevenueMonster/sqlike/sqlike/options" 17 ) 18 19 // SQLDialect : 20 type SQLDialect interface { 21 TableName(db, table string) string 22 Var(i int) string 23 Quote(n string) string 24 Format(v interface{}) (val string) 25 } 26 27 // Dialect : 28 type Dialect interface { 29 SQLDialect 30 Connect(opt *options.ConnectOptions) (connStr string) 31 UseDatabase(stmt sqlstmt.Stmt, db string) 32 GetVersion(stmt sqlstmt.Stmt) 33 GetDatabases(stmt sqlstmt.Stmt) 34 CreateDatabase(stmt sqlstmt.Stmt, db string, checkExists bool) 35 DropDatabase(stmt sqlstmt.Stmt, db string, checkExists bool) 36 HasTable(stmt sqlstmt.Stmt, db, table string) 37 HasPrimaryKey(stmt sqlstmt.Stmt, db, table string) 38 RenameTable(stmt sqlstmt.Stmt, db, oldName, newName string) 39 RenameColumn(stmt sqlstmt.Stmt, db, table, oldColName, newColName string) 40 DropColumn(stmt sqlstmt.Stmt, db, table, column string) 41 DropTable(stmt sqlstmt.Stmt, db, table string, checkExists bool) 42 TruncateTable(stmt sqlstmt.Stmt, db, table string) 43 GetColumns(stmt sqlstmt.Stmt, db, table string) 44 HasIndexByName(stmt sqlstmt.Stmt, db, table, indexName string) 45 HasIndex(stmt sqlstmt.Stmt, dbName, table string, idx indexes.Index) 46 GetIndexes(stmt sqlstmt.Stmt, db, table string) 47 CreateIndexes(stmt sqlstmt.Stmt, db, table string, idxs []indexes.Index, supportDesc bool) 48 DropIndexes(stmt sqlstmt.Stmt, db, table string, idxs []string) 49 CreateTable(stmt sqlstmt.Stmt, db, table, pk string, info driver.Info, fields []reflext.StructFielder) (err error) 50 AlterTable(stmt sqlstmt.Stmt, db, table, pk string, hasPk bool, info driver.Info, fields []reflext.StructFielder, columns util.StringSlice, indexes util.StringSlice, unsafe bool) (err error) 51 InsertInto(stmt sqlstmt.Stmt, db, table, pk string, mapper reflext.StructMapper, codec codec.Codecer, fields []reflext.StructFielder, values reflect.Value, opts *options.InsertOptions) (err error) 52 Select(stmt sqlstmt.Stmt, act *actions.FindActions, mode options.LockMode) (err error) 53 Update(stmt sqlstmt.Stmt, act *actions.UpdateActions) (err error) 54 Delete(stmt sqlstmt.Stmt, act *actions.DeleteActions) (err error) 55 SelectStmt(stmt sqlstmt.Stmt, query interface{}) (err error) 56 Replace(stmt sqlstmt.Stmt, db, table string, columns []string, query *sql.SelectStmt) (err error) 57 } 58 59 var ( 60 mutex = new(sync.RWMutex) 61 dialects = make(map[string]Dialect) 62 ) 63 64 // RegisterDialect : 65 func RegisterDialect(driver string, dialect Dialect) { 66 mutex.Lock() 67 defer mutex.Unlock() 68 if dialect == nil { 69 panic("invalid nil dialect") 70 } 71 dialects[driver] = dialect 72 } 73 74 // GetDialectByDriver : 75 func GetDialectByDriver(driver string) Dialect { 76 mutex.RLock() 77 defer mutex.RUnlock() 78 driver = strings.TrimSpace(strings.ToLower(driver)) 79 return dialects[driver] 80 }