From 72f584d9935cd09e59cd852e89c419745eca2982 Mon Sep 17 00:00:00 2001 From: Jack Christensen Date: Wed, 21 May 2014 08:17:24 -0500 Subject: [PATCH] Add QueryArgs --- sql.go | 29 +++++++++++++++++++++++++++++ sql_test.go | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 64 insertions(+) create mode 100644 sql.go create mode 100644 sql_test.go diff --git a/sql.go b/sql.go new file mode 100644 index 00000000..9445c263 --- /dev/null +++ b/sql.go @@ -0,0 +1,29 @@ +package pgx + +import ( + "strconv" +) + +// QueryArgs is a container for arguments to an SQL query. It is helpful when +// building SQL statements where the number of arguments is variable. +type QueryArgs []interface{} + +var placeholders []string + +func init() { + placeholders = make([]string, 64) + + for i := 1; i < 64; i++ { + placeholders[i] = "$" + strconv.FormatInt(int64(i), 10) + } +} + +// Append adds a value to qa and returns the placeholder value for the +// argument. e.g. $1, $2, etc. +func (qa *QueryArgs) Append(v interface{}) string { + *qa = append(*qa, v) + if len(*qa) < len(placeholders) { + return placeholders[len(*qa)] + } + return "$" + strconv.FormatInt(int64(len(*qa)), 10) +} diff --git a/sql_test.go b/sql_test.go new file mode 100644 index 00000000..bf2b20f5 --- /dev/null +++ b/sql_test.go @@ -0,0 +1,35 @@ +package pgx_test + +import ( + "github.com/JackC/pgx" + "strconv" + "testing" +) + +func TestQueryArgs(t *testing.T) { + var qa pgx.QueryArgs + + for i := 1; i < 512; i++ { + expectedPlaceholder := "$" + strconv.FormatInt(int64(i), 10) + placeholder := qa.Append(i) + if placeholder != expectedPlaceholder { + t.Errorf(`Expected qa.Append to return "%s", but it returned "%s"`, expectedPlaceholder, placeholder) + } + } +} + +func BenchmarkQueryArgs(b *testing.B) { + for i := 0; i < b.N; i++ { + qa := pgx.QueryArgs(make([]interface{}, 0, 16)) + qa.Append("foo1") + qa.Append("foo2") + qa.Append("foo3") + qa.Append("foo4") + qa.Append("foo5") + qa.Append("foo6") + qa.Append("foo7") + qa.Append("foo8") + qa.Append("foo9") + qa.Append("foo10") + } +}