github.com/johnnyeven/libtools@v0.0.0-20191126065708-61829c1adf46/sqlx/db.go (about) 1 package sqlx 2 3 import ( 4 "database/sql" 5 "errors" 6 "time" 7 8 "github.com/johnnyeven/libtools/sqlx/builder" 9 _ "github.com/johnnyeven/libtools/sqlx/mysql_logger_driver" 10 ) 11 12 var ErrNotTx = errors.New("db is not *sql.Tx") 13 var ErrNotDB = errors.New("db is not *sql.DB") 14 15 func Open(driverName string, dataSourceName string, openFunc func(string, string) (*sql.DB, error)) (*DB, error) { 16 db, err := openFunc(driverName, dataSourceName) 17 if err != nil { 18 return nil, err 19 } 20 return &DB{ 21 SqlExecutor: db, 22 }, nil 23 } 24 25 func MustOpen(driverName string, dataSourceName string, openFunc func(string, string) (*sql.DB, error)) *DB { 26 db, err := Open(driverName, dataSourceName, openFunc) 27 if err != nil { 28 panic(err) 29 } 30 return db 31 } 32 33 type DB struct { 34 SqlExecutor 35 } 36 37 func (d *DB) Do(stmt builder.Statement) (result *Result) { 38 return Do(d, stmt) 39 } 40 41 func (d *DB) IsTx() bool { 42 _, ok := d.SqlExecutor.(*sql.Tx) 43 return ok 44 } 45 46 func (d *DB) Query(query string, args ...interface{}) (*sql.Rows, error) { 47 query, args = flattenArgs(query, args...) 48 return d.SqlExecutor.Query(query, args...) 49 } 50 51 func (d *DB) Exec(query string, args ...interface{}) (sql.Result, error) { 52 query, args = flattenArgs(query, args...) 53 return d.SqlExecutor.Exec(query, args...) 54 } 55 56 func (d *DB) Begin() (*DB, error) { 57 if d.IsTx() { 58 return nil, ErrNotDB 59 } 60 db, err := d.SqlExecutor.(*sql.DB).Begin() 61 if err != nil { 62 return nil, err 63 } 64 return &DB{ 65 SqlExecutor: db, 66 }, nil 67 } 68 69 func (d *DB) Commit() error { 70 if !d.IsTx() { 71 return ErrNotTx 72 } 73 return d.SqlExecutor.(*sql.Tx).Commit() 74 } 75 76 func (d *DB) Rollback() error { 77 if !d.IsTx() { 78 return ErrNotTx 79 } 80 return d.SqlExecutor.(*sql.Tx).Rollback() 81 } 82 83 func (d *DB) SetMaxOpenConns(n int) { 84 d.SqlExecutor.(*sql.DB).SetMaxOpenConns(n) 85 } 86 87 func (d *DB) SetMaxIdleConns(n int) { 88 d.SqlExecutor.(*sql.DB).SetMaxIdleConns(n) 89 } 90 91 func (d *DB) SetConnMaxLifetime(t time.Duration) { 92 d.SqlExecutor.(*sql.DB).SetConnMaxLifetime(t) 93 }