From 85b21deebb1761a1afb13ab7975c32328648db3a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jos=C3=A9=20Carlos=20Nieto?= <jose.carlos@menteslibres.net>
Date: Sat, 7 Jun 2014 14:21:45 -0500
Subject: [PATCH] Testing insert.

---
 util/sqlgen/main.go       | 17 ++++++-
 util/sqlgen/main_test.go  | 95 +++++++++++++++++++++++++++++++++++++++
 util/sqlgen/value.go      | 19 ++++++++
 util/sqlgen/value_test.go | 17 +++++++
 4 files changed, 147 insertions(+), 1 deletion(-)

diff --git a/util/sqlgen/main.go b/util/sqlgen/main.go
index c7144463..f8ed4017 100644
--- a/util/sqlgen/main.go
+++ b/util/sqlgen/main.go
@@ -9,6 +9,7 @@ import (
 const (
 	sqlColumnSeparator = `.`
 	sqlColumnComma     = `, `
+	sqlValueComma      = `, `
 	sqlEscape          = `"{{.Raw}}"`
 
 	sqlOrderByLayout = `
@@ -45,7 +46,10 @@ const (
 	sqlUpdateLayout = `
 		UPDATE
 			{{.Source}}
-		SET {{.FieldValues}}
+		SET {{.ColumnValues}}
+			{{if .Where}}
+				WHERE {{.Where}}
+			{{end}}
 	`
 
 	sqlSelectCountLayout = `
@@ -97,7 +101,10 @@ const (
 	SqlDropTable
 	SqlDropDatabase
 	SqlSelectCount
+	SqlInsert
 	SqlSelect
+	SqlUpdate
+	SqlDelete
 )
 
 type (
@@ -125,6 +132,8 @@ type Statement struct {
 	Limit
 	Offset
 	Columns
+	Values
+	ColumnValues
 	OrderBy
 	Where
 }
@@ -141,6 +150,12 @@ func (self *Statement) Compile() string {
 		return mustParse(sqlSelectCountLayout, self)
 	case SqlSelect:
 		return mustParse(sqlSelectLayout, self)
+	case SqlDelete:
+		return mustParse(sqlDeleteLayout, self)
+	case SqlUpdate:
+		return mustParse(sqlUpdateLayout, self)
+	case SqlInsert:
+		return mustParse(sqlInsertLayout, self)
 	}
 	return ""
 }
diff --git a/util/sqlgen/main_test.go b/util/sqlgen/main_test.go
index 67eed3d7..43d3ef68 100644
--- a/util/sqlgen/main_test.go
+++ b/util/sqlgen/main_test.go
@@ -339,3 +339,98 @@ func TestSelectFieldsFromWhereLimitOffset(t *testing.T) {
 		t.Fatalf("Got: %s, Expecting: %s", s, e)
 	}
 }
+
+func TestDelete(t *testing.T) {
+	var s, e string
+	var stmt Statement
+
+	stmt = Statement{
+		Type:   SqlDelete,
+		Source: Source{"source name"},
+		Where: Where{
+			ColumnValue{Column{"baz"}, "=", Value{99}},
+		},
+	}
+
+	s = trim(stmt.Compile())
+	e = `DELETE FROM "source name" WHERE ("baz" = "99")`
+
+	if s != e {
+		t.Fatalf("Got: %s, Expecting: %s", s, e)
+	}
+}
+
+func TestUpdate(t *testing.T) {
+	var s, e string
+	var stmt Statement
+
+	stmt = Statement{
+		Type:   SqlUpdate,
+		Source: Source{"source name"},
+		ColumnValues: ColumnValues{
+			[]ColumnValue{
+				{Column{"foo"}, "=", Value{76}},
+			},
+		},
+		Where: Where{
+			ColumnValue{Column{"baz"}, "=", Value{99}},
+		},
+	}
+
+	s = trim(stmt.Compile())
+	e = `UPDATE "source name" SET "foo" = "76" WHERE ("baz" = "99")`
+
+	if s != e {
+		t.Fatalf("Got: %s, Expecting: %s", s, e)
+	}
+
+	stmt = Statement{
+		Type:   SqlUpdate,
+		Source: Source{"source name"},
+		ColumnValues: ColumnValues{
+			[]ColumnValue{
+				{Column{"foo"}, "=", Value{76}},
+				{Column{"bar"}, "=", Value{Raw{"88"}}},
+			},
+		},
+		Where: Where{
+			ColumnValue{Column{"baz"}, "=", Value{99}},
+		},
+	}
+
+	s = trim(stmt.Compile())
+	e = `UPDATE "source name" SET "foo" = "76", "bar" = 88 WHERE ("baz" = "99")`
+
+	if s != e {
+		t.Fatalf("Got: %s, Expecting: %s", s, e)
+	}
+}
+
+func TestInsert(t *testing.T) {
+	var s, e string
+	var stmt Statement
+
+	stmt = Statement{
+		Type:   SqlInsert,
+		Source: Source{"source name"},
+		Columns: Columns{
+			[]Column{
+				Column{"foo"},
+				Column{"bar"},
+				Column{"baz"},
+			},
+		},
+		Values: Values{
+			Value{"1"},
+			Value{2},
+			Value{Raw{"3"}},
+		},
+	}
+
+	s = trim(stmt.Compile())
+	e = `INSERT INTO "source name" ("foo", "bar", "baz") VALUES ("1", "2", 3)`
+
+	if s != e {
+		t.Fatalf("Got: %s, Expecting: %s", s, e)
+	}
+}
diff --git a/util/sqlgen/value.go b/util/sqlgen/value.go
index a3aa665a..11be7586 100644
--- a/util/sqlgen/value.go
+++ b/util/sqlgen/value.go
@@ -2,8 +2,11 @@ package sqlgen
 
 import (
 	"fmt"
+	"strings"
 )
 
+type Values []Value
+
 type Value struct {
 	v interface{}
 }
@@ -15,3 +18,19 @@ func (self Value) String() string {
 
 	return mustParse(sqlEscape, Raw{fmt.Sprintf(`%v`, self.v)})
 }
+
+func (self Values) String() string {
+	l := len(self)
+
+	if l > 0 {
+		chunks := make([]string, 0, l)
+
+		for i := 0; i < l; i++ {
+			chunks = append(chunks, self[i].String())
+		}
+
+		return strings.Join(chunks, sqlValueComma)
+	}
+
+	return ""
+}
diff --git a/util/sqlgen/value_test.go b/util/sqlgen/value_test.go
index f7d02827..525e7eb0 100644
--- a/util/sqlgen/value_test.go
+++ b/util/sqlgen/value_test.go
@@ -25,5 +25,22 @@ func TestValue(t *testing.T) {
 	if s != e {
 		t.Fatalf("Got: %s, Expecting: %s", s, e)
 	}
+}
+
+func TestValues(t *testing.T) {
+	var s, e string
+	var val Values
+
+	val = Values{
+		Value{Raw{"1"}},
+		Value{Raw{"2"}},
+		Value{"3"},
+	}
 
+	s = val.String()
+	e = `1, 2, "3"`
+
+	if s != e {
+		t.Fatalf("Got: %s, Expecting: %s", s, e)
+	}
 }
-- 
GitLab