|
@@ -1,6 +1,7 @@
|
|
|
package db
|
|
|
|
|
|
import (
|
|
|
+ "context"
|
|
|
"database/sql"
|
|
|
"errors"
|
|
|
"fmt"
|
|
@@ -10,8 +11,9 @@ import (
|
|
|
// PostgreSQL
|
|
|
_ "github.com/lib/pq"
|
|
|
// MySQL
|
|
|
- //_ "github.com/go-sql-driver/mysql"
|
|
|
+ _ "github.com/go-sql-driver/mysql"
|
|
|
"github.com/jmoiron/sqlx"
|
|
|
+ _ "github.com/mattn/go-sqlite3"
|
|
|
)
|
|
|
|
|
|
var (
|
|
@@ -32,6 +34,11 @@ type DB struct {
|
|
|
tx *sqlx.Tx
|
|
|
}
|
|
|
|
|
|
+// Tx is an in-progress database transaction.
|
|
|
+type Tx struct {
|
|
|
+ tx *sqlx.Tx
|
|
|
+}
|
|
|
+
|
|
|
// SetConfig set
|
|
|
func SetConfig(cfg Config) {
|
|
|
config.Driver = cfg.Driver
|
|
@@ -69,7 +76,7 @@ func NewConfig(config Config) (dbx *DB, err error) {
|
|
|
dbx.conn.SetMaxIdleConns(config.MaxIdle)
|
|
|
dbx.conn.SetConnMaxIdleTime(config.MaxIdleTime)
|
|
|
dbx.conn.SetConnMaxLifetime(config.MaxLifeTime)
|
|
|
- err = dbx.conn.Ping()
|
|
|
+ //err = dbx.conn.Ping()
|
|
|
return
|
|
|
}
|
|
|
|
|
@@ -91,11 +98,33 @@ func connect() (dbx *sqlx.DB, err error) {
|
|
|
db.DB.SetMaxIdleConns(config.MaxIdle)
|
|
|
db.DB.SetConnMaxIdleTime(config.MaxIdleTime)
|
|
|
db.DB.SetConnMaxLifetime(config.MaxLifeTime)
|
|
|
- err = db.Ping()
|
|
|
+ /*
|
|
|
+ err = db.Ping()
|
|
|
+ if err != nil {
|
|
|
+ fmt.Println("Connect Ping", err)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ // */
|
|
|
+ })
|
|
|
+ if db == nil {
|
|
|
+ err = errNoneConnect
|
|
|
+ return
|
|
|
+ }
|
|
|
+ dbx = db
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+func connectContext(ctx context.Context) (dbx *sqlx.DB, err error) {
|
|
|
+ once.Do(func() {
|
|
|
+ db, err = sqlx.ConnectContext(ctx, config.Driver, config.DNS)
|
|
|
if err != nil {
|
|
|
- fmt.Println("Connect Ping", err)
|
|
|
+ fmt.Println("Connect ERR", err)
|
|
|
return
|
|
|
}
|
|
|
+ db.DB.SetMaxOpenConns(config.MaxOpenConns)
|
|
|
+ db.DB.SetMaxIdleConns(config.MaxIdle)
|
|
|
+ db.DB.SetConnMaxIdleTime(config.MaxIdleTime)
|
|
|
+ db.DB.SetConnMaxLifetime(config.MaxLifeTime)
|
|
|
})
|
|
|
if db == nil {
|
|
|
err = errNoneConnect
|
|
@@ -121,6 +150,16 @@ func (d *DB) Connect() (err error) {
|
|
|
return
|
|
|
}
|
|
|
|
|
|
+// ConnectContext connect to database
|
|
|
+func (d *DB) ConnectContext(ctx context.Context) (err error) {
|
|
|
+ if d.conn != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ d.conn, err = connectContext(ctx)
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
// Close close database connect
|
|
|
func (d *DB) Close() {
|
|
|
// use pool
|
|
@@ -137,6 +176,16 @@ func (d *DB) Ping() (err error) {
|
|
|
return d.conn.Ping()
|
|
|
}
|
|
|
|
|
|
+// PingContext Ping connect
|
|
|
+func (d *DB) PingContext(ctx context.Context) (err error) {
|
|
|
+ d.conn, err = connectContext(ctx)
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ return d.conn.PingContext(ctx)
|
|
|
+}
|
|
|
+
|
|
|
// BeginTrans begin trans
|
|
|
func (d *DB) BeginTrans() (err error) {
|
|
|
d.conn, err = connect()
|
|
@@ -148,6 +197,41 @@ func (d *DB) BeginTrans() (err error) {
|
|
|
return
|
|
|
}
|
|
|
|
|
|
+// Begin starts a transaction. The default isolation level is dependent on the driver.
|
|
|
+func (d *DB) Begin() (tx *Tx, err error) {
|
|
|
+ d.conn, err = connect()
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ tx = &Tx{}
|
|
|
+ tx.tx, err = d.conn.Beginx()
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+// BeginTransx begin trans
|
|
|
+func (d *DB) BeginTransx(ctx context.Context, opts *sql.TxOptions) (err error) {
|
|
|
+ d.conn, err = connectContext(ctx)
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ d.tx, err = d.conn.BeginTxx(ctx, opts)
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+// BeginTx starts a transaction.
|
|
|
+func (d *DB) BeginTx(ctx context.Context, opts *sql.TxOptions) (tx *Tx, err error) {
|
|
|
+ d.conn, err = connectContext(ctx)
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ tx = &Tx{}
|
|
|
+ tx.tx, err = d.conn.BeginTxx(ctx, opts)
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
// Commit commit
|
|
|
func (d *DB) Commit() (err error) {
|
|
|
return d.tx.Commit()
|
|
@@ -158,7 +242,7 @@ func (d *DB) Rollback() (err error) {
|
|
|
return d.tx.Rollback()
|
|
|
}
|
|
|
|
|
|
-// TransExec trans execute
|
|
|
+// TransExec trans execute with named args
|
|
|
func (d *DB) TransExec(query string, args interface{}) (LastInsertId, RowsAffected int64, err error) {
|
|
|
if rs, err := d.tx.NamedExec(query, args); err == nil {
|
|
|
RowsAffected, _ = rs.RowsAffected()
|
|
@@ -167,6 +251,15 @@ func (d *DB) TransExec(query string, args interface{}) (LastInsertId, RowsAffect
|
|
|
return
|
|
|
}
|
|
|
|
|
|
+// TransExec trans execute with named args
|
|
|
+func (d *DB) TransExecContext(ctx context.Context, query string, args interface{}) (LastInsertId, RowsAffected int64, err error) {
|
|
|
+ if rs, err := d.tx.NamedExecContext(ctx, query, args); err == nil {
|
|
|
+ RowsAffected, _ = rs.RowsAffected()
|
|
|
+ LastInsertId, _ = rs.LastInsertId()
|
|
|
+ }
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
// TransUpdate trans update
|
|
|
func (d *DB) TransUpdate(query string, args interface{}) (reply Reply) {
|
|
|
var (
|
|
@@ -209,7 +302,20 @@ func (d *DB) Select(dest interface{}, query string, args ...interface{}) error {
|
|
|
return err
|
|
|
}
|
|
|
|
|
|
-// Rows get rows
|
|
|
+// SelectContext select
|
|
|
+func (d *DB) SelectContext(ctx context.Context, dest interface{}, query string, args ...interface{}) error {
|
|
|
+ err := d.ConnectContext(ctx)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ defer d.Close()
|
|
|
+
|
|
|
+ err = d.conn.SelectContext(ctx, dest, query, args...)
|
|
|
+
|
|
|
+ return err
|
|
|
+}
|
|
|
+
|
|
|
+// Rows get rows with named args
|
|
|
func (d *DB) Rows(dest interface{}, query string, args interface{}) error {
|
|
|
err := d.Connect()
|
|
|
if err != nil {
|
|
@@ -228,6 +334,25 @@ func (d *DB) Rows(dest interface{}, query string, args interface{}) error {
|
|
|
return err
|
|
|
}
|
|
|
|
|
|
+// RowsContext get rows with named args
|
|
|
+func (d *DB) RowsContext(ctx context.Context, dest interface{}, query string, args interface{}) error {
|
|
|
+ err := d.ConnectContext(ctx)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ defer d.Close()
|
|
|
+
|
|
|
+ nstmt, err := d.conn.PrepareNamedContext(ctx, query)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ defer nstmt.Close()
|
|
|
+
|
|
|
+ err = nstmt.SelectContext(ctx, dest, args)
|
|
|
+
|
|
|
+ return err
|
|
|
+}
|
|
|
+
|
|
|
// Get get
|
|
|
func (d *DB) Get(dest interface{}, query string, args ...interface{}) error {
|
|
|
err := d.Connect()
|
|
@@ -241,7 +366,20 @@ func (d *DB) Get(dest interface{}, query string, args ...interface{}) error {
|
|
|
return err
|
|
|
}
|
|
|
|
|
|
-// Row get row
|
|
|
+// GetContext get
|
|
|
+func (d *DB) GetContext(ctx context.Context, dest interface{}, query string, args ...interface{}) error {
|
|
|
+ err := d.ConnectContext(ctx)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ defer d.Close()
|
|
|
+
|
|
|
+ err = d.conn.GetContext(ctx, dest, query, args...)
|
|
|
+
|
|
|
+ return err
|
|
|
+}
|
|
|
+
|
|
|
+// Row get row with named args
|
|
|
func (d *DB) Row(dest interface{}, query string, args interface{}) error {
|
|
|
err := d.Connect()
|
|
|
if err != nil {
|
|
@@ -260,6 +398,25 @@ func (d *DB) Row(dest interface{}, query string, args interface{}) error {
|
|
|
return err
|
|
|
}
|
|
|
|
|
|
+// RowContext get row with named args
|
|
|
+func (d *DB) RowContext(ctx context.Context, dest interface{}, query string, args interface{}) error {
|
|
|
+ err := d.ConnectContext(ctx)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ defer d.Close()
|
|
|
+
|
|
|
+ nstmt, err := d.conn.PrepareNamedContext(ctx, query)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ defer nstmt.Close()
|
|
|
+
|
|
|
+ err = nstmt.GetContext(ctx, dest, args)
|
|
|
+
|
|
|
+ return err
|
|
|
+}
|
|
|
+
|
|
|
// InsertReply insert and return DbReply
|
|
|
func (d *DB) InsertReply(query string, args interface{}) (reply Reply) {
|
|
|
var (
|
|
@@ -305,7 +462,7 @@ func (d *DB) UpdateReply(query string, args interface{}) (reply Reply) {
|
|
|
return
|
|
|
}
|
|
|
|
|
|
-// Insert insert into
|
|
|
+// Insert insert into with named args
|
|
|
func (d *DB) Insert(query string, args interface{}) (LastInsertId, RowsAffected int64, err error) {
|
|
|
err = d.Connect()
|
|
|
if err != nil {
|
|
@@ -320,7 +477,22 @@ func (d *DB) Insert(query string, args interface{}) (LastInsertId, RowsAffected
|
|
|
return
|
|
|
}
|
|
|
|
|
|
-// Update update/delete
|
|
|
+// InsertContext insert into with named args
|
|
|
+func (d *DB) InsertContext(ctx context.Context, query string, args interface{}) (LastInsertId, RowsAffected int64, err error) {
|
|
|
+ err = d.ConnectContext(ctx)
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ defer d.Close()
|
|
|
+ var rs sql.Result
|
|
|
+ if rs, err = d.conn.NamedExecContext(ctx, query, args); err == nil {
|
|
|
+ LastInsertId, _ = rs.LastInsertId()
|
|
|
+ RowsAffected, _ = rs.RowsAffected()
|
|
|
+ }
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+// Update update/delete with named args
|
|
|
func (d *DB) Update(query string, args interface{}) (RowsAffected int64, err error) {
|
|
|
err = d.Connect()
|
|
|
if err != nil {
|
|
@@ -335,6 +507,21 @@ func (d *DB) Update(query string, args interface{}) (RowsAffected int64, err err
|
|
|
return
|
|
|
}
|
|
|
|
|
|
+// Update update/delete with named args
|
|
|
+func (d *DB) UpdateContext(ctx context.Context, query string, args interface{}) (RowsAffected int64, err error) {
|
|
|
+ err = d.ConnectContext(ctx)
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ defer d.Close()
|
|
|
+
|
|
|
+ var rs sql.Result
|
|
|
+ if rs, err = d.conn.NamedExecContext(ctx, query, args); err == nil {
|
|
|
+ RowsAffected, _ = rs.RowsAffected()
|
|
|
+ }
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
// Exec exec
|
|
|
func (d *DB) Exec(query string, args ...interface{}) (LastInsertId, RowsAffected int64, err error) {
|
|
|
err = d.Connect()
|
|
@@ -350,6 +537,21 @@ func (d *DB) Exec(query string, args ...interface{}) (LastInsertId, RowsAffected
|
|
|
return
|
|
|
}
|
|
|
|
|
|
+// ExecContext exec
|
|
|
+func (d *DB) ExecContext(ctx context.Context, query string, args ...interface{}) (LastInsertId, RowsAffected int64, err error) {
|
|
|
+ err = d.ConnectContext(ctx)
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ defer d.Close()
|
|
|
+ var rs sql.Result
|
|
|
+ if rs, err = d.conn.ExecContext(ctx, query, args...); err == nil {
|
|
|
+ LastInsertId, _ = rs.LastInsertId()
|
|
|
+ RowsAffected, _ = rs.RowsAffected()
|
|
|
+ }
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
// Limit MySQL limit
|
|
|
func (d *DB) Limit(page, pagesize int) string {
|
|
|
// MySQL limit 0, size
|
|
@@ -360,6 +562,25 @@ func (d *DB) Limit(page, pagesize int) string {
|
|
|
return fmt.Sprintf(" limit %d offset %d", pagesize, (page-1)*pagesize)
|
|
|
}
|
|
|
|
|
|
+// Commit commits the transaction.
|
|
|
+func (t *Tx) Commit() error {
|
|
|
+ return t.tx.Commit()
|
|
|
+}
|
|
|
+
|
|
|
+// Rollback aborts the transaction.
|
|
|
+func (t *Tx) Rollback() error {
|
|
|
+ return t.tx.Rollback()
|
|
|
+}
|
|
|
+
|
|
|
+// TransExec trans execute with named args
|
|
|
+func (t *Tx) TransExec(query string, args interface{}) (LastInsertId, RowsAffected int64, err error) {
|
|
|
+ if rs, err := t.tx.NamedExec(query, args); err == nil {
|
|
|
+ RowsAffected, _ = rs.RowsAffected()
|
|
|
+ LastInsertId, _ = rs.LastInsertId()
|
|
|
+ }
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
// Ping ping connect
|
|
|
func Ping() (err error) {
|
|
|
defaultDB.conn, err = connect()
|
|
@@ -371,6 +592,17 @@ func Ping() (err error) {
|
|
|
return
|
|
|
}
|
|
|
|
|
|
+// PingContext ping connect
|
|
|
+func PingContext(ctx context.Context) (err error) {
|
|
|
+ defaultDB.conn, err = connectContext(ctx)
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ err = defaultDB.PingContext(ctx)
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
// Select select
|
|
|
func Select(dest interface{}, query string, args ...interface{}) (err error) {
|
|
|
defaultDB.conn, err = connect()
|
|
@@ -382,7 +614,7 @@ func Select(dest interface{}, query string, args ...interface{}) (err error) {
|
|
|
return
|
|
|
}
|
|
|
|
|
|
-// Rows get rows
|
|
|
+// Rows get rows with named args
|
|
|
func Rows(dest interface{}, query string, args interface{}) (err error) {
|
|
|
defaultDB.conn, err = connect()
|
|
|
if err != nil {
|
|
@@ -399,6 +631,23 @@ func Rows(dest interface{}, query string, args interface{}) (err error) {
|
|
|
return
|
|
|
}
|
|
|
|
|
|
+// RowsContext get rows with named args
|
|
|
+func RowsContext(ctx context.Context, dest interface{}, query string, args interface{}) (err error) {
|
|
|
+ defaultDB.conn, err = connectContext(ctx)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+
|
|
|
+ nstmt, err := defaultDB.conn.PrepareNamedContext(ctx, query)
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ defer nstmt.Close()
|
|
|
+
|
|
|
+ err = nstmt.SelectContext(ctx, dest, args)
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
// Get get
|
|
|
func Get(dest interface{}, query string, args ...interface{}) (err error) {
|
|
|
defaultDB.conn, err = connect()
|
|
@@ -410,7 +659,7 @@ func Get(dest interface{}, query string, args ...interface{}) (err error) {
|
|
|
return
|
|
|
}
|
|
|
|
|
|
-// Row get row
|
|
|
+// Row get row with named args
|
|
|
func Row(dest interface{}, query string, args interface{}) (err error) {
|
|
|
defaultDB.conn, err = connect()
|
|
|
if err != nil {
|
|
@@ -427,6 +676,24 @@ func Row(dest interface{}, query string, args interface{}) (err error) {
|
|
|
return
|
|
|
}
|
|
|
|
|
|
+// RowContext get row with named args
|
|
|
+func RowContext(ctx context.Context, dest interface{}, query string, args interface{}) (err error) {
|
|
|
+ defaultDB.conn, err = connectContext(ctx)
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ nstmt, err := defaultDB.conn.PrepareNamedContext(ctx, query)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ defer nstmt.Close()
|
|
|
+
|
|
|
+ err = nstmt.GetContext(ctx, dest, args)
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+// Exec exec
|
|
|
func Exec(query string, args ...interface{}) (LastInsertId, RowsAffected int64, err error) {
|
|
|
defaultDB.conn, err = connect()
|
|
|
if err != nil {
|
|
@@ -436,3 +703,14 @@ func Exec(query string, args ...interface{}) (LastInsertId, RowsAffected int64,
|
|
|
LastInsertId, RowsAffected, err = defaultDB.Exec(query, args...)
|
|
|
return
|
|
|
}
|
|
|
+
|
|
|
+// Exec exec
|
|
|
+func ExecContext(ctx context.Context, query string, args ...interface{}) (LastInsertId, RowsAffected int64, err error) {
|
|
|
+ defaultDB.conn, err = connectContext(ctx)
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ LastInsertId, RowsAffected, err = defaultDB.ExecContext(ctx, query, args...)
|
|
|
+ return
|
|
|
+}
|