summaryrefslogtreecommitdiff
path: root/vendor/github.com/Masterminds
diff options
context:
space:
mode:
authormo khan <mo@mokhan.ca>2025-07-22 17:35:49 -0600
committermo khan <mo@mokhan.ca>2025-07-22 17:35:49 -0600
commit20ef0d92694465ac86b550df139e8366a0a2b4fa (patch)
tree3f14589e1ce6eb9306a3af31c3a1f9e1af5ed637 /vendor/github.com/Masterminds
parent44e0d272c040cdc53a98b9f1dc58ae7da67752e6 (diff)
feat: connect to spicedb
Diffstat (limited to 'vendor/github.com/Masterminds')
-rw-r--r--vendor/github.com/Masterminds/squirrel/.gitignore1
-rw-r--r--vendor/github.com/Masterminds/squirrel/.travis.yml30
-rw-r--r--vendor/github.com/Masterminds/squirrel/LICENSE23
-rw-r--r--vendor/github.com/Masterminds/squirrel/README.md142
-rw-r--r--vendor/github.com/Masterminds/squirrel/case.go128
-rw-r--r--vendor/github.com/Masterminds/squirrel/delete.go191
-rw-r--r--vendor/github.com/Masterminds/squirrel/delete_ctx.go69
-rw-r--r--vendor/github.com/Masterminds/squirrel/expr.go419
-rw-r--r--vendor/github.com/Masterminds/squirrel/insert.go298
-rw-r--r--vendor/github.com/Masterminds/squirrel/insert_ctx.go69
-rw-r--r--vendor/github.com/Masterminds/squirrel/part.go63
-rw-r--r--vendor/github.com/Masterminds/squirrel/placeholder.go114
-rw-r--r--vendor/github.com/Masterminds/squirrel/row.go22
-rw-r--r--vendor/github.com/Masterminds/squirrel/select.go403
-rw-r--r--vendor/github.com/Masterminds/squirrel/select_ctx.go69
-rw-r--r--vendor/github.com/Masterminds/squirrel/squirrel.go183
-rw-r--r--vendor/github.com/Masterminds/squirrel/squirrel_ctx.go93
-rw-r--r--vendor/github.com/Masterminds/squirrel/statement.go104
-rw-r--r--vendor/github.com/Masterminds/squirrel/stmtcacher.go121
-rw-r--r--vendor/github.com/Masterminds/squirrel/stmtcacher_ctx.go86
-rw-r--r--vendor/github.com/Masterminds/squirrel/stmtcacher_noctx.go21
-rw-r--r--vendor/github.com/Masterminds/squirrel/update.go288
-rw-r--r--vendor/github.com/Masterminds/squirrel/update_ctx.go69
-rw-r--r--vendor/github.com/Masterminds/squirrel/where.go30
24 files changed, 3036 insertions, 0 deletions
diff --git a/vendor/github.com/Masterminds/squirrel/.gitignore b/vendor/github.com/Masterminds/squirrel/.gitignore
new file mode 100644
index 0000000..4a0699f
--- /dev/null
+++ b/vendor/github.com/Masterminds/squirrel/.gitignore
@@ -0,0 +1 @@
+squirrel.test \ No newline at end of file
diff --git a/vendor/github.com/Masterminds/squirrel/.travis.yml b/vendor/github.com/Masterminds/squirrel/.travis.yml
new file mode 100644
index 0000000..7bb6da4
--- /dev/null
+++ b/vendor/github.com/Masterminds/squirrel/.travis.yml
@@ -0,0 +1,30 @@
+language: go
+
+go:
+ - 1.11.x
+ - 1.12.x
+ - 1.13.x
+
+services:
+ - mysql
+ - postgresql
+
+# Setting sudo access to false will let Travis CI use containers rather than
+# VMs to run the tests. For more details see:
+# - http://docs.travis-ci.com/user/workers/container-based-infrastructure/
+# - http://docs.travis-ci.com/user/workers/standard-infrastructure/
+sudo: false
+
+before_script:
+ - mysql -e 'CREATE DATABASE squirrel;'
+ - psql -c 'CREATE DATABASE squirrel;' -U postgres
+
+script:
+ - go test
+ - cd integration
+ - go test -args -driver sqlite3
+ - go test -args -driver mysql -dataSource travis@/squirrel
+ - go test -args -driver postgres -dataSource 'postgres://postgres@localhost/squirrel?sslmode=disable'
+
+notifications:
+ irc: "irc.freenode.net#masterminds"
diff --git a/vendor/github.com/Masterminds/squirrel/LICENSE b/vendor/github.com/Masterminds/squirrel/LICENSE
new file mode 100644
index 0000000..b459007
--- /dev/null
+++ b/vendor/github.com/Masterminds/squirrel/LICENSE
@@ -0,0 +1,23 @@
+MIT License
+
+Squirrel: The Masterminds
+Copyright (c) 2014-2015, Lann Martin. Copyright (C) 2015-2016, Google. Copyright (C) 2015, Matt Farina and Matt Butcher.
+
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/vendor/github.com/Masterminds/squirrel/README.md b/vendor/github.com/Masterminds/squirrel/README.md
new file mode 100644
index 0000000..1d37f28
--- /dev/null
+++ b/vendor/github.com/Masterminds/squirrel/README.md
@@ -0,0 +1,142 @@
+[![Stability: Maintenance](https://masterminds.github.io/stability/maintenance.svg)](https://masterminds.github.io/stability/maintenance.html)
+### Squirrel is "complete".
+Bug fixes will still be merged (slowly). Bug reports are welcome, but I will not necessarily respond to them. If another fork (or substantially similar project) actively improves on what Squirrel does, let me know and I may link to it here.
+
+
+# Squirrel - fluent SQL generator for Go
+
+```go
+import "github.com/Masterminds/squirrel"
+```
+
+
+[![GoDoc](https://godoc.org/github.com/Masterminds/squirrel?status.png)](https://godoc.org/github.com/Masterminds/squirrel)
+[![Build Status](https://api.travis-ci.org/Masterminds/squirrel.svg?branch=master)](https://travis-ci.org/Masterminds/squirrel)
+
+**Squirrel is not an ORM.** For an application of Squirrel, check out
+[structable, a table-struct mapper](https://github.com/Masterminds/structable)
+
+
+Squirrel helps you build SQL queries from composable parts:
+
+```go
+import sq "github.com/Masterminds/squirrel"
+
+users := sq.Select("*").From("users").Join("emails USING (email_id)")
+
+active := users.Where(sq.Eq{"deleted_at": nil})
+
+sql, args, err := active.ToSql()
+
+sql == "SELECT * FROM users JOIN emails USING (email_id) WHERE deleted_at IS NULL"
+```
+
+```go
+sql, args, err := sq.
+ Insert("users").Columns("name", "age").
+ Values("moe", 13).Values("larry", sq.Expr("? + 5", 12)).
+ ToSql()
+
+sql == "INSERT INTO users (name,age) VALUES (?,?),(?,? + 5)"
+```
+
+Squirrel can also execute queries directly:
+
+```go
+stooges := users.Where(sq.Eq{"username": []string{"moe", "larry", "curly", "shemp"}})
+three_stooges := stooges.Limit(3)
+rows, err := three_stooges.RunWith(db).Query()
+
+// Behaves like:
+rows, err := db.Query("SELECT * FROM users WHERE username IN (?,?,?,?) LIMIT 3",
+ "moe", "larry", "curly", "shemp")
+```
+
+Squirrel makes conditional query building a breeze:
+
+```go
+if len(q) > 0 {
+ users = users.Where("name LIKE ?", fmt.Sprint("%", q, "%"))
+}
+```
+
+Squirrel wants to make your life easier:
+
+```go
+// StmtCache caches Prepared Stmts for you
+dbCache := sq.NewStmtCache(db)
+
+// StatementBuilder keeps your syntax neat
+mydb := sq.StatementBuilder.RunWith(dbCache)
+select_users := mydb.Select("*").From("users")
+```
+
+Squirrel loves PostgreSQL:
+
+```go
+psql := sq.StatementBuilder.PlaceholderFormat(sq.Dollar)
+
+// You use question marks for placeholders...
+sql, _, _ := psql.Select("*").From("elephants").Where("name IN (?,?)", "Dumbo", "Verna").ToSql()
+
+/// ...squirrel replaces them using PlaceholderFormat.
+sql == "SELECT * FROM elephants WHERE name IN ($1,$2)"
+
+
+/// You can retrieve id ...
+query := sq.Insert("nodes").
+ Columns("uuid", "type", "data").
+ Values(node.Uuid, node.Type, node.Data).
+ Suffix("RETURNING \"id\"").
+ RunWith(m.db).
+ PlaceholderFormat(sq.Dollar)
+
+query.QueryRow().Scan(&node.id)
+```
+
+You can escape question marks by inserting two question marks:
+
+```sql
+SELECT * FROM nodes WHERE meta->'format' ??| array[?,?]
+```
+
+will generate with the Dollar Placeholder:
+
+```sql
+SELECT * FROM nodes WHERE meta->'format' ?| array[$1,$2]
+```
+
+## FAQ
+
+* **How can I build an IN query on composite keys / tuples, e.g. `WHERE (col1, col2) IN ((1,2),(3,4))`? ([#104](https://github.com/Masterminds/squirrel/issues/104))**
+
+ Squirrel does not explicitly support tuples, but you can get the same effect with e.g.:
+
+ ```go
+ sq.Or{
+ sq.Eq{"col1": 1, "col2": 2},
+ sq.Eq{"col1": 3, "col2": 4}}
+ ```
+
+ ```sql
+ WHERE (col1 = 1 AND col2 = 2) OR (col1 = 3 AND col2 = 4)
+ ```
+
+ (which should produce the same query plan as the tuple version)
+
+* **Why doesn't `Eq{"mynumber": []uint8{1,2,3}}` turn into an `IN` query? ([#114](https://github.com/Masterminds/squirrel/issues/114))**
+
+ Values of type `[]byte` are handled specially by `database/sql`. In Go, [`byte` is just an alias of `uint8`](https://golang.org/pkg/builtin/#byte), so there is no way to distinguish `[]uint8` from `[]byte`.
+
+* **Some features are poorly documented!**
+
+ This isn't a frequent complaints section!
+
+* **Some features are poorly documented?**
+
+ Yes. The tests should be considered a part of the documentation; take a look at those for ideas on how to express more complex queries.
+
+## License
+
+Squirrel is released under the
+[MIT License](http://www.opensource.org/licenses/MIT).
diff --git a/vendor/github.com/Masterminds/squirrel/case.go b/vendor/github.com/Masterminds/squirrel/case.go
new file mode 100644
index 0000000..299e14b
--- /dev/null
+++ b/vendor/github.com/Masterminds/squirrel/case.go
@@ -0,0 +1,128 @@
+package squirrel
+
+import (
+ "bytes"
+ "errors"
+
+ "github.com/lann/builder"
+)
+
+func init() {
+ builder.Register(CaseBuilder{}, caseData{})
+}
+
+// sqlizerBuffer is a helper that allows to write many Sqlizers one by one
+// without constant checks for errors that may come from Sqlizer
+type sqlizerBuffer struct {
+ bytes.Buffer
+ args []interface{}
+ err error
+}
+
+// WriteSql converts Sqlizer to SQL strings and writes it to buffer
+func (b *sqlizerBuffer) WriteSql(item Sqlizer) {
+ if b.err != nil {
+ return
+ }
+
+ var str string
+ var args []interface{}
+ str, args, b.err = nestedToSql(item)
+
+ if b.err != nil {
+ return
+ }
+
+ b.WriteString(str)
+ b.WriteByte(' ')
+ b.args = append(b.args, args...)
+}
+
+func (b *sqlizerBuffer) ToSql() (string, []interface{}, error) {
+ return b.String(), b.args, b.err
+}
+
+// whenPart is a helper structure to describe SQLs "WHEN ... THEN ..." expression
+type whenPart struct {
+ when Sqlizer
+ then Sqlizer
+}
+
+func newWhenPart(when interface{}, then interface{}) whenPart {
+ return whenPart{newPart(when), newPart(then)}
+}
+
+// caseData holds all the data required to build a CASE SQL construct
+type caseData struct {
+ What Sqlizer
+ WhenParts []whenPart
+ Else Sqlizer
+}
+
+// ToSql implements Sqlizer
+func (d *caseData) ToSql() (sqlStr string, args []interface{}, err error) {
+ if len(d.WhenParts) == 0 {
+ err = errors.New("case expression must contain at lease one WHEN clause")
+
+ return
+ }
+
+ sql := sqlizerBuffer{}
+
+ sql.WriteString("CASE ")
+ if d.What != nil {
+ sql.WriteSql(d.What)
+ }
+
+ for _, p := range d.WhenParts {
+ sql.WriteString("WHEN ")
+ sql.WriteSql(p.when)
+ sql.WriteString("THEN ")
+ sql.WriteSql(p.then)
+ }
+
+ if d.Else != nil {
+ sql.WriteString("ELSE ")
+ sql.WriteSql(d.Else)
+ }
+
+ sql.WriteString("END")
+
+ return sql.ToSql()
+}
+
+// CaseBuilder builds SQL CASE construct which could be used as parts of queries.
+type CaseBuilder builder.Builder
+
+// ToSql builds the query into a SQL string and bound args.
+func (b CaseBuilder) ToSql() (string, []interface{}, error) {
+ data := builder.GetStruct(b).(caseData)
+ return data.ToSql()
+}
+
+// MustSql builds the query into a SQL string and bound args.
+// It panics if there are any errors.
+func (b CaseBuilder) MustSql() (string, []interface{}) {
+ sql, args, err := b.ToSql()
+ if err != nil {
+ panic(err)
+ }
+ return sql, args
+}
+
+// what sets optional value for CASE construct "CASE [value] ..."
+func (b CaseBuilder) what(expr interface{}) CaseBuilder {
+ return builder.Set(b, "What", newPart(expr)).(CaseBuilder)
+}
+
+// When adds "WHEN ... THEN ..." part to CASE construct
+func (b CaseBuilder) When(when interface{}, then interface{}) CaseBuilder {
+ // TODO: performance hint: replace slice of WhenPart with just slice of parts
+ // where even indices of the slice belong to "when"s and odd indices belong to "then"s
+ return builder.Append(b, "WhenParts", newWhenPart(when, then)).(CaseBuilder)
+}
+
+// What sets optional "ELSE ..." part for CASE construct
+func (b CaseBuilder) Else(expr interface{}) CaseBuilder {
+ return builder.Set(b, "Else", newPart(expr)).(CaseBuilder)
+}
diff --git a/vendor/github.com/Masterminds/squirrel/delete.go b/vendor/github.com/Masterminds/squirrel/delete.go
new file mode 100644
index 0000000..f3f31e6
--- /dev/null
+++ b/vendor/github.com/Masterminds/squirrel/delete.go
@@ -0,0 +1,191 @@
+package squirrel
+
+import (
+ "bytes"
+ "database/sql"
+ "fmt"
+ "strings"
+
+ "github.com/lann/builder"
+)
+
+type deleteData struct {
+ PlaceholderFormat PlaceholderFormat
+ RunWith BaseRunner
+ Prefixes []Sqlizer
+ From string
+ WhereParts []Sqlizer
+ OrderBys []string
+ Limit string
+ Offset string
+ Suffixes []Sqlizer
+}
+
+func (d *deleteData) Exec() (sql.Result, error) {
+ if d.RunWith == nil {
+ return nil, RunnerNotSet
+ }
+ return ExecWith(d.RunWith, d)
+}
+
+func (d *deleteData) ToSql() (sqlStr string, args []interface{}, err error) {
+ if len(d.From) == 0 {
+ err = fmt.Errorf("delete statements must specify a From table")
+ return
+ }
+
+ sql := &bytes.Buffer{}
+
+ if len(d.Prefixes) > 0 {
+ args, err = appendToSql(d.Prefixes, sql, " ", args)
+ if err != nil {
+ return
+ }
+
+ sql.WriteString(" ")
+ }
+
+ sql.WriteString("DELETE FROM ")
+ sql.WriteString(d.From)
+
+ if len(d.WhereParts) > 0 {
+ sql.WriteString(" WHERE ")
+ args, err = appendToSql(d.WhereParts, sql, " AND ", args)
+ if err != nil {
+ return
+ }
+ }
+
+ if len(d.OrderBys) > 0 {
+ sql.WriteString(" ORDER BY ")
+ sql.WriteString(strings.Join(d.OrderBys, ", "))
+ }
+
+ if len(d.Limit) > 0 {
+ sql.WriteString(" LIMIT ")
+ sql.WriteString(d.Limit)
+ }
+
+ if len(d.Offset) > 0 {
+ sql.WriteString(" OFFSET ")
+ sql.WriteString(d.Offset)
+ }
+
+ if len(d.Suffixes) > 0 {
+ sql.WriteString(" ")
+ args, err = appendToSql(d.Suffixes, sql, " ", args)
+ if err != nil {
+ return
+ }
+ }
+
+ sqlStr, err = d.PlaceholderFormat.ReplacePlaceholders(sql.String())
+ return
+}
+
+// Builder
+
+// DeleteBuilder builds SQL DELETE statements.
+type DeleteBuilder builder.Builder
+
+func init() {
+ builder.Register(DeleteBuilder{}, deleteData{})
+}
+
+// Format methods
+
+// PlaceholderFormat sets PlaceholderFormat (e.g. Question or Dollar) for the
+// query.
+func (b DeleteBuilder) PlaceholderFormat(f PlaceholderFormat) DeleteBuilder {
+ return builder.Set(b, "PlaceholderFormat", f).(DeleteBuilder)
+}
+
+// Runner methods
+
+// RunWith sets a Runner (like database/sql.DB) to be used with e.g. Exec.
+func (b DeleteBuilder) RunWith(runner BaseRunner) DeleteBuilder {
+ return setRunWith(b, runner).(DeleteBuilder)
+}
+
+// Exec builds and Execs the query with the Runner set by RunWith.
+func (b DeleteBuilder) Exec() (sql.Result, error) {
+ data := builder.GetStruct(b).(deleteData)
+ return data.Exec()
+}
+
+// SQL methods
+
+// ToSql builds the query into a SQL string and bound args.
+func (b DeleteBuilder) ToSql() (string, []interface{}, error) {
+ data := builder.GetStruct(b).(deleteData)
+ return data.ToSql()
+}
+
+// MustSql builds the query into a SQL string and bound args.
+// It panics if there are any errors.
+func (b DeleteBuilder) MustSql() (string, []interface{}) {
+ sql, args, err := b.ToSql()
+ if err != nil {
+ panic(err)
+ }
+ return sql, args
+}
+
+// Prefix adds an expression to the beginning of the query
+func (b DeleteBuilder) Prefix(sql string, args ...interface{}) DeleteBuilder {
+ return b.PrefixExpr(Expr(sql, args...))
+}
+
+// PrefixExpr adds an expression to the very beginning of the query
+func (b DeleteBuilder) PrefixExpr(expr Sqlizer) DeleteBuilder {
+ return builder.Append(b, "Prefixes", expr).(DeleteBuilder)
+}
+
+// From sets the table to be deleted from.
+func (b DeleteBuilder) From(from string) DeleteBuilder {
+ return builder.Set(b, "From", from).(DeleteBuilder)
+}
+
+// Where adds WHERE expressions to the query.
+//
+// See SelectBuilder.Where for more information.
+func (b DeleteBuilder) Where(pred interface{}, args ...interface{}) DeleteBuilder {
+ return builder.Append(b, "WhereParts", newWherePart(pred, args...)).(DeleteBuilder)
+}
+
+// OrderBy adds ORDER BY expressions to the query.
+func (b DeleteBuilder) OrderBy(orderBys ...string) DeleteBuilder {
+ return builder.Extend(b, "OrderBys", orderBys).(DeleteBuilder)
+}
+
+// Limit sets a LIMIT clause on the query.
+func (b DeleteBuilder) Limit(limit uint64) DeleteBuilder {
+ return builder.Set(b, "Limit", fmt.Sprintf("%d", limit)).(DeleteBuilder)
+}
+
+// Offset sets a OFFSET clause on the query.
+func (b DeleteBuilder) Offset(offset uint64) DeleteBuilder {
+ return builder.Set(b, "Offset", fmt.Sprintf("%d", offset)).(DeleteBuilder)
+}
+
+// Suffix adds an expression to the end of the query
+func (b DeleteBuilder) Suffix(sql string, args ...interface{}) DeleteBuilder {
+ return b.SuffixExpr(Expr(sql, args...))
+}
+
+// SuffixExpr adds an expression to the end of the query
+func (b DeleteBuilder) SuffixExpr(expr Sqlizer) DeleteBuilder {
+ return builder.Append(b, "Suffixes", expr).(DeleteBuilder)
+}
+
+func (b DeleteBuilder) Query() (*sql.Rows, error) {
+ data := builder.GetStruct(b).(deleteData)
+ return data.Query()
+}
+
+func (d *deleteData) Query() (*sql.Rows, error) {
+ if d.RunWith == nil {
+ return nil, RunnerNotSet
+ }
+ return QueryWith(d.RunWith, d)
+}
diff --git a/vendor/github.com/Masterminds/squirrel/delete_ctx.go b/vendor/github.com/Masterminds/squirrel/delete_ctx.go
new file mode 100644
index 0000000..de83c55
--- /dev/null
+++ b/vendor/github.com/Masterminds/squirrel/delete_ctx.go
@@ -0,0 +1,69 @@
+// +build go1.8
+
+package squirrel
+
+import (
+ "context"
+ "database/sql"
+
+ "github.com/lann/builder"
+)
+
+func (d *deleteData) ExecContext(ctx context.Context) (sql.Result, error) {
+ if d.RunWith == nil {
+ return nil, RunnerNotSet
+ }
+ ctxRunner, ok := d.RunWith.(ExecerContext)
+ if !ok {
+ return nil, NoContextSupport
+ }
+ return ExecContextWith(ctx, ctxRunner, d)
+}
+
+func (d *deleteData) QueryContext(ctx context.Context) (*sql.Rows, error) {
+ if d.RunWith == nil {
+ return nil, RunnerNotSet
+ }
+ ctxRunner, ok := d.RunWith.(QueryerContext)
+ if !ok {
+ return nil, NoContextSupport
+ }
+ return QueryContextWith(ctx, ctxRunner, d)
+}
+
+func (d *deleteData) QueryRowContext(ctx context.Context) RowScanner {
+ if d.RunWith == nil {
+ return &Row{err: RunnerNotSet}
+ }
+ queryRower, ok := d.RunWith.(QueryRowerContext)
+ if !ok {
+ if _, ok := d.RunWith.(QueryerContext); !ok {
+ return &Row{err: RunnerNotQueryRunner}
+ }
+ return &Row{err: NoContextSupport}
+ }
+ return QueryRowContextWith(ctx, queryRower, d)
+}
+
+// ExecContext builds and ExecContexts the query with the Runner set by RunWith.
+func (b DeleteBuilder) ExecContext(ctx context.Context) (sql.Result, error) {
+ data := builder.GetStruct(b).(deleteData)
+ return data.ExecContext(ctx)
+}
+
+// QueryContext builds and QueryContexts the query with the Runner set by RunWith.
+func (b DeleteBuilder) QueryContext(ctx context.Context) (*sql.Rows, error) {
+ data := builder.GetStruct(b).(deleteData)
+ return data.QueryContext(ctx)
+}
+
+// QueryRowContext builds and QueryRowContexts the query with the Runner set by RunWith.
+func (b DeleteBuilder) QueryRowContext(ctx context.Context) RowScanner {
+ data := builder.GetStruct(b).(deleteData)
+ return data.QueryRowContext(ctx)
+}
+
+// ScanContext is a shortcut for QueryRowContext().Scan.
+func (b DeleteBuilder) ScanContext(ctx context.Context, dest ...interface{}) error {
+ return b.QueryRowContext(ctx).Scan(dest...)
+}
diff --git a/vendor/github.com/Masterminds/squirrel/expr.go b/vendor/github.com/Masterminds/squirrel/expr.go
new file mode 100644
index 0000000..eba1b45
--- /dev/null
+++ b/vendor/github.com/Masterminds/squirrel/expr.go
@@ -0,0 +1,419 @@
+package squirrel
+
+import (
+ "bytes"
+ "database/sql/driver"
+ "fmt"
+ "reflect"
+ "sort"
+ "strings"
+)
+
+const (
+ // Portable true/false literals.
+ sqlTrue = "(1=1)"
+ sqlFalse = "(1=0)"
+)
+
+type expr struct {
+ sql string
+ args []interface{}
+}
+
+// Expr builds an expression from a SQL fragment and arguments.
+//
+// Ex:
+// Expr("FROM_UNIXTIME(?)", t)
+func Expr(sql string, args ...interface{}) Sqlizer {
+ return expr{sql: sql, args: args}
+}
+
+func (e expr) ToSql() (sql string, args []interface{}, err error) {
+ simple := true
+ for _, arg := range e.args {
+ if _, ok := arg.(Sqlizer); ok {
+ simple = false
+ }
+ }
+ if simple {
+ return e.sql, e.args, nil
+ }
+
+ buf := &bytes.Buffer{}
+ ap := e.args
+ sp := e.sql
+
+ var isql string
+ var iargs []interface{}
+
+ for err == nil && len(ap) > 0 && len(sp) > 0 {
+ i := strings.Index(sp, "?")
+ if i < 0 {
+ // no more placeholders
+ break
+ }
+ if len(sp) > i+1 && sp[i+1:i+2] == "?" {
+ // escaped "??"; append it and step past
+ buf.WriteString(sp[:i+2])
+ sp = sp[i+2:]
+ continue
+ }
+
+ if as, ok := ap[0].(Sqlizer); ok {
+ // sqlizer argument; expand it and append the result
+ isql, iargs, err = as.ToSql()
+ buf.WriteString(sp[:i])
+ buf.WriteString(isql)
+ args = append(args, iargs...)
+ } else {
+ // normal argument; append it and the placeholder
+ buf.WriteString(sp[:i+1])
+ args = append(args, ap[0])
+ }
+
+ // step past the argument and placeholder
+ ap = ap[1:]
+ sp = sp[i+1:]
+ }
+
+ // append the remaining sql and arguments
+ buf.WriteString(sp)
+ return buf.String(), append(args, ap...), err
+}
+
+type concatExpr []interface{}
+
+func (ce concatExpr) ToSql() (sql string, args []interface{}, err error) {
+ for _, part := range ce {
+ switch p := part.(type) {
+ case string:
+ sql += p
+ case Sqlizer:
+ pSql, pArgs, err := p.ToSql()
+ if err != nil {
+ return "", nil, err
+ }
+ sql += pSql
+ args = append(args, pArgs...)
+ default:
+ return "", nil, fmt.Errorf("%#v is not a string or Sqlizer", part)
+ }
+ }
+ return
+}
+
+// ConcatExpr builds an expression by concatenating strings and other expressions.
+//
+// Ex:
+// name_expr := Expr("CONCAT(?, ' ', ?)", firstName, lastName)
+// ConcatExpr("COALESCE(full_name,", name_expr, ")")
+func ConcatExpr(parts ...interface{}) concatExpr {
+ return concatExpr(parts)
+}
+
+// aliasExpr helps to alias part of SQL query generated with underlying "expr"
+type aliasExpr struct {
+ expr Sqlizer
+ alias string
+}
+
+// Alias allows to define alias for column in SelectBuilder. Useful when column is
+// defined as complex expression like IF or CASE
+// Ex:
+// .Column(Alias(caseStmt, "case_column"))
+func Alias(expr Sqlizer, alias string) aliasExpr {
+ return aliasExpr{expr, alias}
+}
+
+func (e aliasExpr) ToSql() (sql string, args []interface{}, err error) {
+ sql, args, err = e.expr.ToSql()
+ if err == nil {
+ sql = fmt.Sprintf("(%s) AS %s", sql, e.alias)
+ }
+ return
+}
+
+// Eq is syntactic sugar for use with Where/Having/Set methods.
+type Eq map[string]interface{}
+
+func (eq Eq) toSQL(useNotOpr bool) (sql string, args []interface{}, err error) {
+ if len(eq) == 0 {
+ // Empty Sql{} evaluates to true.
+ sql = sqlTrue
+ return
+ }
+
+ var (
+ exprs []string
+ equalOpr = "="
+ inOpr = "IN"
+ nullOpr = "IS"
+ inEmptyExpr = sqlFalse
+ )
+
+ if useNotOpr {
+ equalOpr = "<>"
+ inOpr = "NOT IN"
+ nullOpr = "IS NOT"
+ inEmptyExpr = sqlTrue
+ }
+
+ sortedKeys := getSortedKeys(eq)
+ for _, key := range sortedKeys {
+ var expr string
+ val := eq[key]
+
+ switch v := val.(type) {
+ case driver.Valuer:
+ if val, err = v.Value(); err != nil {
+ return
+ }
+ }
+
+ r := reflect.ValueOf(val)
+ if r.Kind() == reflect.Ptr {
+ if r.IsNil() {
+ val = nil
+ } else {
+ val = r.Elem().Interface()
+ }
+ }
+
+ if val == nil {
+ expr = fmt.Sprintf("%s %s NULL", key, nullOpr)
+ } else {
+ if isListType(val) {
+ valVal := reflect.ValueOf(val)
+ if valVal.Len() == 0 {
+ expr = inEmptyExpr
+ if args == nil {
+ args = []interface{}{}
+ }
+ } else {
+ for i := 0; i < valVal.Len(); i++ {
+ args = append(args, valVal.Index(i).Interface())
+ }
+ expr = fmt.Sprintf("%s %s (%s)", key, inOpr, Placeholders(valVal.Len()))
+ }
+ } else {
+ expr = fmt.Sprintf("%s %s ?", key, equalOpr)
+ args = append(args, val)
+ }
+ }
+ exprs = append(exprs, expr)
+ }
+ sql = strings.Join(exprs, " AND ")
+ return
+}
+
+func (eq Eq) ToSql() (sql string, args []interface{}, err error) {
+ return eq.toSQL(false)
+}
+
+// NotEq is syntactic sugar for use with Where/Having/Set methods.
+// Ex:
+// .Where(NotEq{"id": 1}) == "id <> 1"
+type NotEq Eq
+
+func (neq NotEq) ToSql() (sql string, args []interface{}, err error) {
+ return Eq(neq).toSQL(true)
+}
+
+// Like is syntactic sugar for use with LIKE conditions.
+// Ex:
+// .Where(Like{"name": "%irrel"})
+type Like map[string]interface{}
+
+func (lk Like) toSql(opr string) (sql string, args []interface{}, err error) {
+ var exprs []string
+ for key, val := range lk {
+ expr := ""
+
+ switch v := val.(type) {
+ case driver.Valuer:
+ if val, err = v.Value(); err != nil {
+ return
+ }
+ }
+
+ if val == nil {
+ err = fmt.Errorf("cannot use null with like operators")
+ return
+ } else {
+ if isListType(val) {
+ err = fmt.Errorf("cannot use array or slice with like operators")
+ return
+ } else {
+ expr = fmt.Sprintf("%s %s ?", key, opr)
+ args = append(args, val)
+ }
+ }
+ exprs = append(exprs, expr)
+ }
+ sql = strings.Join(exprs, " AND ")
+ return
+}
+
+func (lk Like) ToSql() (sql string, args []interface{}, err error) {
+ return lk.toSql("LIKE")
+}
+
+// NotLike is syntactic sugar for use with LIKE conditions.
+// Ex:
+// .Where(NotLike{"name": "%irrel"})
+type NotLike Like
+
+func (nlk NotLike) ToSql() (sql string, args []interface{}, err error) {
+ return Like(nlk).toSql("NOT LIKE")
+}
+
+// ILike is syntactic sugar for use with ILIKE conditions.
+// Ex:
+// .Where(ILike{"name": "sq%"})
+type ILike Like
+
+func (ilk ILike) ToSql() (sql string, args []interface{}, err error) {
+ return Like(ilk).toSql("ILIKE")
+}
+
+// NotILike is syntactic sugar for use with ILIKE conditions.
+// Ex:
+// .Where(NotILike{"name": "sq%"})
+type NotILike Like
+
+func (nilk NotILike) ToSql() (sql string, args []interface{}, err error) {
+ return Like(nilk).toSql("NOT ILIKE")
+}
+
+// Lt is syntactic sugar for use with Where/Having/Set methods.
+// Ex:
+// .Where(Lt{"id": 1})
+type Lt map[string]interface{}
+
+func (lt Lt) toSql(opposite, orEq bool) (sql string, args []interface{}, err error) {
+ var (
+ exprs []string
+ opr = "<"
+ )
+
+ if opposite {
+ opr = ">"
+ }
+
+ if orEq {
+ opr = fmt.Sprintf("%s%s", opr, "=")
+ }
+
+ sortedKeys := getSortedKeys(lt)
+ for _, key := range sortedKeys {
+ var expr string
+ val := lt[key]
+
+ switch v := val.(type) {
+ case driver.Valuer:
+ if val, err = v.Value(); err != nil {
+ return
+ }
+ }
+
+ if val == nil {
+ err = fmt.Errorf("cannot use null with less than or greater than operators")
+ return
+ }
+ if isListType(val) {
+ err = fmt.Errorf("cannot use array or slice with less than or greater than operators")
+ return
+ }
+ expr = fmt.Sprintf("%s %s ?", key, opr)
+ args = append(args, val)
+
+ exprs = append(exprs, expr)
+ }
+ sql = strings.Join(exprs, " AND ")
+ return
+}
+
+func (lt Lt) ToSql() (sql string, args []interface{}, err error) {
+ return lt.toSql(false, false)
+}
+
+// LtOrEq is syntactic sugar for use with Where/Having/Set methods.
+// Ex:
+// .Where(LtOrEq{"id": 1}) == "id <= 1"
+type LtOrEq Lt
+
+func (ltOrEq LtOrEq) ToSql() (sql string, args []interface{}, err error) {
+ return Lt(ltOrEq).toSql(false, true)
+}
+
+// Gt is syntactic sugar for use with Where/Having/Set methods.
+// Ex:
+// .Where(Gt{"id": 1}) == "id > 1"
+type Gt Lt
+
+func (gt Gt) ToSql() (sql string, args []interface{}, err error) {
+ return Lt(gt).toSql(true, false)
+}
+
+// GtOrEq is syntactic sugar for use with Where/Having/Set methods.
+// Ex:
+// .Where(GtOrEq{"id": 1}) == "id >= 1"
+type GtOrEq Lt
+
+func (gtOrEq GtOrEq) ToSql() (sql string, args []interface{}, err error) {
+ return Lt(gtOrEq).toSql(true, true)
+}
+
+type conj []Sqlizer
+
+func (c conj) join(sep, defaultExpr string) (sql string, args []interface{}, err error) {
+ if len(c) == 0 {
+ return defaultExpr, []interface{}{}, nil
+ }
+ var sqlParts []string
+ for _, sqlizer := range c {
+ partSQL, partArgs, err := nestedToSql(sqlizer)
+ if err != nil {
+ return "", nil, err
+ }
+ if partSQL != "" {
+ sqlParts = append(sqlParts, partSQL)
+ args = append(args, partArgs...)
+ }
+ }
+ if len(sqlParts) > 0 {
+ sql = fmt.Sprintf("(%s)", strings.Join(sqlParts, sep))
+ }
+ return
+}
+
+// And conjunction Sqlizers
+type And conj
+
+func (a And) ToSql() (string, []interface{}, error) {
+ return conj(a).join(" AND ", sqlTrue)
+}
+
+// Or conjunction Sqlizers
+type Or conj
+
+func (o Or) ToSql() (string, []interface{}, error) {
+ return conj(o).join(" OR ", sqlFalse)
+}
+
+func getSortedKeys(exp map[string]interface{}) []string {
+ sortedKeys := make([]string, 0, len(exp))
+ for k := range exp {
+ sortedKeys = append(sortedKeys, k)
+ }
+ sort.Strings(sortedKeys)
+ return sortedKeys
+}
+
+func isListType(val interface{}) bool {
+ if driver.IsValue(val) {
+ return false
+ }
+ valVal := reflect.ValueOf(val)
+ return valVal.Kind() == reflect.Array || valVal.Kind() == reflect.Slice
+}
diff --git a/vendor/github.com/Masterminds/squirrel/insert.go b/vendor/github.com/Masterminds/squirrel/insert.go
new file mode 100644
index 0000000..c23a579
--- /dev/null
+++ b/vendor/github.com/Masterminds/squirrel/insert.go
@@ -0,0 +1,298 @@
+package squirrel
+
+import (
+ "bytes"
+ "database/sql"
+ "errors"
+ "fmt"
+ "io"
+ "sort"
+ "strings"
+
+ "github.com/lann/builder"
+)
+
+type insertData struct {
+ PlaceholderFormat PlaceholderFormat
+ RunWith BaseRunner
+ Prefixes []Sqlizer
+ StatementKeyword string
+ Options []string
+ Into string
+ Columns []string
+ Values [][]interface{}
+ Suffixes []Sqlizer
+ Select *SelectBuilder
+}
+
+func (d *insertData) Exec() (sql.Result, error) {
+ if d.RunWith == nil {
+ return nil, RunnerNotSet
+ }
+ return ExecWith(d.RunWith, d)
+}
+
+func (d *insertData) Query() (*sql.Rows, error) {
+ if d.RunWith == nil {
+ return nil, RunnerNotSet
+ }
+ return QueryWith(d.RunWith, d)
+}
+
+func (d *insertData) QueryRow() RowScanner {
+ if d.RunWith == nil {
+ return &Row{err: RunnerNotSet}
+ }
+ queryRower, ok := d.RunWith.(QueryRower)
+ if !ok {
+ return &Row{err: RunnerNotQueryRunner}
+ }
+ return QueryRowWith(queryRower, d)
+}
+
+func (d *insertData) ToSql() (sqlStr string, args []interface{}, err error) {
+ if len(d.Into) == 0 {
+ err = errors.New("insert statements must specify a table")
+ return
+ }
+ if len(d.Values) == 0 && d.Select == nil {
+ err = errors.New("insert statements must have at least one set of values or select clause")
+ return
+ }
+
+ sql := &bytes.Buffer{}
+
+ if len(d.Prefixes) > 0 {
+ args, err = appendToSql(d.Prefixes, sql, " ", args)
+ if err != nil {
+ return
+ }
+
+ sql.WriteString(" ")
+ }
+
+ if d.StatementKeyword == "" {
+ sql.WriteString("INSERT ")
+ } else {
+ sql.WriteString(d.StatementKeyword)
+ sql.WriteString(" ")
+ }
+
+ if len(d.Options) > 0 {
+ sql.WriteString(strings.Join(d.Options, " "))
+ sql.WriteString(" ")
+ }
+
+ sql.WriteString("INTO ")
+ sql.WriteString(d.Into)
+ sql.WriteString(" ")
+
+ if len(d.Columns) > 0 {
+ sql.WriteString("(")
+ sql.WriteString(strings.Join(d.Columns, ","))
+ sql.WriteString(") ")
+ }
+
+ if d.Select != nil {
+ args, err = d.appendSelectToSQL(sql, args)
+ } else {
+ args, err = d.appendValuesToSQL(sql, args)
+ }
+ if err != nil {
+ return
+ }
+
+ if len(d.Suffixes) > 0 {
+ sql.WriteString(" ")
+ args, err = appendToSql(d.Suffixes, sql, " ", args)
+ if err != nil {
+ return
+ }
+ }
+
+ sqlStr, err = d.PlaceholderFormat.ReplacePlaceholders(sql.String())
+ return
+}
+
+func (d *insertData) appendValuesToSQL(w io.Writer, args []interface{}) ([]interface{}, error) {
+ if len(d.Values) == 0 {
+ return args, errors.New("values for insert statements are not set")
+ }
+
+ io.WriteString(w, "VALUES ")
+
+ valuesStrings := make([]string, len(d.Values))
+ for r, row := range d.Values {
+ valueStrings := make([]string, len(row))
+ for v, val := range row {
+ if vs, ok := val.(Sqlizer); ok {
+ vsql, vargs, err := vs.ToSql()
+ if err != nil {
+ return nil, err
+ }
+ valueStrings[v] = vsql
+ args = append(args, vargs...)
+ } else {
+ valueStrings[v] = "?"
+ args = append(args, val)
+ }
+ }
+ valuesStrings[r] = fmt.Sprintf("(%s)", strings.Join(valueStrings, ","))
+ }
+
+ io.WriteString(w, strings.Join(valuesStrings, ","))
+
+ return args, nil
+}
+
+func (d *insertData) appendSelectToSQL(w io.Writer, args []interface{}) ([]interface{}, error) {
+ if d.Select == nil {
+ return args, errors.New("select clause for insert statements are not set")
+ }
+
+ selectClause, sArgs, err := d.Select.ToSql()
+ if err != nil {
+ return args, err
+ }
+
+ io.WriteString(w, selectClause)
+ args = append(args, sArgs...)
+
+ return args, nil
+}
+
+// Builder
+
+// InsertBuilder builds SQL INSERT statements.
+type InsertBuilder builder.Builder
+
+func init() {
+ builder.Register(InsertBuilder{}, insertData{})
+}
+
+// Format methods
+
+// PlaceholderFormat sets PlaceholderFormat (e.g. Question or Dollar) for the
+// query.
+func (b InsertBuilder) PlaceholderFormat(f PlaceholderFormat) InsertBuilder {
+ return builder.Set(b, "PlaceholderFormat", f).(InsertBuilder)
+}
+
+// Runner methods
+
+// RunWith sets a Runner (like database/sql.DB) to be used with e.g. Exec.
+func (b InsertBuilder) RunWith(runner BaseRunner) InsertBuilder {
+ return setRunWith(b, runner).(InsertBuilder)
+}
+
+// Exec builds and Execs the query with the Runner set by RunWith.
+func (b InsertBuilder) Exec() (sql.Result, error) {
+ data := builder.GetStruct(b).(insertData)
+ return data.Exec()
+}
+
+// Query builds and Querys the query with the Runner set by RunWith.
+func (b InsertBuilder) Query() (*sql.Rows, error) {
+ data := builder.GetStruct(b).(insertData)
+ return data.Query()
+}
+
+// QueryRow builds and QueryRows the query with the Runner set by RunWith.
+func (b InsertBuilder) QueryRow() RowScanner {
+ data := builder.GetStruct(b).(insertData)
+ return data.QueryRow()
+}
+
+// Scan is a shortcut for QueryRow().Scan.
+func (b InsertBuilder) Scan(dest ...interface{}) error {
+ return b.QueryRow().Scan(dest...)
+}
+
+// SQL methods
+
+// ToSql builds the query into a SQL string and bound args.
+func (b InsertBuilder) ToSql() (string, []interface{}, error) {
+ data := builder.GetStruct(b).(insertData)
+ return data.ToSql()
+}
+
+// MustSql builds the query into a SQL string and bound args.
+// It panics if there are any errors.
+func (b InsertBuilder) MustSql() (string, []interface{}) {
+ sql, args, err := b.ToSql()
+ if err != nil {
+ panic(err)
+ }
+ return sql, args
+}
+
+// Prefix adds an expression to the beginning of the query
+func (b InsertBuilder) Prefix(sql string, args ...interface{}) InsertBuilder {
+ return b.PrefixExpr(Expr(sql, args...))
+}
+
+// PrefixExpr adds an expression to the very beginning of the query
+func (b InsertBuilder) PrefixExpr(expr Sqlizer) InsertBuilder {
+ return builder.Append(b, "Prefixes", expr).(InsertBuilder)
+}
+
+// Options adds keyword options before the INTO clause of the query.
+func (b InsertBuilder) Options(options ...string) InsertBuilder {
+ return builder.Extend(b, "Options", options).(InsertBuilder)
+}
+
+// Into sets the INTO clause of the query.
+func (b InsertBuilder) Into(from string) InsertBuilder {
+ return builder.Set(b, "Into", from).(InsertBuilder)
+}
+
+// Columns adds insert columns to the query.
+func (b InsertBuilder) Columns(columns ...string) InsertBuilder {
+ return builder.Extend(b, "Columns", columns).(InsertBuilder)
+}
+
+// Values adds a single row's values to the query.
+func (b InsertBuilder) Values(values ...interface{}) InsertBuilder {
+ return builder.Append(b, "Values", values).(InsertBuilder)
+}
+
+// Suffix adds an expression to the end of the query
+func (b InsertBuilder) Suffix(sql string, args ...interface{}) InsertBuilder {
+ return b.SuffixExpr(Expr(sql, args...))
+}
+
+// SuffixExpr adds an expression to the end of the query
+func (b InsertBuilder) SuffixExpr(expr Sqlizer) InsertBuilder {
+ return builder.Append(b, "Suffixes", expr).(InsertBuilder)
+}
+
+// SetMap set columns and values for insert builder from a map of column name and value
+// note that it will reset all previous columns and values was set if any
+func (b InsertBuilder) SetMap(clauses map[string]interface{}) InsertBuilder {
+ // Keep the columns in a consistent order by sorting the column key string.
+ cols := make([]string, 0, len(clauses))
+ for col := range clauses {
+ cols = append(cols, col)
+ }
+ sort.Strings(cols)
+
+ vals := make([]interface{}, 0, len(clauses))
+ for _, col := range cols {
+ vals = append(vals, clauses[col])
+ }
+
+ b = builder.Set(b, "Columns", cols).(InsertBuilder)
+ b = builder.Set(b, "Values", [][]interface{}{vals}).(InsertBuilder)
+
+ return b
+}
+
+// Select set Select clause for insert query
+// If Values and Select are used, then Select has higher priority
+func (b InsertBuilder) Select(sb SelectBuilder) InsertBuilder {
+ return builder.Set(b, "Select", &sb).(InsertBuilder)
+}
+
+func (b InsertBuilder) statementKeyword(keyword string) InsertBuilder {
+ return builder.Set(b, "StatementKeyword", keyword).(InsertBuilder)
+}
diff --git a/vendor/github.com/Masterminds/squirrel/insert_ctx.go b/vendor/github.com/Masterminds/squirrel/insert_ctx.go
new file mode 100644
index 0000000..4541c2f
--- /dev/null
+++ b/vendor/github.com/Masterminds/squirrel/insert_ctx.go
@@ -0,0 +1,69 @@
+// +build go1.8
+
+package squirrel
+
+import (
+ "context"
+ "database/sql"
+
+ "github.com/lann/builder"
+)
+
+func (d *insertData) ExecContext(ctx context.Context) (sql.Result, error) {
+ if d.RunWith == nil {
+ return nil, RunnerNotSet
+ }
+ ctxRunner, ok := d.RunWith.(ExecerContext)
+ if !ok {
+ return nil, NoContextSupport
+ }
+ return ExecContextWith(ctx, ctxRunner, d)
+}
+
+func (d *insertData) QueryContext(ctx context.Context) (*sql.Rows, error) {
+ if d.RunWith == nil {
+ return nil, RunnerNotSet
+ }
+ ctxRunner, ok := d.RunWith.(QueryerContext)
+ if !ok {
+ return nil, NoContextSupport
+ }
+ return QueryContextWith(ctx, ctxRunner, d)
+}
+
+func (d *insertData) QueryRowContext(ctx context.Context) RowScanner {
+ if d.RunWith == nil {
+ return &Row{err: RunnerNotSet}
+ }
+ queryRower, ok := d.RunWith.(QueryRowerContext)
+ if !ok {
+ if _, ok := d.RunWith.(QueryerContext); !ok {
+ return &Row{err: RunnerNotQueryRunner}
+ }
+ return &Row{err: NoContextSupport}
+ }
+ return QueryRowContextWith(ctx, queryRower, d)
+}
+
+// ExecContext builds and ExecContexts the query with the Runner set by RunWith.
+func (b InsertBuilder) ExecContext(ctx context.Context) (sql.Result, error) {
+ data := builder.GetStruct(b).(insertData)
+ return data.ExecContext(ctx)
+}
+
+// QueryContext builds and QueryContexts the query with the Runner set by RunWith.
+func (b InsertBuilder) QueryContext(ctx context.Context) (*sql.Rows, error) {
+ data := builder.GetStruct(b).(insertData)
+ return data.QueryContext(ctx)
+}
+
+// QueryRowContext builds and QueryRowContexts the query with the Runner set by RunWith.
+func (b InsertBuilder) QueryRowContext(ctx context.Context) RowScanner {
+ data := builder.GetStruct(b).(insertData)
+ return data.QueryRowContext(ctx)
+}
+
+// ScanContext is a shortcut for QueryRowContext().Scan.
+func (b InsertBuilder) ScanContext(ctx context.Context, dest ...interface{}) error {
+ return b.QueryRowContext(ctx).Scan(dest...)
+}
diff --git a/vendor/github.com/Masterminds/squirrel/part.go b/vendor/github.com/Masterminds/squirrel/part.go
new file mode 100644
index 0000000..c58f68f
--- /dev/null
+++ b/vendor/github.com/Masterminds/squirrel/part.go
@@ -0,0 +1,63 @@
+package squirrel
+
+import (
+ "fmt"
+ "io"
+)
+
+type part struct {
+ pred interface{}
+ args []interface{}
+}
+
+func newPart(pred interface{}, args ...interface{}) Sqlizer {
+ return &part{pred, args}
+}
+
+func (p part) ToSql() (sql string, args []interface{}, err error) {
+ switch pred := p.pred.(type) {
+ case nil:
+ // no-op
+ case Sqlizer:
+ sql, args, err = nestedToSql(pred)
+ case string:
+ sql = pred
+ args = p.args
+ default:
+ err = fmt.Errorf("expected string or Sqlizer, not %T", pred)
+ }
+ return
+}
+
+func nestedToSql(s Sqlizer) (string, []interface{}, error) {
+ if raw, ok := s.(rawSqlizer); ok {
+ return raw.toSqlRaw()
+ } else {
+ return s.ToSql()
+ }
+}
+
+func appendToSql(parts []Sqlizer, w io.Writer, sep string, args []interface{}) ([]interface{}, error) {
+ for i, p := range parts {
+ partSql, partArgs, err := nestedToSql(p)
+ if err != nil {
+ return nil, err
+ } else if len(partSql) == 0 {
+ continue
+ }
+
+ if i > 0 {
+ _, err := io.WriteString(w, sep)
+ if err != nil {
+ return nil, err
+ }
+ }
+
+ _, err = io.WriteString(w, partSql)
+ if err != nil {
+ return nil, err
+ }
+ args = append(args, partArgs...)
+ }
+ return args, nil
+}
diff --git a/vendor/github.com/Masterminds/squirrel/placeholder.go b/vendor/github.com/Masterminds/squirrel/placeholder.go
new file mode 100644
index 0000000..8e97a6c
--- /dev/null
+++ b/vendor/github.com/Masterminds/squirrel/placeholder.go
@@ -0,0 +1,114 @@
+package squirrel
+
+import (
+ "bytes"
+ "fmt"
+ "strings"
+)
+
+// PlaceholderFormat is the interface that wraps the ReplacePlaceholders method.
+//
+// ReplacePlaceholders takes a SQL statement and replaces each question mark
+// placeholder with a (possibly different) SQL placeholder.
+type PlaceholderFormat interface {
+ ReplacePlaceholders(sql string) (string, error)
+}
+
+type placeholderDebugger interface {
+ debugPlaceholder() string
+}
+
+var (
+ // Question is a PlaceholderFormat instance that leaves placeholders as
+ // question marks.
+ Question = questionFormat{}
+
+ // Dollar is a PlaceholderFormat instance that replaces placeholders with
+ // dollar-prefixed positional placeholders (e.g. $1, $2, $3).
+ Dollar = dollarFormat{}
+
+ // Colon is a PlaceholderFormat instance that replaces placeholders with
+ // colon-prefixed positional placeholders (e.g. :1, :2, :3).
+ Colon = colonFormat{}
+
+ // AtP is a PlaceholderFormat instance that replaces placeholders with
+ // "@p"-prefixed positional placeholders (e.g. @p1, @p2, @p3).
+ AtP = atpFormat{}
+)
+
+type questionFormat struct{}
+
+func (questionFormat) ReplacePlaceholders(sql string) (string, error) {
+ return sql, nil
+}
+
+func (questionFormat) debugPlaceholder() string {
+ return "?"
+}
+
+type dollarFormat struct{}
+
+func (dollarFormat) ReplacePlaceholders(sql string) (string, error) {
+ return replacePositionalPlaceholders(sql, "$")
+}
+
+func (dollarFormat) debugPlaceholder() string {
+ return "$"
+}
+
+type colonFormat struct{}
+
+func (colonFormat) ReplacePlaceholders(sql string) (string, error) {
+ return replacePositionalPlaceholders(sql, ":")
+}
+
+func (colonFormat) debugPlaceholder() string {
+ return ":"
+}
+
+type atpFormat struct{}
+
+func (atpFormat) ReplacePlaceholders(sql string) (string, error) {
+ return replacePositionalPlaceholders(sql, "@p")
+}
+
+func (atpFormat) debugPlaceholder() string {
+ return "@p"
+}
+
+// Placeholders returns a string with count ? placeholders joined with commas.
+func Placeholders(count int) string {
+ if count < 1 {
+ return ""
+ }
+
+ return strings.Repeat(",?", count)[1:]
+}
+
+func replacePositionalPlaceholders(sql, prefix string) (string, error) {
+ buf := &bytes.Buffer{}
+ i := 0
+ for {
+ p := strings.Index(sql, "?")
+ if p == -1 {
+ break
+ }
+
+ if len(sql[p:]) > 1 && sql[p:p+2] == "??" { // escape ?? => ?
+ buf.WriteString(sql[:p])
+ buf.WriteString("?")
+ if len(sql[p:]) == 1 {
+ break
+ }
+ sql = sql[p+2:]
+ } else {
+ i++
+ buf.WriteString(sql[:p])
+ fmt.Fprintf(buf, "%s%d", prefix, i)
+ sql = sql[p+1:]
+ }
+ }
+
+ buf.WriteString(sql)
+ return buf.String(), nil
+}
diff --git a/vendor/github.com/Masterminds/squirrel/row.go b/vendor/github.com/Masterminds/squirrel/row.go
new file mode 100644
index 0000000..74ffda9
--- /dev/null
+++ b/vendor/github.com/Masterminds/squirrel/row.go
@@ -0,0 +1,22 @@
+package squirrel
+
+// RowScanner is the interface that wraps the Scan method.
+//
+// Scan behaves like database/sql.Row.Scan.
+type RowScanner interface {
+ Scan(...interface{}) error
+}
+
+// Row wraps database/sql.Row to let squirrel return new errors on Scan.
+type Row struct {
+ RowScanner
+ err error
+}
+
+// Scan returns Row.err or calls RowScanner.Scan.
+func (r *Row) Scan(dest ...interface{}) error {
+ if r.err != nil {
+ return r.err
+ }
+ return r.RowScanner.Scan(dest...)
+}
diff --git a/vendor/github.com/Masterminds/squirrel/select.go b/vendor/github.com/Masterminds/squirrel/select.go
new file mode 100644
index 0000000..d55ce4c
--- /dev/null
+++ b/vendor/github.com/Masterminds/squirrel/select.go
@@ -0,0 +1,403 @@
+package squirrel
+
+import (
+ "bytes"
+ "database/sql"
+ "fmt"
+ "strings"
+
+ "github.com/lann/builder"
+)
+
+type selectData struct {
+ PlaceholderFormat PlaceholderFormat
+ RunWith BaseRunner
+ Prefixes []Sqlizer
+ Options []string
+ Columns []Sqlizer
+ From Sqlizer
+ Joins []Sqlizer
+ WhereParts []Sqlizer
+ GroupBys []string
+ HavingParts []Sqlizer
+ OrderByParts []Sqlizer
+ Limit string
+ Offset string
+ Suffixes []Sqlizer
+}
+
+func (d *selectData) Exec() (sql.Result, error) {
+ if d.RunWith == nil {
+ return nil, RunnerNotSet
+ }
+ return ExecWith(d.RunWith, d)
+}
+
+func (d *selectData) Query() (*sql.Rows, error) {
+ if d.RunWith == nil {
+ return nil, RunnerNotSet
+ }
+ return QueryWith(d.RunWith, d)
+}
+
+func (d *selectData) QueryRow() RowScanner {
+ if d.RunWith == nil {
+ return &Row{err: RunnerNotSet}
+ }
+ queryRower, ok := d.RunWith.(QueryRower)
+ if !ok {
+ return &Row{err: RunnerNotQueryRunner}
+ }
+ return QueryRowWith(queryRower, d)
+}
+
+func (d *selectData) ToSql() (sqlStr string, args []interface{}, err error) {
+ sqlStr, args, err = d.toSqlRaw()
+ if err != nil {
+ return
+ }
+
+ sqlStr, err = d.PlaceholderFormat.ReplacePlaceholders(sqlStr)
+ return
+}
+
+func (d *selectData) toSqlRaw() (sqlStr string, args []interface{}, err error) {
+ if len(d.Columns) == 0 {
+ err = fmt.Errorf("select statements must have at least one result column")
+ return
+ }
+
+ sql := &bytes.Buffer{}
+
+ if len(d.Prefixes) > 0 {
+ args, err = appendToSql(d.Prefixes, sql, " ", args)
+ if err != nil {
+ return
+ }
+
+ sql.WriteString(" ")
+ }
+
+ sql.WriteString("SELECT ")
+
+ if len(d.Options) > 0 {
+ sql.WriteString(strings.Join(d.Options, " "))
+ sql.WriteString(" ")
+ }
+
+ if len(d.Columns) > 0 {
+ args, err = appendToSql(d.Columns, sql, ", ", args)
+ if err != nil {
+ return
+ }
+ }
+
+ if d.From != nil {
+ sql.WriteString(" FROM ")
+ args, err = appendToSql([]Sqlizer{d.From}, sql, "", args)
+ if err != nil {
+ return
+ }
+ }
+
+ if len(d.Joins) > 0 {
+ sql.WriteString(" ")
+ args, err = appendToSql(d.Joins, sql, " ", args)
+ if err != nil {
+ return
+ }
+ }
+
+ if len(d.WhereParts) > 0 {
+ sql.WriteString(" WHERE ")
+ args, err = appendToSql(d.WhereParts, sql, " AND ", args)
+ if err != nil {
+ return
+ }
+ }
+
+ if len(d.GroupBys) > 0 {
+ sql.WriteString(" GROUP BY ")
+ sql.WriteString(strings.Join(d.GroupBys, ", "))
+ }
+
+ if len(d.HavingParts) > 0 {
+ sql.WriteString(" HAVING ")
+ args, err = appendToSql(d.HavingParts, sql, " AND ", args)
+ if err != nil {
+ return
+ }
+ }
+
+ if len(d.OrderByParts) > 0 {
+ sql.WriteString(" ORDER BY ")
+ args, err = appendToSql(d.OrderByParts, sql, ", ", args)
+ if err != nil {
+ return
+ }
+ }
+
+ if len(d.Limit) > 0 {
+ sql.WriteString(" LIMIT ")
+ sql.WriteString(d.Limit)
+ }
+
+ if len(d.Offset) > 0 {
+ sql.WriteString(" OFFSET ")
+ sql.WriteString(d.Offset)
+ }
+
+ if len(d.Suffixes) > 0 {
+ sql.WriteString(" ")
+
+ args, err = appendToSql(d.Suffixes, sql, " ", args)
+ if err != nil {
+ return
+ }
+ }
+
+ sqlStr = sql.String()
+ return
+}
+
+// Builder
+
+// SelectBuilder builds SQL SELECT statements.
+type SelectBuilder builder.Builder
+
+func init() {
+ builder.Register(SelectBuilder{}, selectData{})
+}
+
+// Format methods
+
+// PlaceholderFormat sets PlaceholderFormat (e.g. Question or Dollar) for the
+// query.
+func (b SelectBuilder) PlaceholderFormat(f PlaceholderFormat) SelectBuilder {
+ return builder.Set(b, "PlaceholderFormat", f).(SelectBuilder)
+}
+
+// Runner methods
+
+// RunWith sets a Runner (like database/sql.DB) to be used with e.g. Exec.
+// For most cases runner will be a database connection.
+//
+// Internally we use this to mock out the database connection for testing.
+func (b SelectBuilder) RunWith(runner BaseRunner) SelectBuilder {
+ return setRunWith(b, runner).(SelectBuilder)
+}
+
+// Exec builds and Execs the query with the Runner set by RunWith.
+func (b SelectBuilder) Exec() (sql.Result, error) {
+ data := builder.GetStruct(b).(selectData)
+ return data.Exec()
+}
+
+// Query builds and Querys the query with the Runner set by RunWith.
+func (b SelectBuilder) Query() (*sql.Rows, error) {
+ data := builder.GetStruct(b).(selectData)
+ return data.Query()
+}
+
+// QueryRow builds and QueryRows the query with the Runner set by RunWith.
+func (b SelectBuilder) QueryRow() RowScanner {
+ data := builder.GetStruct(b).(selectData)
+ return data.QueryRow()
+}
+
+// Scan is a shortcut for QueryRow().Scan.
+func (b SelectBuilder) Scan(dest ...interface{}) error {
+ return b.QueryRow().Scan(dest...)
+}
+
+// SQL methods
+
+// ToSql builds the query into a SQL string and bound args.
+func (b SelectBuilder) ToSql() (string, []interface{}, error) {
+ data := builder.GetStruct(b).(selectData)
+ return data.ToSql()
+}
+
+func (b SelectBuilder) toSqlRaw() (string, []interface{}, error) {
+ data := builder.GetStruct(b).(selectData)
+ return data.toSqlRaw()
+}
+
+// MustSql builds the query into a SQL string and bound args.
+// It panics if there are any errors.
+func (b SelectBuilder) MustSql() (string, []interface{}) {
+ sql, args, err := b.ToSql()
+ if err != nil {
+ panic(err)
+ }
+ return sql, args
+}
+
+// Prefix adds an expression to the beginning of the query
+func (b SelectBuilder) Prefix(sql string, args ...interface{}) SelectBuilder {
+ return b.PrefixExpr(Expr(sql, args...))
+}
+
+// PrefixExpr adds an expression to the very beginning of the query
+func (b SelectBuilder) PrefixExpr(expr Sqlizer) SelectBuilder {
+ return builder.Append(b, "Prefixes", expr).(SelectBuilder)
+}
+
+// Distinct adds a DISTINCT clause to the query.
+func (b SelectBuilder) Distinct() SelectBuilder {
+ return b.Options("DISTINCT")
+}
+
+// Options adds select option to the query
+func (b SelectBuilder) Options(options ...string) SelectBuilder {
+ return builder.Extend(b, "Options", options).(SelectBuilder)
+}
+
+// Columns adds result columns to the query.
+func (b SelectBuilder) Columns(columns ...string) SelectBuilder {
+ parts := make([]interface{}, 0, len(columns))
+ for _, str := range columns {
+ parts = append(parts, newPart(str))
+ }
+ return builder.Extend(b, "Columns", parts).(SelectBuilder)
+}
+
+// RemoveColumns remove all columns from query.
+// Must add a new column with Column or Columns methods, otherwise
+// return a error.
+func (b SelectBuilder) RemoveColumns() SelectBuilder {
+ return builder.Delete(b, "Columns").(SelectBuilder)
+}
+
+// Column adds a result column to the query.
+// Unlike Columns, Column accepts args which will be bound to placeholders in
+// the columns string, for example:
+// Column("IF(col IN ("+squirrel.Placeholders(3)+"), 1, 0) as col", 1, 2, 3)
+func (b SelectBuilder) Column(column interface{}, args ...interface{}) SelectBuilder {
+ return builder.Append(b, "Columns", newPart(column, args...)).(SelectBuilder)
+}
+
+// From sets the FROM clause of the query.
+func (b SelectBuilder) From(from string) SelectBuilder {
+ return builder.Set(b, "From", newPart(from)).(SelectBuilder)
+}
+
+// FromSelect sets a subquery into the FROM clause of the query.
+func (b SelectBuilder) FromSelect(from SelectBuilder, alias string) SelectBuilder {
+ // Prevent misnumbered parameters in nested selects (#183).
+ from = from.PlaceholderFormat(Question)
+ return builder.Set(b, "From", Alias(from, alias)).(SelectBuilder)
+}
+
+// JoinClause adds a join clause to the query.
+func (b SelectBuilder) JoinClause(pred interface{}, args ...interface{}) SelectBuilder {
+ return builder.Append(b, "Joins", newPart(pred, args...)).(SelectBuilder)
+}
+
+// Join adds a JOIN clause to the query.
+func (b SelectBuilder) Join(join string, rest ...interface{}) SelectBuilder {
+ return b.JoinClause("JOIN "+join, rest...)
+}
+
+// LeftJoin adds a LEFT JOIN clause to the query.
+func (b SelectBuilder) LeftJoin(join string, rest ...interface{}) SelectBuilder {
+ return b.JoinClause("LEFT JOIN "+join, rest...)
+}
+
+// RightJoin adds a RIGHT JOIN clause to the query.
+func (b SelectBuilder) RightJoin(join string, rest ...interface{}) SelectBuilder {
+ return b.JoinClause("RIGHT JOIN "+join, rest...)
+}
+
+// InnerJoin adds a INNER JOIN clause to the query.
+func (b SelectBuilder) InnerJoin(join string, rest ...interface{}) SelectBuilder {
+ return b.JoinClause("INNER JOIN "+join, rest...)
+}
+
+// CrossJoin adds a CROSS JOIN clause to the query.
+func (b SelectBuilder) CrossJoin(join string, rest ...interface{}) SelectBuilder {
+ return b.JoinClause("CROSS JOIN "+join, rest...)
+}
+
+// Where adds an expression to the WHERE clause of the query.
+//
+// Expressions are ANDed together in the generated SQL.
+//
+// Where accepts several types for its pred argument:
+//
+// nil OR "" - ignored.
+//
+// string - SQL expression.
+// If the expression has SQL placeholders then a set of arguments must be passed
+// as well, one for each placeholder.
+//
+// map[string]interface{} OR Eq - map of SQL expressions to values. Each key is
+// transformed into an expression like "<key> = ?", with the corresponding value
+// bound to the placeholder. If the value is nil, the expression will be "<key>
+// IS NULL". If the value is an array or slice, the expression will be "<key> IN
+// (?,?,...)", with one placeholder for each item in the value. These expressions
+// are ANDed together.
+//
+// Where will panic if pred isn't any of the above types.
+func (b SelectBuilder) Where(pred interface{}, args ...interface{}) SelectBuilder {
+ if pred == nil || pred == "" {
+ return b
+ }
+ return builder.Append(b, "WhereParts", newWherePart(pred, args...)).(SelectBuilder)
+}
+
+// GroupBy adds GROUP BY expressions to the query.
+func (b SelectBuilder) GroupBy(groupBys ...string) SelectBuilder {
+ return builder.Extend(b, "GroupBys", groupBys).(SelectBuilder)
+}
+
+// Having adds an expression to the HAVING clause of the query.
+//
+// See Where.
+func (b SelectBuilder) Having(pred interface{}, rest ...interface{}) SelectBuilder {
+ return builder.Append(b, "HavingParts", newWherePart(pred, rest...)).(SelectBuilder)
+}
+
+// OrderByClause adds ORDER BY clause to the query.
+func (b SelectBuilder) OrderByClause(pred interface{}, args ...interface{}) SelectBuilder {
+ return builder.Append(b, "OrderByParts", newPart(pred, args...)).(SelectBuilder)
+}
+
+// OrderBy adds ORDER BY expressions to the query.
+func (b SelectBuilder) OrderBy(orderBys ...string) SelectBuilder {
+ for _, orderBy := range orderBys {
+ b = b.OrderByClause(orderBy)
+ }
+
+ return b
+}
+
+// Limit sets a LIMIT clause on the query.
+func (b SelectBuilder) Limit(limit uint64) SelectBuilder {
+ return builder.Set(b, "Limit", fmt.Sprintf("%d", limit)).(SelectBuilder)
+}
+
+// Limit ALL allows to access all records with limit
+func (b SelectBuilder) RemoveLimit() SelectBuilder {
+ return builder.Delete(b, "Limit").(SelectBuilder)
+}
+
+// Offset sets a OFFSET clause on the query.
+func (b SelectBuilder) Offset(offset uint64) SelectBuilder {
+ return builder.Set(b, "Offset", fmt.Sprintf("%d", offset)).(SelectBuilder)
+}
+
+// RemoveOffset removes OFFSET clause.
+func (b SelectBuilder) RemoveOffset() SelectBuilder {
+ return builder.Delete(b, "Offset").(SelectBuilder)
+}
+
+// Suffix adds an expression to the end of the query
+func (b SelectBuilder) Suffix(sql string, args ...interface{}) SelectBuilder {
+ return b.SuffixExpr(Expr(sql, args...))
+}
+
+// SuffixExpr adds an expression to the end of the query
+func (b SelectBuilder) SuffixExpr(expr Sqlizer) SelectBuilder {
+ return builder.Append(b, "Suffixes", expr).(SelectBuilder)
+}
diff --git a/vendor/github.com/Masterminds/squirrel/select_ctx.go b/vendor/github.com/Masterminds/squirrel/select_ctx.go
new file mode 100644
index 0000000..4c42c13
--- /dev/null
+++ b/vendor/github.com/Masterminds/squirrel/select_ctx.go
@@ -0,0 +1,69 @@
+// +build go1.8
+
+package squirrel
+
+import (
+ "context"
+ "database/sql"
+
+ "github.com/lann/builder"
+)
+
+func (d *selectData) ExecContext(ctx context.Context) (sql.Result, error) {
+ if d.RunWith == nil {
+ return nil, RunnerNotSet
+ }
+ ctxRunner, ok := d.RunWith.(ExecerContext)
+ if !ok {
+ return nil, NoContextSupport
+ }
+ return ExecContextWith(ctx, ctxRunner, d)
+}
+
+func (d *selectData) QueryContext(ctx context.Context) (*sql.Rows, error) {
+ if d.RunWith == nil {
+ return nil, RunnerNotSet
+ }
+ ctxRunner, ok := d.RunWith.(QueryerContext)
+ if !ok {
+ return nil, NoContextSupport
+ }
+ return QueryContextWith(ctx, ctxRunner, d)
+}
+
+func (d *selectData) QueryRowContext(ctx context.Context) RowScanner {
+ if d.RunWith == nil {
+ return &Row{err: RunnerNotSet}
+ }
+ queryRower, ok := d.RunWith.(QueryRowerContext)
+ if !ok {
+ if _, ok := d.RunWith.(QueryerContext); !ok {
+ return &Row{err: RunnerNotQueryRunner}
+ }
+ return &Row{err: NoContextSupport}
+ }
+ return QueryRowContextWith(ctx, queryRower, d)
+}
+
+// ExecContext builds and ExecContexts the query with the Runner set by RunWith.
+func (b SelectBuilder) ExecContext(ctx context.Context) (sql.Result, error) {
+ data := builder.GetStruct(b).(selectData)
+ return data.ExecContext(ctx)
+}
+
+// QueryContext builds and QueryContexts the query with the Runner set by RunWith.
+func (b SelectBuilder) QueryContext(ctx context.Context) (*sql.Rows, error) {
+ data := builder.GetStruct(b).(selectData)
+ return data.QueryContext(ctx)
+}
+
+// QueryRowContext builds and QueryRowContexts the query with the Runner set by RunWith.
+func (b SelectBuilder) QueryRowContext(ctx context.Context) RowScanner {
+ data := builder.GetStruct(b).(selectData)
+ return data.QueryRowContext(ctx)
+}
+
+// ScanContext is a shortcut for QueryRowContext().Scan.
+func (b SelectBuilder) ScanContext(ctx context.Context, dest ...interface{}) error {
+ return b.QueryRowContext(ctx).Scan(dest...)
+}
diff --git a/vendor/github.com/Masterminds/squirrel/squirrel.go b/vendor/github.com/Masterminds/squirrel/squirrel.go
new file mode 100644
index 0000000..46d456e
--- /dev/null
+++ b/vendor/github.com/Masterminds/squirrel/squirrel.go
@@ -0,0 +1,183 @@
+// Package squirrel provides a fluent SQL generator.
+//
+// See https://github.com/Masterminds/squirrel for examples.
+package squirrel
+
+import (
+ "bytes"
+ "database/sql"
+ "fmt"
+ "strings"
+
+ "github.com/lann/builder"
+)
+
+// Sqlizer is the interface that wraps the ToSql method.
+//
+// ToSql returns a SQL representation of the Sqlizer, along with a slice of args
+// as passed to e.g. database/sql.Exec. It can also return an error.
+type Sqlizer interface {
+ ToSql() (string, []interface{}, error)
+}
+
+// rawSqlizer is expected to do what Sqlizer does, but without finalizing placeholders.
+// This is useful for nested queries.
+type rawSqlizer interface {
+ toSqlRaw() (string, []interface{}, error)
+}
+
+// Execer is the interface that wraps the Exec method.
+//
+// Exec executes the given query as implemented by database/sql.Exec.
+type Execer interface {
+ Exec(query string, args ...interface{}) (sql.Result, error)
+}
+
+// Queryer is the interface that wraps the Query method.
+//
+// Query executes the given query as implemented by database/sql.Query.
+type Queryer interface {
+ Query(query string, args ...interface{}) (*sql.Rows, error)
+}
+
+// QueryRower is the interface that wraps the QueryRow method.
+//
+// QueryRow executes the given query as implemented by database/sql.QueryRow.
+type QueryRower interface {
+ QueryRow(query string, args ...interface{}) RowScanner
+}
+
+// BaseRunner groups the Execer and Queryer interfaces.
+type BaseRunner interface {
+ Execer
+ Queryer
+}
+
+// Runner groups the Execer, Queryer, and QueryRower interfaces.
+type Runner interface {
+ Execer
+ Queryer
+ QueryRower
+}
+
+// WrapStdSql wraps a type implementing the standard SQL interface with methods that
+// squirrel expects.
+func WrapStdSql(stdSql StdSql) Runner {
+ return &stdsqlRunner{stdSql}
+}
+
+// StdSql encompasses the standard methods of the *sql.DB type, and other types that
+// wrap these methods.
+type StdSql interface {
+ Query(string, ...interface{}) (*sql.Rows, error)
+ QueryRow(string, ...interface{}) *sql.Row
+ Exec(string, ...interface{}) (sql.Result, error)
+}
+
+type stdsqlRunner struct {
+ StdSql
+}
+
+func (r *stdsqlRunner) QueryRow(query string, args ...interface{}) RowScanner {
+ return r.StdSql.QueryRow(query, args...)
+}
+
+func setRunWith(b interface{}, runner BaseRunner) interface{} {
+ switch r := runner.(type) {
+ case StdSqlCtx:
+ runner = WrapStdSqlCtx(r)
+ case StdSql:
+ runner = WrapStdSql(r)
+ }
+ return builder.Set(b, "RunWith", runner)
+}
+
+// RunnerNotSet is returned by methods that need a Runner if it isn't set.
+var RunnerNotSet = fmt.Errorf("cannot run; no Runner set (RunWith)")
+
+// RunnerNotQueryRunner is returned by QueryRow if the RunWith value doesn't implement QueryRower.
+var RunnerNotQueryRunner = fmt.Errorf("cannot QueryRow; Runner is not a QueryRower")
+
+// ExecWith Execs the SQL returned by s with db.
+func ExecWith(db Execer, s Sqlizer) (res sql.Result, err error) {
+ query, args, err := s.ToSql()
+ if err != nil {
+ return
+ }
+ return db.Exec(query, args...)
+}
+
+// QueryWith Querys the SQL returned by s with db.
+func QueryWith(db Queryer, s Sqlizer) (rows *sql.Rows, err error) {
+ query, args, err := s.ToSql()
+ if err != nil {
+ return
+ }
+ return db.Query(query, args...)
+}
+
+// QueryRowWith QueryRows the SQL returned by s with db.
+func QueryRowWith(db QueryRower, s Sqlizer) RowScanner {
+ query, args, err := s.ToSql()
+ return &Row{RowScanner: db.QueryRow(query, args...), err: err}
+}
+
+// DebugSqlizer calls ToSql on s and shows the approximate SQL to be executed
+//
+// If ToSql returns an error, the result of this method will look like:
+// "[ToSql error: %s]" or "[DebugSqlizer error: %s]"
+//
+// IMPORTANT: As its name suggests, this function should only be used for
+// debugging. While the string result *might* be valid SQL, this function does
+// not try very hard to ensure it. Additionally, executing the output of this
+// function with any untrusted user input is certainly insecure.
+func DebugSqlizer(s Sqlizer) string {
+ sql, args, err := s.ToSql()
+ if err != nil {
+ return fmt.Sprintf("[ToSql error: %s]", err)
+ }
+
+ var placeholder string
+ downCast, ok := s.(placeholderDebugger)
+ if !ok {
+ placeholder = "?"
+ } else {
+ placeholder = downCast.debugPlaceholder()
+ }
+ // TODO: dedupe this with placeholder.go
+ buf := &bytes.Buffer{}
+ i := 0
+ for {
+ p := strings.Index(sql, placeholder)
+ if p == -1 {
+ break
+ }
+ if len(sql[p:]) > 1 && sql[p:p+2] == "??" { // escape ?? => ?
+ buf.WriteString(sql[:p])
+ buf.WriteString("?")
+ if len(sql[p:]) == 1 {
+ break
+ }
+ sql = sql[p+2:]
+ } else {
+ if i+1 > len(args) {
+ return fmt.Sprintf(
+ "[DebugSqlizer error: too many placeholders in %#v for %d args]",
+ sql, len(args))
+ }
+ buf.WriteString(sql[:p])
+ fmt.Fprintf(buf, "'%v'", args[i])
+ // advance our sql string "cursor" beyond the arg we placed
+ sql = sql[p+1:]
+ i++
+ }
+ }
+ if i < len(args) {
+ return fmt.Sprintf(
+ "[DebugSqlizer error: not enough placeholders in %#v for %d args]",
+ sql, len(args))
+ }
+ // "append" any remaning sql that won't need interpolating
+ buf.WriteString(sql)
+ return buf.String()
+}
diff --git a/vendor/github.com/Masterminds/squirrel/squirrel_ctx.go b/vendor/github.com/Masterminds/squirrel/squirrel_ctx.go
new file mode 100644
index 0000000..c20148a
--- /dev/null
+++ b/vendor/github.com/Masterminds/squirrel/squirrel_ctx.go
@@ -0,0 +1,93 @@
+// +build go1.8
+
+package squirrel
+
+import (
+ "context"
+ "database/sql"
+ "errors"
+)
+
+// NoContextSupport is returned if a db doesn't support Context.
+var NoContextSupport = errors.New("DB does not support Context")
+
+// ExecerContext is the interface that wraps the ExecContext method.
+//
+// Exec executes the given query as implemented by database/sql.ExecContext.
+type ExecerContext interface {
+ ExecContext(ctx context.Context, query string, args ...interface{}) (sql.Result, error)
+}
+
+// QueryerContext is the interface that wraps the QueryContext method.
+//
+// QueryContext executes the given query as implemented by database/sql.QueryContext.
+type QueryerContext interface {
+ QueryContext(ctx context.Context, query string, args ...interface{}) (*sql.Rows, error)
+}
+
+// QueryRowerContext is the interface that wraps the QueryRowContext method.
+//
+// QueryRowContext executes the given query as implemented by database/sql.QueryRowContext.
+type QueryRowerContext interface {
+ QueryRowContext(ctx context.Context, query string, args ...interface{}) RowScanner
+}
+
+// RunnerContext groups the Runner interface, along with the Context versions of each of
+// its methods
+type RunnerContext interface {
+ Runner
+ QueryerContext
+ QueryRowerContext
+ ExecerContext
+}
+
+// WrapStdSqlCtx wraps a type implementing the standard SQL interface plus the context
+// versions of the methods with methods that squirrel expects.
+func WrapStdSqlCtx(stdSqlCtx StdSqlCtx) RunnerContext {
+ return &stdsqlCtxRunner{stdSqlCtx}
+}
+
+// StdSqlCtx encompasses the standard methods of the *sql.DB type, along with the Context
+// versions of those methods, and other types that wrap these methods.
+type StdSqlCtx interface {
+ StdSql
+ QueryContext(context.Context, string, ...interface{}) (*sql.Rows, error)
+ QueryRowContext(context.Context, string, ...interface{}) *sql.Row
+ ExecContext(context.Context, string, ...interface{}) (sql.Result, error)
+}
+
+type stdsqlCtxRunner struct {
+ StdSqlCtx
+}
+
+func (r *stdsqlCtxRunner) QueryRow(query string, args ...interface{}) RowScanner {
+ return r.StdSqlCtx.QueryRow(query, args...)
+}
+
+func (r *stdsqlCtxRunner) QueryRowContext(ctx context.Context, query string, args ...interface{}) RowScanner {
+ return r.StdSqlCtx.QueryRowContext(ctx, query, args...)
+}
+
+// ExecContextWith ExecContexts the SQL returned by s with db.
+func ExecContextWith(ctx context.Context, db ExecerContext, s Sqlizer) (res sql.Result, err error) {
+ query, args, err := s.ToSql()
+ if err != nil {
+ return
+ }
+ return db.ExecContext(ctx, query, args...)
+}
+
+// QueryContextWith QueryContexts the SQL returned by s with db.
+func QueryContextWith(ctx context.Context, db QueryerContext, s Sqlizer) (rows *sql.Rows, err error) {
+ query, args, err := s.ToSql()
+ if err != nil {
+ return
+ }
+ return db.QueryContext(ctx, query, args...)
+}
+
+// QueryRowContextWith QueryRowContexts the SQL returned by s with db.
+func QueryRowContextWith(ctx context.Context, db QueryRowerContext, s Sqlizer) RowScanner {
+ query, args, err := s.ToSql()
+ return &Row{RowScanner: db.QueryRowContext(ctx, query, args...), err: err}
+}
diff --git a/vendor/github.com/Masterminds/squirrel/statement.go b/vendor/github.com/Masterminds/squirrel/statement.go
new file mode 100644
index 0000000..9420c67
--- /dev/null
+++ b/vendor/github.com/Masterminds/squirrel/statement.go
@@ -0,0 +1,104 @@
+package squirrel
+
+import "github.com/lann/builder"
+
+// StatementBuilderType is the type of StatementBuilder.
+type StatementBuilderType builder.Builder
+
+// Select returns a SelectBuilder for this StatementBuilderType.
+func (b StatementBuilderType) Select(columns ...string) SelectBuilder {
+ return SelectBuilder(b).Columns(columns...)
+}
+
+// Insert returns a InsertBuilder for this StatementBuilderType.
+func (b StatementBuilderType) Insert(into string) InsertBuilder {
+ return InsertBuilder(b).Into(into)
+}
+
+// Replace returns a InsertBuilder for this StatementBuilderType with the
+// statement keyword set to "REPLACE".
+func (b StatementBuilderType) Replace(into string) InsertBuilder {
+ return InsertBuilder(b).statementKeyword("REPLACE").Into(into)
+}
+
+// Update returns a UpdateBuilder for this StatementBuilderType.
+func (b StatementBuilderType) Update(table string) UpdateBuilder {
+ return UpdateBuilder(b).Table(table)
+}
+
+// Delete returns a DeleteBuilder for this StatementBuilderType.
+func (b StatementBuilderType) Delete(from string) DeleteBuilder {
+ return DeleteBuilder(b).From(from)
+}
+
+// PlaceholderFormat sets the PlaceholderFormat field for any child builders.
+func (b StatementBuilderType) PlaceholderFormat(f PlaceholderFormat) StatementBuilderType {
+ return builder.Set(b, "PlaceholderFormat", f).(StatementBuilderType)
+}
+
+// RunWith sets the RunWith field for any child builders.
+func (b StatementBuilderType) RunWith(runner BaseRunner) StatementBuilderType {
+ return setRunWith(b, runner).(StatementBuilderType)
+}
+
+// Where adds WHERE expressions to the query.
+//
+// See SelectBuilder.Where for more information.
+func (b StatementBuilderType) Where(pred interface{}, args ...interface{}) StatementBuilderType {
+ return builder.Append(b, "WhereParts", newWherePart(pred, args...)).(StatementBuilderType)
+}
+
+// StatementBuilder is a parent builder for other builders, e.g. SelectBuilder.
+var StatementBuilder = StatementBuilderType(builder.EmptyBuilder).PlaceholderFormat(Question)
+
+// Select returns a new SelectBuilder, optionally setting some result columns.
+//
+// See SelectBuilder.Columns.
+func Select(columns ...string) SelectBuilder {
+ return StatementBuilder.Select(columns...)
+}
+
+// Insert returns a new InsertBuilder with the given table name.
+//
+// See InsertBuilder.Into.
+func Insert(into string) InsertBuilder {
+ return StatementBuilder.Insert(into)
+}
+
+// Replace returns a new InsertBuilder with the statement keyword set to
+// "REPLACE" and with the given table name.
+//
+// See InsertBuilder.Into.
+func Replace(into string) InsertBuilder {
+ return StatementBuilder.Replace(into)
+}
+
+// Update returns a new UpdateBuilder with the given table name.
+//
+// See UpdateBuilder.Table.
+func Update(table string) UpdateBuilder {
+ return StatementBuilder.Update(table)
+}
+
+// Delete returns a new DeleteBuilder with the given table name.
+//
+// See DeleteBuilder.Table.
+func Delete(from string) DeleteBuilder {
+ return StatementBuilder.Delete(from)
+}
+
+// Case returns a new CaseBuilder
+// "what" represents case value
+func Case(what ...interface{}) CaseBuilder {
+ b := CaseBuilder(builder.EmptyBuilder)
+
+ switch len(what) {
+ case 0:
+ case 1:
+ b = b.what(what[0])
+ default:
+ b = b.what(newPart(what[0], what[1:]...))
+
+ }
+ return b
+}
diff --git a/vendor/github.com/Masterminds/squirrel/stmtcacher.go b/vendor/github.com/Masterminds/squirrel/stmtcacher.go
new file mode 100644
index 0000000..5bf267a
--- /dev/null
+++ b/vendor/github.com/Masterminds/squirrel/stmtcacher.go
@@ -0,0 +1,121 @@
+package squirrel
+
+import (
+ "database/sql"
+ "fmt"
+ "sync"
+)
+
+// Prepareer is the interface that wraps the Prepare method.
+//
+// Prepare executes the given query as implemented by database/sql.Prepare.
+type Preparer interface {
+ Prepare(query string) (*sql.Stmt, error)
+}
+
+// DBProxy groups the Execer, Queryer, QueryRower, and Preparer interfaces.
+type DBProxy interface {
+ Execer
+ Queryer
+ QueryRower
+ Preparer
+}
+
+// NOTE: NewStmtCache is defined in stmtcacher_ctx.go (Go >= 1.8) or stmtcacher_noctx.go (Go < 1.8).
+
+// StmtCache wraps and delegates down to a Preparer type
+//
+// It also automatically prepares all statements sent to the underlying Preparer calls
+// for Exec, Query and QueryRow and caches the returns *sql.Stmt using the provided
+// query as the key. So that it can be automatically re-used.
+type StmtCache struct {
+ prep Preparer
+ cache map[string]*sql.Stmt
+ mu sync.Mutex
+}
+
+// Prepare delegates down to the underlying Preparer and caches the result
+// using the provided query as a key
+func (sc *StmtCache) Prepare(query string) (*sql.Stmt, error) {
+ sc.mu.Lock()
+ defer sc.mu.Unlock()
+
+ stmt, ok := sc.cache[query]
+ if ok {
+ return stmt, nil
+ }
+ stmt, err := sc.prep.Prepare(query)
+ if err == nil {
+ sc.cache[query] = stmt
+ }
+ return stmt, err
+}
+
+// Exec delegates down to the underlying Preparer using a prepared statement
+func (sc *StmtCache) Exec(query string, args ...interface{}) (res sql.Result, err error) {
+ stmt, err := sc.Prepare(query)
+ if err != nil {
+ return
+ }
+ return stmt.Exec(args...)
+}
+
+// Query delegates down to the underlying Preparer using a prepared statement
+func (sc *StmtCache) Query(query string, args ...interface{}) (rows *sql.Rows, err error) {
+ stmt, err := sc.Prepare(query)
+ if err != nil {
+ return
+ }
+ return stmt.Query(args...)
+}
+
+// QueryRow delegates down to the underlying Preparer using a prepared statement
+func (sc *StmtCache) QueryRow(query string, args ...interface{}) RowScanner {
+ stmt, err := sc.Prepare(query)
+ if err != nil {
+ return &Row{err: err}
+ }
+ return stmt.QueryRow(args...)
+}
+
+// Clear removes and closes all the currently cached prepared statements
+func (sc *StmtCache) Clear() (err error) {
+ sc.mu.Lock()
+ defer sc.mu.Unlock()
+
+ for key, stmt := range sc.cache {
+ delete(sc.cache, key)
+
+ if stmt == nil {
+ continue
+ }
+
+ if cerr := stmt.Close(); cerr != nil {
+ err = cerr
+ }
+ }
+
+ if err != nil {
+ return fmt.Errorf("one or more Stmt.Close failed; last error: %v", err)
+ }
+
+ return
+}
+
+type DBProxyBeginner interface {
+ DBProxy
+ Begin() (*sql.Tx, error)
+}
+
+type stmtCacheProxy struct {
+ DBProxy
+ db *sql.DB
+}
+
+func NewStmtCacheProxy(db *sql.DB) DBProxyBeginner {
+ return &stmtCacheProxy{DBProxy: NewStmtCache(db), db: db}
+}
+
+func (sp *stmtCacheProxy) Begin() (*sql.Tx, error) {
+ return sp.db.Begin()
+}
diff --git a/vendor/github.com/Masterminds/squirrel/stmtcacher_ctx.go b/vendor/github.com/Masterminds/squirrel/stmtcacher_ctx.go
new file mode 100644
index 0000000..53603cf
--- /dev/null
+++ b/vendor/github.com/Masterminds/squirrel/stmtcacher_ctx.go
@@ -0,0 +1,86 @@
+// +build go1.8
+
+package squirrel
+
+import (
+ "context"
+ "database/sql"
+)
+
+// PrepareerContext is the interface that wraps the Prepare and PrepareContext methods.
+//
+// Prepare executes the given query as implemented by database/sql.Prepare.
+// PrepareContext executes the given query as implemented by database/sql.PrepareContext.
+type PreparerContext interface {
+ Preparer
+ PrepareContext(ctx context.Context, query string) (*sql.Stmt, error)
+}
+
+// DBProxyContext groups the Execer, Queryer, QueryRower and PreparerContext interfaces.
+type DBProxyContext interface {
+ Execer
+ Queryer
+ QueryRower
+ PreparerContext
+}
+
+// NewStmtCache returns a *StmtCache wrapping a PreparerContext that caches Prepared Stmts.
+//
+// Stmts are cached based on the string value of their queries.
+func NewStmtCache(prep PreparerContext) *StmtCache {
+ return &StmtCache{prep: prep, cache: make(map[string]*sql.Stmt)}
+}
+
+// NewStmtCacher is deprecated
+//
+// Use NewStmtCache instead
+func NewStmtCacher(prep PreparerContext) DBProxyContext {
+ return NewStmtCache(prep)
+}
+
+// PrepareContext delegates down to the underlying PreparerContext and caches the result
+// using the provided query as a key
+func (sc *StmtCache) PrepareContext(ctx context.Context, query string) (*sql.Stmt, error) {
+ ctxPrep, ok := sc.prep.(PreparerContext)
+ if !ok {
+ return nil, NoContextSupport
+ }
+ sc.mu.Lock()
+ defer sc.mu.Unlock()
+ stmt, ok := sc.cache[query]
+ if ok {
+ return stmt, nil
+ }
+ stmt, err := ctxPrep.PrepareContext(ctx, query)
+ if err == nil {
+ sc.cache[query] = stmt
+ }
+ return stmt, err
+}
+
+// ExecContext delegates down to the underlying PreparerContext using a prepared statement
+func (sc *StmtCache) ExecContext(ctx context.Context, query string, args ...interface{}) (res sql.Result, err error) {
+ stmt, err := sc.PrepareContext(ctx, query)
+ if err != nil {
+ return
+ }
+ return stmt.ExecContext(ctx, args...)
+}
+
+// QueryContext delegates down to the underlying PreparerContext using a prepared statement
+func (sc *StmtCache) QueryContext(ctx context.Context, query string, args ...interface{}) (rows *sql.Rows, err error) {
+ stmt, err := sc.PrepareContext(ctx, query)
+ if err != nil {
+ return
+ }
+ return stmt.QueryContext(ctx, args...)
+}
+
+// QueryRowContext delegates down to the underlying PreparerContext using a prepared statement
+func (sc *StmtCache) QueryRowContext(ctx context.Context, query string, args ...interface{}) RowScanner {
+ stmt, err := sc.PrepareContext(ctx, query)
+ if err != nil {
+ return &Row{err: err}
+ }
+ return stmt.QueryRowContext(ctx, args...)
+}
diff --git a/vendor/github.com/Masterminds/squirrel/stmtcacher_noctx.go b/vendor/github.com/Masterminds/squirrel/stmtcacher_noctx.go
new file mode 100644
index 0000000..deac967
--- /dev/null
+++ b/vendor/github.com/Masterminds/squirrel/stmtcacher_noctx.go
@@ -0,0 +1,21 @@
+// +build !go1.8
+
+package squirrel
+
+import (
+ "database/sql"
+)
+
+// NewStmtCacher returns a DBProxy wrapping prep that caches Prepared Stmts.
+//
+// Stmts are cached based on the string value of their queries.
+func NewStmtCache(prep Preparer) *StmtCache {
+ return &StmtCacher{prep: prep, cache: make(map[string]*sql.Stmt)}
+}
+
+// NewStmtCacher is deprecated
+//
+// Use NewStmtCache instead
+func NewStmtCacher(prep Preparer) DBProxy {
+ return NewStmtCache(prep)
+}
diff --git a/vendor/github.com/Masterminds/squirrel/update.go b/vendor/github.com/Masterminds/squirrel/update.go
new file mode 100644
index 0000000..eb2a9c4
--- /dev/null
+++ b/vendor/github.com/Masterminds/squirrel/update.go
@@ -0,0 +1,288 @@
+package squirrel
+
+import (
+ "bytes"
+ "database/sql"
+ "fmt"
+ "sort"
+ "strings"
+
+ "github.com/lann/builder"
+)
+
+type updateData struct {
+ PlaceholderFormat PlaceholderFormat
+ RunWith BaseRunner
+ Prefixes []Sqlizer
+ Table string
+ SetClauses []setClause
+ From Sqlizer
+ WhereParts []Sqlizer
+ OrderBys []string
+ Limit string
+ Offset string
+ Suffixes []Sqlizer
+}
+
+type setClause struct {
+ column string
+ value interface{}
+}
+
+func (d *updateData) Exec() (sql.Result, error) {
+ if d.RunWith == nil {
+ return nil, RunnerNotSet
+ }
+ return ExecWith(d.RunWith, d)
+}
+
+func (d *updateData) Query() (*sql.Rows, error) {
+ if d.RunWith == nil {
+ return nil, RunnerNotSet
+ }
+ return QueryWith(d.RunWith, d)
+}
+
+func (d *updateData) QueryRow() RowScanner {
+ if d.RunWith == nil {
+ return &Row{err: RunnerNotSet}
+ }
+ queryRower, ok := d.RunWith.(QueryRower)
+ if !ok {
+ return &Row{err: RunnerNotQueryRunner}
+ }
+ return QueryRowWith(queryRower, d)
+}
+
+func (d *updateData) ToSql() (sqlStr string, args []interface{}, err error) {
+ if len(d.Table) == 0 {
+ err = fmt.Errorf("update statements must specify a table")
+ return
+ }
+ if len(d.SetClauses) == 0 {
+ err = fmt.Errorf("update statements must have at least one Set clause")
+ return
+ }
+
+ sql := &bytes.Buffer{}
+
+ if len(d.Prefixes) > 0 {
+ args, err = appendToSql(d.Prefixes, sql, " ", args)
+ if err != nil {
+ return
+ }
+
+ sql.WriteString(" ")
+ }
+
+ sql.WriteString("UPDATE ")
+ sql.WriteString(d.Table)
+
+ sql.WriteString(" SET ")
+ setSqls := make([]string, len(d.SetClauses))
+ for i, setClause := range d.SetClauses {
+ var valSql string
+ if vs, ok := setClause.value.(Sqlizer); ok {
+ vsql, vargs, err := vs.ToSql()
+ if err != nil {
+ return "", nil, err
+ }
+ if _, ok := vs.(SelectBuilder); ok {
+ valSql = fmt.Sprintf("(%s)", vsql)
+ } else {
+ valSql = vsql
+ }
+ args = append(args, vargs...)
+ } else {
+ valSql = "?"
+ args = append(args, setClause.value)
+ }
+ setSqls[i] = fmt.Sprintf("%s = %s", setClause.column, valSql)
+ }
+ sql.WriteString(strings.Join(setSqls, ", "))
+
+ if d.From != nil {
+ sql.WriteString(" FROM ")
+ args, err = appendToSql([]Sqlizer{d.From}, sql, "", args)
+ if err != nil {
+ return
+ }
+ }
+
+ if len(d.WhereParts) > 0 {
+ sql.WriteString(" WHERE ")
+ args, err = appendToSql(d.WhereParts, sql, " AND ", args)
+ if err != nil {
+ return
+ }
+ }
+
+ if len(d.OrderBys) > 0 {
+ sql.WriteString(" ORDER BY ")
+ sql.WriteString(strings.Join(d.OrderBys, ", "))
+ }
+
+ if len(d.Limit) > 0 {
+ sql.WriteString(" LIMIT ")
+ sql.WriteString(d.Limit)
+ }
+
+ if len(d.Offset) > 0 {
+ sql.WriteString(" OFFSET ")
+ sql.WriteString(d.Offset)
+ }
+
+ if len(d.Suffixes) > 0 {
+ sql.WriteString(" ")
+ args, err = appendToSql(d.Suffixes, sql, " ", args)
+ if err != nil {
+ return
+ }
+ }
+
+ sqlStr, err = d.PlaceholderFormat.ReplacePlaceholders(sql.String())
+ return
+}
+
+// Builder
+
+// UpdateBuilder builds SQL UPDATE statements.
+type UpdateBuilder builder.Builder
+
+func init() {
+ builder.Register(UpdateBuilder{}, updateData{})
+}
+
+// Format methods
+
+// PlaceholderFormat sets PlaceholderFormat (e.g. Question or Dollar) for the
+// query.
+func (b UpdateBuilder) PlaceholderFormat(f PlaceholderFormat) UpdateBuilder {
+ return builder.Set(b, "PlaceholderFormat", f).(UpdateBuilder)
+}
+
+// Runner methods
+
+// RunWith sets a Runner (like database/sql.DB) to be used with e.g. Exec.
+func (b UpdateBuilder) RunWith(runner BaseRunner) UpdateBuilder {
+ return setRunWith(b, runner).(UpdateBuilder)
+}
+
+// Exec builds and Execs the query with the Runner set by RunWith.
+func (b UpdateBuilder) Exec() (sql.Result, error) {
+ data := builder.GetStruct(b).(updateData)
+ return data.Exec()
+}
+
+func (b UpdateBuilder) Query() (*sql.Rows, error) {
+ data := builder.GetStruct(b).(updateData)
+ return data.Query()
+}
+
+func (b UpdateBuilder) QueryRow() RowScanner {
+ data := builder.GetStruct(b).(updateData)
+ return data.QueryRow()
+}
+
+func (b UpdateBuilder) Scan(dest ...interface{}) error {
+ return b.QueryRow().Scan(dest...)
+}
+
+// SQL methods
+
+// ToSql builds the query into a SQL string and bound args.
+func (b UpdateBuilder) ToSql() (string, []interface{}, error) {
+ data := builder.GetStruct(b).(updateData)
+ return data.ToSql()
+}
+
+// MustSql builds the query into a SQL string and bound args.
+// It panics if there are any errors.
+func (b UpdateBuilder) MustSql() (string, []interface{}) {
+ sql, args, err := b.ToSql()
+ if err != nil {
+ panic(err)
+ }
+ return sql, args
+}
+
+// Prefix adds an expression to the beginning of the query
+func (b UpdateBuilder) Prefix(sql string, args ...interface{}) UpdateBuilder {
+ return b.PrefixExpr(Expr(sql, args...))
+}
+
+// PrefixExpr adds an expression to the very beginning of the query
+func (b UpdateBuilder) PrefixExpr(expr Sqlizer) UpdateBuilder {
+ return builder.Append(b, "Prefixes", expr).(UpdateBuilder)
+}
+
+// Table sets the table to be updated.
+func (b UpdateBuilder) Table(table string) UpdateBuilder {
+ return builder.Set(b, "Table", table).(UpdateBuilder)
+}
+
+// Set adds SET clauses to the query.
+func (b UpdateBuilder) Set(column string, value interface{}) UpdateBuilder {
+ return builder.Append(b, "SetClauses", setClause{column: column, value: value}).(UpdateBuilder)
+}
+
+// SetMap is a convenience method which calls .Set for each key/value pair in clauses.
+func (b UpdateBuilder) SetMap(clauses map[string]interface{}) UpdateBuilder {
+ keys := make([]string, len(clauses))
+ i := 0
+ for key := range clauses {
+ keys[i] = key
+ i++
+ }
+ sort.Strings(keys)
+ for _, key := range keys {
+ val, _ := clauses[key]
+ b = b.Set(key, val)
+ }
+ return b
+}
+
+// From adds FROM clause to the query
+// FROM is valid construct in postgresql only.
+func (b UpdateBuilder) From(from string) UpdateBuilder {
+ return builder.Set(b, "From", newPart(from)).(UpdateBuilder)
+}
+
+// FromSelect sets a subquery into the FROM clause of the query.
+func (b UpdateBuilder) FromSelect(from SelectBuilder, alias string) UpdateBuilder {
+ // Prevent misnumbered parameters in nested selects (#183).
+ from = from.PlaceholderFormat(Question)
+ return builder.Set(b, "From", Alias(from, alias)).(UpdateBuilder)
+}
+
+// Where adds WHERE expressions to the query.
+//
+// See SelectBuilder.Where for more information.
+func (b UpdateBuilder) Where(pred interface{}, args ...interface{}) UpdateBuilder {
+ return builder.Append(b, "WhereParts", newWherePart(pred, args...)).(UpdateBuilder)
+}
+
+// OrderBy adds ORDER BY expressions to the query.
+func (b UpdateBuilder) OrderBy(orderBys ...string) UpdateBuilder {
+ return builder.Extend(b, "OrderBys", orderBys).(UpdateBuilder)
+}
+
+// Limit sets a LIMIT clause on the query.
+func (b UpdateBuilder) Limit(limit uint64) UpdateBuilder {
+ return builder.Set(b, "Limit", fmt.Sprintf("%d", limit)).(UpdateBuilder)
+}
+
+// Offset sets a OFFSET clause on the query.
+func (b UpdateBuilder) Offset(offset uint64) UpdateBuilder {
+ return builder.Set(b, "Offset", fmt.Sprintf("%d", offset)).(UpdateBuilder)
+}
+
+// Suffix adds an expression to the end of the query
+func (b UpdateBuilder) Suffix(sql string, args ...interface{}) UpdateBuilder {
+ return b.SuffixExpr(Expr(sql, args...))
+}
+
+// SuffixExpr adds an expression to the end of the query
+func (b UpdateBuilder) SuffixExpr(expr Sqlizer) UpdateBuilder {
+ return builder.Append(b, "Suffixes", expr).(UpdateBuilder)
+}
diff --git a/vendor/github.com/Masterminds/squirrel/update_ctx.go b/vendor/github.com/Masterminds/squirrel/update_ctx.go
new file mode 100644
index 0000000..ad479f9
--- /dev/null
+++ b/vendor/github.com/Masterminds/squirrel/update_ctx.go
@@ -0,0 +1,69 @@
+// +build go1.8
+
+package squirrel
+
+import (
+ "context"
+ "database/sql"
+
+ "github.com/lann/builder"
+)
+
+func (d *updateData) ExecContext(ctx context.Context) (sql.Result, error) {
+ if d.RunWith == nil {
+ return nil, RunnerNotSet
+ }
+ ctxRunner, ok := d.RunWith.(ExecerContext)
+ if !ok {
+ return nil, NoContextSupport
+ }
+ return ExecContextWith(ctx, ctxRunner, d)
+}
+
+func (d *updateData) QueryContext(ctx context.Context) (*sql.Rows, error) {
+ if d.RunWith == nil {
+ return nil, RunnerNotSet
+ }
+ ctxRunner, ok := d.RunWith.(QueryerContext)
+ if !ok {
+ return nil, NoContextSupport
+ }
+ return QueryContextWith(ctx, ctxRunner, d)
+}
+
+func (d *updateData) QueryRowContext(ctx context.Context) RowScanner {
+ if d.RunWith == nil {
+ return &Row{err: RunnerNotSet}
+ }
+ queryRower, ok := d.RunWith.(QueryRowerContext)
+ if !ok {
+ if _, ok := d.RunWith.(QueryerContext); !ok {
+ return &Row{err: RunnerNotQueryRunner}
+ }
+ return &Row{err: NoContextSupport}
+ }
+ return QueryRowContextWith(ctx, queryRower, d)
+}
+
+// ExecContext builds and ExecContexts the query with the Runner set by RunWith.
+func (b UpdateBuilder) ExecContext(ctx context.Context) (sql.Result, error) {
+ data := builder.GetStruct(b).(updateData)
+ return data.ExecContext(ctx)
+}
+
+// QueryContext builds and QueryContexts the query with the Runner set by RunWith.
+func (b UpdateBuilder) QueryContext(ctx context.Context) (*sql.Rows, error) {
+ data := builder.GetStruct(b).(updateData)
+ return data.QueryContext(ctx)
+}
+
+// QueryRowContext builds and QueryRowContexts the query with the Runner set by RunWith.
+func (b UpdateBuilder) QueryRowContext(ctx context.Context) RowScanner {
+ data := builder.GetStruct(b).(updateData)
+ return data.QueryRowContext(ctx)
+}
+
+// ScanContext is a shortcut for QueryRowContext().Scan.
+func (b UpdateBuilder) ScanContext(ctx context.Context, dest ...interface{}) error {
+ return b.QueryRowContext(ctx).Scan(dest...)
+}
diff --git a/vendor/github.com/Masterminds/squirrel/where.go b/vendor/github.com/Masterminds/squirrel/where.go
new file mode 100644
index 0000000..976b63a
--- /dev/null
+++ b/vendor/github.com/Masterminds/squirrel/where.go
@@ -0,0 +1,30 @@
+package squirrel
+
+import (
+ "fmt"
+)
+
+type wherePart part
+
+func newWherePart(pred interface{}, args ...interface{}) Sqlizer {
+ return &wherePart{pred: pred, args: args}
+}
+
+func (p wherePart) ToSql() (sql string, args []interface{}, err error) {
+ switch pred := p.pred.(type) {
+ case nil:
+ // no-op
+ case rawSqlizer:
+ return pred.toSqlRaw()
+ case Sqlizer:
+ return pred.ToSql()
+ case map[string]interface{}:
+ return Eq(pred).ToSql()
+ case string:
+ sql = pred
+ args = p.args
+ default:
+ err = fmt.Errorf("expected string-keyed map or string, not %T", pred)
+ }
+ return
+}