| |
| |
| |
|
|
| package db |
|
|
| import ( |
| "database/sql" |
| "fmt" |
| "strings" |
|
|
| "github.com/GoAdminGroup/go-admin/modules/config" |
| "github.com/GoAdminGroup/go-admin/modules/service" |
| ) |
|
|
| const ( |
| |
| DriverMysql = "mysql" |
| |
| DriverSqlite = "sqlite" |
| |
| DriverPostgresql = "postgresql" |
| |
| DriverMssql = "mssql" |
| |
| DriverOceanBase = "oceanbase" |
| ) |
|
|
| |
| type Connection interface { |
| |
| Query(query string, args ...interface{}) ([]map[string]interface{}, error) |
|
|
| |
| Exec(query string, args ...interface{}) (sql.Result, error) |
|
|
| |
| QueryWithConnection(conn, query string, args ...interface{}) ([]map[string]interface{}, error) |
| QueryWithTx(tx *sql.Tx, query string, args ...interface{}) ([]map[string]interface{}, error) |
| QueryWith(tx *sql.Tx, conn, query string, args ...interface{}) ([]map[string]interface{}, error) |
|
|
| |
| ExecWithConnection(conn, query string, args ...interface{}) (sql.Result, error) |
| ExecWithTx(tx *sql.Tx, query string, args ...interface{}) (sql.Result, error) |
| ExecWith(tx *sql.Tx, conn, query string, args ...interface{}) (sql.Result, error) |
|
|
| BeginTxWithReadUncommitted() *sql.Tx |
| BeginTxWithReadCommitted() *sql.Tx |
| BeginTxWithRepeatableRead() *sql.Tx |
| BeginTx() *sql.Tx |
| BeginTxWithLevel(level sql.IsolationLevel) *sql.Tx |
|
|
| BeginTxWithReadUncommittedAndConnection(conn string) *sql.Tx |
| BeginTxWithReadCommittedAndConnection(conn string) *sql.Tx |
| BeginTxWithRepeatableReadAndConnection(conn string) *sql.Tx |
| BeginTxAndConnection(conn string) *sql.Tx |
| BeginTxWithLevelAndConnection(conn string, level sql.IsolationLevel) *sql.Tx |
|
|
| |
| InitDB(cfg map[string]config.Database) Connection |
|
|
| |
| Name() string |
|
|
| Close() []error |
|
|
| GetDelimiter() string |
| GetDelimiter2() string |
| GetDelimiters() []string |
|
|
| GetDB(key string) *sql.DB |
|
|
| GetConfig(name string) config.Database |
|
|
| CreateDB(name string, beans ...interface{}) error |
| } |
|
|
| |
| func GetConnectionByDriver(driver string) Connection { |
| switch driver { |
| case "mysql": |
| return GetMysqlDB() |
| case "mssql": |
| return GetMssqlDB() |
| case "sqlite": |
| return GetSqliteDB() |
| case "postgresql": |
| return GetPostgresqlDB() |
| case "oceanbase": |
| return GetOceanBaseDB() |
| default: |
| panic("driver not found!") |
| } |
| } |
|
|
| func GetConnectionFromService(srv interface{}) Connection { |
| if v, ok := srv.(Connection); ok { |
| return v |
| } |
| panic("wrong service") |
| } |
|
|
| func GetConnection(srvs service.List) Connection { |
| if v, ok := srvs.Get(config.GetDatabases().GetDefault().Driver).(Connection); ok { |
| return v |
| } |
| panic("wrong service") |
| } |
|
|
| func GetAggregationExpression(driver, field, headField, delimiter string) string { |
| switch driver { |
| case "postgresql": |
| return fmt.Sprintf("string_agg(%s::character varying, '%s') as %s", field, delimiter, headField) |
| case "mysql": |
| return fmt.Sprintf("group_concat(%s separator '%s') as %s", field, delimiter, headField) |
| case "sqlite": |
| return fmt.Sprintf("group_concat(%s, '%s') as %s", field, delimiter, headField) |
| case "mssql": |
| return fmt.Sprintf("string_agg(%s, '%s') as [%s]", field, delimiter, headField) |
| case "oceanbase": |
| return fmt.Sprintf("group_concat(%s separator '%s') as %s", field, delimiter, headField) |
|
|
| default: |
| panic("wrong driver") |
| } |
| } |
|
|
| const ( |
| INSERT = 0 |
| DELETE = 1 |
| UPDATE = 2 |
| QUERY = 3 |
| ) |
|
|
| var ignoreErrors = [...][]string{ |
| |
| { |
| "LastInsertId is not supported", |
| "There is no generated identity value", |
| "LastInsertId is not supported by this driver", |
| }, |
| |
| { |
| "no affect", |
| }, |
| |
| { |
| "LastInsertId is not supported", |
| "There is no generated identity value", |
| "no affect", |
| "LastInsertId is not supported by this driver", |
| }, |
| |
| { |
| "LastInsertId is not supported", |
| "There is no generated identity value", |
| "no affect", |
| "out of index", |
| "LastInsertId is not supported by this driver", |
| }, |
| } |
|
|
| func CheckError(err error, t int) bool { |
| if err == nil { |
| return false |
| } |
| for _, msg := range ignoreErrors[t] { |
| if strings.Contains(err.Error(), msg) { |
| return false |
| } |
| } |
| return true |
| } |
|
|