aboutsummaryrefslogtreecommitdiff
path: root/vendor/github.com/go-xorm/builder
diff options
context:
space:
mode:
authorUnknwon <u@gogs.io>2017-02-09 19:48:13 -0500
committerUnknwon <u@gogs.io>2017-02-09 19:48:13 -0500
commit2fd69f13d9599a6c58b47225565163fd7d87889f (patch)
treefd19e868e1c2e95a5fb83a268f6e393669d6ee79 /vendor/github.com/go-xorm/builder
parenteb66060cd7b9bce996b1d75ae80ce1ef31d5ce62 (diff)
vendor: check in vendors
Bye bye glide...
Diffstat (limited to 'vendor/github.com/go-xorm/builder')
-rw-r--r--vendor/github.com/go-xorm/builder/LICENSE27
-rw-r--r--vendor/github.com/go-xorm/builder/README.md175
-rw-r--r--vendor/github.com/go-xorm/builder/builder.go190
-rw-r--r--vendor/github.com/go-xorm/builder/builder_delete.go22
-rw-r--r--vendor/github.com/go-xorm/builder/builder_insert.go64
-rw-r--r--vendor/github.com/go-xorm/builder/builder_select.go53
-rw-r--r--vendor/github.com/go-xorm/builder/builder_update.go41
-rw-r--r--vendor/github.com/go-xorm/builder/circle.yml12
-rw-r--r--vendor/github.com/go-xorm/builder/cond.go87
-rw-r--r--vendor/github.com/go-xorm/builder/cond_and.go59
-rw-r--r--vendor/github.com/go-xorm/builder/cond_between.go40
-rw-r--r--vendor/github.com/go-xorm/builder/cond_compare.go154
-rw-r--r--vendor/github.com/go-xorm/builder/cond_eq.go96
-rw-r--r--vendor/github.com/go-xorm/builder/cond_expr.go39
-rw-r--r--vendor/github.com/go-xorm/builder/cond_in.go217
-rw-r--r--vendor/github.com/go-xorm/builder/cond_like.go36
-rw-r--r--vendor/github.com/go-xorm/builder/cond_neq.go78
-rw-r--r--vendor/github.com/go-xorm/builder/cond_not.go53
-rw-r--r--vendor/github.com/go-xorm/builder/cond_notin.go211
-rw-r--r--vendor/github.com/go-xorm/builder/cond_null.go59
-rw-r--r--vendor/github.com/go-xorm/builder/cond_or.go67
-rw-r--r--vendor/github.com/go-xorm/builder/doc.go120
-rw-r--r--vendor/github.com/go-xorm/builder/error.go16
23 files changed, 1916 insertions, 0 deletions
diff --git a/vendor/github.com/go-xorm/builder/LICENSE b/vendor/github.com/go-xorm/builder/LICENSE
new file mode 100644
index 00000000..614d5e28
--- /dev/null
+++ b/vendor/github.com/go-xorm/builder/LICENSE
@@ -0,0 +1,27 @@
+Copyright (c) 2016 The Xorm Authors
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+* Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+* Neither the name of the {organization} nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/vendor/github.com/go-xorm/builder/README.md b/vendor/github.com/go-xorm/builder/README.md
new file mode 100644
index 00000000..16287363
--- /dev/null
+++ b/vendor/github.com/go-xorm/builder/README.md
@@ -0,0 +1,175 @@
+# SQL builder
+
+[![CircleCI](https://circleci.com/gh/go-xorm/builder/tree/master.svg?style=svg)](https://circleci.com/gh/go-xorm/builder/tree/master)
+
+Package builder is a lightweight and fast SQL builder for Go and XORM.
+
+Make sure you have installed Go 1.1+ and then:
+
+ go get github.com/go-xorm/builder
+
+# Insert
+
+```Go
+sql, args, err := Insert(Eq{"c": 1, "d": 2}).Into("table1").ToSQL()
+```
+
+# Select
+
+```Go
+sql, args, err := Select("c, d").From("table1").Where(Eq{"a": 1}).ToSQL()
+
+sql, args, err = Select("c, d").From("table1").LeftJoin("table2", Eq{"table1.id": 1}.And(Lt{"table2.id": 3})).
+ RightJoin("table3", "table2.id = table3.tid").Where(Eq{"a": 1}).ToSQL()
+```
+
+# Update
+
+```Go
+sql, args, err := Update(Eq{"a": 2}).From("table1").Where(Eq{"a": 1}).ToSQL()
+```
+
+# Delete
+
+```Go
+sql, args, err := Delete(Eq{"a": 1}).From("table1").ToSQL()
+```
+
+# Conditions
+
+* `Eq` is a redefine of a map, you can give one or more conditions to `Eq`
+
+```Go
+import . "github.com/go-xorm/builder"
+
+sql, args, _ := ToSQL(Eq{"a":1})
+// a=? [1]
+sql, args, _ := ToSQL(Eq{"b":"c"}.And(Eq{"c": 0}))
+// b=? AND c=? ["c", 0]
+sql, args, _ := ToSQL(Eq{"b":"c", "c":0})
+// b=? AND c=? ["c", 0]
+sql, args, _ := ToSQL(Eq{"b":"c"}.Or(Eq{"b":"d"}))
+// b=? OR b=? ["c", "d"]
+sql, args, _ := ToSQL(Eq{"b": []string{"c", "d"}})
+// b IN (?,?) ["c", "d"]
+sql, args, _ := ToSQL(Eq{"b": 1, "c":[]int{2, 3}})
+// b=? AND c IN (?,?) [1, 2, 3]
+```
+
+* `Neq` is the same to `Eq`
+
+```Go
+import . "github.com/go-xorm/builder"
+
+sql, args, _ := ToSQL(Neq{"a":1})
+// a<>? [1]
+sql, args, _ := ToSQL(Neq{"b":"c"}.And(Neq{"c": 0}))
+// b<>? AND c<>? ["c", 0]
+sql, args, _ := ToSQL(Neq{"b":"c", "c":0})
+// b<>? AND c<>? ["c", 0]
+sql, args, _ := ToSQL(Neq{"b":"c"}.Or(Neq{"b":"d"}))
+// b<>? OR b<>? ["c", "d"]
+sql, args, _ := ToSQL(Neq{"b": []string{"c", "d"}})
+// b NOT IN (?,?) ["c", "d"]
+sql, args, _ := ToSQL(Neq{"b": 1, "c":[]int{2, 3}})
+// b<>? AND c NOT IN (?,?) [1, 2, 3]
+```
+
+* `Gt`, `Gte`, `Lt`, `Lte`
+
+```Go
+import . "github.com/go-xorm/builder"
+
+sql, args, _ := ToSQL(Gt{"a", 1}.And(Gte{"b", 2}))
+// a>? AND b>=? [1, 2]
+sql, args, _ := ToSQL(Lt{"a", 1}.Or(Lte{"b", 2}))
+// a<? OR b<=? [1, 2]
+```
+
+* `Like`
+
+```Go
+import . "github.com/go-xorm/builder"
+
+sql, args, _ := ToSQL(Like{"a", "c"})
+// a LIKE ? [%c%]
+```
+
+* `Expr` you can customerize your sql with `Expr`
+
+```Go
+import . "github.com/go-xorm/builder"
+
+sql, args, _ := ToSQL(Expr("a = ? ", 1))
+// a = ? [1]
+sql, args, _ := ToSQL(Eq{"a": Expr("select id from table where c = ?", 1)})
+// a=(select id from table where c = ?) [1]
+```
+
+* `In` and `NotIn`
+
+```Go
+import . "github.com/go-xorm/builder"
+
+sql, args, _ := ToSQL(In("a", 1, 2, 3))
+// a IN (?,?,?) [1,2,3]
+sql, args, _ := ToSQL(In("a", []int{1, 2, 3}))
+// a IN (?,?,?) [1,2,3]
+sql, args, _ := ToSQL(In("a", Expr("select id from b where c = ?", 1))))
+// a IN (select id from b where c = ?) [1]
+```
+
+* `IsNull` and `NotNull`
+
+```Go
+import . "github.com/go-xorm/builder"
+
+sql, args, _ := ToSQL(IsNull{"a"})
+// a IS NULL []
+sql, args, _ := ToSQL(NotNull{"b"})
+ // b IS NOT NULL []
+```
+
+* `And(conds ...Cond)`, And can connect one or more condtions via And
+
+```Go
+import . "github.com/go-xorm/builder"
+
+sql, args, _ := ToSQL(And(Eq{"a":1}, Like{"b", "c"}, Neq{"d", 2}))
+// a=? AND b LIKE ? AND d<>? [1, %c%, 2]
+```
+
+* `Or(conds ...Cond)`, Or can connect one or more conditions via Or
+
+```Go
+import . "github.com/go-xorm/builder"
+
+sql, args, _ := ToSQL(Or(Eq{"a":1}, Like{"b", "c"}, Neq{"d", 2}))
+// a=? OR b LIKE ? OR d<>? [1, %c%, 2]
+sql, args, _ := ToSQL(Or(Eq{"a":1}, And(Like{"b", "c"}, Neq{"d", 2})))
+// a=? OR (b LIKE ? AND d<>?) [1, %c%, 2]
+```
+
+* `Between`
+
+```Go
+import . "github.com/go-xorm/builder"
+
+sql, args, _ := ToSQL(Between{"a", 1, 2})
+// a BETWEEN 1 AND 2
+```
+
+* Define yourself conditions
+
+Since `Cond` is an interface.
+
+```Go
+type Cond interface {
+ WriteTo(Writer) error
+ And(...Cond) Cond
+ Or(...Cond) Cond
+ IsValid() bool
+}
+```
+
+You can define yourself conditions and compose with other `Cond`. \ No newline at end of file
diff --git a/vendor/github.com/go-xorm/builder/builder.go b/vendor/github.com/go-xorm/builder/builder.go
new file mode 100644
index 00000000..1253b988
--- /dev/null
+++ b/vendor/github.com/go-xorm/builder/builder.go
@@ -0,0 +1,190 @@
+// Copyright 2016 The Xorm Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package builder
+
+type optype byte
+
+const (
+ condType optype = iota // only conditions
+ selectType // select
+ insertType // insert
+ updateType // update
+ deleteType // delete
+)
+
+type join struct {
+ joinType string
+ joinTable string
+ joinCond Cond
+}
+
+// Builder describes a SQL statement
+type Builder struct {
+ optype
+ tableName string
+ cond Cond
+ selects []string
+ joins []join
+ inserts Eq
+ updates []Eq
+}
+
+// Select creates a select Builder
+func Select(cols ...string) *Builder {
+ builder := &Builder{cond: NewCond()}
+ return builder.Select(cols...)
+}
+
+// Insert creates an insert Builder
+func Insert(eq Eq) *Builder {
+ builder := &Builder{cond: NewCond()}
+ return builder.Insert(eq)
+}
+
+// Update creates an update Builder
+func Update(updates ...Eq) *Builder {
+ builder := &Builder{cond: NewCond()}
+ return builder.Update(updates...)
+}
+
+// Delete creates a delete Builder
+func Delete(conds ...Cond) *Builder {
+ builder := &Builder{cond: NewCond()}
+ return builder.Delete(conds...)
+}
+
+// Where sets where SQL
+func (b *Builder) Where(cond Cond) *Builder {
+ b.cond = b.cond.And(cond)
+ return b
+}
+
+// From sets the table name
+func (b *Builder) From(tableName string) *Builder {
+ b.tableName = tableName
+ return b
+}
+
+// Into sets insert table name
+func (b *Builder) Into(tableName string) *Builder {
+ b.tableName = tableName
+ return b
+}
+
+// Join sets join table and contions
+func (b *Builder) Join(joinType, joinTable string, joinCond interface{}) *Builder {
+ switch joinCond.(type) {
+ case Cond:
+ b.joins = append(b.joins, join{joinType, joinTable, joinCond.(Cond)})
+ case string:
+ b.joins = append(b.joins, join{joinType, joinTable, Expr(joinCond.(string))})
+ }
+
+ return b
+}
+
+// InnerJoin sets inner join
+func (b *Builder) InnerJoin(joinTable string, joinCond interface{}) *Builder {
+ return b.Join("INNER", joinTable, joinCond)
+}
+
+// LeftJoin sets left join SQL
+func (b *Builder) LeftJoin(joinTable string, joinCond interface{}) *Builder {
+ return b.Join("LEFT", joinTable, joinCond)
+}
+
+// RightJoin sets right join SQL
+func (b *Builder) RightJoin(joinTable string, joinCond interface{}) *Builder {
+ return b.Join("RIGHT", joinTable, joinCond)
+}
+
+// CrossJoin sets cross join SQL
+func (b *Builder) CrossJoin(joinTable string, joinCond interface{}) *Builder {
+ return b.Join("CROSS", joinTable, joinCond)
+}
+
+// FullJoin sets full join SQL
+func (b *Builder) FullJoin(joinTable string, joinCond interface{}) *Builder {
+ return b.Join("FULL", joinTable, joinCond)
+}
+
+// Select sets select SQL
+func (b *Builder) Select(cols ...string) *Builder {
+ b.selects = cols
+ b.optype = selectType
+ return b
+}
+
+// And sets AND condition
+func (b *Builder) And(cond Cond) *Builder {
+ b.cond = And(b.cond, cond)
+ return b
+}
+
+// Or sets OR condition
+func (b *Builder) Or(cond Cond) *Builder {
+ b.cond = Or(b.cond, cond)
+ return b
+}
+
+// Insert sets insert SQL
+func (b *Builder) Insert(eq Eq) *Builder {
+ b.inserts = eq
+ b.optype = insertType
+ return b
+}
+
+// Update sets update SQL
+func (b *Builder) Update(updates ...Eq) *Builder {
+ b.updates = updates
+ b.optype = updateType
+ return b
+}
+
+// Delete sets delete SQL
+func (b *Builder) Delete(conds ...Cond) *Builder {
+ b.cond = b.cond.And(conds...)
+ b.optype = deleteType
+ return b
+}
+
+// WriteTo implements Writer interface
+func (b *Builder) WriteTo(w Writer) error {
+ switch b.optype {
+ case condType:
+ return b.cond.WriteTo(w)
+ case selectType:
+ return b.selectWriteTo(w)
+ case insertType:
+ return b.insertWriteTo(w)
+ case updateType:
+ return b.updateWriteTo(w)
+ case deleteType:
+ return b.deleteWriteTo(w)
+ }
+
+ return ErrNotSupportType
+}
+
+// ToSQL convert a builder to SQL and args
+func (b *Builder) ToSQL() (string, []interface{}, error) {
+ w := NewWriter()
+ if err := b.WriteTo(w); err != nil {
+ return "", nil, err
+ }
+
+ return w.writer.String(), w.args, nil
+}
+
+// ToSQL convert a builder or condtions to SQL and args
+func ToSQL(cond interface{}) (string, []interface{}, error) {
+ switch cond.(type) {
+ case Cond:
+ return condToSQL(cond.(Cond))
+ case *Builder:
+ return cond.(*Builder).ToSQL()
+ }
+ return "", nil, ErrNotSupportType
+}
diff --git a/vendor/github.com/go-xorm/builder/builder_delete.go b/vendor/github.com/go-xorm/builder/builder_delete.go
new file mode 100644
index 00000000..743f1a4a
--- /dev/null
+++ b/vendor/github.com/go-xorm/builder/builder_delete.go
@@ -0,0 +1,22 @@
+// Copyright 2016 The Xorm Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package builder
+
+import (
+ "errors"
+ "fmt"
+)
+
+func (b *Builder) deleteWriteTo(w Writer) error {
+ if len(b.tableName) <= 0 {
+ return errors.New("no table indicated")
+ }
+
+ if _, err := fmt.Fprintf(w, "DELETE FROM %s WHERE ", b.tableName); err != nil {
+ return err
+ }
+
+ return b.cond.WriteTo(w)
+}
diff --git a/vendor/github.com/go-xorm/builder/builder_insert.go b/vendor/github.com/go-xorm/builder/builder_insert.go
new file mode 100644
index 00000000..decec931
--- /dev/null
+++ b/vendor/github.com/go-xorm/builder/builder_insert.go
@@ -0,0 +1,64 @@
+// Copyright 2016 The Xorm Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package builder
+
+import (
+ "bytes"
+ "errors"
+ "fmt"
+)
+
+func (b *Builder) insertWriteTo(w Writer) error {
+ if len(b.tableName) <= 0 {
+ return errors.New("no table indicated")
+ }
+ if len(b.inserts) <= 0 {
+ return errors.New("no column to be update")
+ }
+
+ if _, err := fmt.Fprintf(w, "INSERT INTO %s (", b.tableName); err != nil {
+ return err
+ }
+
+ var args = make([]interface{}, 0)
+ var bs []byte
+ var valBuffer = bytes.NewBuffer(bs)
+ var i = 0
+ for col, value := range b.inserts {
+ fmt.Fprint(w, col)
+ if e, ok := value.(expr); ok {
+ fmt.Fprint(valBuffer, e.sql)
+ args = append(args, e.args...)
+ } else {
+ fmt.Fprint(valBuffer, "?")
+ args = append(args, value)
+ }
+
+ if i != len(b.inserts)-1 {
+ if _, err := fmt.Fprint(w, ","); err != nil {
+ return err
+ }
+ if _, err := fmt.Fprint(valBuffer, ","); err != nil {
+ return err
+ }
+ }
+ i = i + 1
+ }
+
+ if _, err := fmt.Fprint(w, ") Values ("); err != nil {
+ return err
+ }
+
+ if _, err := w.Write(valBuffer.Bytes()); err != nil {
+ return err
+ }
+ if _, err := fmt.Fprint(w, ")"); err != nil {
+ return err
+ }
+
+ w.Append(args...)
+
+ return nil
+}
diff --git a/vendor/github.com/go-xorm/builder/builder_select.go b/vendor/github.com/go-xorm/builder/builder_select.go
new file mode 100644
index 00000000..05f116e0
--- /dev/null
+++ b/vendor/github.com/go-xorm/builder/builder_select.go
@@ -0,0 +1,53 @@
+// Copyright 2016 The Xorm Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package builder
+
+import (
+ "errors"
+ "fmt"
+)
+
+func (b *Builder) selectWriteTo(w Writer) error {
+ if len(b.tableName) <= 0 {
+ return errors.New("no table indicated")
+ }
+
+ if _, err := fmt.Fprint(w, "SELECT "); err != nil {
+ return err
+ }
+ if len(b.selects) > 0 {
+ for i, s := range b.selects {
+ if _, err := fmt.Fprint(w, s); err != nil {
+ return err
+ }
+ if i != len(b.selects)-1 {
+ if _, err := fmt.Fprint(w, ","); err != nil {
+ return err
+ }
+ }
+ }
+ } else {
+ if _, err := fmt.Fprint(w, "*"); err != nil {
+ return err
+ }
+ }
+
+ if _, err := fmt.Fprintf(w, " FROM %s", b.tableName); err != nil {
+ return err
+ }
+
+ for _, v := range b.joins {
+ fmt.Fprintf(w, " %s JOIN %s ON ", v.joinType, v.joinTable)
+ if err := v.joinCond.WriteTo(w); err != nil {
+ return err
+ }
+ }
+
+ if _, err := fmt.Fprint(w, " WHERE "); err != nil {
+ return err
+ }
+
+ return b.cond.WriteTo(w)
+}
diff --git a/vendor/github.com/go-xorm/builder/builder_update.go b/vendor/github.com/go-xorm/builder/builder_update.go
new file mode 100644
index 00000000..182af830
--- /dev/null
+++ b/vendor/github.com/go-xorm/builder/builder_update.go
@@ -0,0 +1,41 @@
+// Copyright 2016 The Xorm Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package builder
+
+import (
+ "errors"
+ "fmt"
+)
+
+func (b *Builder) updateWriteTo(w Writer) error {
+ if len(b.tableName) <= 0 {
+ return errors.New("no table indicated")
+ }
+ if len(b.updates) <= 0 {
+ return errors.New("no column to be update")
+ }
+
+ if _, err := fmt.Fprintf(w, "UPDATE %s SET ", b.tableName); err != nil {
+ return err
+ }
+
+ for i, s := range b.updates {
+ if err := s.opWriteTo(",", w); err != nil {
+ return err
+ }
+
+ if i != len(b.updates)-1 {
+ if _, err := fmt.Fprint(w, ","); err != nil {
+ return err
+ }
+ }
+ }
+
+ if _, err := fmt.Fprint(w, " WHERE "); err != nil {
+ return err
+ }
+
+ return b.cond.WriteTo(w)
+}
diff --git a/vendor/github.com/go-xorm/builder/circle.yml b/vendor/github.com/go-xorm/builder/circle.yml
new file mode 100644
index 00000000..b2a8bfc9
--- /dev/null
+++ b/vendor/github.com/go-xorm/builder/circle.yml
@@ -0,0 +1,12 @@
+dependencies:
+ override:
+ # './...' is a relative pattern which means all subdirectories
+ - go get -t -d -v ./...
+ - go build -v
+ - go get -u github.com/golang/lint/golint
+
+test:
+ override:
+ # './...' is a relative pattern which means all subdirectories
+ - golint ./...
+ - go test -v -race \ No newline at end of file
diff --git a/vendor/github.com/go-xorm/builder/cond.go b/vendor/github.com/go-xorm/builder/cond.go
new file mode 100644
index 00000000..77dd139b
--- /dev/null
+++ b/vendor/github.com/go-xorm/builder/cond.go
@@ -0,0 +1,87 @@
+// Copyright 2016 The Xorm Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package builder
+
+import (
+ "bytes"
+ "io"
+)
+
+// Writer defines the interface
+type Writer interface {
+ io.Writer
+ Append(...interface{})
+}
+
+var _ Writer = NewWriter()
+
+// BytesWriter implments Writer and save SQL in bytes.Buffer
+type BytesWriter struct {
+ writer *bytes.Buffer
+ buffer []byte
+ args []interface{}
+}
+
+// NewWriter creates a new string writer
+func NewWriter() *BytesWriter {
+ w := &BytesWriter{}
+ w.writer = bytes.NewBuffer(w.buffer)
+ return w
+}
+
+// Write writes data to Writer
+func (s *BytesWriter) Write(buf []byte) (int, error) {
+ return s.writer.Write(buf)
+}
+
+// Append appends args to Writer
+func (s *BytesWriter) Append(args ...interface{}) {
+ s.args = append(s.args, args...)
+}
+
+// Cond defines an interface
+type Cond interface {
+ WriteTo(Writer) error
+ And(...Cond) Cond
+ Or(...Cond) Cond
+ IsValid() bool
+}
+
+type condEmpty struct{}
+
+var _ Cond = condEmpty{}
+
+// NewCond creates an empty condition
+func NewCond() Cond {
+ return condEmpty{}
+}
+
+func (condEmpty) WriteTo(w Writer) error {
+ return nil
+}
+
+func (condEmpty) And(conds ...Cond) Cond {
+ return And(conds...)
+}
+
+func (condEmpty) Or(conds ...Cond) Cond {
+ return Or(conds...)
+}
+
+func (condEmpty) IsValid() bool {
+ return false
+}
+
+func condToSQL(cond Cond) (string, []interface{}, error) {
+ if cond == nil || !cond.IsValid() {
+ return "", nil, nil
+ }
+
+ w := NewWriter()
+ if err := cond.WriteTo(w); err != nil {
+ return "", nil, err
+ }
+ return w.writer.String(), w.args, nil
+}
diff --git a/vendor/github.com/go-xorm/builder/cond_and.go b/vendor/github.com/go-xorm/builder/cond_and.go
new file mode 100644
index 00000000..9c30e9c2
--- /dev/null
+++ b/vendor/github.com/go-xorm/builder/cond_and.go
@@ -0,0 +1,59 @@
+// Copyright 2016 The Xorm Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package builder
+
+import "fmt"
+
+type condAnd []Cond
+
+var _ Cond = condAnd{}
+
+// And generates AND conditions
+func And(conds ...Cond) Cond {
+ var result = make(condAnd, 0, len(conds))
+ for _, cond := range conds {
+ if cond == nil || !cond.IsValid() {
+ continue
+ }
+ result = append(result, cond)
+ }
+ return result
+}
+
+func (and condAnd) WriteTo(w Writer) error {
+ for i, cond := range and {
+ _, isOr := cond.(condOr)
+ if isOr {
+ fmt.Fprint(w, "(")
+ }
+
+ err := cond.WriteTo(w)
+ if err != nil {
+ return err
+ }
+
+ if isOr {
+ fmt.Fprint(w, ")")
+ }
+
+ if i != len(and)-1 {
+ fmt.Fprint(w, " AND ")
+ }
+ }
+
+ return nil
+}
+
+func (and condAnd) And(conds ...Cond) Cond {
+ return And(and, And(conds...))
+}
+
+func (and condAnd) Or(conds ...Cond) Cond {
+ return Or(and, Or(conds...))
+}
+
+func (and condAnd) IsValid() bool {
+ return len(and) > 0
+}
diff --git a/vendor/github.com/go-xorm/builder/cond_between.go b/vendor/github.com/go-xorm/builder/cond_between.go
new file mode 100644
index 00000000..f2b29ed1
--- /dev/null
+++ b/vendor/github.com/go-xorm/builder/cond_between.go
@@ -0,0 +1,40 @@
+// Copyright 2016 The Xorm Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package builder
+
+import "fmt"
+
+// Between implmentes between condition
+type Between struct {
+ Col string
+ LessVal interface{}
+ MoreVal interface{}
+}
+
+var _ Cond = Between{}
+
+// WriteTo write data to Writer
+func (between Between) WriteTo(w Writer) error {
+ if _, err := fmt.Fprintf(w, "%s BETWEEN ? AND ?", between.Col); err != nil {
+ return err
+ }
+ w.Append(between.LessVal, between.MoreVal)
+ return nil
+}
+
+// And implments And with other conditions
+func (between Between) And(conds ...Cond) Cond {
+ return And(between, And(conds...))
+}
+
+// Or implments Or with other conditions
+func (between Between) Or(conds ...Cond) Cond {
+ return Or(between, Or(conds...))
+}
+
+// IsValid tests if the condition is valid
+func (between Between) IsValid() bool {
+ return len(between.Col) > 0
+}
diff --git a/vendor/github.com/go-xorm/builder/cond_compare.go b/vendor/github.com/go-xorm/builder/cond_compare.go
new file mode 100644
index 00000000..e10ef744
--- /dev/null
+++ b/vendor/github.com/go-xorm/builder/cond_compare.go
@@ -0,0 +1,154 @@
+// Copyright 2016 The Xorm Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package builder
+
+import "fmt"
+
+// WriteMap writes conditions' SQL to Writer, op could be =, <>, >, <, <=, >= and etc.
+func WriteMap(w Writer, data map[string]interface{}, op string) error {
+ var args = make([]interface{}, 0, len(data))
+ var i = 0
+ for k, v := range data {
+ switch v.(type) {
+ case expr:
+ if _, err := fmt.Fprintf(w, "%s%s(", k, op); err != nil {
+ return err
+ }
+
+ if err := v.(expr).WriteTo(w); err != nil {
+ return err
+ }
+
+ if _, err := fmt.Fprintf(w, ")"); err != nil {
+ return err
+ }
+ case *Builder:
+ if _, err := fmt.Fprintf(w, "%s%s(", k, op); err != nil {
+ return err
+ }
+
+ if err := v.(*Builder).WriteTo(w); err != nil {
+ return err
+ }
+
+ if _, err := fmt.Fprintf(w, ")"); err != nil {
+ return err
+ }
+ default:
+ if _, err := fmt.Fprintf(w, "%s%s?", k, op); err != nil {
+ return err
+ }
+ args = append(args, v)
+ }
+ if i != len(data)-1 {
+ if _, err := fmt.Fprint(w, " AND "); err != nil {
+ return err
+ }
+ }
+ i = i + 1
+ }
+ w.Append(args...)
+ return nil
+}
+
+// Lt defines < condition
+type Lt map[string]interface{}
+
+var _ Cond = Lt{}
+
+// WriteTo write SQL to Writer
+func (lt Lt) WriteTo(w Writer) error {
+ return WriteMap(w, lt, "<")
+}
+
+// And implements And with other conditions
+func (lt Lt) And(conds ...Cond) Cond {
+ return condAnd{lt, And(conds...)}
+}
+
+// Or implements Or with other conditions
+func (lt Lt) Or(conds ...Cond) Cond {
+ return condOr{lt, Or(conds...)}
+}
+
+// IsValid tests if this Eq is valid
+func (lt Lt) IsValid() bool {
+ return len(lt) > 0
+}
+
+// Lte defines <= condition
+type Lte map[string]interface{}
+
+var _ Cond = Lte{}
+
+// WriteTo write SQL to Writer
+func (lte Lte) WriteTo(w Writer) error {
+ return WriteMap(w, lte, "<=")
+}
+
+// And implements And with other conditions
+func (lte Lte) And(conds ...Cond) Cond {
+ return And(lte, And(conds...))
+}
+
+// Or implements Or with other conditions
+func (lte Lte) Or(conds ...Cond) Cond {
+ return Or(lte, Or(conds...))
+}
+
+// IsValid tests if this Eq is valid
+func (lte Lte) IsValid() bool {
+ return len(lte) > 0
+}
+
+// Gt defines > condition
+type Gt map[string]interface{}
+
+var _ Cond = Gt{}
+
+// WriteTo write SQL to Writer
+func (gt Gt) WriteTo(w Writer) error {
+ return WriteMap(w, gt, ">")
+}
+
+// And implements And with other conditions
+func (gt Gt) And(conds ...Cond) Cond {
+ return And(gt, And(conds...))
+}
+
+// Or implements Or with other conditions
+func (gt Gt) Or(conds ...Cond) Cond {
+ return Or(gt, Or(conds...))
+}
+
+// IsValid tests if this Eq is valid
+func (gt Gt) IsValid() bool {
+ return len(gt) > 0
+}
+
+// Gte defines >= condition
+type Gte map[string]interface{}
+
+var _ Cond = Gte{}
+
+// WriteTo write SQL to Writer
+func (gte Gte) WriteTo(w Writer) error {
+ return WriteMap(w, gte, ">=")
+}
+
+// And implements And with other conditions
+func (gte Gte) And(conds ...Cond) Cond {
+ return And(gte, And(conds...))
+}
+
+// Or implements Or with other conditions
+func (gte Gte) Or(conds ...Cond) Cond {
+ return Or(gte, Or(conds...))
+}
+
+// IsValid tests if this Eq is valid
+func (gte Gte) IsValid() bool {
+ return len(gte) > 0
+}
diff --git a/vendor/github.com/go-xorm/builder/cond_eq.go b/vendor/github.com/go-xorm/builder/cond_eq.go
new file mode 100644
index 00000000..8777727f
--- /dev/null
+++ b/vendor/github.com/go-xorm/builder/cond_eq.go
@@ -0,0 +1,96 @@
+// Copyright 2016 The Xorm Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package builder
+
+import "fmt"
+
+// Incr implements a type used by Eq
+type Incr int
+
+// Decr implements a type used by Eq
+type Decr int
+
+// Eq defines equals conditions
+type Eq map[string]interface{}
+
+var _ Cond = Eq{}
+
+func (eq Eq) opWriteTo(op string, w Writer) error {
+ var i = 0
+ for k, v := range eq {
+ switch v.(type) {
+ case []int, []int64, []string, []int32, []int16, []int8, []uint, []uint64, []uint32, []uint16, []interface{}:
+ if err := In(k, v).WriteTo(w); err != nil {
+ return err
+ }
+ case expr:
+ if _, err := fmt.Fprintf(w, "%s=(", k); err != nil {
+ return err
+ }
+
+ if err := v.(expr).WriteTo(w); err != nil {
+ return err
+ }
+
+ if _, err := fmt.Fprintf(w, ")"); err != nil {
+ return err
+ }
+ case *Builder:
+ if _, err := fmt.Fprintf(w, "%s=(", k); err != nil {
+ return err
+ }
+
+ if err := v.(*Builder).WriteTo(w); err != nil {
+ return err
+ }
+
+ if _, err := fmt.Fprintf(w, ")"); err != nil {
+ return err
+ }
+ case Incr:
+ if _, err := fmt.Fprintf(w, "%s=%s+?", k, k); err != nil {
+ return err
+ }
+ w.Append(int(v.(Incr)))
+ case Decr:
+ if _, err := fmt.Fprintf(w, "%s=%s-?", k, k); err != nil {
+ return err
+ }
+ w.Append(int(v.(Decr)))
+ default:
+ if _, err := fmt.Fprintf(w, "%s=?", k); err != nil {
+ return err
+ }
+ w.Append(v)
+ }
+ if i != len(eq)-1 {
+ if _, err := fmt.Fprint(w, op); err != nil {
+ return err
+ }
+ }
+ i = i + 1
+ }
+ return nil
+}
+
+// WriteTo writes SQL to Writer
+func (eq Eq) WriteTo(w Writer) error {
+ return eq.opWriteTo(" AND ", w)
+}
+
+// And implements And with other conditions
+func (eq Eq) And(conds ...Cond) Cond {
+ return And(eq, And(conds...))
+}
+
+// Or implements Or with other conditions
+func (eq Eq) Or(conds ...Cond) Cond {
+ return Or(eq, Or(conds...))
+}
+
+// IsValid tests if this Eq is valid
+func (eq Eq) IsValid() bool {
+ return len(eq) > 0
+}
diff --git a/vendor/github.com/go-xorm/builder/cond_expr.go b/vendor/github.com/go-xorm/builder/cond_expr.go
new file mode 100644
index 00000000..e5ed572b
--- /dev/null
+++ b/vendor/github.com/go-xorm/builder/cond_expr.go
@@ -0,0 +1,39 @@
+// Copyright 2016 The Xorm Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package builder
+
+import "fmt"
+
+type expr struct {
+ sql string
+ args []interface{}
+}
+
+var _ Cond = expr{}
+
+// Expr generate customerize SQL
+func Expr(sql string, args ...interface{}) Cond {
+ return expr{sql, args}
+}
+
+func (expr expr) WriteTo(w Writer) error {
+ if _, err := fmt.Fprint(w, expr.sql); err != nil {
+ return err
+ }
+ w.Append(expr.args...)
+ return nil
+}
+
+func (expr expr) And(conds ...Cond) Cond {
+ return And(expr, And(conds...))
+}
+
+func (expr expr) Or(conds ...Cond) Cond {
+ return Or(expr, Or(conds...))
+}
+
+func (expr expr) IsValid() bool {
+ return len(expr.sql) > 0
+}
diff --git a/vendor/github.com/go-xorm/builder/cond_in.go b/vendor/github.com/go-xorm/builder/cond_in.go
new file mode 100644
index 00000000..9ada13b7
--- /dev/null
+++ b/vendor/github.com/go-xorm/builder/cond_in.go
@@ -0,0 +1,217 @@
+// Copyright 2016 The Xorm Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package builder
+
+import (
+ "fmt"
+ "strings"
+)
+
+type condIn struct {
+ col string
+ vals []interface{}
+}
+
+var _ Cond = condIn{}
+
+// In generates IN condition
+func In(col string, values ...interface{}) Cond {
+ return condIn{col, values}
+}
+
+func (condIn condIn) WriteTo(w Writer) error {
+ if len(condIn.vals) <= 0 {
+ return ErrNoInConditions
+ }
+
+ switch condIn.vals[0].(type) {
+ case []int8:
+ vals := condIn.vals[0].([]int8)
+ if len(vals) <= 0 {
+ return ErrNoInConditions
+ }
+ questionMark := strings.Repeat("?,", len(vals))
+ if _, err := fmt.Fprintf(w, "%s IN (%s)", condIn.col, questionMark[:len(questionMark)-1]); err != nil {
+ return err
+ }
+ for _, val := range vals {
+ w.Append(val)
+ }
+ case []int16:
+ vals := condIn.vals[0].([]int16)
+ if len(vals) <= 0 {
+ return ErrNoInConditions
+ }
+ questionMark := strings.Repeat("?,", len(vals))
+ if _, err := fmt.Fprintf(w, "%s IN (%s)", condIn.col, questionMark[:len(questionMark)-1]); err != nil {
+ return err
+ }
+ for _, val := range vals {
+ w.Append(val)
+ }
+ case []int:
+ vals := condIn.vals[0].([]int)
+ if len(vals) <= 0 {
+ return ErrNoInConditions
+ }
+ questionMark := strings.Repeat("?,", len(vals))
+ if _, err := fmt.Fprintf(w, "%s IN (%s)", condIn.col, questionMark[:len(questionMark)-1]); err != nil {
+ return err
+ }
+ for _, val := range vals {
+ w.Append(val)
+ }
+ case []int32:
+ vals := condIn.vals[0].([]int32)
+ if len(vals) <= 0 {
+ return ErrNoInConditions
+ }
+ questionMark := strings.Repeat("?,", len(vals))
+ if _, err := fmt.Fprintf(w, "%s IN (%s)", condIn.col, questionMark[:len(questionMark)-1]); err != nil {
+ return err
+ }
+ for _, val := range vals {
+ w.Append(val)
+ }
+ case []int64:
+ vals := condIn.vals[0].([]int64)
+ if len(vals) <= 0 {
+ return ErrNoInConditions
+ }
+ questionMark := strings.Repeat("?,", len(vals))
+ if _, err := fmt.Fprintf(w, "%s IN (%s)", condIn.col, questionMark[:len(questionMark)-1]); err != nil {
+ return err
+ }
+ for _, val := range vals {
+ w.Append(val)
+ }
+ case []uint8:
+ vals := condIn.vals[0].([]uint8)
+ if len(vals) <= 0 {
+ return ErrNoInConditions
+ }
+ questionMark := strings.Repeat("?,", len(vals))
+ if _, err := fmt.Fprintf(w, "%s IN (%s)", condIn.col, questionMark[:len(questionMark)-1]); err != nil {
+ return err
+ }
+ for _, val := range vals {
+ w.Append(val)
+ }
+ case []uint16:
+ vals := condIn.vals[0].([]uint16)
+ if len(vals) <= 0 {
+ return ErrNoInConditions
+ }
+ questionMark := strings.Repeat("?,", len(vals))
+ if _, err := fmt.Fprintf(w, "%s IN (%s)", condIn.col, questionMark[:len(questionMark)-1]); err != nil {
+ return err
+ }
+ for _, val := range vals {
+ w.Append(val)
+ }
+ case []uint:
+ vals := condIn.vals[0].([]uint)
+ if len(vals) <= 0 {
+ return ErrNoInConditions
+ }
+ questionMark := strings.Repeat("?,", len(vals))
+ if _, err := fmt.Fprintf(w, "%s IN (%s)", condIn.col, questionMark[:len(questionMark)-1]); err != nil {
+ return err
+ }
+ for _, val := range vals {
+ w.Append(val)
+ }
+ case []uint32:
+ vals := condIn.vals[0].([]uint32)
+ if len(vals) <= 0 {
+ return ErrNoInConditions
+ }
+ questionMark := strings.Repeat("?,", len(vals))
+ if _, err := fmt.Fprintf(w, "%s IN (%s)", condIn.col, questionMark[:len(questionMark)-1]); err != nil {
+ return err
+ }
+ for _, val := range vals {
+ w.Append(val)
+ }
+ case []uint64:
+ vals := condIn.vals[0].([]uint64)
+ if len(vals) <= 0 {
+ return ErrNoInConditions
+ }
+ questionMark := strings.Repeat("?,", len(vals))
+ if _, err := fmt.Fprintf(w, "%s IN (%s)", condIn.col, questionMark[:len(questionMark)-1]); err != nil {
+ return err
+ }
+ for _, val := range vals {
+ w.Append(val)
+ }
+ case []string:
+ vals := condIn.vals[0].([]string)
+ if len(vals) <= 0 {
+ return ErrNoInConditions
+ }
+ questionMark := strings.Repeat("?,", len(vals))
+ if _, err := fmt.Fprintf(w, "%s IN (%s)", condIn.col, questionMark[:len(questionMark)-1]); err != nil {
+ return err
+ }
+ for _, val := range vals {
+ w.Append(val)
+ }
+ case []interface{}:
+ vals := condIn.vals[0].([]interface{})
+ if len(vals) <= 0 {
+ return ErrNoInConditions
+ }
+ questionMark := strings.Repeat("?,", len(vals))
+ if _, err := fmt.Fprintf(w, "%s IN (%s)", condIn.col, questionMark[:len(questionMark)-1]); err != nil {
+ return err
+ }
+ w.Append(vals...)
+ case expr:
+ val := condIn.vals[0].(expr)
+ if _, err := fmt.Fprintf(w, "%s IN (", condIn.col); err != nil {
+ return err
+ }
+ if err := val.WriteTo(w); err != nil {
+ return err
+ }
+ if _, err := fmt.Fprintf(w, ")"); err != nil {
+ return err
+ }
+ case *Builder:
+ bd := condIn.vals[0].(*Builder)
+ if _, err := fmt.Fprintf(w, "%s IN (", condIn.col); err != nil {
+ return err
+ }
+ if err := bd.WriteTo(w); err != nil {
+ return err
+ }
+ if _, err := fmt.Fprintf(w, ")"); err != nil {
+ return err
+ }
+ default:
+ if len(condIn.vals) <= 0 {
+ return ErrNoInConditions
+ }
+ questionMark := strings.Repeat("?,", len(condIn.vals))
+ if _, err := fmt.Fprintf(w, "%s IN (%s)", condIn.col, questionMark[:len(questionMark)-1]); err != nil {
+ return err
+ }
+ w.Append(condIn.vals...)
+ }
+ return nil
+}
+
+func (condIn condIn) And(conds ...Cond) Cond {
+ return And(condIn, And(conds...))
+}
+
+func (condIn condIn) Or(conds ...Cond) Cond {
+ return Or(condIn, Or(conds...))
+}
+
+func (condIn condIn) IsValid() bool {
+ return len(condIn.col) > 0 && len(condIn.vals) > 0
+}
diff --git a/vendor/github.com/go-xorm/builder/cond_like.go b/vendor/github.com/go-xorm/builder/cond_like.go
new file mode 100644
index 00000000..0648badb
--- /dev/null
+++ b/vendor/github.com/go-xorm/builder/cond_like.go
@@ -0,0 +1,36 @@
+// Copyright 2016 The Xorm Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package builder
+
+import "fmt"
+
+// Like defines like condition
+type Like [2]string
+
+var _ Cond = Like{"", ""}
+
+// WriteTo write SQL to Writer
+func (like Like) WriteTo(w Writer) error {
+ if _, err := fmt.Fprintf(w, "%s LIKE ?", like[0]); err != nil {
+ return err
+ }
+ w.Append("%" + like[1] + "%")
+ return nil
+}
+
+// And implements And with other conditions
+func (like Like) And(conds ...Cond) Cond {
+ return And(like, And(conds...))
+}
+
+// Or implements Or with other conditions
+func (like Like) Or(conds ...Cond) Cond {
+ return Or(like, Or(conds...))
+}
+
+// IsValid tests if this condition is valid
+func (like Like) IsValid() bool {
+ return len(like[0]) > 0 && len(like[1]) > 0
+}
diff --git a/vendor/github.com/go-xorm/builder/cond_neq.go b/vendor/github.com/go-xorm/builder/cond_neq.go
new file mode 100644
index 00000000..d07b2b18
--- /dev/null
+++ b/vendor/github.com/go-xorm/builder/cond_neq.go
@@ -0,0 +1,78 @@
+// Copyright 2016 The Xorm Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package builder
+
+import "fmt"
+
+// Neq defines not equal conditions
+type Neq map[string]interface{}
+
+var _ Cond = Neq{}
+
+// WriteTo writes SQL to Writer
+func (neq Neq) WriteTo(w Writer) error {
+ var args = make([]interface{}, 0, len(neq))
+ var i = 0
+ for k, v := range neq {
+ switch v.(type) {
+ case []int, []int64, []string, []int32, []int16, []int8:
+ if err := NotIn(k, v).WriteTo(w); err != nil {
+ return err
+ }
+ case expr:
+ if _, err := fmt.Fprintf(w, "%s<>(", k); err != nil {
+ return err
+ }
+
+ if err := v.(expr).WriteTo(w); err != nil {
+ return err
+ }
+
+ if _, err := fmt.Fprintf(w, ")"); err != nil {
+ return err
+ }
+ case *Builder:
+ if _, err := fmt.Fprintf(w, "%s<>(", k); err != nil {
+ return err
+ }
+
+ if err := v.(*Builder).WriteTo(w); err != nil {
+ return err
+ }
+
+ if _, err := fmt.Fprintf(w, ")"); err != nil {
+ return err
+ }
+ default:
+ if _, err := fmt.Fprintf(w, "%s<>?", k); err != nil {
+ return err
+ }
+ args = append(args, v)
+ }
+ if i != len(neq)-1 {
+ if _, err := fmt.Fprint(w, " AND "); err != nil {
+ return err
+ }
+ }
+ i = i + 1
+ }
+ w.Append(args...)
+ return nil
+}
+
+// And implements And with other conditions
+func (neq Neq) And(conds ...Cond) Cond {
+ return And(neq, And(conds...))
+}
+
+// Or implements Or with other conditions
+func (neq Neq) Or(conds ...Cond) Cond {
+ return Or(neq, Or(conds...))
+}
+
+// IsValid tests if this condition is valid
+func (neq Neq) IsValid() bool {
+ return len(neq) > 0
+}
diff --git a/vendor/github.com/go-xorm/builder/cond_not.go b/vendor/github.com/go-xorm/builder/cond_not.go
new file mode 100644
index 00000000..294a7e07
--- /dev/null
+++ b/vendor/github.com/go-xorm/builder/cond_not.go
@@ -0,0 +1,53 @@
+// Copyright 2016 The Xorm Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package builder
+
+import "fmt"
+
+// Not defines NOT condition
+type Not [1]Cond
+
+var _ Cond = Not{}
+
+// WriteTo writes SQL to Writer
+func (not Not) WriteTo(w Writer) error {
+ if _, err := fmt.Fprint(w, "NOT "); err != nil {
+ return err
+ }
+ switch not[0].(type) {
+ case condAnd, condOr:
+ if _, err := fmt.Fprint(w, "("); err != nil {
+ return err
+ }
+ }
+
+ if err := not[0].WriteTo(w); err != nil {
+ return err
+ }
+
+ switch not[0].(type) {
+ case condAnd, condOr:
+ if _, err := fmt.Fprint(w, ")"); err != nil {
+ return err
+ }
+ }
+
+ return nil
+}
+
+// And implements And with other conditions
+func (not Not) And(conds ...Cond) Cond {
+ return And(not, And(conds...))
+}
+
+// Or implements Or with other conditions
+func (not Not) Or(conds ...Cond) Cond {
+ return Or(not, Or(conds...))
+}
+
+// IsValid tests if this condition is valid
+func (not Not) IsValid() bool {
+ return not[0] != nil && not[0].IsValid()
+}
diff --git a/vendor/github.com/go-xorm/builder/cond_notin.go b/vendor/github.com/go-xorm/builder/cond_notin.go
new file mode 100644
index 00000000..47c16be2
--- /dev/null
+++ b/vendor/github.com/go-xorm/builder/cond_notin.go
@@ -0,0 +1,211 @@
+// Copyright 2016 The Xorm Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package builder
+
+import (
+ "fmt"
+ "strings"
+)
+
+type condNotIn condIn
+
+var _ Cond = condNotIn{}
+
+// NotIn generate NOT IN condition
+func NotIn(col string, values ...interface{}) Cond {
+ return condNotIn{col, values}
+}
+
+func (condNotIn condNotIn) WriteTo(w Writer) error {
+ if len(condNotIn.vals) <= 0 {
+ return ErrNoNotInConditions
+ }
+
+ switch condNotIn.vals[0].(type) {
+ case []int8:
+ vals := condNotIn.vals[0].([]int8)
+ if len(vals) <= 0 {
+ return ErrNoNotInConditions
+ }
+ questionMark := strings.Repeat("?,", len(vals))
+ if _, err := fmt.Fprintf(w, "%s NOT IN (%s)", condNotIn.col, questionMark[:len(questionMark)-1]); err != nil {
+ return err
+ }
+ for _, val := range vals {
+ w.Append(val)
+ }
+ case []int16:
+ vals := condNotIn.vals[0].([]int16)
+ if len(vals) <= 0 {
+ return ErrNoNotInConditions
+ }
+ questionMark := strings.Repeat("?,", len(vals))
+ if _, err := fmt.Fprintf(w, "%s NOT IN (%s)", condNotIn.col, questionMark[:len(questionMark)-1]); err != nil {
+ return err
+ }
+ for _, val := range vals {
+ w.Append(val)
+ }
+ case []int:
+ vals := condNotIn.vals[0].([]int)
+ if len(vals) <= 0 {
+ return ErrNoNotInConditions
+ }
+ questionMark := strings.Repeat("?,", len(vals))
+ if _, err := fmt.Fprintf(w, "%s NOT IN (%s)", condNotIn.col, questionMark[:len(questionMark)-1]); err != nil {
+ return err
+ }
+ for _, val := range vals {
+ w.Append(val)
+ }
+ case []int32:
+ vals := condNotIn.vals[0].([]int32)
+ if len(vals) <= 0 {
+ return ErrNoNotInConditions
+ }
+ questionMark := strings.Repeat("?,", len(vals))
+ if _, err := fmt.Fprintf(w, "%s NOT IN (%s)", condNotIn.col, questionMark[:len(questionMark)-1]); err != nil {
+ return err
+ }
+ for _, val := range vals {
+ w.Append(val)
+ }
+ case []int64:
+ vals := condNotIn.vals[0].([]int64)
+ if len(vals) <= 0 {
+ return ErrNoNotInConditions
+ }
+ questionMark := strings.Repeat("?,", len(vals))
+ if _, err := fmt.Fprintf(w, "%s NOT IN (%s)", condNotIn.col, questionMark[:len(questionMark)-1]); err != nil {
+ return err
+ }
+ for _, val := range vals {
+ w.Append(val)
+ }
+ case []uint8:
+ vals := condNotIn.vals[0].([]uint8)
+ if len(vals) <= 0 {
+ return ErrNoNotInConditions
+ }
+ questionMark := strings.Repeat("?,", len(vals))
+ if _, err := fmt.Fprintf(w, "%s NOT IN (%s)", condNotIn.col, questionMark[:len(questionMark)-1]); err != nil {
+ return err
+ }
+ for _, val := range vals {
+ w.Append(val)
+ }
+ case []uint16:
+ vals := condNotIn.vals[0].([]uint16)
+ if len(vals) <= 0 {
+ return ErrNoNotInConditions
+ }
+ questionMark := strings.Repeat("?,", len(vals))
+ if _, err := fmt.Fprintf(w, "%s NOT IN (%s)", condNotIn.col, questionMark[:len(questionMark)-1]); err != nil {
+ return err
+ }
+ for _, val := range vals {
+ w.Append(val)
+ }
+ case []uint:
+ vals := condNotIn.vals[0].([]uint)
+ if len(vals) <= 0 {
+ return ErrNoNotInConditions
+ }
+ questionMark := strings.Repeat("?,", len(vals))
+ if _, err := fmt.Fprintf(w, "%s NOT IN (%s)", condNotIn.col, questionMark[:len(questionMark)-1]); err != nil {
+ return err
+ }
+ for _, val := range vals {
+ w.Append(val)
+ }
+ case []uint32:
+ vals := condNotIn.vals[0].([]uint32)
+ if len(vals) <= 0 {
+ return ErrNoNotInConditions
+ }
+ questionMark := strings.Repeat("?,", len(vals))
+ if _, err := fmt.Fprintf(w, "%s NOT IN (%s)", condNotIn.col, questionMark[:len(questionMark)-1]); err != nil {
+ return err
+ }
+ for _, val := range vals {
+ w.Append(val)
+ }
+ case []uint64:
+ vals := condNotIn.vals[0].([]uint64)
+ if len(vals) <= 0 {
+ return ErrNoNotInConditions
+ }
+ questionMark := strings.Repeat("?,", len(vals))
+ if _, err := fmt.Fprintf(w, "%s NOT IN (%s)", condNotIn.col, questionMark[:len(questionMark)-1]); err != nil {
+ return err
+ }
+ for _, val := range vals {
+ w.Append(val)
+ }
+ case []string:
+ vals := condNotIn.vals[0].([]string)
+ if len(vals) <= 0 {
+ return ErrNoNotInConditions
+ }
+ questionMark := strings.Repeat("?,", len(vals))
+ if _, err := fmt.Fprintf(w, "%s NOT IN (%s)", condNotIn.col, questionMark[:len(questionMark)-1]); err != nil {
+ return err
+ }
+ for _, val := range vals {
+ w.Append(val)
+ }
+ case []interface{}:
+ vals := condNotIn.vals[0].([]interface{})
+ if len(vals) <= 0 {
+ return ErrNoNotInConditions
+ }
+ questionMark := strings.Repeat("?,", len(vals))
+ if _, err := fmt.Fprintf(w, "%s NOT IN (%s)", condNotIn.col, questionMark[:len(questionMark)-1]); err != nil {
+ return err
+ }
+ w.Append(vals...)
+ case expr:
+ val := condNotIn.vals[0].(expr)
+ if _, err := fmt.Fprintf(w, "%s NOT IN (", condNotIn.col); err != nil {
+ return err
+ }
+ if err := val.WriteTo(w); err != nil {
+ return err
+ }
+ if _, err := fmt.Fprintf(w, ")"); err != nil {
+ return err
+ }
+ case *Builder:
+ val := condNotIn.vals[0].(*Builder)
+ if _, err := fmt.Fprintf(w, "%s NOT IN (", condNotIn.col); err != nil {
+ return err
+ }
+ if err := val.WriteTo(w); err != nil {
+ return err
+ }
+ if _, err := fmt.Fprintf(w, ")"); err != nil {
+ return err
+ }
+ default:
+ questionMark := strings.Repeat("?,", len(condNotIn.vals))
+ if _, err := fmt.Fprintf(w, "%s NOT IN (%s)", condNotIn.col, questionMark[:len(questionMark)-1]); err != nil {
+ return err
+ }
+ w.Append(condNotIn.vals...)
+ }
+ return nil
+}
+
+func (condNotIn condNotIn) And(conds ...Cond) Cond {
+ return And(condNotIn, And(conds...))
+}
+
+func (condNotIn condNotIn) Or(conds ...Cond) Cond {
+ return Or(condNotIn, Or(conds...))
+}
+
+func (condNotIn condNotIn) IsValid() bool {
+ return len(condNotIn.col) > 0 && len(condNotIn.vals) > 0
+}
diff --git a/vendor/github.com/go-xorm/builder/cond_null.go b/vendor/github.com/go-xorm/builder/cond_null.go
new file mode 100644
index 00000000..bf2aaf85
--- /dev/null
+++ b/vendor/github.com/go-xorm/builder/cond_null.go
@@ -0,0 +1,59 @@
+// Copyright 2016 The Xorm Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package builder
+
+import "fmt"
+
+// IsNull defines IS NULL condition
+type IsNull [1]string
+
+var _ Cond = IsNull{""}
+
+// WriteTo write SQL to Writer
+func (isNull IsNull) WriteTo(w Writer) error {
+ _, err := fmt.Fprintf(w, "%s IS NULL", isNull[0])
+ return err
+}
+
+// And implements And with other conditions
+func (isNull IsNull) And(conds ...Cond) Cond {
+ return And(isNull, And(conds...))
+}
+
+// Or implements Or with other conditions
+func (isNull IsNull) Or(conds ...Cond) Cond {
+ return Or(isNull, Or(conds...))
+}
+
+// IsValid tests if this condition is valid
+func (isNull IsNull) IsValid() bool {
+ return len(isNull[0]) > 0
+}
+
+// NotNull defines NOT NULL condition
+type NotNull [1]string
+
+var _ Cond = NotNull{""}
+
+// WriteTo write SQL to Writer
+func (notNull NotNull) WriteTo(w Writer) error {
+ _, err := fmt.Fprintf(w, "%s IS NOT NULL", notNull[0])
+ return err
+}
+
+// And implements And with other conditions
+func (notNull NotNull) And(conds ...Cond) Cond {
+ return And(notNull, And(conds...))
+}
+
+// Or implements Or with other conditions
+func (notNull NotNull) Or(conds ...Cond) Cond {
+ return Or(notNull, Or(conds...))
+}
+
+// IsValid tests if this condition is valid
+func (notNull NotNull) IsValid() bool {
+ return len(notNull[0]) > 0
+}
diff --git a/vendor/github.com/go-xorm/builder/cond_or.go b/vendor/github.com/go-xorm/builder/cond_or.go
new file mode 100644
index 00000000..35c3da02
--- /dev/null
+++ b/vendor/github.com/go-xorm/builder/cond_or.go
@@ -0,0 +1,67 @@
+// Copyright 2016 The Xorm Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package builder
+
+import "fmt"
+
+type condOr []Cond
+
+var _ Cond = condOr{}
+
+// Or sets OR conditions
+func Or(conds ...Cond) Cond {
+ var result = make(condOr, 0, len(conds))
+ for _, cond := range conds {
+ if cond == nil || !cond.IsValid() {
+ continue
+ }
+ result = append(result, cond)
+ }
+ return result
+}
+
+// WriteTo implments Cond
+func (o condOr) WriteTo(w Writer) error {
+ for i, cond := range o {
+ var needQuote bool
+ switch cond.(type) {
+ case condAnd:
+ needQuote = true
+ case Eq:
+ needQuote = (len(cond.(Eq)) > 1)
+ }
+
+ if needQuote {
+ fmt.Fprint(w, "(")
+ }
+
+ err := cond.WriteTo(w)
+ if err != nil {
+ return err
+ }
+
+ if needQuote {
+ fmt.Fprint(w, ")")
+ }
+
+ if i != len(o)-1 {
+ fmt.Fprint(w, " OR ")
+ }
+ }
+
+ return nil
+}
+
+func (o condOr) And(conds ...Cond) Cond {
+ return And(o, And(conds...))
+}
+
+func (o condOr) Or(conds ...Cond) Cond {
+ return Or(o, Or(conds...))
+}
+
+func (o condOr) IsValid() bool {
+ return len(o) > 0
+}
diff --git a/vendor/github.com/go-xorm/builder/doc.go b/vendor/github.com/go-xorm/builder/doc.go
new file mode 100644
index 00000000..162b150f
--- /dev/null
+++ b/vendor/github.com/go-xorm/builder/doc.go
@@ -0,0 +1,120 @@
+// Copyright 2016 The XORM Authors. All rights reserved.
+// Use of this source code is governed by a BSD
+// license that can be found in the LICENSE file.
+
+/*
+
+Package builder is a simple and powerful sql builder for Go.
+
+Make sure you have installed Go 1.1+ and then:
+
+ go get github.com/go-xorm/builder
+
+WARNNING: Currently, only query conditions are supported. Below is the supported conditions.
+
+1. Eq is a redefine of a map, you can give one or more conditions to Eq
+
+ import . "github.com/go-xorm/builder"
+
+ sql, args, _ := ToSQL(Eq{"a":1})
+ // a=? [1]
+ sql, args, _ := ToSQL(Eq{"b":"c"}.And(Eq{"c": 0}))
+ // b=? AND c=? ["c", 0]
+ sql, args, _ := ToSQL(Eq{"b":"c", "c":0})
+ // b=? AND c=? ["c", 0]
+ sql, args, _ := ToSQL(Eq{"b":"c"}.Or(Eq{"b":"d"}))
+ // b=? OR b=? ["c", "d"]
+ sql, args, _ := ToSQL(Eq{"b": []string{"c", "d"}})
+ // b IN (?,?) ["c", "d"]
+ sql, args, _ := ToSQL(Eq{"b": 1, "c":[]int{2, 3}})
+ // b=? AND c IN (?,?) [1, 2, 3]
+
+2. Neq is the same to Eq
+
+ import . "github.com/go-xorm/builder"
+
+ sql, args, _ := ToSQL(Neq{"a":1})
+ // a<>? [1]
+ sql, args, _ := ToSQL(Neq{"b":"c"}.And(Neq{"c": 0}))
+ // b<>? AND c<>? ["c", 0]
+ sql, args, _ := ToSQL(Neq{"b":"c", "c":0})
+ // b<>? AND c<>? ["c", 0]
+ sql, args, _ := ToSQL(Neq{"b":"c"}.Or(Neq{"b":"d"}))
+ // b<>? OR b<>? ["c", "d"]
+ sql, args, _ := ToSQL(Neq{"b": []string{"c", "d"}})
+ // b NOT IN (?,?) ["c", "d"]
+ sql, args, _ := ToSQL(Neq{"b": 1, "c":[]int{2, 3}})
+ // b<>? AND c NOT IN (?,?) [1, 2, 3]
+
+3. Gt, Gte, Lt, Lte
+
+ import . "github.com/go-xorm/builder"
+
+ sql, args, _ := ToSQL(Gt{"a", 1}.And(Gte{"b", 2}))
+ // a>? AND b>=? [1, 2]
+ sql, args, _ := ToSQL(Lt{"a", 1}.Or(Lte{"b", 2}))
+ // a<? OR b<=? [1, 2]
+
+4. Like
+
+ import . "github.com/go-xorm/builder"
+
+ sql, args, _ := ToSQL(Like{"a", "c"})
+ // a LIKE ? [%c%]
+
+5. Expr you can customerize your sql with Expr
+
+ import . "github.com/go-xorm/builder"
+
+ sql, args, _ := ToSQL(Expr("a = ? ", 1))
+ // a = ? [1]
+ sql, args, _ := ToSQL(Eq{"a": Expr("select id from table where c = ?", 1)})
+ // a=(select id from table where c = ?) [1]
+
+6. In and NotIn
+
+ import . "github.com/go-xorm/builder"
+
+ sql, args, _ := ToSQL(In("a", 1, 2, 3))
+ // a IN (?,?,?) [1,2,3]
+ sql, args, _ := ToSQL(In("a", []int{1, 2, 3}))
+ // a IN (?,?,?) [1,2,3]
+ sql, args, _ := ToSQL(In("a", Expr("select id from b where c = ?", 1))))
+ // a IN (select id from b where c = ?) [1]
+
+7. IsNull and NotNull
+
+ import . "github.com/go-xorm/builder"
+
+ sql, args, _ := ToSQL(IsNull{"a"})
+ // a IS NULL []
+ sql, args, _ := ToSQL(NotNull{"b"})
+ // b IS NOT NULL []
+
+8. And(conds ...Cond), And can connect one or more condtions via AND
+
+ import . "github.com/go-xorm/builder"
+
+ sql, args, _ := ToSQL(And(Eq{"a":1}, Like{"b", "c"}, Neq{"d", 2}))
+ // a=? AND b LIKE ? AND d<>? [1, %c%, 2]
+
+9. Or(conds ...Cond), Or can connect one or more conditions via Or
+
+ import . "github.com/go-xorm/builder"
+
+ sql, args, _ := ToSQL(Or(Eq{"a":1}, Like{"b", "c"}, Neq{"d", 2}))
+ // a=? OR b LIKE ? OR d<>? [1, %c%, 2]
+ sql, args, _ := ToSQL(Or(Eq{"a":1}, And(Like{"b", "c"}, Neq{"d", 2})))
+ // a=? OR (b LIKE ? AND d<>?) [1, %c%, 2]
+
+10. Between
+
+ import . "github.com/go-xorm/builder"
+
+ sql, args, _ := ToSQL(Between("a", 1, 2))
+ // a BETWEEN 1 AND 2
+
+11. define yourself conditions
+Since Cond is a interface, you can define yourself conditions and compare with them
+*/
+package builder
diff --git a/vendor/github.com/go-xorm/builder/error.go b/vendor/github.com/go-xorm/builder/error.go
new file mode 100644
index 00000000..d7ac51ea
--- /dev/null
+++ b/vendor/github.com/go-xorm/builder/error.go
@@ -0,0 +1,16 @@
+// Copyright 2016 The Xorm Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package builder
+
+import "errors"
+
+var (
+ // ErrNotSupportType not supported SQL type error
+ ErrNotSupportType = errors.New("not supported SQL type")
+ // ErrNoNotInConditions no NOT IN params error
+ ErrNoNotInConditions = errors.New("No NOT IN conditions")
+ // ErrNoInConditions no IN params error
+ ErrNoInConditions = errors.New("No IN conditions")
+)