From 06da7349ebc528f00b25ccc6598c6a5218b94c7a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Carlos=20Nieto?= <jose.carlos@menteslibres.net> Date: Tue, 17 Jun 2014 16:21:50 -0500 Subject: [PATCH] Better debugger functionality. --- postgresql/database.go | 59 ++++++++++++++++++++++++++++-------------- util/sqlutil/main.go | 30 ++++++++++++++++++--- 2 files changed, 66 insertions(+), 23 deletions(-) diff --git a/postgresql/database.go b/postgresql/database.go index c1a616d5..36f8265d 100644 --- a/postgresql/database.go +++ b/postgresql/database.go @@ -70,6 +70,13 @@ func debugEnabled() bool { return false } +func debugLog(query string, args []interface{}, err error) { + if debugEnabled() == true { + d := sqlutil.Debug{query, args, err} + d.Print() + } +} + func init() { template = &sqlgen.Template{ @@ -106,68 +113,82 @@ func init() { } func (self *Source) doExec(stmt sqlgen.Statement, args ...interface{}) (sql.Result, error) { + var query string + var res sql.Result + var err error + + defer func() { + debugLog(query, args, err) + }() if self.session == nil { return nil, db.ErrNotConnected } - query := stmt.Compile(template) + query = stmt.Compile(template) l := len(args) for i := 0; i < l; i++ { query = strings.Replace(query, `?`, fmt.Sprintf(`$%d`, i+1), 1) } - if debugEnabled() == true { - sqlutil.DebugQuery(query, args) - } - if self.tx != nil { - return self.tx.Exec(query, args...) + res, err = self.tx.Exec(query, args...) + } else { + res, err = self.session.Exec(query, args...) } - return self.session.Exec(query, args...) + return res, err } func (self *Source) doQuery(stmt sqlgen.Statement, args ...interface{}) (*sql.Rows, error) { + var rows *sql.Rows + var query string + var err error + + defer func() { + debugLog(query, args, err) + }() + if self.session == nil { return nil, db.ErrNotConnected } - query := stmt.Compile(template) + query = stmt.Compile(template) l := len(args) for i := 0; i < l; i++ { query = strings.Replace(query, `?`, fmt.Sprintf(`$%d`, i+1), 1) } - if debugEnabled() == true { - sqlutil.DebugQuery(query, args) - } - if self.tx != nil { - return self.tx.Query(query, args...) + rows, err = self.tx.Query(query, args...) + } else { + rows, err = self.session.Query(query, args...) } - return self.session.Query(query, args...) + return rows, err } func (self *Source) doQueryRow(stmt sqlgen.Statement, args ...interface{}) (*sql.Row, error) { + var query string + var err error + + defer func() { + debugLog(query, args, err) + }() + if self.session == nil { return nil, db.ErrNotConnected } - query := stmt.Compile(template) + query = stmt.Compile(template) l := len(args) for i := 0; i < l; i++ { query = strings.Replace(query, `?`, fmt.Sprintf(`$%d`, i+1), 1) } - if debugEnabled() == true { - sqlutil.DebugQuery(query, args) - } - if self.tx != nil { return self.tx.QueryRow(query, args...), nil } diff --git a/util/sqlutil/main.go b/util/sqlutil/main.go index 52c648ac..d20eabd5 100644 --- a/util/sqlutil/main.go +++ b/util/sqlutil/main.go @@ -25,6 +25,7 @@ package sqlutil import ( "database/sql" + "fmt" "log" "menteslibres.net/gosexy/to" "reflect" @@ -43,10 +44,31 @@ type T struct { ColumnTypes map[string]reflect.Kind } -func DebugQuery(s string, args []interface{}) { - s = reInvisibleChars.ReplaceAllString(s, ` `) - s = strings.TrimSpace(s) - log.Printf("\n\tSQL: %s\n\tARGS: %v\n\n", s, args) +type Debug struct { + SQL string + Args []interface{} + Err error +} + +func (self *Debug) Print() { + self.SQL = reInvisibleChars.ReplaceAllString(self.SQL, ` `) + self.SQL = strings.TrimSpace(self.SQL) + + s := make([]string, 0, 3) + + if self.SQL != "" { + s = append(s, fmt.Sprintf(`SQL: %s`, self.SQL)) + } + + if len(self.Args) > 0 { + s = append(s, fmt.Sprintf(`ARG: %s`, self.Args)) + } + + if self.Err != nil { + s = append(s, fmt.Sprintf(`ERR: %q`, self.Err)) + } + + log.Printf("\n\t%s\n\n", strings.Join(s, "\n\t")) } func (self *T) ColumnLike(s string) string { -- GitLab