From 7164ae32b70182ca85314939446ddce56ec582c1 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jos=C3=A9=20Carlos=20Nieto?= <jose.carlos@menteslibres.net>
Date: Thu, 28 May 2015 06:12:17 -0500
Subject: [PATCH] Adding sqlutil.ToColumnsValuesAndArguments.

---
 mysql/collection.go      |  2 +-
 postgresql/collection.go | 38 ++++++++------------------------------
 util/sqlutil/convert.go  | 35 +++++++++++++++++++++++++++++++++++
 util/sqlutil/main.go     | 34 ----------------------------------
 4 files changed, 44 insertions(+), 65 deletions(-)

diff --git a/mysql/collection.go b/mysql/collection.go
index 6b53facb..7858e04f 100644
--- a/mysql/collection.go
+++ b/mysql/collection.go
@@ -67,7 +67,7 @@ func (t *table) Append(item interface{}) (interface{}, error) {
 		return nil, err
 	}
 
-	sqlgenCols, sqlgenVals, sqlgenArgs, err := t.ColumnsValuesAndArguments(columnNames, columnValues)
+	sqlgenCols, sqlgenVals, sqlgenArgs, err := sqlutil.ToColumnsValuesAndArguments(columnNames, columnValues)
 
 	if err != nil {
 		return nil, err
diff --git a/postgresql/collection.go b/postgresql/collection.go
index 19ecda73..1f5d00e4 100644
--- a/postgresql/collection.go
+++ b/postgresql/collection.go
@@ -64,38 +64,16 @@ func (t *table) Truncate() error {
 // Append inserts an item (map or struct) into the collection.
 func (t *table) Append(item interface{}) (interface{}, error) {
 
-	cols, vals, err := t.FieldValues(item)
+	columnNames, columnValues, err := t.FieldValues(item)
 
 	if err != nil {
 		return nil, err
 	}
 
-	columns := new(sqlgen.Columns)
+	sqlgenCols, sqlgenVals, sqlgenArgs, err := sqlutil.ToColumnsValuesAndArguments(columnNames, columnValues)
 
-	columns.Columns = make([]sqlgen.Fragment, 0, len(cols))
-	for i := range cols {
-		columns.Columns = append(columns.Columns, sqlgen.ColumnWithName(cols[i]))
-	}
-
-	values := new(sqlgen.Values)
-	var arguments []interface{}
-
-	arguments = make([]interface{}, 0, len(vals))
-	values.Values = make([]sqlgen.Fragment, 0, len(vals))
-
-	for i := range vals {
-		switch v := vals[i].(type) {
-		case *sqlgen.Value:
-			// Adding value.
-			values.Values = append(values.Values, v)
-		case sqlgen.Value:
-			// Adding value.
-			values.Values = append(values.Values, &v)
-		default:
-			// Adding both value and placeholder.
-			values.Values = append(values.Values, sqlPlaceholder)
-			arguments = append(arguments, v)
-		}
+	if err != nil {
+		return nil, err
 	}
 
 	var pKey []string
@@ -110,15 +88,15 @@ func (t *table) Append(item interface{}) (interface{}, error) {
 	stmt := sqlgen.Statement{
 		Type:    sqlgen.Insert,
 		Table:   sqlgen.TableWithName(t.MainTableName()),
-		Columns: columns,
-		Values:  values,
+		Columns: sqlgenCols,
+		Values:  sqlgenVals,
 	}
 
 	// No primary keys defined.
 	if len(pKey) == 0 {
 		var res sql.Result
 
-		if res, err = t.database.Exec(stmt, arguments...); err != nil {
+		if res, err = t.database.Exec(stmt, sqlgenArgs...); err != nil {
 			return nil, err
 		}
 
@@ -133,7 +111,7 @@ func (t *table) Append(item interface{}) (interface{}, error) {
 
 	// A primary key was found.
 	stmt.Extra = sqlgen.Extra(fmt.Sprintf(`RETURNING "%s"`, strings.Join(pKey, `", "`)))
-	if rows, err = t.database.Query(stmt, arguments...); err != nil {
+	if rows, err = t.database.Query(stmt, sqlgenArgs...); err != nil {
 		return nil, err
 	}
 
diff --git a/util/sqlutil/convert.go b/util/sqlutil/convert.go
index 19446268..d88bfaca 100644
--- a/util/sqlutil/convert.go
+++ b/util/sqlutil/convert.go
@@ -157,3 +157,38 @@ func ToColumnValues(cond db.Cond) (ToColumnValues sqlgen.ColumnValues, args []in
 
 	return ToColumnValues, args
 }
+
+// ToColumnsValuesAndArguments maps the given columnNames and columnValues into
+// sqlgen's Columns and Values, it also extracts and returns query arguments.
+func ToColumnsValuesAndArguments(columnNames []string, columnValues []interface{}) (*sqlgen.Columns, *sqlgen.Values, []interface{}, error) {
+	var arguments []interface{}
+
+	columns := new(sqlgen.Columns)
+
+	columns.Columns = make([]sqlgen.Fragment, 0, len(columnNames))
+	for i := range columnNames {
+		columns.Columns = append(columns.Columns, sqlgen.ColumnWithName(columnNames[i]))
+	}
+
+	values := new(sqlgen.Values)
+
+	arguments = make([]interface{}, 0, len(columnValues))
+	values.Values = make([]sqlgen.Fragment, 0, len(columnValues))
+
+	for i := range columnValues {
+		switch v := columnValues[i].(type) {
+		case *sqlgen.Value:
+			// Adding value.
+			values.Values = append(values.Values, v)
+		case sqlgen.Value:
+			// Adding value.
+			values.Values = append(values.Values, &v)
+		default:
+			// Adding both value and placeholder.
+			values.Values = append(values.Values, sqlPlaceholder)
+			arguments = append(arguments, v)
+		}
+	}
+
+	return columns, values, arguments, nil
+}
diff --git a/util/sqlutil/main.go b/util/sqlutil/main.go
index 11e5e266..3c1546a9 100644
--- a/util/sqlutil/main.go
+++ b/util/sqlutil/main.go
@@ -33,7 +33,6 @@ import (
 
 	"upper.io/db"
 	"upper.io/db/util"
-	"upper.io/db/util/sqlgen"
 )
 
 var (
@@ -228,36 +227,3 @@ func (t *T) NthTableName(i int) string {
 	}
 	return ""
 }
-
-func (t *T) ColumnsValuesAndArguments(columnNames []string, columnValues []interface{}) (*sqlgen.Columns, *sqlgen.Values, []interface{}, error) {
-	var arguments []interface{}
-
-	columns := new(sqlgen.Columns)
-
-	columns.Columns = make([]sqlgen.Fragment, 0, len(columnNames))
-	for i := range columnNames {
-		columns.Columns = append(columns.Columns, sqlgen.ColumnWithName(columnNames[i]))
-	}
-
-	values := new(sqlgen.Values)
-
-	arguments = make([]interface{}, 0, len(columnValues))
-	values.Values = make([]sqlgen.Fragment, 0, len(columnValues))
-
-	for i := range columnValues {
-		switch v := columnValues[i].(type) {
-		case *sqlgen.Value:
-			// Adding value.
-			values.Values = append(values.Values, v)
-		case sqlgen.Value:
-			// Adding value.
-			values.Values = append(values.Values, &v)
-		default:
-			// Adding both value and placeholder.
-			values.Values = append(values.Values, sqlPlaceholder)
-			arguments = append(arguments, v)
-		}
-	}
-
-	return columns, values, arguments, nil
-}
-- 
GitLab