Browse Source

SQL transactions to logs too

Vova Tkach 6 years ago
parent
commit
7557d042a1
3 changed files with 85 additions and 32 deletions
  1. 33 0
      engine/sqlw/log.go
  2. 13 32
      engine/sqlw/sqlw.go
  3. 39 0
      engine/sqlw/txw.go

+ 33 - 0
engine/sqlw/log.go

@@ -0,0 +1,33 @@
+package sqlw
+
+import (
+	"fmt"
+	"os"
+	"regexp"
+	"strings"
+	"time"
+
+	"golang-fave/consts"
+)
+
+func log(query string, s time.Time, transaction bool) {
+	color := "0;33"
+	if transaction {
+		color = "1;33"
+	}
+	msg := query
+	if reg, err := regexp.Compile("[\\s\\t]+"); err == nil {
+		msg = strings.Trim(reg.ReplaceAllString(msg, " "), " ")
+	}
+	if reg, err := regexp.Compile("[\\s\\t]+;$"); err == nil {
+		msg = reg.ReplaceAllString(msg, ";")
+	}
+	if consts.ParamDebug {
+		t := time.Now().Sub(s).Seconds()
+		if consts.IS_WIN {
+			fmt.Fprintln(os.Stdout, "[SQL] "+msg+fmt.Sprintf(" %.3f ms", t))
+		} else {
+			fmt.Fprintln(os.Stdout, "\033["+color+"m[SQL] "+msg+fmt.Sprintf(" %.3f ms", t)+"\033[0m")
+		}
+	}
+}

+ 13 - 32
engine/sqlw/sqlw.go

@@ -5,16 +5,9 @@ import (
 	_ "github.com/go-sql-driver/mysql"
 	_ "github.com/go-sql-driver/mysql"
 
 
 	"errors"
 	"errors"
-	"fmt"
-	"os"
-	"regexp"
-	"strings"
 	"time"
 	"time"
-
-	"golang-fave/consts"
 )
 )
 
 
-type Tx = sql.Tx
 type Rows = sql.Rows
 type Rows = sql.Rows
 
 
 type DB struct {
 type DB struct {
@@ -23,27 +16,12 @@ type DB struct {
 
 
 var ErrNoRows = sql.ErrNoRows
 var ErrNoRows = sql.ErrNoRows
 
 
-func (this *DB) logQuery(query string, s time.Time) {
-	msg := query
-	if reg, err := regexp.Compile("[\\s\\t]+"); err == nil {
-		msg = strings.Trim(reg.ReplaceAllString(msg, " "), " ")
-	}
-	if consts.ParamDebug {
-		t := time.Now().Sub(s).Seconds()
-		if consts.IS_WIN {
-			fmt.Fprintln(os.Stdout, "[SQL] "+msg+fmt.Sprintf(" %.3f ms", t))
-		} else {
-			fmt.Fprintln(os.Stdout, "\033[1;33m[SQL] "+msg+fmt.Sprintf(" %.3f ms", t)+"\033[0m")
-		}
-	}
-}
-
 func Open(driverName, dataSourceName string) (*DB, error) {
 func Open(driverName, dataSourceName string) (*DB, error) {
 	db, err := sql.Open(driverName, dataSourceName)
 	db, err := sql.Open(driverName, dataSourceName)
 	if err != nil {
 	if err != nil {
 		return nil, err
 		return nil, err
 	}
 	}
-	return &DB{db: db}, nil
+	return &DB{db: db}, err
 }
 }
 
 
 func (this *DB) Close() error {
 func (this *DB) Close() error {
@@ -69,25 +47,31 @@ func (this *DB) SetMaxOpenConns(n int) {
 func (this *DB) QueryRow(query string, args ...interface{}) *sql.Row {
 func (this *DB) QueryRow(query string, args ...interface{}) *sql.Row {
 	s := time.Now()
 	s := time.Now()
 	r := this.db.QueryRow(query, args...)
 	r := this.db.QueryRow(query, args...)
-	this.logQuery(query, s)
+	log(query, s, false)
 	return r
 	return r
 }
 }
 
 
-func (this *DB) Begin() (*sql.Tx, error) {
-	return this.db.Begin()
+func (this *DB) Begin() (*Tx, error) {
+	tx, err := this.db.Begin()
+	if err != nil {
+		return nil, err
+	}
+	s := time.Now()
+	log("[TX] TRANSACTION START", s, true)
+	return &Tx{tx, s}, err
 }
 }
 
 
 func (this *DB) Query(query string, args ...interface{}) (*sql.Rows, error) {
 func (this *DB) Query(query string, args ...interface{}) (*sql.Rows, error) {
 	s := time.Now()
 	s := time.Now()
 	r, e := this.db.Query(query, args...)
 	r, e := this.db.Query(query, args...)
-	this.logQuery(query, s)
+	log(query, s, false)
 	return r, e
 	return r, e
 }
 }
 
 
 func (this *DB) Exec(query string, args ...interface{}) (sql.Result, error) {
 func (this *DB) Exec(query string, args ...interface{}) (sql.Result, error) {
 	s := time.Now()
 	s := time.Now()
 	r, e := this.db.Exec(query, args...)
 	r, e := this.db.Exec(query, args...)
-	this.logQuery(query, s)
+	log(query, s, false)
 	return r, e
 	return r, e
 }
 }
 
 
@@ -95,17 +79,14 @@ func (this *DB) Transaction(queries func(tx *Tx) error) error {
 	if queries == nil {
 	if queries == nil {
 		return errors.New("queries is not set for transaction")
 		return errors.New("queries is not set for transaction")
 	}
 	}
-
-	tx, err := this.db.Begin()
+	tx, err := this.Begin()
 	if err != nil {
 	if err != nil {
 		return err
 		return err
 	}
 	}
-
 	err = queries(tx)
 	err = queries(tx)
 	if err != nil {
 	if err != nil {
 		tx.Rollback()
 		tx.Rollback()
 		return err
 		return err
 	}
 	}
-
 	return tx.Commit()
 	return tx.Commit()
 }
 }

+ 39 - 0
engine/sqlw/txw.go

@@ -0,0 +1,39 @@
+package sqlw
+
+import (
+	"database/sql"
+	_ "github.com/go-sql-driver/mysql"
+
+	"time"
+)
+
+type Tx struct {
+	tx *sql.Tx
+	s  time.Time
+}
+
+func (this *Tx) Rollback() error {
+	err := this.tx.Rollback()
+	log("[TX] TRANSACTION END (Rollback)", this.s, true)
+	return err
+}
+
+func (this *Tx) Commit() error {
+	err := this.tx.Commit()
+	log("[TX] TRANSACTION END (Commit)", this.s, true)
+	return err
+}
+
+func (this *Tx) Exec(query string, args ...interface{}) (sql.Result, error) {
+	s := time.Now()
+	r, e := this.tx.Exec(query, args...)
+	log("[TX] "+query, s, true)
+	return r, e
+}
+
+func (this *Tx) QueryRow(query string, args ...interface{}) *sql.Row {
+	s := time.Now()
+	r := this.tx.QueryRow(query, args...)
+	log("[TX] "+query, s, true)
+	return r
+}