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