From 677cb3e6597d24e7ba6c9860c6d59c6a9f3fed9d Mon Sep 17 00:00:00 2001
From: Carlos Nieto <jose.carlos@menteslibres.net>
Date: Wed, 16 Apr 2014 22:26:50 -0500
Subject: [PATCH] Adding UPPERIO_DB_DEBUG enviroment variable support.

---
 db.go                       |  4 ++++
 mongo/collection.go         |  4 ++++
 mongo/database.go           | 24 ++++++++++++++++-------
 mongo/database_test.go      |  5 +++--
 mysql/database.go           | 33 ++++++++++++++++++++------------
 mysql/database_test.go      |  7 ++++---
 postgresql/database.go      | 38 ++++++++++++++++++++++---------------
 postgresql/database_test.go |  5 +++--
 ql/database.go              | 31 ++++++++++++++++++++----------
 ql/database_test.go         |  6 +++---
 sqlite/database.go          | 33 ++++++++++++++++++++------------
 sqlite/database_test.go     |  5 +++--
 12 files changed, 127 insertions(+), 68 deletions(-)

diff --git a/db.go b/db.go
index e35228c2..efca4a99 100644
--- a/db.go
+++ b/db.go
@@ -224,6 +224,10 @@ var (
 	ErrUnsupportedDestination  = errors.New(`Unsupported destination type.`)
 )
 
+var (
+	EnvEnableDebug = `UPPERIO_DB_DEBUG`
+)
+
 // Registered wrappers.
 var wrappers = make(map[string]Database)
 
diff --git a/mongo/collection.go b/mongo/collection.go
index 4989457f..f5acf569 100644
--- a/mongo/collection.go
+++ b/mongo/collection.go
@@ -59,6 +59,10 @@ func (self *Collection) Find(terms ...interface{}) db.Result {
 
 	queryChunks.Conditions = self.compileQuery(terms...)
 
+	if debugEnabled() == true {
+		debugLogQuery(queryChunks)
+	}
+
 	// Actually executing query.
 	result := &Result{
 		self,
diff --git a/mongo/database.go b/mongo/database.go
index 7e720e80..647edde4 100644
--- a/mongo/database.go
+++ b/mongo/database.go
@@ -26,21 +26,16 @@ package mongo
 import (
 	"fmt"
 	"labix.org/v2/mgo"
+	"log"
 	"net/url"
+	"os"
 	"strings"
 	"time"
 	"upper.io/db"
 )
 
-var Debug = false
-
 const driverName = `mongo`
 
-// Registers this driver.
-func init() {
-	db.Register(driverName, &Source{})
-}
-
 type Source struct {
 	name     string
 	config   db.Settings
@@ -48,6 +43,21 @@ type Source struct {
 	database *mgo.Database
 }
 
+func debugEnabled() bool {
+	if os.Getenv(db.EnvEnableDebug) != "" {
+		return true
+	}
+	return false
+}
+
+func init() {
+	db.Register(driverName, &Source{})
+}
+
+func debugLogQuery(c *chunks) {
+	log.Printf("Fields: %v\nLimit: %v\nOffset: %v\nSort: %v\nConditions: %v\n", c.Fields, c.Limit, c.Offset, c.Sort, c.Conditions)
+}
+
 // Returns the string name of the database.
 func (self *Source) Name() string {
 	return self.name
diff --git a/mongo/database_test.go b/mongo/database_test.go
index 12bc4535..4180bcbf 100644
--- a/mongo/database_test.go
+++ b/mongo/database_test.go
@@ -27,6 +27,7 @@ import (
 	"labix.org/v2/mgo"
 	"labix.org/v2/mgo/bson"
 	"menteslibres.net/gosexy/to"
+	"os"
 	"reflect"
 	"strings"
 	"testing"
@@ -86,7 +87,7 @@ var testValues = testValuesStruct{
 
 // Enabling outputting some information to stdout, useful for development.
 func TestEnableDebug(t *testing.T) {
-	Debug = true
+	os.Setenv(db.EnvEnableDebug, "TRUE")
 }
 
 // Trying to open an empty datasource, it must succeed (mongo).
@@ -671,7 +672,7 @@ func TestDataTypes(t *testing.T) {
 
 // We are going to benchmark the engine, so this is no longed needed.
 func TestDisableDebug(t *testing.T) {
-	Debug = false
+	os.Setenv(db.EnvEnableDebug, "")
 }
 
 // Benchmarking raw mgo queries.
diff --git a/mysql/database.go b/mysql/database.go
index 0ae91255..65a0ada6 100644
--- a/mysql/database.go
+++ b/mysql/database.go
@@ -27,14 +27,14 @@ import (
 	"database/sql"
 	"fmt"
 	_ "github.com/go-sql-driver/mysql"
+	"log"
+	"os"
 	"reflect"
 	"regexp"
 	"strings"
 	"upper.io/db"
 )
 
-var Debug = false
-
 // Format for saving dates.
 const DateFormat = "2006-01-02 15:04:05.000"
 
@@ -45,10 +45,6 @@ var columnPattern = regexp.MustCompile(`^([a-z]+)\(?([0-9,]+)?\)?\s?([a-z]*)?`)
 
 const driverName = `mysql`
 
-func init() {
-	db.Register(driverName, &Source{})
-}
-
 type sqlValues_t []interface{}
 
 type Source struct {
@@ -62,6 +58,21 @@ type sqlQuery struct {
 	Args  []interface{}
 }
 
+func debugEnabled() bool {
+	if os.Getenv(db.EnvEnableDebug) != "" {
+		return true
+	}
+	return false
+}
+
+func init() {
+	db.Register(driverName, &Source{})
+}
+
+func debugLogQuery(s string, q *sqlQuery) {
+	log.Printf("SQL: %s\nARGS: %v\n", strings.TrimSpace(s), q.Args)
+}
+
 func sqlCompile(terms []interface{}) *sqlQuery {
 	q := &sqlQuery{}
 
@@ -117,9 +128,8 @@ func (self *Source) doExec(terms ...interface{}) (sql.Result, error) {
 
 	query := strings.Join(chunks.Query, ` `)
 
-	if Debug == true {
-		fmt.Printf("Q: %s\n", query)
-		fmt.Printf("A: %v\n", chunks.Args)
+	if debugEnabled() == true {
+		debugLogQuery(query, chunks)
 	}
 
 	return self.session.Exec(query, chunks.Args...)
@@ -134,9 +144,8 @@ func (self *Source) doQuery(terms ...interface{}) (*sql.Rows, error) {
 
 	query := strings.Join(chunks.Query, " ")
 
-	if Debug == true {
-		fmt.Printf("Q: %s\n", query)
-		fmt.Printf("A: %v\n", chunks.Args)
+	if debugEnabled() == true {
+		debugLogQuery(query, chunks)
 	}
 
 	return self.session.Query(query, chunks.Args...)
diff --git a/mysql/database_test.go b/mysql/database_test.go
index 73621108..31aa01f8 100644
--- a/mysql/database_test.go
+++ b/mysql/database_test.go
@@ -1,5 +1,5 @@
 /*
-  Copyright (c) 2012-2013 JosĂŠ Carlos Nieto, https://menteslibres.net/xiam
+  Copyright (c) 2012-2014 JosĂŠ Carlos Nieto, https://menteslibres.net/xiam
 
   Permission is hereby granted, free of charge, to any person obtaining
   a copy of this software and associated documentation files (the
@@ -36,6 +36,7 @@ package mysql
 import (
 	"database/sql"
 	"menteslibres.net/gosexy/to"
+	"os"
 	"reflect"
 	"strings"
 	"testing"
@@ -100,7 +101,7 @@ var testValues = testValuesStruct{
 // Enabling outputting some information to stdout (like the SQL query and its
 // arguments), useful for development.
 func TestEnableDebug(t *testing.T) {
-	Debug = true
+	os.Setenv(db.EnvEnableDebug, "TRUE")
 }
 
 // Trying to open an empty datasource, it must fail.
@@ -640,7 +641,7 @@ func TestDataTypes(t *testing.T) {
 
 // We are going to benchmark the engine, so this is no longed needed.
 func TestDisableDebug(t *testing.T) {
-	Debug = false
+	os.Setenv(db.EnvEnableDebug, "")
 }
 
 // Benchmarking raw database/sql.
diff --git a/postgresql/database.go b/postgresql/database.go
index db80d6f5..b86a8c48 100644
--- a/postgresql/database.go
+++ b/postgresql/database.go
@@ -27,14 +27,14 @@ import (
 	"database/sql"
 	"fmt"
 	_ "github.com/xiam/gopostgresql"
+	"log"
+	"os"
 	"reflect"
 	"regexp"
 	"strings"
 	"upper.io/db"
 )
 
-var Debug = false
-
 // Format for saving dates.
 var DateFormat = "2006-01-02 15:04:05"
 
@@ -47,10 +47,6 @@ var columnPattern = regexp.MustCompile(`^([a-z]+)\(?([0-9,]+)?\)?\s?([a-z]*)?`)
 
 const driverName = `postgresql`
 
-func init() {
-	db.Register(driverName, &Source{})
-}
-
 type sqlValues_t []interface{}
 
 type Source struct {
@@ -65,6 +61,21 @@ type sqlQuery struct {
 	Args  []interface{}
 }
 
+func debugEnabled() bool {
+	if os.Getenv(db.EnvEnableDebug) != "" {
+		return true
+	}
+	return false
+}
+
+func init() {
+	db.Register(driverName, &Source{})
+}
+
+func debugLogQuery(s string, q *sqlQuery) {
+	log.Printf("SQL: %s\nARGS: %v\n", strings.TrimSpace(s), q.Args)
+}
+
 func sqlCompile(terms []interface{}) *sqlQuery {
 	q := &sqlQuery{}
 
@@ -124,9 +135,8 @@ func (self *Source) doExec(terms ...interface{}) (sql.Result, error) {
 		query = strings.Replace(query, `?`, fmt.Sprintf(`$%d`, i+1), 1)
 	}
 
-	if Debug == true {
-		fmt.Printf("Q: %s\n", query)
-		fmt.Printf("A: %v\n", chunks.Args)
+	if debugEnabled() == true {
+		debugLogQuery(query, chunks)
 	}
 
 	return self.session.Exec(query, chunks.Args...)
@@ -145,9 +155,8 @@ func (self *Source) doQuery(terms ...interface{}) (*sql.Rows, error) {
 		query = strings.Replace(query, `?`, fmt.Sprintf(`$%d`, i+1), 1)
 	}
 
-	if Debug == true {
-		fmt.Printf("Q: %s\n", query)
-		fmt.Printf("A: %v\n", chunks.Args)
+	if debugEnabled() == true {
+		debugLogQuery(query, chunks)
 	}
 
 	return self.session.Query(query, chunks.Args...)
@@ -166,9 +175,8 @@ func (self *Source) doQueryRow(terms ...interface{}) (*sql.Row, error) {
 		query = strings.Replace(query, `?`, fmt.Sprintf(`$%d`, i+1), 1)
 	}
 
-	if Debug == true {
-		fmt.Printf("Q: %s\n", query)
-		fmt.Printf("A: %v\n", chunks.Args)
+	if debugEnabled() == true {
+		debugLogQuery(query, chunks)
 	}
 
 	return self.session.QueryRow(query, chunks.Args...), nil
diff --git a/postgresql/database_test.go b/postgresql/database_test.go
index 80231380..aa359d16 100644
--- a/postgresql/database_test.go
+++ b/postgresql/database_test.go
@@ -36,6 +36,7 @@ package postgresql
 import (
 	"database/sql"
 	"menteslibres.net/gosexy/to"
+	"os"
 	"reflect"
 	"strings"
 	"testing"
@@ -100,7 +101,7 @@ var testValues = testValuesStruct{
 // Enabling outputting some information to stdout (like the SQL query and its
 // arguments), useful for development.
 func TestEnableDebug(t *testing.T) {
-	Debug = true
+	os.Setenv(db.EnvEnableDebug, "TRUE")
 }
 
 // Trying to open an empty datasource, it must fail.
@@ -634,7 +635,7 @@ func TestDataTypes(t *testing.T) {
 
 // We are going to benchmark the engine, so this is no longed needed.
 func TestDisableDebug(t *testing.T) {
-	Debug = false
+	os.Setenv(db.EnvEnableDebug, "")
 }
 
 // Benchmarking raw database/sql.
diff --git a/ql/database.go b/ql/database.go
index 3a22d55d..9d4db014 100644
--- a/ql/database.go
+++ b/ql/database.go
@@ -27,6 +27,8 @@ import (
 	"database/sql"
 	"fmt"
 	_ "github.com/cznic/ql/driver"
+	"log"
+	"os"
 	"reflect"
 	"strings"
 	"time"
@@ -45,10 +47,6 @@ var timeType = reflect.TypeOf(time.Time{}).Kind()
 
 const driverName = `ql`
 
-func init() {
-	db.Register(driverName, &Source{})
-}
-
 type sqlValues_t []interface{}
 
 type Source struct {
@@ -63,6 +61,21 @@ type sqlQuery struct {
 	Args  []interface{}
 }
 
+func debugEnabled() bool {
+	if os.Getenv(db.EnvEnableDebug) != "" {
+		return true
+	}
+	return false
+}
+
+func init() {
+	db.Register(driverName, &Source{})
+}
+
+func debugLogQuery(s string, q *sqlQuery) {
+	log.Printf("SQL: %s\nARGS: %v\n", strings.TrimSpace(s), q.Args)
+}
+
 func sqlCompile(terms []interface{}) *sqlQuery {
 	q := &sqlQuery{}
 
@@ -121,9 +134,8 @@ func (self *Source) doExec(terms ...interface{}) (res sql.Result, err error) {
 		query = strings.Replace(query, `?`, fmt.Sprintf(`$%d`, i+1), 1)
 	}
 
-	if Debug == true {
-		fmt.Printf("Q: %s\n", query)
-		fmt.Printf("A: %v\n", chunks.Args)
+	if debugEnabled() == true {
+		debugLogQuery(query, chunks)
 	}
 
 	if tx, err = self.session.Begin(); err != nil {
@@ -154,9 +166,8 @@ func (self *Source) doQuery(terms ...interface{}) (*sql.Rows, error) {
 		query = strings.Replace(query, `?`, fmt.Sprintf(`$%d`, i+1), 1)
 	}
 
-	if Debug == true {
-		fmt.Printf("Q: %s\n", query)
-		fmt.Printf("A: %v\n", chunks.Args)
+	if debugEnabled() == true {
+		debugLogQuery(query, chunks)
 	}
 
 	return self.session.Query(query, chunks.Args...)
diff --git a/ql/database_test.go b/ql/database_test.go
index 844620b1..668a059a 100644
--- a/ql/database_test.go
+++ b/ql/database_test.go
@@ -36,7 +36,7 @@ package ql
 import (
 	"database/sql"
 	"menteslibres.net/gosexy/to"
-	//"reflect"
+	"os"
 	"strings"
 	"testing"
 	"time"
@@ -92,7 +92,7 @@ var testValues = testValuesStruct{
 // Enabling outputting some information to stdout (like the SQL query and its
 // arguments), useful for development.
 func TestEnableDebug(t *testing.T) {
-	Debug = true
+	os.Setenv(db.EnvEnableDebug, "TRUE")
 }
 
 // Trying to open an empty datasource, it must fail.
@@ -634,7 +634,7 @@ func TestDataTypes(t *testing.T) {
 
 // We are going to benchmark the engine, so this is no longed needed.
 func TestDisableDebug(t *testing.T) {
-	Debug = false
+	os.Setenv(db.EnvEnableDebug, "")
 }
 
 // Benchmarking raw database/sql.
diff --git a/sqlite/database.go b/sqlite/database.go
index ccaf824d..b5026b04 100644
--- a/sqlite/database.go
+++ b/sqlite/database.go
@@ -30,14 +30,14 @@ import (
 	// See: https://github.com/mattn/go-sqlite3/issues/40
 	//_ "github.com/xiam/gosqlite3"
 	_ "github.com/mattn/go-sqlite3"
+	"log"
+	"os"
 	"reflect"
 	"regexp"
 	"strings"
 	"upper.io/db"
 )
 
-var Debug = false
-
 // Format for saving dates.
 var DateFormat = `2006-01-02 15:04:05`
 
@@ -48,10 +48,6 @@ var columnPattern = regexp.MustCompile(`^([a-zA-Z]+)\(?([0-9,]+)?\)?\s?([a-zA-Z]
 
 const driverName = `sqlite`
 
-func init() {
-	db.Register(driverName, &Source{})
-}
-
 type sqlValues_t []interface{}
 
 type Source struct {
@@ -66,6 +62,21 @@ type sqlQuery struct {
 	Args  []interface{}
 }
 
+func debugEnabled() bool {
+	if os.Getenv(db.EnvEnableDebug) != "" {
+		return true
+	}
+	return false
+}
+
+func init() {
+	db.Register(driverName, &Source{})
+}
+
+func debugLogQuery(s string, q *sqlQuery) {
+	log.Printf("SQL: %s\nARGS: %v\n", strings.TrimSpace(s), q.Args)
+}
+
 func sqlCompile(terms []interface{}) *sqlQuery {
 	q := &sqlQuery{}
 
@@ -121,9 +132,8 @@ func (self *Source) doExec(terms ...interface{}) (sql.Result, error) {
 
 	query := strings.Join(chunks.Query, ` `)
 
-	if Debug == true {
-		fmt.Printf("Q: %s\n", query)
-		fmt.Printf("A: %v\n", chunks.Args)
+	if debugEnabled() == true {
+		debugLogQuery(query, chunks)
 	}
 
 	return self.session.Exec(query, chunks.Args...)
@@ -139,9 +149,8 @@ func (self *Source) doQuery(terms ...interface{}) (*sql.Rows, error) {
 
 	query := strings.Join(chunks.Query, ` `)
 
-	if Debug == true {
-		fmt.Printf("Q: %s\n", query)
-		fmt.Printf("A: %v\n", chunks.Args)
+	if debugEnabled() == true {
+		debugLogQuery(query, chunks)
 	}
 
 	return self.session.Query(query, chunks.Args...)
diff --git a/sqlite/database_test.go b/sqlite/database_test.go
index 611a12e0..6baaaafb 100644
--- a/sqlite/database_test.go
+++ b/sqlite/database_test.go
@@ -36,6 +36,7 @@ package sqlite
 import (
 	"database/sql"
 	"menteslibres.net/gosexy/to"
+	"os"
 	"reflect"
 	"strings"
 	"testing"
@@ -92,7 +93,7 @@ var testValues = testValuesStruct{
 // Enabling outputting some information to stdout (like the SQL query and its
 // arguments), useful for development.
 func TestEnableDebug(t *testing.T) {
-	Debug = true
+	os.Setenv(db.EnvEnableDebug, "TRUE")
 }
 
 // Trying to open an empty datasource, it must fail.
@@ -632,7 +633,7 @@ func TestDataTypes(t *testing.T) {
 
 // We are going to benchmark the engine, so this is no longed needed.
 func TestDisableDebug(t *testing.T) {
-	Debug = false
+	os.Setenv(db.EnvEnableDebug, "")
 }
 
 // Benchmarking raw database/sql.
-- 
GitLab