|
|
|
|
|
|
|
|
|
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 |
|
} |
|
|