add debug info in logs
diff --git a/data/data.go b/data/data.go
index b6d9cbd..afb469a 100644
--- a/data/data.go
+++ b/data/data.go
@@ -3,13 +3,14 @@
import (
"database/sql"
"fmt"
+ "os"
+ "path"
+ "runtime"
+ "sync"
+
"github.com/30x/apid-core"
"github.com/30x/apid-core/data/wrap"
"github.com/mattn/go-sqlite3"
- "os"
- "path"
- "sync"
- "runtime"
)
const (
@@ -119,19 +120,19 @@
}
log.Infof("LoadDB: %s", dataPath)
- dataSource := fmt.Sprintf(config.GetString(configDataSourceKey), dataPath)
+ source := fmt.Sprintf(config.GetString(configDataSourceKey), dataPath)
wrappedDriverName := "dd:" + config.GetString(configDataDriverKey)
- dataDriver := wrap.WrapDriver{&sqlite3.SQLiteDriver{}, dbTraceLog}
+ driver := wrap.NewDriver(&sqlite3.SQLiteDriver{}, dbTraceLog)
func() {
// just ignore the "registered twice" panic
defer func() {
recover()
}()
- sql.Register(wrappedDriverName, &dataDriver)
+ sql.Register(wrappedDriverName, driver)
}()
- db, err = sql.Open(wrappedDriverName, dataSource)
+ db, err = sql.Open(wrappedDriverName, source)
if err != nil {
log.Errorf("error loading db: %s", err)
return
@@ -184,4 +185,4 @@
storagePath := config.GetString("local_storage_path")
relativeDataPath := config.GetString(configDataPathKey)
return path.Join(storagePath, relativeDataPath, id, "sqlite3")
-}
\ No newline at end of file
+}
diff --git a/data/wrap/connection.go b/data/wrap/connection.go
index bd865b3..d643a88 100644
--- a/data/wrap/connection.go
+++ b/data/wrap/connection.go
@@ -1,14 +1,19 @@
package wrap
import (
+ "database/sql/driver"
+
+ "sync/atomic"
+
"github.com/30x/apid-core"
"github.com/mattn/go-sqlite3"
- "database/sql/driver"
)
type wrapConn struct {
*sqlite3.SQLiteConn
- log apid.LogService
+ log apid.LogService
+ stmtCounter int64
+ txCounter int64
}
func (c *wrapConn) Swap(cc *sqlite3.SQLiteConn) {
@@ -16,42 +21,46 @@
}
func (c *wrapConn) Prepare(query string) (driver.Stmt, error) {
- c.log.Debugf("begin prepare stmt: %s", query)
+ stmtID := atomic.AddInt64(&c.stmtCounter, 1)
+ log := c.log.WithField("stmt", stmtID)
+ log.Debugf("begin prepare stmt: %s", query)
stmt, err := c.SQLiteConn.Prepare(query)
if err != nil {
- c.log.Errorf("prepare stmt failed: %s", err)
+ log.Errorf("prepare stmt failed: %s", err)
return nil, err
}
- c.log.Debug("end prepare stmt")
+ log.Debug("end prepare stmt")
s := stmt.(*sqlite3.SQLiteStmt)
- return &wrapStmt{s, c.log}, nil
+ return &wrapStmt{s, log}, nil
}
func (c *wrapConn) Begin() (driver.Tx, error) {
- c.log.Debug("begin trans")
+ txID := atomic.AddInt64(&c.txCounter, 1)
+ log := c.log.WithField("tx", txID)
+ log.Debug("begin trans %d", txID)
tx, err := c.SQLiteConn.Begin()
if err != nil {
- c.log.Errorf("begin trans failed: %s", err)
+ log.Errorf("begin trans failed: %s", err)
return nil, err
}
- c.log.Debug("end begin trans")
+ log.Debug("end begin trans")
t := tx.(*sqlite3.SQLiteTx)
- return &wrapTx{t, c.log}, nil
+ return &wrapTx{t, log}, nil
}
func (c *wrapConn) Close() (err error) {
- c.log.Debug("begin close")
+ c.log.Debug("begin close conn")
if err = c.SQLiteConn.Close(); err != nil {
- c.log.Errorf("close failed: %s", err)
+ c.log.Errorf("close conn failed: %s", err)
return
}
- c.log.Debug("end close")
+ c.log.Debug("end close conn")
return
}
diff --git a/data/wrap/driver.go b/data/wrap/driver.go
index 62a799a..686eb13 100644
--- a/data/wrap/driver.go
+++ b/data/wrap/driver.go
@@ -3,23 +3,35 @@
import (
"database/sql/driver"
"strings"
+
+ "sync/atomic"
+
"github.com/30x/apid-core"
"github.com/mattn/go-sqlite3"
)
-type WrapDriver struct {
- driver.Driver
- Log apid.LogService
+func NewDriver(d driver.Driver, log apid.LogService) driver.Driver {
+ return wrapDriver{d, log, 0}
}
-func (d WrapDriver) Open(dsn string) (driver.Conn, error) {
+type wrapDriver struct {
+ driver.Driver
+ log apid.LogService
+ counter int64
+}
+
+func (d wrapDriver) Open(dsn string) (driver.Conn, error) {
+ connId := atomic.AddInt64(&d.counter, 1)
+ log := d.log.WithField("conn", connId)
+ log.Debug("begin open conn")
internalDSN := strings.TrimPrefix(dsn, "dd:")
internalCon, err := d.Driver.Open(internalDSN)
if err != nil {
+ log.Errorf("open conn failed: %v", err)
return nil, err
}
c := internalCon.(*sqlite3.SQLiteConn)
- return &wrapConn{c, d.Log}, nil
+ return &wrapConn{c, log, 0, 0}, nil
}