diff options
Diffstat (limited to 'vendor/github.com')
111 files changed, 951 insertions, 5939 deletions
diff --git a/vendor/github.com/go-sql-driver/mysql/.travis.yml b/vendor/github.com/go-sql-driver/mysql/.travis.yml index 75505f1440..cc1268c361 100644 --- a/vendor/github.com/go-sql-driver/mysql/.travis.yml +++ b/vendor/github.com/go-sql-driver/mysql/.travis.yml @@ -1,10 +1,10 @@ sudo: false language: go go: + - 1.7.x - 1.8.x - 1.9.x - 1.10.x - - 1.11.x - master before_install: diff --git a/vendor/github.com/go-sql-driver/mysql/AUTHORS b/vendor/github.com/go-sql-driver/mysql/AUTHORS index 5ce4f7eca1..73ff68fbcf 100644 --- a/vendor/github.com/go-sql-driver/mysql/AUTHORS +++ b/vendor/github.com/go-sql-driver/mysql/AUTHORS @@ -35,7 +35,6 @@ Hanno Braun <mail at hannobraun.com> Henri Yandell <flamefew at gmail.com> Hirotaka Yamamoto <ymmt2005 at gmail.com> ICHINOSE Shogo <shogo82148 at gmail.com> -Ilia Cimpoes <ichimpoesh at gmail.com> INADA Naoki <songofacandy at gmail.com> Jacek Szwec <szwec.jacek at gmail.com> James Harr <james.harr at gmail.com> @@ -73,9 +72,6 @@ Shuode Li <elemount at qq.com> Soroush Pour <me at soroushjp.com> Stan Putrya <root.vagner at gmail.com> Stanley Gunawan <gunawan.stanley at gmail.com> -Steven Hartland <steven.hartland at multiplay.co.uk> -Thomas Wodarek <wodarekwebpage at gmail.com> -Tom Jenkinson <tom at tjenkinson.me> Xiangyu Hu <xiangyu.hu at outlook.com> Xiaobing Jiang <s7v7nislands at gmail.com> Xiuming Chen <cc at cxm.cc> @@ -91,4 +87,3 @@ Keybase Inc. Percona LLC Pivotal Inc. Stripe Inc. -Multiplay Ltd. diff --git a/vendor/github.com/go-sql-driver/mysql/CHANGELOG.md b/vendor/github.com/go-sql-driver/mysql/CHANGELOG.md index 2d87d74c97..ce1b5330a9 100644 --- a/vendor/github.com/go-sql-driver/mysql/CHANGELOG.md +++ b/vendor/github.com/go-sql-driver/mysql/CHANGELOG.md @@ -1,3 +1,14 @@ +## Version 1.4.1 (2018-11-14) + +Bugfixes: + + - Fix TIME format for binary columns (#818) + - Fix handling of empty auth plugin names (#835) + - Fix caching_sha2_password with empty password (#826) + - Fix canceled context broke mysqlConn (#862) + - Fix OldAuthSwitchRequest support (#870) + - Fix Auth Response packet for cleartext password (#887) + ## Version 1.4 (2018-06-03) Changes: diff --git a/vendor/github.com/go-sql-driver/mysql/README.md b/vendor/github.com/go-sql-driver/mysql/README.md index 341d9194c1..2e9b07eeb2 100644 --- a/vendor/github.com/go-sql-driver/mysql/README.md +++ b/vendor/github.com/go-sql-driver/mysql/README.md @@ -40,7 +40,7 @@ A MySQL-Driver for Go's [database/sql](https://golang.org/pkg/database/sql/) pac * Optional placeholder interpolation ## Requirements - * Go 1.8 or higher. We aim to support the 3 latest versions of Go. + * Go 1.7 or higher. We aim to support the 3 latest versions of Go. * MySQL (4.1+), MariaDB, Percona Server, Google CloudSQL or Sphinx (2.2.3+) --------------------------------------- @@ -328,11 +328,11 @@ Timeout for establishing connections, aka dial timeout. The value must be a deci ``` Type: bool / string -Valid Values: true, false, skip-verify, preferred, <name> +Valid Values: true, false, skip-verify, <name> Default: false ``` -`tls=true` enables TLS / SSL encrypted connection to the server. Use `skip-verify` if you want to use a self-signed or invalid certificate (server side) or use `preferred` to use TLS only when advertised by the server. This is similar to `skip-verify`, but additionally allows a fallback to a connection which is not encrypted. Neither `skip-verify` nor `preferred` add any reliable security. You can use a custom TLS config after registering it with [`mysql.RegisterTLSConfig`](https://godoc.org/github.com/go-sql-driver/mysql#RegisterTLSConfig). +`tls=true` enables TLS / SSL encrypted connection to the server. Use `skip-verify` if you want to use a self-signed or invalid certificate (server side). Use a custom value registered with [`mysql.RegisterTLSConfig`](https://godoc.org/github.com/go-sql-driver/mysql#RegisterTLSConfig). ##### `writeTimeout` diff --git a/vendor/github.com/go-sql-driver/mysql/auth.go b/vendor/github.com/go-sql-driver/mysql/auth.go index fec7040d4a..14f678a87b 100644 --- a/vendor/github.com/go-sql-driver/mysql/auth.go +++ b/vendor/github.com/go-sql-driver/mysql/auth.go @@ -360,15 +360,13 @@ func (mc *mysqlConn) handleAuthResult(oldAuthData []byte, plugin string) error { pubKey := mc.cfg.pubKey if pubKey == nil { // request public key from server - data, err := mc.buf.takeSmallBuffer(4 + 1) - if err != nil { - return err - } + data := mc.buf.takeSmallBuffer(4 + 1) data[4] = cachingSha2PasswordRequestPublicKey mc.writePacket(data) // parse public key - if data, err = mc.readPacket(); err != nil { + data, err := mc.readPacket() + if err != nil { return err } diff --git a/vendor/github.com/go-sql-driver/mysql/buffer.go b/vendor/github.com/go-sql-driver/mysql/buffer.go index 19486bd6f6..eb4748bf44 100644 --- a/vendor/github.com/go-sql-driver/mysql/buffer.go +++ b/vendor/github.com/go-sql-driver/mysql/buffer.go @@ -22,17 +22,17 @@ const defaultBufSize = 4096 // The buffer is similar to bufio.Reader / Writer but zero-copy-ish // Also highly optimized for this particular use case. type buffer struct { - buf []byte // buf is a byte buffer who's length and capacity are equal. + buf []byte nc net.Conn idx int length int timeout time.Duration } -// newBuffer allocates and returns a new buffer. func newBuffer(nc net.Conn) buffer { + var b [defaultBufSize]byte return buffer{ - buf: make([]byte, defaultBufSize), + buf: b[:], nc: nc, } } @@ -105,56 +105,43 @@ func (b *buffer) readNext(need int) ([]byte, error) { return b.buf[offset:b.idx], nil } -// takeBuffer returns a buffer with the requested size. +// returns a buffer with the requested size. // If possible, a slice from the existing buffer is returned. // Otherwise a bigger buffer is made. // Only one buffer (total) can be used at a time. -func (b *buffer) takeBuffer(length int) ([]byte, error) { +func (b *buffer) takeBuffer(length int) []byte { if b.length > 0 { - return nil, ErrBusyBuffer + return nil } // test (cheap) general case first - if length <= cap(b.buf) { - return b.buf[:length], nil + if length <= defaultBufSize || length <= cap(b.buf) { + return b.buf[:length] } if length < maxPacketSize { b.buf = make([]byte, length) - return b.buf, nil + return b.buf } - - // buffer is larger than we want to store. - return make([]byte, length), nil + return make([]byte, length) } -// takeSmallBuffer is shortcut which can be used if length is -// known to be smaller than defaultBufSize. +// shortcut which can be used if the requested buffer is guaranteed to be +// smaller than defaultBufSize // Only one buffer (total) can be used at a time. -func (b *buffer) takeSmallBuffer(length int) ([]byte, error) { +func (b *buffer) takeSmallBuffer(length int) []byte { if b.length > 0 { - return nil, ErrBusyBuffer + return nil } - return b.buf[:length], nil + return b.buf[:length] } // takeCompleteBuffer returns the complete existing buffer. // This can be used if the necessary buffer size is unknown. -// cap and len of the returned buffer will be equal. // Only one buffer (total) can be used at a time. -func (b *buffer) takeCompleteBuffer() ([]byte, error) { - if b.length > 0 { - return nil, ErrBusyBuffer - } - return b.buf, nil -} - -// store stores buf, an updated buffer, if its suitable to do so. -func (b *buffer) store(buf []byte) error { +func (b *buffer) takeCompleteBuffer() []byte { if b.length > 0 { - return ErrBusyBuffer - } else if cap(buf) <= maxPacketSize && cap(buf) > cap(b.buf) { - b.buf = buf[:cap(buf)] + return nil } - return nil + return b.buf } diff --git a/vendor/github.com/go-sql-driver/mysql/connection.go b/vendor/github.com/go-sql-driver/mysql/connection.go index fc4ec7597d..e57061412b 100644 --- a/vendor/github.com/go-sql-driver/mysql/connection.go +++ b/vendor/github.com/go-sql-driver/mysql/connection.go @@ -9,8 +9,6 @@ package mysql import ( - "context" - "database/sql" "database/sql/driver" "io" "net" @@ -19,6 +17,16 @@ import ( "time" ) +// a copy of context.Context for Go 1.7 and earlier +type mysqlContext interface { + Done() <-chan struct{} + Err() error + + // defined in context.Context, but not used in this driver: + // Deadline() (deadline time.Time, ok bool) + // Value(key interface{}) interface{} +} + type mysqlConn struct { buf buffer netConn net.Conn @@ -35,7 +43,7 @@ type mysqlConn struct { // for context support (Go 1.8+) watching bool - watcher chan<- context.Context + watcher chan<- mysqlContext closech chan struct{} finished chan<- struct{} canceled atomicError // set non-nil if conn is canceled @@ -182,10 +190,10 @@ func (mc *mysqlConn) interpolateParams(query string, args []driver.Value) (strin return "", driver.ErrSkip } - buf, err := mc.buf.takeCompleteBuffer() - if err != nil { + buf := mc.buf.takeCompleteBuffer() + if buf == nil { // can not take the buffer. Something must be wrong with the connection - errLog.Print(err) + errLog.Print(ErrBusyBuffer) return "", ErrInvalidConn } buf = buf[:0] @@ -451,193 +459,3 @@ func (mc *mysqlConn) finish() { case <-mc.closech: } } - -// Ping implements driver.Pinger interface -func (mc *mysqlConn) Ping(ctx context.Context) (err error) { - if mc.closed.IsSet() { - errLog.Print(ErrInvalidConn) - return driver.ErrBadConn - } - - if err = mc.watchCancel(ctx); err != nil { - return - } - defer mc.finish() - - if err = mc.writeCommandPacket(comPing); err != nil { - return mc.markBadConn(err) - } - - return mc.readResultOK() -} - -// BeginTx implements driver.ConnBeginTx interface -func (mc *mysqlConn) BeginTx(ctx context.Context, opts driver.TxOptions) (driver.Tx, error) { - if err := mc.watchCancel(ctx); err != nil { - return nil, err - } - defer mc.finish() - - if sql.IsolationLevel(opts.Isolation) != sql.LevelDefault { - level, err := mapIsolationLevel(opts.Isolation) - if err != nil { - return nil, err - } - err = mc.exec("SET TRANSACTION ISOLATION LEVEL " + level) - if err != nil { - return nil, err - } - } - - return mc.begin(opts.ReadOnly) -} - -func (mc *mysqlConn) QueryContext(ctx context.Context, query string, args []driver.NamedValue) (driver.Rows, error) { - dargs, err := namedValueToValue(args) - if err != nil { - return nil, err - } - - if err := mc.watchCancel(ctx); err != nil { - return nil, err - } - - rows, err := mc.query(query, dargs) - if err != nil { - mc.finish() - return nil, err - } - rows.finish = mc.finish - return rows, err -} - -func (mc *mysqlConn) ExecContext(ctx context.Context, query string, args []driver.NamedValue) (driver.Result, error) { - dargs, err := namedValueToValue(args) - if err != nil { - return nil, err - } - - if err := mc.watchCancel(ctx); err != nil { - return nil, err - } - defer mc.finish() - - return mc.Exec(query, dargs) -} - -func (mc *mysqlConn) PrepareContext(ctx context.Context, query string) (driver.Stmt, error) { - if err := mc.watchCancel(ctx); err != nil { - return nil, err - } - - stmt, err := mc.Prepare(query) - mc.finish() - if err != nil { - return nil, err - } - - select { - default: - case <-ctx.Done(): - stmt.Close() - return nil, ctx.Err() - } - return stmt, nil -} - -func (stmt *mysqlStmt) QueryContext(ctx context.Context, args []driver.NamedValue) (driver.Rows, error) { - dargs, err := namedValueToValue(args) - if err != nil { - return nil, err - } - - if err := stmt.mc.watchCancel(ctx); err != nil { - return nil, err - } - - rows, err := stmt.query(dargs) - if err != nil { - stmt.mc.finish() - return nil, err - } - rows.finish = stmt.mc.finish - return rows, err -} - -func (stmt *mysqlStmt) ExecContext(ctx context.Context, args []driver.NamedValue) (driver.Result, error) { - dargs, err := namedValueToValue(args) - if err != nil { - return nil, err - } - - if err := stmt.mc.watchCancel(ctx); err != nil { - return nil, err - } - defer stmt.mc.finish() - - return stmt.Exec(dargs) -} - -func (mc *mysqlConn) watchCancel(ctx context.Context) error { - if mc.watching { - // Reach here if canceled, - // so the connection is already invalid - mc.cleanup() - return nil - } - // When ctx is already cancelled, don't watch it. - if err := ctx.Err(); err != nil { - return err - } - // When ctx is not cancellable, don't watch it. - if ctx.Done() == nil { - return nil - } - // When watcher is not alive, can't watch it. - if mc.watcher == nil { - return nil - } - - mc.watching = true - mc.watcher <- ctx - return nil -} - -func (mc *mysqlConn) startWatcher() { - watcher := make(chan context.Context, 1) - mc.watcher = watcher - finished := make(chan struct{}) - mc.finished = finished - go func() { - for { - var ctx context.Context - select { - case ctx = <-watcher: - case <-mc.closech: - return - } - - select { - case <-ctx.Done(): - mc.cancel(ctx.Err()) - case <-finished: - case <-mc.closech: - return - } - } - }() -} - -func (mc *mysqlConn) CheckNamedValue(nv *driver.NamedValue) (err error) { - nv.Value, err = converter{}.ConvertValue(nv.Value) - return -} - -// ResetSession implements driver.SessionResetter. -// (From Go 1.10) -func (mc *mysqlConn) ResetSession(ctx context.Context) error { - if mc.closed.IsSet() { - return driver.ErrBadConn - } - return nil -} diff --git a/vendor/github.com/go-sql-driver/mysql/connection_go18.go b/vendor/github.com/go-sql-driver/mysql/connection_go18.go new file mode 100644 index 0000000000..ce52c7d167 --- /dev/null +++ b/vendor/github.com/go-sql-driver/mysql/connection_go18.go @@ -0,0 +1,207 @@ +// Go MySQL Driver - A MySQL-Driver for Go's database/sql package +// +// Copyright 2012 The Go-MySQL-Driver Authors. All rights reserved. +// +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this file, +// You can obtain one at http://mozilla.org/MPL/2.0/. + +// +build go1.8 + +package mysql + +import ( + "context" + "database/sql" + "database/sql/driver" +) + +// Ping implements driver.Pinger interface +func (mc *mysqlConn) Ping(ctx context.Context) (err error) { + if mc.closed.IsSet() { + errLog.Print(ErrInvalidConn) + return driver.ErrBadConn + } + + if err = mc.watchCancel(ctx); err != nil { + return + } + defer mc.finish() + + if err = mc.writeCommandPacket(comPing); err != nil { + return + } + + return mc.readResultOK() +} + +// BeginTx implements driver.ConnBeginTx interface +func (mc *mysqlConn) BeginTx(ctx context.Context, opts driver.TxOptions) (driver.Tx, error) { + if err := mc.watchCancel(ctx); err != nil { + return nil, err + } + defer mc.finish() + + if sql.IsolationLevel(opts.Isolation) != sql.LevelDefault { + level, err := mapIsolationLevel(opts.Isolation) + if err != nil { + return nil, err + } + err = mc.exec("SET TRANSACTION ISOLATION LEVEL " + level) + if err != nil { + return nil, err + } + } + + return mc.begin(opts.ReadOnly) +} + +func (mc *mysqlConn) QueryContext(ctx context.Context, query string, args []driver.NamedValue) (driver.Rows, error) { + dargs, err := namedValueToValue(args) + if err != nil { + return nil, err + } + + if err := mc.watchCancel(ctx); err != nil { + return nil, err + } + + rows, err := mc.query(query, dargs) + if err != nil { + mc.finish() + return nil, err + } + rows.finish = mc.finish + return rows, err +} + +func (mc *mysqlConn) ExecContext(ctx context.Context, query string, args []driver.NamedValue) (driver.Result, error) { + dargs, err := namedValueToValue(args) + if err != nil { + return nil, err + } + + if err := mc.watchCancel(ctx); err != nil { + return nil, err + } + defer mc.finish() + + return mc.Exec(query, dargs) +} + +func (mc *mysqlConn) PrepareContext(ctx context.Context, query string) (driver.Stmt, error) { + if err := mc.watchCancel(ctx); err != nil { + return nil, err + } + + stmt, err := mc.Prepare(query) + mc.finish() + if err != nil { + return nil, err + } + + select { + default: + case <-ctx.Done(): + stmt.Close() + return nil, ctx.Err() + } + return stmt, nil +} + +func (stmt *mysqlStmt) QueryContext(ctx context.Context, args []driver.NamedValue) (driver.Rows, error) { + dargs, err := namedValueToValue(args) + if err != nil { + return nil, err + } + + if err := stmt.mc.watchCancel(ctx); err != nil { + return nil, err + } + + rows, err := stmt.query(dargs) + if err != nil { + stmt.mc.finish() + return nil, err + } + rows.finish = stmt.mc.finish + return rows, err +} + +func (stmt *mysqlStmt) ExecContext(ctx context.Context, args []driver.NamedValue) (driver.Result, error) { + dargs, err := namedValueToValue(args) + if err != nil { + return nil, err + } + + if err := stmt.mc.watchCancel(ctx); err != nil { + return nil, err + } + defer stmt.mc.finish() + + return stmt.Exec(dargs) +} + +func (mc *mysqlConn) watchCancel(ctx context.Context) error { + if mc.watching { + // Reach here if canceled, + // so the connection is already invalid + mc.cleanup() + return nil + } + // When ctx is already cancelled, don't watch it. + if err := ctx.Err(); err != nil { + return err + } + // When ctx is not cancellable, don't watch it. + if ctx.Done() == nil { + return nil + } + // When watcher is not alive, can't watch it. + if mc.watcher == nil { + return nil + } + + mc.watching = true + mc.watcher <- ctx + return nil +} + +func (mc *mysqlConn) startWatcher() { + watcher := make(chan mysqlContext, 1) + mc.watcher = watcher + finished := make(chan struct{}) + mc.finished = finished + go func() { + for { + var ctx mysqlContext + select { + case ctx = <-watcher: + case <-mc.closech: + return + } + + select { + case <-ctx.Done(): + mc.cancel(ctx.Err()) + case <-finished: + case <-mc.closech: + return + } + } + }() +} + +func (mc *mysqlConn) CheckNamedValue(nv *driver.NamedValue) (err error) { + nv.Value, err = converter{}.ConvertValue(nv.Value) + return +} + +// ResetSession implements driver.SessionResetter. +// (From Go 1.10) +func (mc *mysqlConn) ResetSession(ctx context.Context) error { + if mc.closed.IsSet() { + return driver.ErrBadConn + } + return nil +} diff --git a/vendor/github.com/go-sql-driver/mysql/driver.go b/vendor/github.com/go-sql-driver/mysql/driver.go index 9f4967087f..e9ede2c8da 100644 --- a/vendor/github.com/go-sql-driver/mysql/driver.go +++ b/vendor/github.com/go-sql-driver/mysql/driver.go @@ -23,6 +23,11 @@ import ( "sync" ) +// watcher interface is used for context support (From Go 1.8) +type watcher interface { + startWatcher() +} + // MySQLDriver is exported to make the driver directly accessible. // In general the driver is used via the database/sql package. type MySQLDriver struct{} @@ -50,7 +55,7 @@ func RegisterDial(net string, dial DialFunc) { // Open new Connection. // See https://github.com/go-sql-driver/mysql#dsn-data-source-name for how -// the DSN string is formatted +// the DSN string is formated func (d MySQLDriver) Open(dsn string) (driver.Conn, error) { var err error @@ -77,10 +82,6 @@ func (d MySQLDriver) Open(dsn string) (driver.Conn, error) { mc.netConn, err = nd.Dial(mc.cfg.Net, mc.cfg.Addr) } if err != nil { - if nerr, ok := err.(net.Error); ok && nerr.Temporary() { - errLog.Print("net.Error from Dial()': ", nerr.Error()) - return nil, driver.ErrBadConn - } return nil, err } @@ -95,7 +96,9 @@ func (d MySQLDriver) Open(dsn string) (driver.Conn, error) { } // Call startWatcher for context support (From Go 1.8) - mc.startWatcher() + if s, ok := interface{}(mc).(watcher); ok { + s.startWatcher() + } mc.buf = newBuffer(mc.netConn) diff --git a/vendor/github.com/go-sql-driver/mysql/dsn.go b/vendor/github.com/go-sql-driver/mysql/dsn.go index b9134722eb..be014babe3 100644 --- a/vendor/github.com/go-sql-driver/mysql/dsn.go +++ b/vendor/github.com/go-sql-driver/mysql/dsn.go @@ -560,7 +560,7 @@ func parseDSNParams(cfg *Config, params string) (err error) { } else { cfg.TLSConfig = "false" } - } else if vl := strings.ToLower(value); vl == "skip-verify" || vl == "preferred" { + } else if vl := strings.ToLower(value); vl == "skip-verify" { cfg.TLSConfig = vl cfg.tls = &tls.Config{InsecureSkipVerify: true} } else { diff --git a/vendor/github.com/go-sql-driver/mysql/packets.go b/vendor/github.com/go-sql-driver/mysql/packets.go index 5e0853767d..9ed6408509 100644 --- a/vendor/github.com/go-sql-driver/mysql/packets.go +++ b/vendor/github.com/go-sql-driver/mysql/packets.go @@ -51,7 +51,7 @@ func (mc *mysqlConn) readPacket() ([]byte, error) { mc.sequence++ // packets with length 0 terminate a previous packet which is a - // multiple of (2^24)-1 bytes long + // multiple of (2^24)−1 bytes long if pktLen == 0 { // there was no previous packet if prevData == nil { @@ -194,11 +194,7 @@ func (mc *mysqlConn) readHandshakePacket() (data []byte, plugin string, err erro return nil, "", ErrOldProtocol } if mc.flags&clientSSL == 0 && mc.cfg.tls != nil { - if mc.cfg.TLSConfig == "preferred" { - mc.cfg.tls = nil - } else { - return nil, "", ErrNoTLS - } + return nil, "", ErrNoTLS } pos += 2 @@ -290,10 +286,10 @@ func (mc *mysqlConn) writeHandshakeResponsePacket(authResp []byte, plugin string } // Calculate packet length and get buffer with that size - data, err := mc.buf.takeSmallBuffer(pktLen + 4) - if err != nil { + data := mc.buf.takeSmallBuffer(pktLen + 4) + if data == nil { // cannot take the buffer. Something must be wrong with the connection - errLog.Print(err) + errLog.Print(ErrBusyBuffer) return errBadConnNoWrite } @@ -371,10 +367,10 @@ func (mc *mysqlConn) writeHandshakeResponsePacket(authResp []byte, plugin string // http://dev.mysql.com/doc/internals/en/connection-phase-packets.html#packet-Protocol::AuthSwitchResponse func (mc *mysqlConn) writeAuthSwitchPacket(authData []byte) error { pktLen := 4 + len(authData) - data, err := mc.buf.takeSmallBuffer(pktLen) - if err != nil { + data := mc.buf.takeSmallBuffer(pktLen) + if data == nil { // cannot take the buffer. Something must be wrong with the connection - errLog.Print(err) + errLog.Print(ErrBusyBuffer) return errBadConnNoWrite } @@ -391,10 +387,10 @@ func (mc *mysqlConn) writeCommandPacket(command byte) error { // Reset Packet Sequence mc.sequence = 0 - data, err := mc.buf.takeSmallBuffer(4 + 1) - if err != nil { + data := mc.buf.takeSmallBuffer(4 + 1) + if data == nil { // cannot take the buffer. Something must be wrong with the connection - errLog.Print(err) + errLog.Print(ErrBusyBuffer) return errBadConnNoWrite } @@ -410,10 +406,10 @@ func (mc *mysqlConn) writeCommandPacketStr(command byte, arg string) error { mc.sequence = 0 pktLen := 1 + len(arg) - data, err := mc.buf.takeBuffer(pktLen + 4) - if err != nil { + data := mc.buf.takeBuffer(pktLen + 4) + if data == nil { // cannot take the buffer. Something must be wrong with the connection - errLog.Print(err) + errLog.Print(ErrBusyBuffer) return errBadConnNoWrite } @@ -431,10 +427,10 @@ func (mc *mysqlConn) writeCommandPacketUint32(command byte, arg uint32) error { // Reset Packet Sequence mc.sequence = 0 - data, err := mc.buf.takeSmallBuffer(4 + 1 + 4) - if err != nil { + data := mc.buf.takeSmallBuffer(4 + 1 + 4) + if data == nil { // cannot take the buffer. Something must be wrong with the connection - errLog.Print(err) + errLog.Print(ErrBusyBuffer) return errBadConnNoWrite } @@ -887,7 +883,7 @@ func (stmt *mysqlStmt) writeExecutePacket(args []driver.Value) error { const minPktLen = 4 + 1 + 4 + 1 + 4 mc := stmt.mc - // Determine threshold dynamically to avoid packet size shortage. + // Determine threshould dynamically to avoid packet size shortage. longDataSize := mc.maxAllowedPacket / (stmt.paramCount + 1) if longDataSize < 64 { longDataSize = 64 @@ -897,17 +893,15 @@ func (stmt *mysqlStmt) writeExecutePacket(args []driver.Value) error { mc.sequence = 0 var data []byte - var err error if len(args) == 0 { - data, err = mc.buf.takeBuffer(minPktLen) + data = mc.buf.takeBuffer(minPktLen) } else { - data, err = mc.buf.takeCompleteBuffer() - // In this case the len(data) == cap(data) which is used to optimise the flow below. + data = mc.buf.takeCompleteBuffer() } - if err != nil { + if data == nil { // cannot take the buffer. Something must be wrong with the connection - errLog.Print(err) + errLog.Print(ErrBusyBuffer) return errBadConnNoWrite } @@ -933,7 +927,7 @@ func (stmt *mysqlStmt) writeExecutePacket(args []driver.Value) error { pos := minPktLen var nullMask []byte - if maskLen, typesLen := (len(args)+7)/8, 1+2*len(args); pos+maskLen+typesLen >= cap(data) { + if maskLen, typesLen := (len(args)+7)/8, 1+2*len(args); pos+maskLen+typesLen >= len(data) { // buffer has to be extended but we don't know by how much so // we depend on append after all data with known sizes fit. // We stop at that because we deal with a lot of columns here @@ -942,11 +936,10 @@ func (stmt *mysqlStmt) writeExecutePacket(args []driver.Value) error { copy(tmp[:pos], data[:pos]) data = tmp nullMask = data[pos : pos+maskLen] - // No need to clean nullMask as make ensures that. pos += maskLen } else { nullMask = data[pos : pos+maskLen] - for i := range nullMask { + for i := 0; i < maskLen; i++ { nullMask[i] = 0 } pos += maskLen @@ -1083,10 +1076,7 @@ func (stmt *mysqlStmt) writeExecutePacket(args []driver.Value) error { // In that case we must build the data packet with the new values buffer if valuesCap != cap(paramValues) { data = append(data[:pos], paramValues...) - if err = mc.buf.store(data); err != nil { - errLog.Print(err) - return errBadConnNoWrite - } + mc.buf.buf = data } pos += len(paramValues) diff --git a/vendor/github.com/go-sql-driver/mysql/utils.go b/vendor/github.com/go-sql-driver/mysql/utils.go index cb3650bb9b..ca5d47d825 100644 --- a/vendor/github.com/go-sql-driver/mysql/utils.go +++ b/vendor/github.com/go-sql-driver/mysql/utils.go @@ -10,10 +10,8 @@ package mysql import ( "crypto/tls" - "database/sql" "database/sql/driver" "encoding/binary" - "errors" "fmt" "io" "strconv" @@ -82,7 +80,7 @@ func DeregisterTLSConfig(key string) { func getTLSConfigClone(key string) (config *tls.Config) { tlsConfigLock.RLock() if v, ok := tlsConfigRegistry[key]; ok { - config = v.Clone() + config = cloneTLSConfig(v) } tlsConfigLock.RUnlock() return @@ -726,30 +724,3 @@ func (ae *atomicError) Value() error { } return nil } - -func namedValueToValue(named []driver.NamedValue) ([]driver.Value, error) { - dargs := make([]driver.Value, len(named)) - for n, param := range named { - if len(param.Name) > 0 { - // TODO: support the use of Named Parameters #561 - return nil, errors.New("mysql: driver does not support the use of Named Parameters") - } - dargs[n] = param.Value - } - return dargs, nil -} - -func mapIsolationLevel(level driver.IsolationLevel) (string, error) { - switch sql.IsolationLevel(level) { - case sql.LevelRepeatableRead: - return "REPEATABLE READ", nil - case sql.LevelReadCommitted: - return "READ COMMITTED", nil - case sql.LevelReadUncommitted: - return "READ UNCOMMITTED", nil - case sql.LevelSerializable: - return "SERIALIZABLE", nil - default: - return "", fmt.Errorf("mysql: unsupported isolation level: %v", level) - } -} diff --git a/vendor/github.com/go-sql-driver/mysql/utils_go17.go b/vendor/github.com/go-sql-driver/mysql/utils_go17.go new file mode 100644 index 0000000000..f595634567 --- /dev/null +++ b/vendor/github.com/go-sql-driver/mysql/utils_go17.go @@ -0,0 +1,40 @@ +// Go MySQL Driver - A MySQL-Driver for Go's database/sql package +// +// Copyright 2017 The Go-MySQL-Driver Authors. All rights reserved. +// +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this file, +// You can obtain one at http://mozilla.org/MPL/2.0/. + +// +build go1.7 +// +build !go1.8 + +package mysql + +import "crypto/tls" + +func cloneTLSConfig(c *tls.Config) *tls.Config { + return &tls.Config{ + Rand: c.Rand, + Time: c.Time, + Certificates: c.Certificates, + NameToCertificate: c.NameToCertificate, + GetCertificate: c.GetCertificate, + RootCAs: c.RootCAs, + NextProtos: c.NextProtos, + ServerName: c.ServerName, + ClientAuth: c.ClientAuth, + ClientCAs: c.ClientCAs, + InsecureSkipVerify: c.InsecureSkipVerify, + CipherSuites: c.CipherSuites, + PreferServerCipherSuites: c.PreferServerCipherSuites, + SessionTicketsDisabled: c.SessionTicketsDisabled, + SessionTicketKey: c.SessionTicketKey, + ClientSessionCache: c.ClientSessionCache, + MinVersion: c.MinVersion, + MaxVersion: c.MaxVersion, + CurvePreferences: c.CurvePreferences, + DynamicRecordSizingDisabled: c.DynamicRecordSizingDisabled, + Renegotiation: c.Renegotiation, + } +} diff --git a/vendor/github.com/go-sql-driver/mysql/utils_go18.go b/vendor/github.com/go-sql-driver/mysql/utils_go18.go new file mode 100644 index 0000000000..c35c2a6aab --- /dev/null +++ b/vendor/github.com/go-sql-driver/mysql/utils_go18.go @@ -0,0 +1,50 @@ +// Go MySQL Driver - A MySQL-Driver for Go's database/sql package +// +// Copyright 2017 The Go-MySQL-Driver Authors. All rights reserved. +// +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this file, +// You can obtain one at http://mozilla.org/MPL/2.0/. + +// +build go1.8 + +package mysql + +import ( + "crypto/tls" + "database/sql" + "database/sql/driver" + "errors" + "fmt" +) + +func cloneTLSConfig(c *tls.Config) *tls.Config { + return c.Clone() +} + +func namedValueToValue(named []driver.NamedValue) ([]driver.Value, error) { + dargs := make([]driver.Value, len(named)) + for n, param := range named { + if len(param.Name) > 0 { + // TODO: support the use of Named Parameters #561 + return nil, errors.New("mysql: driver does not support the use of Named Parameters") + } + dargs[n] = param.Value + } + return dargs, nil +} + +func mapIsolationLevel(level driver.IsolationLevel) (string, error) { + switch sql.IsolationLevel(level) { + case sql.LevelRepeatableRead: + return "REPEATABLE READ", nil + case sql.LevelReadCommitted: + return "READ COMMITTED", nil + case sql.LevelReadUncommitted: + return "READ UNCOMMITTED", nil + case sql.LevelSerializable: + return "SERIALIZABLE", nil + default: + return "", fmt.Errorf("mysql: unsupported isolation level: %v", level) + } +} diff --git a/vendor/github.com/go-xorm/builder/.drone.yml b/vendor/github.com/go-xorm/builder/.drone.yml deleted file mode 100644 index ca40377721..0000000000 --- a/vendor/github.com/go-xorm/builder/.drone.yml +++ /dev/null @@ -1,37 +0,0 @@ -workspace: - base: /go - path: src/github.com/go-xorm/builder - -clone: - git: - image: plugins/git:next - depth: 50 - tags: true - -matrix: - GO_VERSION: - - 1.8 - - 1.9 - - 1.10 - - 1.11 - -pipeline: - test: - image: golang:${GO_VERSION} - commands: - - go get -u github.com/golang/lint/golint - - go get -u github.com/stretchr/testify/assert - - go get -u github.com/go-xorm/sqlfiddle - - golint ./... - - go test -v -race -coverprofile=coverage.txt -covermode=atomic - when: - event: [ push, tag, pull_request ] - -codecov: - image: robertstettner/drone-codecov - group: build - secrets: [ codecov_token ] - files: - - coverage.txt - when: - event: [ push, pull_request ]
\ No newline at end of file diff --git a/vendor/github.com/go-xorm/builder/LICENSE b/vendor/github.com/go-xorm/builder/LICENSE deleted file mode 100644 index 614d5e2829..0000000000 --- a/vendor/github.com/go-xorm/builder/LICENSE +++ /dev/null @@ -1,27 +0,0 @@ -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 deleted file mode 100644 index cf516d1fd5..0000000000 --- a/vendor/github.com/go-xorm/builder/README.md +++ /dev/null @@ -1,206 +0,0 @@ -# SQL builder - -[![GitCI.cn](https://gitci.cn/api/badges/go-xorm/builder/status.svg)](https://gitci.cn/go-xorm/builder) [![codecov](https://codecov.io/gh/go-xorm/builder/branch/master/graph/badge.svg)](https://codecov.io/gh/go-xorm/builder) -[![](https://goreportcard.com/badge/github.com/go-xorm/builder)](https://goreportcard.com/report/github.com/go-xorm/builder) - -Package builder is a lightweight and fast SQL builder for Go and XORM. - -Make sure you have installed Go 1.8+ and then: - - go get github.com/go-xorm/builder - -# Insert - -```Go -sql, args, err := builder.Insert(Eq{"c": 1, "d": 2}).Into("table1").ToSQL() - -// INSERT INTO table1 SELECT * FROM table2 -sql, err := builder.Insert().Into("table1").Select().From("table2").ToBoundSQL() - -// INSERT INTO table1 (a, b) SELECT b, c FROM table2 -sql, err = builder.Insert("a, b").Into("table1").Select("b, c").From("table2").ToBoundSQL() -``` - -# Select - -```Go -// Simple Query -sql, args, err := Select("c, d").From("table1").Where(Eq{"a": 1}).ToSQL() -// With join -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() -// From sub query -sql, args, err := Select("sub.id").From(Select("c").From("table1").Where(Eq{"a": 1}), "sub").Where(Eq{"b": 1}).ToSQL() -// From union query -sql, args, err = Select("sub.id").From( - Select("id").From("table1").Where(Eq{"a": 1}).Union("all", Select("id").From("table1").Where(Eq{"a": 2})),"sub"). - Where(Eq{"b": 1}).ToSQL() -// With order by -sql, args, err = Select("a", "b", "c").From("table1").Where(Eq{"f1": "v1", "f2": "v2"}). - OrderBy("a ASC").ToSQL() -// With limit. -// Be careful! You should set up specific dialect for builder before performing a query with LIMIT -sql, args, err = Dialect(MYSQL).Select("a", "b", "c").From("table1").OrderBy("a ASC"). - Limit(5, 10).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() -``` - -# Union - -```Go -sql, args, err := Select("*").From("a").Where(Eq{"status": "1"}). - Union("all", Select("*").From("a").Where(Eq{"status": "2"})). - Union("distinct", Select("*").From("a").Where(Eq{"status": "3"})). - Union("", Select("*").From("a").Where(Eq{"status": "4"})). - 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 deleted file mode 100644 index ffe86d4dcb..0000000000 --- a/vendor/github.com/go-xorm/builder/builder.go +++ /dev/null @@ -1,394 +0,0 @@ -// 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 ( - sql2 "database/sql" - "fmt" - "sort" -) - -type optype byte - -const ( - condType optype = iota // only conditions - selectType // select - insertType // insert - updateType // update - deleteType // delete - unionType // union -) - -const ( - POSTGRES = "postgres" - SQLITE = "sqlite3" - MYSQL = "mysql" - MSSQL = "mssql" - ORACLE = "oracle" -) - -type join struct { - joinType string - joinTable string - joinCond Cond -} - -type union struct { - unionType string - builder *Builder -} - -type limit struct { - limitN int - offset int -} - -// Builder describes a SQL statement -type Builder struct { - optype - dialect string - isNested bool - into string - from string - subQuery *Builder - cond Cond - selects []string - joins []join - unions []union - limitation *limit - insertCols []string - insertVals []interface{} - updates []Eq - orderBy string - groupBy string - having string -} - -// Dialect sets the db dialect of Builder. -func Dialect(dialect string) *Builder { - builder := &Builder{cond: NewCond(), dialect: dialect} - return builder -} - -// MySQL is shortcut of Dialect(MySQL) -func MySQL() *Builder { - return Dialect(MYSQL) -} - -// MsSQL is shortcut of Dialect(MsSQL) -func MsSQL() *Builder { - return Dialect(MSSQL) -} - -// Oracle is shortcut of Dialect(Oracle) -func Oracle() *Builder { - return Dialect(ORACLE) -} - -// Postgres is shortcut of Dialect(Postgres) -func Postgres() *Builder { - return Dialect(POSTGRES) -} - -// SQLite is shortcut of Dialect(SQLITE) -func SQLite() *Builder { - return Dialect(SQLITE) -} - -// Where sets where SQL -func (b *Builder) Where(cond Cond) *Builder { - if b.cond.IsValid() { - b.cond = b.cond.And(cond) - } else { - b.cond = cond - } - return b -} - -// From sets from subject(can be a table name in string or a builder pointer) and its alias -func (b *Builder) From(subject interface{}, alias ...string) *Builder { - switch subject.(type) { - case *Builder: - b.subQuery = subject.(*Builder) - - if len(alias) > 0 { - b.from = alias[0] - } else { - b.isNested = true - } - case string: - b.from = subject.(string) - - if len(alias) > 0 { - b.from = b.from + " " + alias[0] - } - } - - return b -} - -// TableName returns the table name -func (b *Builder) TableName() string { - if b.optype == insertType { - return b.into - } - return b.from -} - -// Into sets insert table name -func (b *Builder) Into(tableName string) *Builder { - b.into = tableName - return b -} - -// Join sets join table and conditions -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 -} - -// Union sets union conditions -func (b *Builder) Union(unionTp string, unionCond *Builder) *Builder { - var builder *Builder - if b.optype != unionType { - builder = &Builder{cond: NewCond()} - builder.optype = unionType - builder.dialect = b.dialect - builder.selects = b.selects - - currentUnions := b.unions - // erase sub unions (actually append to new Builder.unions) - b.unions = nil - - for e := range currentUnions { - currentUnions[e].builder.dialect = b.dialect - } - - builder.unions = append(append(builder.unions, union{"", b}), currentUnions...) - } else { - builder = b - } - - if unionCond != nil { - if unionCond.dialect == "" && builder.dialect != "" { - unionCond.dialect = builder.dialect - } - - builder.unions = append(builder.unions, union{unionTp, unionCond}) - } - - return builder -} - -// Limit sets limitN condition -func (b *Builder) Limit(limitN int, offset ...int) *Builder { - b.limitation = &limit{limitN: limitN} - - if len(offset) > 0 { - b.limitation.offset = offset[0] - } - - 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 - if b.optype == condType { - 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 -} - -type insertColsSorter struct { - cols []string - vals []interface{} -} - -func (s insertColsSorter) Len() int { - return len(s.cols) -} -func (s insertColsSorter) Swap(i, j int) { - s.cols[i], s.cols[j] = s.cols[j], s.cols[i] - s.vals[i], s.vals[j] = s.vals[j], s.vals[i] -} - -func (s insertColsSorter) Less(i, j int) bool { - return s.cols[i] < s.cols[j] -} - -// Insert sets insert SQL -func (b *Builder) Insert(eq ...interface{}) *Builder { - if len(eq) > 0 { - var paramType = -1 - for _, e := range eq { - switch t := e.(type) { - case Eq: - if paramType == -1 { - paramType = 0 - } - if paramType != 0 { - break - } - for k, v := range t { - b.insertCols = append(b.insertCols, k) - b.insertVals = append(b.insertVals, v) - } - case string: - if paramType == -1 { - paramType = 1 - } - if paramType != 1 { - break - } - b.insertCols = append(b.insertCols, t) - } - } - } - - if len(b.insertCols) == len(b.insertVals) { - sort.Sort(insertColsSorter{ - cols: b.insertCols, - vals: b.insertVals, - }) - } - b.optype = insertType - return b -} - -// Update sets update SQL -func (b *Builder) Update(updates ...Eq) *Builder { - b.updates = make([]Eq, 0, len(updates)) - for _, update := range updates { - if update.IsValid() { - b.updates = append(b.updates, update) - } - } - 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) - case unionType: - return b.unionWriteTo(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 - } - - // in case of sql.NamedArg in args - for e := range w.args { - if namedArg, ok := w.args[e].(sql2.NamedArg); ok { - w.args[e] = namedArg.Value - } - } - - var sql = w.writer.String() - var err error - - switch b.dialect { - case ORACLE, MSSQL: - // This is for compatibility with different sql drivers - for e := range w.args { - w.args[e] = sql2.Named(fmt.Sprintf("p%d", e+1), w.args[e]) - } - - var prefix string - if b.dialect == ORACLE { - prefix = ":p" - } else { - prefix = "@p" - } - - if sql, err = ConvertPlaceholder(sql, prefix); err != nil { - return "", nil, err - } - case POSTGRES: - if sql, err = ConvertPlaceholder(sql, "$"); err != nil { - return "", nil, err - } - } - - return sql, w.args, nil -} - -// ToBoundSQL -func (b *Builder) ToBoundSQL() (string, error) { - w := NewWriter() - if err := b.WriteTo(w); err != nil { - return "", err - } - - return ConvertToBoundSQL(w.writer.String(), w.args) -} diff --git a/vendor/github.com/go-xorm/builder/builder_delete.go b/vendor/github.com/go-xorm/builder/builder_delete.go deleted file mode 100644 index 317cc3ff9e..0000000000 --- a/vendor/github.com/go-xorm/builder/builder_delete.go +++ /dev/null @@ -1,27 +0,0 @@ -// 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" -) - -// Delete creates a delete Builder -func Delete(conds ...Cond) *Builder { - builder := &Builder{cond: NewCond()} - return builder.Delete(conds...) -} - -func (b *Builder) deleteWriteTo(w Writer) error { - if len(b.from) <= 0 { - return ErrNoTableName - } - - if _, err := fmt.Fprintf(w, "DELETE FROM %s WHERE ", b.from); 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 deleted file mode 100644 index 202cad51d8..0000000000 --- a/vendor/github.com/go-xorm/builder/builder_insert.go +++ /dev/null @@ -1,89 +0,0 @@ -// 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" - "fmt" -) - -// Insert creates an insert Builder -func Insert(eq ...interface{}) *Builder { - builder := &Builder{cond: NewCond()} - return builder.Insert(eq...) -} - -func (b *Builder) insertSelectWriteTo(w Writer) error { - if _, err := fmt.Fprintf(w, "INSERT INTO %s ", b.into); err != nil { - return err - } - - if len(b.insertCols) > 0 { - fmt.Fprintf(w, "(") - for _, col := range b.insertCols { - fmt.Fprintf(w, col) - } - fmt.Fprintf(w, ") ") - } - - return b.selectWriteTo(w) -} - -func (b *Builder) insertWriteTo(w Writer) error { - if len(b.into) <= 0 { - return ErrNoTableName - } - if len(b.insertCols) <= 0 && b.from == "" { - return ErrNoColumnToInsert - } - - if b.into != "" && b.from != "" { - return b.insertSelectWriteTo(w) - } - - if _, err := fmt.Fprintf(w, "INSERT INTO %s (", b.into); err != nil { - return err - } - - var args = make([]interface{}, 0) - var bs []byte - var valBuffer = bytes.NewBuffer(bs) - - for i, col := range b.insertCols { - value := b.insertVals[i] - fmt.Fprint(w, col) - if e, ok := value.(expr); ok { - fmt.Fprintf(valBuffer, "(%s)", e.sql) - args = append(args, e.args...) - } else { - fmt.Fprint(valBuffer, "?") - args = append(args, value) - } - - if i != len(b.insertCols)-1 { - if _, err := fmt.Fprint(w, ","); err != nil { - return err - } - if _, err := fmt.Fprint(valBuffer, ","); err != nil { - return err - } - } - } - - 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_limit.go b/vendor/github.com/go-xorm/builder/builder_limit.go deleted file mode 100644 index 82435dacbd..0000000000 --- a/vendor/github.com/go-xorm/builder/builder_limit.go +++ /dev/null @@ -1,100 +0,0 @@ -// Copyright 2018 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" -) - -func (b *Builder) limitWriteTo(w Writer) error { - if strings.TrimSpace(b.dialect) == "" { - return ErrDialectNotSetUp - } - - if b.limitation != nil { - limit := b.limitation - if limit.offset < 0 || limit.limitN <= 0 { - return ErrInvalidLimitation - } - // erase limit condition - b.limitation = nil - ow := w.(*BytesWriter) - - switch strings.ToLower(strings.TrimSpace(b.dialect)) { - case ORACLE: - if len(b.selects) == 0 { - b.selects = append(b.selects, "*") - } - - var final *Builder - selects := b.selects - b.selects = append(selects, "ROWNUM RN") - - var wb *Builder - if b.optype == unionType { - wb = Dialect(b.dialect).Select("at.*", "ROWNUM RN"). - From(b, "at") - } else { - wb = b - } - - if limit.offset == 0 { - final = Dialect(b.dialect).Select(selects...).From(wb, "at"). - Where(Lte{"at.RN": limit.limitN}) - } else { - sub := Dialect(b.dialect).Select("*"). - From(b, "at").Where(Lte{"at.RN": limit.offset + limit.limitN}) - - final = Dialect(b.dialect).Select(selects...).From(sub, "att"). - Where(Gt{"att.RN": limit.offset}) - } - - return final.WriteTo(ow) - case SQLITE, MYSQL, POSTGRES: - // if type UNION, we need to write previous content back to current writer - if b.optype == unionType { - if err := b.WriteTo(ow); err != nil { - return err - } - } - - if limit.offset == 0 { - fmt.Fprint(ow, " LIMIT ", limit.limitN) - } else { - fmt.Fprintf(ow, " LIMIT %v OFFSET %v", limit.limitN, limit.offset) - } - case MSSQL: - if len(b.selects) == 0 { - b.selects = append(b.selects, "*") - } - - var final *Builder - selects := b.selects - b.selects = append(append([]string{fmt.Sprintf("TOP %d %v", limit.limitN+limit.offset, b.selects[0])}, - b.selects[1:]...), "ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS RN") - - var wb *Builder - if b.optype == unionType { - wb = Dialect(b.dialect).Select("*", "ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS RN"). - From(b, "at") - } else { - wb = b - } - - if limit.offset == 0 { - final = Dialect(b.dialect).Select(selects...).From(wb, "at") - } else { - final = Dialect(b.dialect).Select(selects...).From(wb, "at").Where(Gt{"at.RN": limit.offset}) - } - - return final.WriteTo(ow) - default: - return ErrNotSupportType - } - } - - return nil -} diff --git a/vendor/github.com/go-xorm/builder/builder_select.go b/vendor/github.com/go-xorm/builder/builder_select.go deleted file mode 100644 index c33b38698b..0000000000 --- a/vendor/github.com/go-xorm/builder/builder_select.go +++ /dev/null @@ -1,145 +0,0 @@ -// 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" -) - -// Select creates a select Builder -func Select(cols ...string) *Builder { - builder := &Builder{cond: NewCond()} - return builder.Select(cols...) -} - -func (b *Builder) selectWriteTo(w Writer) error { - if len(b.from) <= 0 && !b.isNested { - return ErrNoTableName - } - - // perform limit before writing to writer when b.dialect between ORACLE and MSSQL - // this avoid a duplicate writing problem in simple limit query - if b.limitation != nil && (b.dialect == ORACLE || b.dialect == MSSQL) { - return b.limitWriteTo(w) - } - - 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 b.subQuery == nil { - if _, err := fmt.Fprint(w, " FROM ", b.from); err != nil { - return err - } - } else { - if b.cond.IsValid() && len(b.from) <= 0 { - return ErrUnnamedDerivedTable - } - if b.subQuery.dialect != "" && b.dialect != b.subQuery.dialect { - return ErrInconsistentDialect - } - - // dialect of sub-query will inherit from the main one (if not set up) - if b.dialect != "" && b.subQuery.dialect == "" { - b.subQuery.dialect = b.dialect - } - - switch b.subQuery.optype { - case selectType, unionType: - fmt.Fprint(w, " FROM (") - if err := b.subQuery.WriteTo(w); err != nil { - return err - } - - if len(b.from) == 0 { - fmt.Fprintf(w, ")") - } else { - fmt.Fprintf(w, ") %v", b.from) - } - default: - return ErrUnexpectedSubQuery - } - } - - for _, v := range b.joins { - if _, err := fmt.Fprintf(w, " %s JOIN %s ON ", v.joinType, v.joinTable); err != nil { - return err - } - - if err := v.joinCond.WriteTo(w); err != nil { - return err - } - } - - if b.cond.IsValid() { - if _, err := fmt.Fprint(w, " WHERE "); err != nil { - return err - } - - if err := b.cond.WriteTo(w); err != nil { - return err - } - } - - if len(b.groupBy) > 0 { - if _, err := fmt.Fprint(w, " GROUP BY ", b.groupBy); err != nil { - return err - } - } - - if len(b.having) > 0 { - if _, err := fmt.Fprint(w, " HAVING ", b.having); err != nil { - return err - } - } - - if len(b.orderBy) > 0 { - if _, err := fmt.Fprint(w, " ORDER BY ", b.orderBy); err != nil { - return err - } - } - - if b.limitation != nil { - if err := b.limitWriteTo(w); err != nil { - return err - } - } - - return nil -} - -// OrderBy orderBy SQL -func (b *Builder) OrderBy(orderBy string) *Builder { - b.orderBy = orderBy - return b -} - -// GroupBy groupby SQL -func (b *Builder) GroupBy(groupby string) *Builder { - b.groupBy = groupby - return b -} - -// Having having SQL -func (b *Builder) Having(having string) *Builder { - b.having = having - return b -} diff --git a/vendor/github.com/go-xorm/builder/builder_union.go b/vendor/github.com/go-xorm/builder/builder_union.go deleted file mode 100644 index 4ba9216178..0000000000 --- a/vendor/github.com/go-xorm/builder/builder_union.go +++ /dev/null @@ -1,47 +0,0 @@ -// Copyright 2018 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" -) - -func (b *Builder) unionWriteTo(w Writer) error { - if b.limitation != nil || b.cond.IsValid() || - b.orderBy != "" || b.having != "" || b.groupBy != "" { - return ErrNotUnexpectedUnionConditions - } - - for idx, u := range b.unions { - current := u.builder - if current.optype != selectType { - return ErrUnsupportedUnionMembers - } - - if len(b.unions) == 1 { - if err := current.selectWriteTo(w); err != nil { - return err - } - } else { - if b.dialect != "" && b.dialect != current.dialect { - return ErrInconsistentDialect - } - - if idx != 0 { - fmt.Fprint(w, fmt.Sprintf(" UNION %v ", strings.ToUpper(u.unionType))) - } - fmt.Fprint(w, "(") - - if err := current.selectWriteTo(w); err != nil { - return err - } - - fmt.Fprint(w, ")") - } - } - - return nil -} diff --git a/vendor/github.com/go-xorm/builder/builder_update.go b/vendor/github.com/go-xorm/builder/builder_update.go deleted file mode 100644 index 37b4551526..0000000000 --- a/vendor/github.com/go-xorm/builder/builder_update.go +++ /dev/null @@ -1,46 +0,0 @@ -// 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" -) - -// Update creates an update Builder -func Update(updates ...Eq) *Builder { - builder := &Builder{cond: NewCond()} - return builder.Update(updates...) -} - -func (b *Builder) updateWriteTo(w Writer) error { - if len(b.from) <= 0 { - return ErrNoTableName - } - if len(b.updates) <= 0 { - return ErrNoColumnToUpdate - } - - if _, err := fmt.Fprintf(w, "UPDATE %s SET ", b.from); 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/cond.go b/vendor/github.com/go-xorm/builder/cond.go deleted file mode 100644 index e44173bbd5..0000000000 --- a/vendor/github.com/go-xorm/builder/cond.go +++ /dev/null @@ -1,74 +0,0 @@ -// 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 ( - "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 *StringBuilder - args []interface{} -} - -// NewWriter creates a new string writer -func NewWriter() *BytesWriter { - w := &BytesWriter{ - writer: &StringBuilder{}, - } - 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 -} diff --git a/vendor/github.com/go-xorm/builder/cond_and.go b/vendor/github.com/go-xorm/builder/cond_and.go deleted file mode 100644 index e30bd186cd..0000000000 --- a/vendor/github.com/go-xorm/builder/cond_and.go +++ /dev/null @@ -1,61 +0,0 @@ -// 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) - _, isExpr := cond.(expr) - wrap := isOr || isExpr - if wrap { - fmt.Fprint(w, "(") - } - - err := cond.WriteTo(w) - if err != nil { - return err - } - - if wrap { - 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 deleted file mode 100644 index 10e0b83152..0000000000 --- a/vendor/github.com/go-xorm/builder/cond_between.go +++ /dev/null @@ -1,65 +0,0 @@ -// 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 ", between.Col); err != nil { - return err - } - if lv, ok := between.LessVal.(expr); ok { - if err := lv.WriteTo(w); err != nil { - return err - } - } else { - if _, err := fmt.Fprint(w, "?"); err != nil { - return err - } - w.Append(between.LessVal) - } - - if _, err := fmt.Fprint(w, " AND "); err != nil { - return err - } - - if mv, ok := between.MoreVal.(expr); ok { - if err := mv.WriteTo(w); err != nil { - return err - } - } else { - if _, err := fmt.Fprint(w, "?"); err != nil { - return err - } - w.Append(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 deleted file mode 100644 index 1c293719c0..0000000000 --- a/vendor/github.com/go-xorm/builder/cond_compare.go +++ /dev/null @@ -1,160 +0,0 @@ -// 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 - keys := make([]string, 0, len(data)) - for k := range data { - keys = append(keys, k) - } - - for _, k := range keys { - v := data[k] - 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 deleted file mode 100644 index 79d795e6dd..0000000000 --- a/vendor/github.com/go-xorm/builder/cond_eq.go +++ /dev/null @@ -1,112 +0,0 @@ -// 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" - "sort" -) - -// 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 := range eq.sortedKeys() { - v := eq[k] - 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 -} - -// sortedKeys returns all keys of this Eq sorted with sort.Strings. -// It is used internally for consistent ordering when generating -// SQL, see https://github.com/go-xorm/builder/issues/10 -func (eq Eq) sortedKeys() []string { - keys := make([]string, 0, len(eq)) - for key := range eq { - keys = append(keys, key) - } - sort.Strings(keys) - return keys -} diff --git a/vendor/github.com/go-xorm/builder/cond_expr.go b/vendor/github.com/go-xorm/builder/cond_expr.go deleted file mode 100644 index e5ed572b15..0000000000 --- a/vendor/github.com/go-xorm/builder/cond_expr.go +++ /dev/null @@ -1,39 +0,0 @@ -// 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 deleted file mode 100644 index f6366d35c2..0000000000 --- a/vendor/github.com/go-xorm/builder/cond_in.go +++ /dev/null @@ -1,237 +0,0 @@ -// 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" - "reflect" - "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) handleBlank(w Writer) error { - _, err := fmt.Fprint(w, "0=1") - return err -} - -func (condIn condIn) WriteTo(w Writer) error { - if len(condIn.vals) <= 0 { - return condIn.handleBlank(w) - } - - switch condIn.vals[0].(type) { - case []int8: - vals := condIn.vals[0].([]int8) - if len(vals) <= 0 { - return condIn.handleBlank(w) - } - 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 condIn.handleBlank(w) - } - 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 condIn.handleBlank(w) - } - 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 condIn.handleBlank(w) - } - 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 condIn.handleBlank(w) - } - 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 condIn.handleBlank(w) - } - 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 condIn.handleBlank(w) - } - 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 condIn.handleBlank(w) - } - 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 condIn.handleBlank(w) - } - 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 condIn.handleBlank(w) - } - 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 condIn.handleBlank(w) - } - 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 condIn.handleBlank(w) - } - 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: - v := reflect.ValueOf(condIn.vals[0]) - if v.Kind() == reflect.Slice { - l := v.Len() - if l == 0 { - return condIn.handleBlank(w) - } - - questionMark := strings.Repeat("?,", l) - if _, err := fmt.Fprintf(w, "%s IN (%s)", condIn.col, questionMark[:len(questionMark)-1]); err != nil { - return err - } - - for i := 0; i < l; i++ { - w.Append(v.Index(i).Interface()) - } - } else { - 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 deleted file mode 100644 index e34202f8b0..0000000000 --- a/vendor/github.com/go-xorm/builder/cond_like.go +++ /dev/null @@ -1,41 +0,0 @@ -// 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 - } - // FIXME: if use other regular express, this will be failed. but for compatible, keep this - if like[1][0] == '%' || like[1][len(like[1])-1] == '%' { - w.Append(like[1]) - } else { - 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 deleted file mode 100644 index 3a8f3136d9..0000000000 --- a/vendor/github.com/go-xorm/builder/cond_neq.go +++ /dev/null @@ -1,94 +0,0 @@ -// 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" - "sort" -) - -// 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 := range neq.sortedKeys() { - v := neq[k] - 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 -} - -// sortedKeys returns all keys of this Neq sorted with sort.Strings. -// It is used internally for consistent ordering when generating -// SQL, see https://github.com/go-xorm/builder/issues/10 -func (neq Neq) sortedKeys() []string { - keys := make([]string, 0, len(neq)) - for key := range neq { - keys = append(keys, key) - } - sort.Strings(keys) - return keys -} diff --git a/vendor/github.com/go-xorm/builder/cond_not.go b/vendor/github.com/go-xorm/builder/cond_not.go deleted file mode 100644 index 667dfe7293..0000000000 --- a/vendor/github.com/go-xorm/builder/cond_not.go +++ /dev/null @@ -1,77 +0,0 @@ -// 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 - } - case Eq: - if len(not[0].(Eq)) > 1 { - if _, err := fmt.Fprint(w, "("); err != nil { - return err - } - } - case Neq: - if len(not[0].(Neq)) > 1 { - 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 - } - case Eq: - if len(not[0].(Eq)) > 1 { - if _, err := fmt.Fprint(w, ")"); err != nil { - return err - } - } - case Neq: - if len(not[0].(Neq)) > 1 { - 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 deleted file mode 100644 index dc3ac49a35..0000000000 --- a/vendor/github.com/go-xorm/builder/cond_notin.go +++ /dev/null @@ -1,234 +0,0 @@ -// 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" - "reflect" - "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) handleBlank(w Writer) error { - _, err := fmt.Fprint(w, "0=0") - return err -} - -func (condNotIn condNotIn) WriteTo(w Writer) error { - if len(condNotIn.vals) <= 0 { - return condNotIn.handleBlank(w) - } - - switch condNotIn.vals[0].(type) { - case []int8: - vals := condNotIn.vals[0].([]int8) - if len(vals) <= 0 { - return condNotIn.handleBlank(w) - } - 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 condNotIn.handleBlank(w) - } - 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 condNotIn.handleBlank(w) - } - 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 condNotIn.handleBlank(w) - } - 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 condNotIn.handleBlank(w) - } - 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 condNotIn.handleBlank(w) - } - 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 condNotIn.handleBlank(w) - } - 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 condNotIn.handleBlank(w) - } - 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 condNotIn.handleBlank(w) - } - 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 condNotIn.handleBlank(w) - } - 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 condNotIn.handleBlank(w) - } - 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 condNotIn.handleBlank(w) - } - 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: - v := reflect.ValueOf(condNotIn.vals[0]) - if v.Kind() == reflect.Slice { - l := v.Len() - if l == 0 { - return condNotIn.handleBlank(w) - } - - questionMark := strings.Repeat("?,", l) - if _, err := fmt.Fprintf(w, "%s NOT IN (%s)", condNotIn.col, questionMark[:len(questionMark)-1]); err != nil { - return err - } - - for i := 0; i < l; i++ { - w.Append(v.Index(i).Interface()) - } - } else { - 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 deleted file mode 100644 index bf2aaf8518..0000000000 --- a/vendor/github.com/go-xorm/builder/cond_null.go +++ /dev/null @@ -1,59 +0,0 @@ -// 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 deleted file mode 100644 index 52442653a8..0000000000 --- a/vendor/github.com/go-xorm/builder/cond_or.go +++ /dev/null @@ -1,69 +0,0 @@ -// 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, expr: - needQuote = true - case Eq: - needQuote = (len(cond.(Eq)) > 1) - case Neq: - needQuote = (len(cond.(Neq)) > 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 deleted file mode 100644 index 162b150f10..0000000000 --- a/vendor/github.com/go-xorm/builder/doc.go +++ /dev/null @@ -1,120 +0,0 @@ -// 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 deleted file mode 100644 index d830ee9955..0000000000 --- a/vendor/github.com/go-xorm/builder/error.go +++ /dev/null @@ -1,40 +0,0 @@ -// 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") - // ErrNeedMoreArguments need more arguments - ErrNeedMoreArguments = errors.New("Need more sql arguments") - // ErrNoTableName no table name - ErrNoTableName = errors.New("No table indicated") - // ErrNoColumnToInsert no column to update - ErrNoColumnToUpdate = errors.New("No column(s) to update") - // ErrNoColumnToInsert no column to update - ErrNoColumnToInsert = errors.New("No column(s) to insert") - // ErrNotSupportDialectType not supported dialect type error - ErrNotSupportDialectType = errors.New("Not supported dialect type") - // ErrNotUnexpectedUnionConditions using union in a wrong way - ErrNotUnexpectedUnionConditions = errors.New("Unexpected conditional fields in UNION query") - // ErrUnsupportedUnionMembers unexpected members in UNION query - ErrUnsupportedUnionMembers = errors.New("Unexpected members in UNION query") - // ErrUnexpectedSubQuery Unexpected sub-query in SELECT query - ErrUnexpectedSubQuery = errors.New("Unexpected sub-query in SELECT query") - // ErrDialectNotSetUp dialect is not setup yet - ErrDialectNotSetUp = errors.New("Dialect is not setup yet, try to use `Dialect(dbType)` at first") - // ErrInvalidLimitation offset or limit is not correct - ErrInvalidLimitation = errors.New("Offset or limit is not correct") - // ErrUnnamedDerivedTable Every derived table must have its own alias - ErrUnnamedDerivedTable = errors.New("Every derived table must have its own alias") - // ErrInconsistentDialect Inconsistent dialect in same builder - ErrInconsistentDialect = errors.New("Inconsistent dialect in same builder") -) diff --git a/vendor/github.com/go-xorm/builder/go.mod b/vendor/github.com/go-xorm/builder/go.mod deleted file mode 100644 index ef1a659ad1..0000000000 --- a/vendor/github.com/go-xorm/builder/go.mod +++ /dev/null @@ -1 +0,0 @@ -module "github.com/go-xorm/builder" diff --git a/vendor/github.com/go-xorm/builder/sql.go b/vendor/github.com/go-xorm/builder/sql.go deleted file mode 100644 index 0834242768..0000000000 --- a/vendor/github.com/go-xorm/builder/sql.go +++ /dev/null @@ -1,156 +0,0 @@ -// Copyright 2018 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 ( - sql2 "database/sql" - "fmt" - "reflect" - "time" -) - -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 -} - -func condToBoundSQL(cond Cond) (string, error) { - if cond == nil || !cond.IsValid() { - return "", nil - } - - w := NewWriter() - if err := cond.WriteTo(w); err != nil { - return "", err - } - return ConvertToBoundSQL(w.writer.String(), w.args) -} - -// ToSQL convert a builder or conditions 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 -} - -// ToBoundSQL convert a builder or conditions to parameters bound SQL -func ToBoundSQL(cond interface{}) (string, error) { - switch cond.(type) { - case Cond: - return condToBoundSQL(cond.(Cond)) - case *Builder: - return cond.(*Builder).ToBoundSQL() - } - return "", ErrNotSupportType -} - -func noSQLQuoteNeeded(a interface{}) bool { - switch a.(type) { - case int, int8, int16, int32, int64: - return true - case uint, uint8, uint16, uint32, uint64: - return true - case float32, float64: - return true - case bool: - return true - case string: - return false - case time.Time, *time.Time: - return false - } - - t := reflect.TypeOf(a) - switch t.Kind() { - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - return true - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: - return true - case reflect.Float32, reflect.Float64: - return true - case reflect.Bool: - return true - case reflect.String: - return false - } - - return false -} - -// ConvertToBoundSQL will convert SQL and args to a bound SQL -func ConvertToBoundSQL(sql string, args []interface{}) (string, error) { - buf := StringBuilder{} - var i, j, start int - for ; i < len(sql); i++ { - if sql[i] == '?' { - _, err := buf.WriteString(sql[start:i]) - if err != nil { - return "", err - } - start = i + 1 - - if len(args) == j { - return "", ErrNeedMoreArguments - } - - arg := args[j] - if namedArg, ok := arg.(sql2.NamedArg); ok { - arg = namedArg.Value - } - - if noSQLQuoteNeeded(arg) { - _, err = fmt.Fprint(&buf, arg) - } else { - _, err = fmt.Fprintf(&buf, "'%v'", arg) - } - if err != nil { - return "", err - } - j = j + 1 - } - } - _, err := buf.WriteString(sql[start:]) - if err != nil { - return "", err - } - return buf.String(), nil -} - -// ConvertPlaceholder replaces ? to $1, $2 ... or :1, :2 ... according prefix -func ConvertPlaceholder(sql, prefix string) (string, error) { - buf := StringBuilder{} - var i, j, start int - for ; i < len(sql); i++ { - if sql[i] == '?' { - if _, err := buf.WriteString(sql[start:i]); err != nil { - return "", err - } - - start = i + 1 - j = j + 1 - - if _, err := buf.WriteString(fmt.Sprintf("%v%d", prefix, j)); err != nil { - return "", err - } - } - } - - if _, err := buf.WriteString(sql[start:]); err != nil { - return "", err - } - - return buf.String(), nil -} diff --git a/vendor/github.com/go-xorm/builder/string_builder.go b/vendor/github.com/go-xorm/builder/string_builder.go deleted file mode 100644 index d4de8717e7..0000000000 --- a/vendor/github.com/go-xorm/builder/string_builder.go +++ /dev/null @@ -1,119 +0,0 @@ -// Copyright 2017 The Go 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 ( - "unicode/utf8" - "unsafe" -) - -// A StringBuilder is used to efficiently build a string using Write methods. -// It minimizes memory copying. The zero value is ready to use. -// Do not copy a non-zero Builder. -type StringBuilder struct { - addr *StringBuilder // of receiver, to detect copies by value - buf []byte -} - -// noescape hides a pointer from escape analysis. noescape is -// the identity function but escape analysis doesn't think the -// output depends on the input. noescape is inlined and currently -// compiles down to zero instructions. -// USE CAREFULLY! -// This was copied from the runtime; see issues 23382 and 7921. -//go:nosplit -func noescape(p unsafe.Pointer) unsafe.Pointer { - x := uintptr(p) - return unsafe.Pointer(x ^ 0) -} - -func (b *StringBuilder) copyCheck() { - if b.addr == nil { - // This hack works around a failing of Go's escape analysis - // that was causing b to escape and be heap allocated. - // See issue 23382. - // TODO: once issue 7921 is fixed, this should be reverted to - // just "b.addr = b". - b.addr = (*StringBuilder)(noescape(unsafe.Pointer(b))) - } else if b.addr != b { - panic("strings: illegal use of non-zero Builder copied by value") - } -} - -// String returns the accumulated string. -func (b *StringBuilder) String() string { - return *(*string)(unsafe.Pointer(&b.buf)) -} - -// Len returns the number of accumulated bytes; b.Len() == len(b.String()). -func (b *StringBuilder) Len() int { return len(b.buf) } - -// Reset resets the Builder to be empty. -func (b *StringBuilder) Reset() { - b.addr = nil - b.buf = nil -} - -// grow copies the buffer to a new, larger buffer so that there are at least n -// bytes of capacity beyond len(b.buf). -func (b *StringBuilder) grow(n int) { - buf := make([]byte, len(b.buf), 2*cap(b.buf)+n) - copy(buf, b.buf) - b.buf = buf -} - -// Grow grows b's capacity, if necessary, to guarantee space for -// another n bytes. After Grow(n), at least n bytes can be written to b -// without another allocation. If n is negative, Grow panics. -func (b *StringBuilder) Grow(n int) { - b.copyCheck() - if n < 0 { - panic("strings.Builder.Grow: negative count") - } - if cap(b.buf)-len(b.buf) < n { - b.grow(n) - } -} - -// Write appends the contents of p to b's buffer. -// Write always returns len(p), nil. -func (b *StringBuilder) Write(p []byte) (int, error) { - b.copyCheck() - b.buf = append(b.buf, p...) - return len(p), nil -} - -// WriteByte appends the byte c to b's buffer. -// The returned error is always nil. -func (b *StringBuilder) WriteByte(c byte) error { - b.copyCheck() - b.buf = append(b.buf, c) - return nil -} - -// WriteRune appends the UTF-8 encoding of Unicode code point r to b's buffer. -// It returns the length of r and a nil error. -func (b *StringBuilder) WriteRune(r rune) (int, error) { - b.copyCheck() - if r < utf8.RuneSelf { - b.buf = append(b.buf, byte(r)) - return 1, nil - } - l := len(b.buf) - if cap(b.buf)-l < utf8.UTFMax { - b.grow(utf8.UTFMax) - } - n := utf8.EncodeRune(b.buf[l:l+utf8.UTFMax], r) - b.buf = b.buf[:l+n] - return n, nil -} - -// WriteString appends the contents of s to b's buffer. -// It returns the length of s and a nil error. -func (b *StringBuilder) WriteString(s string) (int, error) { - b.copyCheck() - b.buf = append(b.buf, s...) - return len(s), nil -} diff --git a/vendor/github.com/go-xorm/core/.gitignore b/vendor/github.com/go-xorm/core/.gitignore deleted file mode 100644 index 98e6ef67fa..0000000000 --- a/vendor/github.com/go-xorm/core/.gitignore +++ /dev/null @@ -1 +0,0 @@ -*.db diff --git a/vendor/github.com/go-xorm/core/LICENSE b/vendor/github.com/go-xorm/core/LICENSE deleted file mode 100644 index 1130797806..0000000000 --- a/vendor/github.com/go-xorm/core/LICENSE +++ /dev/null @@ -1,27 +0,0 @@ -Copyright (c) 2013 - 2015 Lunny Xiao <xiaolunwen@gmail.com> -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/core/README.md b/vendor/github.com/go-xorm/core/README.md deleted file mode 100644 index 09b72c74b3..0000000000 --- a/vendor/github.com/go-xorm/core/README.md +++ /dev/null @@ -1,116 +0,0 @@ -Core is a lightweight wrapper of sql.DB. - -[![CircleCI](https://circleci.com/gh/go-xorm/core/tree/master.svg?style=svg)](https://circleci.com/gh/go-xorm/core/tree/master) - -# Open -```Go -db, _ := core.Open(db, connstr) -``` - -# SetMapper -```Go -db.SetMapper(SameMapper()) -``` - -## Scan usage - -### Scan -```Go -rows, _ := db.Query() -for rows.Next() { - rows.Scan() -} -``` - -### ScanMap -```Go -rows, _ := db.Query() -for rows.Next() { - rows.ScanMap() -``` - -### ScanSlice - -You can use `[]string`, `[][]byte`, `[]interface{}`, `[]*string`, `[]sql.NullString` to ScanSclice. Notice, slice's length should be equal or less than select columns. - -```Go -rows, _ := db.Query() -cols, _ := rows.Columns() -for rows.Next() { - var s = make([]string, len(cols)) - rows.ScanSlice(&s) -} -``` - -```Go -rows, _ := db.Query() -cols, _ := rows.Columns() -for rows.Next() { - var s = make([]*string, len(cols)) - rows.ScanSlice(&s) -} -``` - -### ScanStruct -```Go -rows, _ := db.Query() -for rows.Next() { - rows.ScanStructByName() - rows.ScanStructByIndex() -} -``` - -## Query usage -```Go -rows, err := db.Query("select * from table where name = ?", name) - -user = User{ - Name:"lunny", -} -rows, err := db.QueryStruct("select * from table where name = ?Name", - &user) - -var user = map[string]interface{}{ - "name": "lunny", -} -rows, err = db.QueryMap("select * from table where name = ?name", - &user) -``` - -## QueryRow usage -```Go -row := db.QueryRow("select * from table where name = ?", name) - -user = User{ - Name:"lunny", -} -row := db.QueryRowStruct("select * from table where name = ?Name", - &user) - -var user = map[string]interface{}{ - "name": "lunny", -} -row = db.QueryRowMap("select * from table where name = ?name", - &user) -``` - -## Exec usage -```Go -db.Exec("insert into user (`name`, title, age, alias, nick_name,created) values (?,?,?,?,?,?)", name, title, age, alias...) - -user = User{ - Name:"lunny", - Title:"test", - Age: 18, -} -result, err = db.ExecStruct("insert into user (`name`, title, age, alias, nick_name,created) values (?Name,?Title,?Age,?Alias,?NickName,?Created)", - &user) - -var user = map[string]interface{}{ - "Name": "lunny", - "Title": "test", - "Age": 18, -} -result, err = db.ExecMap("insert into user (`name`, title, age, alias, nick_name,created) values (?Name,?Title,?Age,?Alias,?NickName,?Created)", - &user) -```
\ No newline at end of file diff --git a/vendor/github.com/go-xorm/core/benchmark.sh b/vendor/github.com/go-xorm/core/benchmark.sh deleted file mode 100644 index eab9e57e9f..0000000000 --- a/vendor/github.com/go-xorm/core/benchmark.sh +++ /dev/null @@ -1 +0,0 @@ -go test -v -bench=. -run=XXX diff --git a/vendor/github.com/go-xorm/core/cache.go b/vendor/github.com/go-xorm/core/cache.go deleted file mode 100644 index 8f9531da94..0000000000 --- a/vendor/github.com/go-xorm/core/cache.go +++ /dev/null @@ -1,87 +0,0 @@ -package core - -import ( - "bytes" - "encoding/gob" - "errors" - "fmt" - "strings" - "time" -) - -const ( - // default cache expired time - CacheExpired = 60 * time.Minute - // not use now - CacheMaxMemory = 256 - // evey ten minutes to clear all expired nodes - CacheGcInterval = 10 * time.Minute - // each time when gc to removed max nodes - CacheGcMaxRemoved = 20 -) - -var ( - ErrCacheMiss = errors.New("xorm/cache: key not found.") - ErrNotStored = errors.New("xorm/cache: not stored.") -) - -// CacheStore is a interface to store cache -type CacheStore interface { - // key is primary key or composite primary key - // value is struct's pointer - // key format : <tablename>-p-<pk1>-<pk2>... - Put(key string, value interface{}) error - Get(key string) (interface{}, error) - Del(key string) error -} - -// Cacher is an interface to provide cache -// id format : u-<pk1>-<pk2>... -type Cacher interface { - GetIds(tableName, sql string) interface{} - GetBean(tableName string, id string) interface{} - PutIds(tableName, sql string, ids interface{}) - PutBean(tableName string, id string, obj interface{}) - DelIds(tableName, sql string) - DelBean(tableName string, id string) - ClearIds(tableName string) - ClearBeans(tableName string) -} - -func encodeIds(ids []PK) (string, error) { - buf := new(bytes.Buffer) - enc := gob.NewEncoder(buf) - err := enc.Encode(ids) - - return buf.String(), err -} - -func decodeIds(s string) ([]PK, error) { - pks := make([]PK, 0) - - dec := gob.NewDecoder(strings.NewReader(s)) - err := dec.Decode(&pks) - - return pks, err -} - -func GetCacheSql(m Cacher, tableName, sql string, args interface{}) ([]PK, error) { - bytes := m.GetIds(tableName, GenSqlKey(sql, args)) - if bytes == nil { - return nil, errors.New("Not Exist") - } - return decodeIds(bytes.(string)) -} - -func PutCacheSql(m Cacher, ids []PK, tableName, sql string, args interface{}) error { - bytes, err := encodeIds(ids) - if err != nil { - return err - } - m.PutIds(tableName, GenSqlKey(sql, args), bytes) - return nil -} - -func GenSqlKey(sql string, args interface{}) string { - return fmt.Sprintf("%v-%v", sql, args) -} diff --git a/vendor/github.com/go-xorm/core/circle.yml b/vendor/github.com/go-xorm/core/circle.yml deleted file mode 100644 index e6a05be272..0000000000 --- a/vendor/github.com/go-xorm/core/circle.yml +++ /dev/null @@ -1,15 +0,0 @@ -dependencies: - override: - # './...' is a relative pattern which means all subdirectories - - go get -t -d -v ./... - - go build -v - -database: - override: - - mysql -u root -e "CREATE DATABASE core_test DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci" - -test: - override: - # './...' is a relative pattern which means all subdirectories - - go test -v -race - - go test -v -race --dbtype=sqlite3 diff --git a/vendor/github.com/go-xorm/core/column.go b/vendor/github.com/go-xorm/core/column.go deleted file mode 100644 index 20912b713c..0000000000 --- a/vendor/github.com/go-xorm/core/column.go +++ /dev/null @@ -1,159 +0,0 @@ -package core - -import ( - "fmt" - "reflect" - "strings" - "time" -) - -const ( - TWOSIDES = iota + 1 - ONLYTODB - ONLYFROMDB -) - -// Column defines database column -type Column struct { - Name string - TableName string - FieldName string - SQLType SQLType - IsJSON bool - Length int - Length2 int - Nullable bool - Default string - Indexes map[string]int - IsPrimaryKey bool - IsAutoIncrement bool - MapType int - IsCreated bool - IsUpdated bool - IsDeleted bool - IsCascade bool - IsVersion bool - DefaultIsEmpty bool - EnumOptions map[string]int - SetOptions map[string]int - DisableTimeZone bool - TimeZone *time.Location // column specified time zone - Comment string -} - -func NewColumn(name, fieldName string, sqlType SQLType, len1, len2 int, nullable bool) *Column { - return &Column{ - Name: name, - TableName: "", - FieldName: fieldName, - SQLType: sqlType, - Length: len1, - Length2: len2, - Nullable: nullable, - Default: "", - Indexes: make(map[string]int), - IsPrimaryKey: false, - IsAutoIncrement: false, - MapType: TWOSIDES, - IsCreated: false, - IsUpdated: false, - IsDeleted: false, - IsCascade: false, - IsVersion: false, - DefaultIsEmpty: false, - EnumOptions: make(map[string]int), - Comment: "", - } -} - -// generate column description string according dialect -func (col *Column) String(d Dialect) string { - sql := d.QuoteStr() + col.Name + d.QuoteStr() + " " - - sql += d.SqlType(col) + " " - - if col.IsPrimaryKey { - sql += "PRIMARY KEY " - if col.IsAutoIncrement { - sql += d.AutoIncrStr() + " " - } - } - - if col.Default != "" { - sql += "DEFAULT " + col.Default + " " - } - - if d.ShowCreateNull() { - if col.Nullable { - sql += "NULL " - } else { - sql += "NOT NULL " - } - } - - return sql -} - -func (col *Column) StringNoPk(d Dialect) string { - sql := d.QuoteStr() + col.Name + d.QuoteStr() + " " - - sql += d.SqlType(col) + " " - - if col.Default != "" { - sql += "DEFAULT " + col.Default + " " - } - - if d.ShowCreateNull() { - if col.Nullable { - sql += "NULL " - } else { - sql += "NOT NULL " - } - } - - return sql -} - -// return col's filed of struct's value -func (col *Column) ValueOf(bean interface{}) (*reflect.Value, error) { - dataStruct := reflect.Indirect(reflect.ValueOf(bean)) - return col.ValueOfV(&dataStruct) -} - -func (col *Column) ValueOfV(dataStruct *reflect.Value) (*reflect.Value, error) { - var fieldValue reflect.Value - fieldPath := strings.Split(col.FieldName, ".") - - if dataStruct.Type().Kind() == reflect.Map { - keyValue := reflect.ValueOf(fieldPath[len(fieldPath)-1]) - fieldValue = dataStruct.MapIndex(keyValue) - return &fieldValue, nil - } else if dataStruct.Type().Kind() == reflect.Interface { - structValue := reflect.ValueOf(dataStruct.Interface()) - dataStruct = &structValue - } - - level := len(fieldPath) - fieldValue = dataStruct.FieldByName(fieldPath[0]) - for i := 0; i < level-1; i++ { - if !fieldValue.IsValid() { - break - } - if fieldValue.Kind() == reflect.Struct { - fieldValue = fieldValue.FieldByName(fieldPath[i+1]) - } else if fieldValue.Kind() == reflect.Ptr { - if fieldValue.IsNil() { - fieldValue.Set(reflect.New(fieldValue.Type().Elem())) - } - fieldValue = fieldValue.Elem().FieldByName(fieldPath[i+1]) - } else { - return nil, fmt.Errorf("field %v is not valid", col.FieldName) - } - } - - if !fieldValue.IsValid() { - return nil, fmt.Errorf("field %v is not valid", col.FieldName) - } - - return &fieldValue, nil -} diff --git a/vendor/github.com/go-xorm/core/converstion.go b/vendor/github.com/go-xorm/core/converstion.go deleted file mode 100644 index 18522fbeeb..0000000000 --- a/vendor/github.com/go-xorm/core/converstion.go +++ /dev/null @@ -1,8 +0,0 @@ -package core - -// Conversion is an interface. A type implements Conversion will according -// the custom method to fill into database and retrieve from database. -type Conversion interface { - FromDB([]byte) error - ToDB() ([]byte, error) -} diff --git a/vendor/github.com/go-xorm/core/db.go b/vendor/github.com/go-xorm/core/db.go deleted file mode 100644 index 9969fa4313..0000000000 --- a/vendor/github.com/go-xorm/core/db.go +++ /dev/null @@ -1,401 +0,0 @@ -package core - -import ( - "database/sql" - "database/sql/driver" - "errors" - "fmt" - "reflect" - "regexp" - "sync" -) - -var ( - DefaultCacheSize = 200 -) - -func MapToSlice(query string, mp interface{}) (string, []interface{}, error) { - vv := reflect.ValueOf(mp) - if vv.Kind() != reflect.Ptr || vv.Elem().Kind() != reflect.Map { - return "", []interface{}{}, ErrNoMapPointer - } - - args := make([]interface{}, 0, len(vv.Elem().MapKeys())) - var err error - query = re.ReplaceAllStringFunc(query, func(src string) string { - v := vv.Elem().MapIndex(reflect.ValueOf(src[1:])) - if !v.IsValid() { - err = fmt.Errorf("map key %s is missing", src[1:]) - } else { - args = append(args, v.Interface()) - } - return "?" - }) - - return query, args, err -} - -func StructToSlice(query string, st interface{}) (string, []interface{}, error) { - vv := reflect.ValueOf(st) - if vv.Kind() != reflect.Ptr || vv.Elem().Kind() != reflect.Struct { - return "", []interface{}{}, ErrNoStructPointer - } - - args := make([]interface{}, 0) - var err error - query = re.ReplaceAllStringFunc(query, func(src string) string { - fv := vv.Elem().FieldByName(src[1:]).Interface() - if v, ok := fv.(driver.Valuer); ok { - var value driver.Value - value, err = v.Value() - if err != nil { - return "?" - } - args = append(args, value) - } else { - args = append(args, fv) - } - return "?" - }) - if err != nil { - return "", []interface{}{}, err - } - return query, args, nil -} - -type cacheStruct struct { - value reflect.Value - idx int -} - -type DB struct { - *sql.DB - Mapper IMapper - reflectCache map[reflect.Type]*cacheStruct - reflectCacheMutex sync.RWMutex -} - -func Open(driverName, dataSourceName string) (*DB, error) { - db, err := sql.Open(driverName, dataSourceName) - if err != nil { - return nil, err - } - return &DB{ - DB: db, - Mapper: NewCacheMapper(&SnakeMapper{}), - reflectCache: make(map[reflect.Type]*cacheStruct), - }, nil -} - -func FromDB(db *sql.DB) *DB { - return &DB{ - DB: db, - Mapper: NewCacheMapper(&SnakeMapper{}), - reflectCache: make(map[reflect.Type]*cacheStruct), - } -} - -func (db *DB) reflectNew(typ reflect.Type) reflect.Value { - db.reflectCacheMutex.Lock() - defer db.reflectCacheMutex.Unlock() - cs, ok := db.reflectCache[typ] - if !ok || cs.idx+1 > DefaultCacheSize-1 { - cs = &cacheStruct{reflect.MakeSlice(reflect.SliceOf(typ), DefaultCacheSize, DefaultCacheSize), 0} - db.reflectCache[typ] = cs - } else { - cs.idx = cs.idx + 1 - } - return cs.value.Index(cs.idx).Addr() -} - -func (db *DB) Query(query string, args ...interface{}) (*Rows, error) { - rows, err := db.DB.Query(query, args...) - if err != nil { - if rows != nil { - rows.Close() - } - return nil, err - } - return &Rows{rows, db}, nil -} - -func (db *DB) QueryMap(query string, mp interface{}) (*Rows, error) { - query, args, err := MapToSlice(query, mp) - if err != nil { - return nil, err - } - return db.Query(query, args...) -} - -func (db *DB) QueryStruct(query string, st interface{}) (*Rows, error) { - query, args, err := StructToSlice(query, st) - if err != nil { - return nil, err - } - return db.Query(query, args...) -} - -func (db *DB) QueryRow(query string, args ...interface{}) *Row { - rows, err := db.Query(query, args...) - if err != nil { - return &Row{nil, err} - } - return &Row{rows, nil} -} - -func (db *DB) QueryRowMap(query string, mp interface{}) *Row { - query, args, err := MapToSlice(query, mp) - if err != nil { - return &Row{nil, err} - } - return db.QueryRow(query, args...) -} - -func (db *DB) QueryRowStruct(query string, st interface{}) *Row { - query, args, err := StructToSlice(query, st) - if err != nil { - return &Row{nil, err} - } - return db.QueryRow(query, args...) -} - -type Stmt struct { - *sql.Stmt - db *DB - names map[string]int -} - -func (db *DB) Prepare(query string) (*Stmt, error) { - names := make(map[string]int) - var i int - query = re.ReplaceAllStringFunc(query, func(src string) string { - names[src[1:]] = i - i += 1 - return "?" - }) - - stmt, err := db.DB.Prepare(query) - if err != nil { - return nil, err - } - return &Stmt{stmt, db, names}, nil -} - -func (s *Stmt) ExecMap(mp interface{}) (sql.Result, error) { - vv := reflect.ValueOf(mp) - if vv.Kind() != reflect.Ptr || vv.Elem().Kind() != reflect.Map { - return nil, errors.New("mp should be a map's pointer") - } - - args := make([]interface{}, len(s.names)) - for k, i := range s.names { - args[i] = vv.Elem().MapIndex(reflect.ValueOf(k)).Interface() - } - return s.Stmt.Exec(args...) -} - -func (s *Stmt) ExecStruct(st interface{}) (sql.Result, error) { - vv := reflect.ValueOf(st) - if vv.Kind() != reflect.Ptr || vv.Elem().Kind() != reflect.Struct { - return nil, errors.New("mp should be a map's pointer") - } - - args := make([]interface{}, len(s.names)) - for k, i := range s.names { - args[i] = vv.Elem().FieldByName(k).Interface() - } - return s.Stmt.Exec(args...) -} - -func (s *Stmt) Query(args ...interface{}) (*Rows, error) { - rows, err := s.Stmt.Query(args...) - if err != nil { - return nil, err - } - return &Rows{rows, s.db}, nil -} - -func (s *Stmt) QueryMap(mp interface{}) (*Rows, error) { - vv := reflect.ValueOf(mp) - if vv.Kind() != reflect.Ptr || vv.Elem().Kind() != reflect.Map { - return nil, errors.New("mp should be a map's pointer") - } - - args := make([]interface{}, len(s.names)) - for k, i := range s.names { - args[i] = vv.Elem().MapIndex(reflect.ValueOf(k)).Interface() - } - - return s.Query(args...) -} - -func (s *Stmt) QueryStruct(st interface{}) (*Rows, error) { - vv := reflect.ValueOf(st) - if vv.Kind() != reflect.Ptr || vv.Elem().Kind() != reflect.Struct { - return nil, errors.New("mp should be a map's pointer") - } - - args := make([]interface{}, len(s.names)) - for k, i := range s.names { - args[i] = vv.Elem().FieldByName(k).Interface() - } - - return s.Query(args...) -} - -func (s *Stmt) QueryRow(args ...interface{}) *Row { - rows, err := s.Query(args...) - return &Row{rows, err} -} - -func (s *Stmt) QueryRowMap(mp interface{}) *Row { - vv := reflect.ValueOf(mp) - if vv.Kind() != reflect.Ptr || vv.Elem().Kind() != reflect.Map { - return &Row{nil, errors.New("mp should be a map's pointer")} - } - - args := make([]interface{}, len(s.names)) - for k, i := range s.names { - args[i] = vv.Elem().MapIndex(reflect.ValueOf(k)).Interface() - } - - return s.QueryRow(args...) -} - -func (s *Stmt) QueryRowStruct(st interface{}) *Row { - vv := reflect.ValueOf(st) - if vv.Kind() != reflect.Ptr || vv.Elem().Kind() != reflect.Struct { - return &Row{nil, errors.New("st should be a struct's pointer")} - } - - args := make([]interface{}, len(s.names)) - for k, i := range s.names { - args[i] = vv.Elem().FieldByName(k).Interface() - } - - return s.QueryRow(args...) -} - -var ( - re = regexp.MustCompile(`[?](\w+)`) -) - -// insert into (name) values (?) -// insert into (name) values (?name) -func (db *DB) ExecMap(query string, mp interface{}) (sql.Result, error) { - query, args, err := MapToSlice(query, mp) - if err != nil { - return nil, err - } - return db.DB.Exec(query, args...) -} - -func (db *DB) ExecStruct(query string, st interface{}) (sql.Result, error) { - query, args, err := StructToSlice(query, st) - if err != nil { - return nil, err - } - return db.DB.Exec(query, args...) -} - -type EmptyScanner struct { -} - -func (EmptyScanner) Scan(src interface{}) error { - return nil -} - -type Tx struct { - *sql.Tx - db *DB -} - -func (db *DB) Begin() (*Tx, error) { - tx, err := db.DB.Begin() - if err != nil { - return nil, err - } - return &Tx{tx, db}, nil -} - -func (tx *Tx) Prepare(query string) (*Stmt, error) { - names := make(map[string]int) - var i int - query = re.ReplaceAllStringFunc(query, func(src string) string { - names[src[1:]] = i - i += 1 - return "?" - }) - - stmt, err := tx.Tx.Prepare(query) - if err != nil { - return nil, err - } - return &Stmt{stmt, tx.db, names}, nil -} - -func (tx *Tx) Stmt(stmt *Stmt) *Stmt { - // TODO: - return stmt -} - -func (tx *Tx) ExecMap(query string, mp interface{}) (sql.Result, error) { - query, args, err := MapToSlice(query, mp) - if err != nil { - return nil, err - } - return tx.Tx.Exec(query, args...) -} - -func (tx *Tx) ExecStruct(query string, st interface{}) (sql.Result, error) { - query, args, err := StructToSlice(query, st) - if err != nil { - return nil, err - } - return tx.Tx.Exec(query, args...) -} - -func (tx *Tx) Query(query string, args ...interface{}) (*Rows, error) { - rows, err := tx.Tx.Query(query, args...) - if err != nil { - return nil, err - } - return &Rows{rows, tx.db}, nil -} - -func (tx *Tx) QueryMap(query string, mp interface{}) (*Rows, error) { - query, args, err := MapToSlice(query, mp) - if err != nil { - return nil, err - } - return tx.Query(query, args...) -} - -func (tx *Tx) QueryStruct(query string, st interface{}) (*Rows, error) { - query, args, err := StructToSlice(query, st) - if err != nil { - return nil, err - } - return tx.Query(query, args...) -} - -func (tx *Tx) QueryRow(query string, args ...interface{}) *Row { - rows, err := tx.Query(query, args...) - return &Row{rows, err} -} - -func (tx *Tx) QueryRowMap(query string, mp interface{}) *Row { - query, args, err := MapToSlice(query, mp) - if err != nil { - return &Row{nil, err} - } - return tx.QueryRow(query, args...) -} - -func (tx *Tx) QueryRowStruct(query string, st interface{}) *Row { - query, args, err := StructToSlice(query, st) - if err != nil { - return &Row{nil, err} - } - return tx.QueryRow(query, args...) -} diff --git a/vendor/github.com/go-xorm/core/dialect.go b/vendor/github.com/go-xorm/core/dialect.go deleted file mode 100644 index c288a08478..0000000000 --- a/vendor/github.com/go-xorm/core/dialect.go +++ /dev/null @@ -1,315 +0,0 @@ -package core - -import ( - "fmt" - "strings" - "time" -) - -type DbType string - -type Uri struct { - DbType DbType - Proto string - Host string - Port string - DbName string - User string - Passwd string - Charset string - Laddr string - Raddr string - Timeout time.Duration - Schema string -} - -// a dialect is a driver's wrapper -type Dialect interface { - SetLogger(logger ILogger) - Init(*DB, *Uri, string, string) error - URI() *Uri - DB() *DB - DBType() DbType - SqlType(*Column) string - FormatBytes(b []byte) string - - DriverName() string - DataSourceName() string - - QuoteStr() string - IsReserved(string) bool - Quote(string) string - AndStr() string - OrStr() string - EqStr() string - RollBackStr() string - AutoIncrStr() string - - SupportInsertMany() bool - SupportEngine() bool - SupportCharset() bool - SupportDropIfExists() bool - IndexOnTable() bool - ShowCreateNull() bool - - IndexCheckSql(tableName, idxName string) (string, []interface{}) - TableCheckSql(tableName string) (string, []interface{}) - - IsColumnExist(tableName string, colName string) (bool, error) - - CreateTableSql(table *Table, tableName, storeEngine, charset string) string - DropTableSql(tableName string) string - CreateIndexSql(tableName string, index *Index) string - DropIndexSql(tableName string, index *Index) string - - ModifyColumnSql(tableName string, col *Column) string - - ForUpdateSql(query string) string - - //CreateTableIfNotExists(table *Table, tableName, storeEngine, charset string) error - //MustDropTable(tableName string) error - - GetColumns(tableName string) ([]string, map[string]*Column, error) - GetTables() ([]*Table, error) - GetIndexes(tableName string) (map[string]*Index, error) - - Filters() []Filter - SetParams(params map[string]string) -} - -func OpenDialect(dialect Dialect) (*DB, error) { - return Open(dialect.DriverName(), dialect.DataSourceName()) -} - -type Base struct { - db *DB - dialect Dialect - driverName string - dataSourceName string - logger ILogger - *Uri -} - -func (b *Base) DB() *DB { - return b.db -} - -func (b *Base) SetLogger(logger ILogger) { - b.logger = logger -} - -func (b *Base) Init(db *DB, dialect Dialect, uri *Uri, drivername, dataSourceName string) error { - b.db, b.dialect, b.Uri = db, dialect, uri - b.driverName, b.dataSourceName = drivername, dataSourceName - return nil -} - -func (b *Base) URI() *Uri { - return b.Uri -} - -func (b *Base) DBType() DbType { - return b.Uri.DbType -} - -func (b *Base) FormatBytes(bs []byte) string { - return fmt.Sprintf("0x%x", bs) -} - -func (b *Base) DriverName() string { - return b.driverName -} - -func (b *Base) ShowCreateNull() bool { - return true -} - -func (b *Base) DataSourceName() string { - return b.dataSourceName -} - -func (b *Base) AndStr() string { - return "AND" -} - -func (b *Base) OrStr() string { - return "OR" -} - -func (b *Base) EqStr() string { - return "=" -} - -func (db *Base) RollBackStr() string { - return "ROLL BACK" -} - -func (db *Base) SupportDropIfExists() bool { - return true -} - -func (db *Base) DropTableSql(tableName string) string { - quote := db.dialect.Quote - return fmt.Sprintf("DROP TABLE IF EXISTS %s", quote(tableName)) -} - -func (db *Base) HasRecords(query string, args ...interface{}) (bool, error) { - db.LogSQL(query, args) - rows, err := db.DB().Query(query, args...) - if err != nil { - return false, err - } - defer rows.Close() - - if rows.Next() { - return true, nil - } - return false, nil -} - -func (db *Base) IsColumnExist(tableName, colName string) (bool, error) { - query := "SELECT `COLUMN_NAME` FROM `INFORMATION_SCHEMA`.`COLUMNS` WHERE `TABLE_SCHEMA` = ? AND `TABLE_NAME` = ? AND `COLUMN_NAME` = ?" - query = strings.Replace(query, "`", db.dialect.QuoteStr(), -1) - return db.HasRecords(query, db.DbName, tableName, colName) -} - -/* -func (db *Base) CreateTableIfNotExists(table *Table, tableName, storeEngine, charset string) error { - sql, args := db.dialect.TableCheckSql(tableName) - rows, err := db.DB().Query(sql, args...) - if db.Logger != nil { - db.Logger.Info("[sql]", sql, args) - } - if err != nil { - return err - } - defer rows.Close() - - if rows.Next() { - return nil - } - - sql = db.dialect.CreateTableSql(table, tableName, storeEngine, charset) - _, err = db.DB().Exec(sql) - if db.Logger != nil { - db.Logger.Info("[sql]", sql) - } - return err -}*/ - -func (db *Base) CreateIndexSql(tableName string, index *Index) string { - quote := db.dialect.Quote - var unique string - var idxName string - if index.Type == UniqueType { - unique = " UNIQUE" - } - idxName = index.XName(tableName) - return fmt.Sprintf("CREATE%s INDEX %v ON %v (%v)", unique, - quote(idxName), quote(tableName), - quote(strings.Join(index.Cols, quote(",")))) -} - -func (db *Base) DropIndexSql(tableName string, index *Index) string { - quote := db.dialect.Quote - var name string - if index.IsRegular { - name = index.XName(tableName) - } else { - name = index.Name - } - return fmt.Sprintf("DROP INDEX %v ON %s", quote(name), quote(tableName)) -} - -func (db *Base) ModifyColumnSql(tableName string, col *Column) string { - return fmt.Sprintf("alter table %s MODIFY COLUMN %s", tableName, col.StringNoPk(db.dialect)) -} - -func (b *Base) CreateTableSql(table *Table, tableName, storeEngine, charset string) string { - var sql string - sql = "CREATE TABLE IF NOT EXISTS " - if tableName == "" { - tableName = table.Name - } - - sql += b.dialect.Quote(tableName) - sql += " (" - - if len(table.ColumnsSeq()) > 0 { - pkList := table.PrimaryKeys - - for _, colName := range table.ColumnsSeq() { - col := table.GetColumn(colName) - if col.IsPrimaryKey && len(pkList) == 1 { - sql += col.String(b.dialect) - } else { - sql += col.StringNoPk(b.dialect) - } - sql = strings.TrimSpace(sql) - if b.DriverName() == MYSQL && len(col.Comment) > 0 { - sql += " COMMENT '" + col.Comment + "'" - } - sql += ", " - } - - if len(pkList) > 1 { - sql += "PRIMARY KEY ( " - sql += b.dialect.Quote(strings.Join(pkList, b.dialect.Quote(","))) - sql += " ), " - } - - sql = sql[:len(sql)-2] - } - sql += ")" - - if b.dialect.SupportEngine() && storeEngine != "" { - sql += " ENGINE=" + storeEngine - } - if b.dialect.SupportCharset() { - if len(charset) == 0 { - charset = b.dialect.URI().Charset - } - if len(charset) > 0 { - sql += " DEFAULT CHARSET " + charset - } - } - - return sql -} - -func (b *Base) ForUpdateSql(query string) string { - return query + " FOR UPDATE" -} - -func (b *Base) LogSQL(sql string, args []interface{}) { - if b.logger != nil && b.logger.IsShowSQL() { - if len(args) > 0 { - b.logger.Infof("[SQL] %v %v", sql, args) - } else { - b.logger.Infof("[SQL] %v", sql) - } - } -} - -func (b *Base) SetParams(params map[string]string) { -} - -var ( - dialects = map[string]func() Dialect{} -) - -// RegisterDialect register database dialect -func RegisterDialect(dbName DbType, dialectFunc func() Dialect) { - if dialectFunc == nil { - panic("core: Register dialect is nil") - } - dialects[strings.ToLower(string(dbName))] = dialectFunc // !nashtsai! allow override dialect -} - -// QueryDialect query if registed database dialect -func QueryDialect(dbName DbType) Dialect { - if d, ok := dialects[strings.ToLower(string(dbName))]; ok { - return d() - } - return nil -} diff --git a/vendor/github.com/go-xorm/core/driver.go b/vendor/github.com/go-xorm/core/driver.go deleted file mode 100644 index 0f1020b403..0000000000 --- a/vendor/github.com/go-xorm/core/driver.go +++ /dev/null @@ -1,27 +0,0 @@ -package core - -type Driver interface { - Parse(string, string) (*Uri, error) -} - -var ( - drivers = map[string]Driver{} -) - -func RegisterDriver(driverName string, driver Driver) { - if driver == nil { - panic("core: Register driver is nil") - } - if _, dup := drivers[driverName]; dup { - panic("core: Register called twice for driver " + driverName) - } - drivers[driverName] = driver -} - -func QueryDriver(driverName string) Driver { - return drivers[driverName] -} - -func RegisteredDriverSize() int { - return len(drivers) -} diff --git a/vendor/github.com/go-xorm/core/error.go b/vendor/github.com/go-xorm/core/error.go deleted file mode 100644 index 640e6036e6..0000000000 --- a/vendor/github.com/go-xorm/core/error.go +++ /dev/null @@ -1,8 +0,0 @@ -package core - -import "errors" - -var ( - ErrNoMapPointer = errors.New("mp should be a map's pointer") - ErrNoStructPointer = errors.New("mp should be a struct's pointer") -) diff --git a/vendor/github.com/go-xorm/core/filter.go b/vendor/github.com/go-xorm/core/filter.go deleted file mode 100644 index 35b0ece676..0000000000 --- a/vendor/github.com/go-xorm/core/filter.go +++ /dev/null @@ -1,64 +0,0 @@ -package core - -import ( - "fmt" - "strings" -) - -// Filter is an interface to filter SQL -type Filter interface { - Do(sql string, dialect Dialect, table *Table) string -} - -// QuoteFilter filter SQL replace ` to database's own quote character -type QuoteFilter struct { -} - -func (s *QuoteFilter) Do(sql string, dialect Dialect, table *Table) string { - return strings.Replace(sql, "`", dialect.QuoteStr(), -1) -} - -// IdFilter filter SQL replace (id) to primary key column name -type IdFilter struct { -} - -type Quoter struct { - dialect Dialect -} - -func NewQuoter(dialect Dialect) *Quoter { - return &Quoter{dialect} -} - -func (q *Quoter) Quote(content string) string { - return q.dialect.QuoteStr() + content + q.dialect.QuoteStr() -} - -func (i *IdFilter) Do(sql string, dialect Dialect, table *Table) string { - quoter := NewQuoter(dialect) - if table != nil && len(table.PrimaryKeys) == 1 { - sql = strings.Replace(sql, " `(id)` ", " "+quoter.Quote(table.PrimaryKeys[0])+" ", -1) - sql = strings.Replace(sql, " "+quoter.Quote("(id)")+" ", " "+quoter.Quote(table.PrimaryKeys[0])+" ", -1) - return strings.Replace(sql, " (id) ", " "+quoter.Quote(table.PrimaryKeys[0])+" ", -1) - } - return sql -} - -// SeqFilter filter SQL replace ?, ? ... to $1, $2 ... -type SeqFilter struct { - Prefix string - Start int -} - -func (s *SeqFilter) Do(sql string, dialect Dialect, table *Table) string { - segs := strings.Split(sql, "?") - size := len(segs) - res := "" - for i, c := range segs { - if i < size-1 { - res += c + fmt.Sprintf("%s%v", s.Prefix, i+s.Start) - } - } - res += segs[size-1] - return res -} diff --git a/vendor/github.com/go-xorm/core/go.mod b/vendor/github.com/go-xorm/core/go.mod deleted file mode 100644 index 70c86bcbc8..0000000000 --- a/vendor/github.com/go-xorm/core/go.mod +++ /dev/null @@ -1 +0,0 @@ -module "github.com/go-xorm/core" diff --git a/vendor/github.com/go-xorm/core/ilogger.go b/vendor/github.com/go-xorm/core/ilogger.go deleted file mode 100644 index c8d7849605..0000000000 --- a/vendor/github.com/go-xorm/core/ilogger.go +++ /dev/null @@ -1,31 +0,0 @@ -package core - -type LogLevel int - -const ( - // !nashtsai! following level also match syslog.Priority value - LOG_DEBUG LogLevel = iota - LOG_INFO - LOG_WARNING - LOG_ERR - LOG_OFF - LOG_UNKNOWN -) - -// logger interface -type ILogger interface { - Debug(v ...interface{}) - Debugf(format string, v ...interface{}) - Error(v ...interface{}) - Errorf(format string, v ...interface{}) - Info(v ...interface{}) - Infof(format string, v ...interface{}) - Warn(v ...interface{}) - Warnf(format string, v ...interface{}) - - Level() LogLevel - SetLevel(l LogLevel) - - ShowSQL(show ...bool) - IsShowSQL() bool -} diff --git a/vendor/github.com/go-xorm/core/index.go b/vendor/github.com/go-xorm/core/index.go deleted file mode 100644 index 9aa1b7ac99..0000000000 --- a/vendor/github.com/go-xorm/core/index.go +++ /dev/null @@ -1,63 +0,0 @@ -package core - -import ( - "fmt" - "sort" - "strings" -) - -const ( - IndexType = iota + 1 - UniqueType -) - -// database index -type Index struct { - IsRegular bool - Name string - Type int - Cols []string -} - -func (index *Index) XName(tableName string) string { - if !strings.HasPrefix(index.Name, "UQE_") && - !strings.HasPrefix(index.Name, "IDX_") { - tableName = strings.Replace(tableName, `"`, "", -1) - tableName = strings.Replace(tableName, `.`, "_", -1) - if index.Type == UniqueType { - return fmt.Sprintf("UQE_%v_%v", tableName, index.Name) - } - return fmt.Sprintf("IDX_%v_%v", tableName, index.Name) - } - return index.Name -} - -// add columns which will be composite index -func (index *Index) AddColumn(cols ...string) { - for _, col := range cols { - index.Cols = append(index.Cols, col) - } -} - -func (index *Index) Equal(dst *Index) bool { - if index.Type != dst.Type { - return false - } - if len(index.Cols) != len(dst.Cols) { - return false - } - sort.StringSlice(index.Cols).Sort() - sort.StringSlice(dst.Cols).Sort() - - for i := 0; i < len(index.Cols); i++ { - if index.Cols[i] != dst.Cols[i] { - return false - } - } - return true -} - -// new an index -func NewIndex(name string, indexType int) *Index { - return &Index{true, name, indexType, make([]string, 0)} -} diff --git a/vendor/github.com/go-xorm/core/mapper.go b/vendor/github.com/go-xorm/core/mapper.go deleted file mode 100644 index bb72a15662..0000000000 --- a/vendor/github.com/go-xorm/core/mapper.go +++ /dev/null @@ -1,254 +0,0 @@ -package core - -import ( - "strings" - "sync" -) - -// name translation between struct, fields names and table, column names -type IMapper interface { - Obj2Table(string) string - Table2Obj(string) string -} - -type CacheMapper struct { - oriMapper IMapper - obj2tableCache map[string]string - obj2tableMutex sync.RWMutex - table2objCache map[string]string - table2objMutex sync.RWMutex -} - -func NewCacheMapper(mapper IMapper) *CacheMapper { - return &CacheMapper{oriMapper: mapper, obj2tableCache: make(map[string]string), - table2objCache: make(map[string]string), - } -} - -func (m *CacheMapper) Obj2Table(o string) string { - m.obj2tableMutex.RLock() - t, ok := m.obj2tableCache[o] - m.obj2tableMutex.RUnlock() - if ok { - return t - } - - t = m.oriMapper.Obj2Table(o) - m.obj2tableMutex.Lock() - m.obj2tableCache[o] = t - m.obj2tableMutex.Unlock() - return t -} - -func (m *CacheMapper) Table2Obj(t string) string { - m.table2objMutex.RLock() - o, ok := m.table2objCache[t] - m.table2objMutex.RUnlock() - if ok { - return o - } - - o = m.oriMapper.Table2Obj(t) - m.table2objMutex.Lock() - m.table2objCache[t] = o - m.table2objMutex.Unlock() - return o -} - -// SameMapper implements IMapper and provides same name between struct and -// database table -type SameMapper struct { -} - -func (m SameMapper) Obj2Table(o string) string { - return o -} - -func (m SameMapper) Table2Obj(t string) string { - return t -} - -// SnakeMapper implements IMapper and provides name transaltion between -// struct and database table -type SnakeMapper struct { -} - -func snakeCasedName(name string) string { - newstr := make([]rune, 0) - for idx, chr := range name { - if isUpper := 'A' <= chr && chr <= 'Z'; isUpper { - if idx > 0 { - newstr = append(newstr, '_') - } - chr -= ('A' - 'a') - } - newstr = append(newstr, chr) - } - - return string(newstr) -} - -func (mapper SnakeMapper) Obj2Table(name string) string { - return snakeCasedName(name) -} - -func titleCasedName(name string) string { - newstr := make([]rune, 0) - upNextChar := true - - name = strings.ToLower(name) - - for _, chr := range name { - switch { - case upNextChar: - upNextChar = false - if 'a' <= chr && chr <= 'z' { - chr -= ('a' - 'A') - } - case chr == '_': - upNextChar = true - continue - } - - newstr = append(newstr, chr) - } - - return string(newstr) -} - -func (mapper SnakeMapper) Table2Obj(name string) string { - return titleCasedName(name) -} - -// GonicMapper implements IMapper. It will consider initialisms when mapping names. -// E.g. id -> ID, user -> User and to table names: UserID -> user_id, MyUID -> my_uid -type GonicMapper map[string]bool - -func isASCIIUpper(r rune) bool { - return 'A' <= r && r <= 'Z' -} - -func toASCIIUpper(r rune) rune { - if 'a' <= r && r <= 'z' { - r -= ('a' - 'A') - } - return r -} - -func gonicCasedName(name string) string { - newstr := make([]rune, 0, len(name)+3) - for idx, chr := range name { - if isASCIIUpper(chr) && idx > 0 { - if !isASCIIUpper(newstr[len(newstr)-1]) { - newstr = append(newstr, '_') - } - } - - if !isASCIIUpper(chr) && idx > 1 { - l := len(newstr) - if isASCIIUpper(newstr[l-1]) && isASCIIUpper(newstr[l-2]) { - newstr = append(newstr, newstr[l-1]) - newstr[l-1] = '_' - } - } - - newstr = append(newstr, chr) - } - return strings.ToLower(string(newstr)) -} - -func (mapper GonicMapper) Obj2Table(name string) string { - return gonicCasedName(name) -} - -func (mapper GonicMapper) Table2Obj(name string) string { - newstr := make([]rune, 0) - - name = strings.ToLower(name) - parts := strings.Split(name, "_") - - for _, p := range parts { - _, isInitialism := mapper[strings.ToUpper(p)] - for i, r := range p { - if i == 0 || isInitialism { - r = toASCIIUpper(r) - } - newstr = append(newstr, r) - } - } - - return string(newstr) -} - -// A GonicMapper that contains a list of common initialisms taken from golang/lint -var LintGonicMapper = GonicMapper{ - "API": true, - "ASCII": true, - "CPU": true, - "CSS": true, - "DNS": true, - "EOF": true, - "GUID": true, - "HTML": true, - "HTTP": true, - "HTTPS": true, - "ID": true, - "IP": true, - "JSON": true, - "LHS": true, - "QPS": true, - "RAM": true, - "RHS": true, - "RPC": true, - "SLA": true, - "SMTP": true, - "SSH": true, - "TLS": true, - "TTL": true, - "UI": true, - "UID": true, - "UUID": true, - "URI": true, - "URL": true, - "UTF8": true, - "VM": true, - "XML": true, - "XSRF": true, - "XSS": true, -} - -// provide prefix table name support -type PrefixMapper struct { - Mapper IMapper - Prefix string -} - -func (mapper PrefixMapper) Obj2Table(name string) string { - return mapper.Prefix + mapper.Mapper.Obj2Table(name) -} - -func (mapper PrefixMapper) Table2Obj(name string) string { - return mapper.Mapper.Table2Obj(name[len(mapper.Prefix):]) -} - -func NewPrefixMapper(mapper IMapper, prefix string) PrefixMapper { - return PrefixMapper{mapper, prefix} -} - -// provide suffix table name support -type SuffixMapper struct { - Mapper IMapper - Suffix string -} - -func (mapper SuffixMapper) Obj2Table(name string) string { - return mapper.Mapper.Obj2Table(name) + mapper.Suffix -} - -func (mapper SuffixMapper) Table2Obj(name string) string { - return mapper.Mapper.Table2Obj(name[:len(name)-len(mapper.Suffix)]) -} - -func NewSuffixMapper(mapper IMapper, suffix string) SuffixMapper { - return SuffixMapper{mapper, suffix} -} diff --git a/vendor/github.com/go-xorm/core/pk.go b/vendor/github.com/go-xorm/core/pk.go deleted file mode 100644 index 1810dd944b..0000000000 --- a/vendor/github.com/go-xorm/core/pk.go +++ /dev/null @@ -1,26 +0,0 @@ -package core - -import ( - "bytes" - "encoding/gob" -) - -type PK []interface{} - -func NewPK(pks ...interface{}) *PK { - p := PK(pks) - return &p -} - -func (p *PK) ToString() (string, error) { - buf := new(bytes.Buffer) - enc := gob.NewEncoder(buf) - err := enc.Encode(*p) - return buf.String(), err -} - -func (p *PK) FromString(content string) error { - dec := gob.NewDecoder(bytes.NewBufferString(content)) - err := dec.Decode(p) - return err -} diff --git a/vendor/github.com/go-xorm/core/rows.go b/vendor/github.com/go-xorm/core/rows.go deleted file mode 100644 index 580de4f9c6..0000000000 --- a/vendor/github.com/go-xorm/core/rows.go +++ /dev/null @@ -1,334 +0,0 @@ -package core - -import ( - "database/sql" - "errors" - "reflect" - "sync" -) - -type Rows struct { - *sql.Rows - db *DB -} - -func (rs *Rows) ToMapString() ([]map[string]string, error) { - cols, err := rs.Columns() - if err != nil { - return nil, err - } - - var results = make([]map[string]string, 0, 10) - for rs.Next() { - var record = make(map[string]string, len(cols)) - err = rs.ScanMap(&record) - if err != nil { - return nil, err - } - results = append(results, record) - } - return results, nil -} - -// scan data to a struct's pointer according field index -func (rs *Rows) ScanStructByIndex(dest ...interface{}) error { - if len(dest) == 0 { - return errors.New("at least one struct") - } - - vvvs := make([]reflect.Value, len(dest)) - for i, s := range dest { - vv := reflect.ValueOf(s) - if vv.Kind() != reflect.Ptr || vv.Elem().Kind() != reflect.Struct { - return errors.New("dest should be a struct's pointer") - } - - vvvs[i] = vv.Elem() - } - - cols, err := rs.Columns() - if err != nil { - return err - } - newDest := make([]interface{}, len(cols)) - - var i = 0 - for _, vvv := range vvvs { - for j := 0; j < vvv.NumField(); j++ { - newDest[i] = vvv.Field(j).Addr().Interface() - i = i + 1 - } - } - - return rs.Rows.Scan(newDest...) -} - -var ( - fieldCache = make(map[reflect.Type]map[string]int) - fieldCacheMutex sync.RWMutex -) - -func fieldByName(v reflect.Value, name string) reflect.Value { - t := v.Type() - fieldCacheMutex.RLock() - cache, ok := fieldCache[t] - fieldCacheMutex.RUnlock() - if !ok { - cache = make(map[string]int) - for i := 0; i < v.NumField(); i++ { - cache[t.Field(i).Name] = i - } - fieldCacheMutex.Lock() - fieldCache[t] = cache - fieldCacheMutex.Unlock() - } - - if i, ok := cache[name]; ok { - return v.Field(i) - } - - return reflect.Zero(t) -} - -// scan data to a struct's pointer according field name -func (rs *Rows) ScanStructByName(dest interface{}) error { - vv := reflect.ValueOf(dest) - if vv.Kind() != reflect.Ptr || vv.Elem().Kind() != reflect.Struct { - return errors.New("dest should be a struct's pointer") - } - - cols, err := rs.Columns() - if err != nil { - return err - } - - newDest := make([]interface{}, len(cols)) - var v EmptyScanner - for j, name := range cols { - f := fieldByName(vv.Elem(), rs.db.Mapper.Table2Obj(name)) - if f.IsValid() { - newDest[j] = f.Addr().Interface() - } else { - newDest[j] = &v - } - } - - return rs.Rows.Scan(newDest...) -} - -// scan data to a slice's pointer, slice's length should equal to columns' number -func (rs *Rows) ScanSlice(dest interface{}) error { - vv := reflect.ValueOf(dest) - if vv.Kind() != reflect.Ptr || vv.Elem().Kind() != reflect.Slice { - return errors.New("dest should be a slice's pointer") - } - - vvv := vv.Elem() - cols, err := rs.Columns() - if err != nil { - return err - } - - newDest := make([]interface{}, len(cols)) - - for j := 0; j < len(cols); j++ { - if j >= vvv.Len() { - newDest[j] = reflect.New(vvv.Type().Elem()).Interface() - } else { - newDest[j] = vvv.Index(j).Addr().Interface() - } - } - - err = rs.Rows.Scan(newDest...) - if err != nil { - return err - } - - srcLen := vvv.Len() - for i := srcLen; i < len(cols); i++ { - vvv = reflect.Append(vvv, reflect.ValueOf(newDest[i]).Elem()) - } - return nil -} - -// scan data to a map's pointer -func (rs *Rows) ScanMap(dest interface{}) error { - vv := reflect.ValueOf(dest) - if vv.Kind() != reflect.Ptr || vv.Elem().Kind() != reflect.Map { - return errors.New("dest should be a map's pointer") - } - - cols, err := rs.Columns() - if err != nil { - return err - } - - newDest := make([]interface{}, len(cols)) - vvv := vv.Elem() - - for i, _ := range cols { - newDest[i] = rs.db.reflectNew(vvv.Type().Elem()).Interface() - } - - err = rs.Rows.Scan(newDest...) - if err != nil { - return err - } - - for i, name := range cols { - vname := reflect.ValueOf(name) - vvv.SetMapIndex(vname, reflect.ValueOf(newDest[i]).Elem()) - } - - return nil -} - -type Row struct { - rows *Rows - // One of these two will be non-nil: - err error // deferred error for easy chaining -} - -// ErrorRow return an error row -func ErrorRow(err error) *Row { - return &Row{ - err: err, - } -} - -// NewRow from rows -func NewRow(rows *Rows, err error) *Row { - return &Row{rows, err} -} - -func (row *Row) Columns() ([]string, error) { - if row.err != nil { - return nil, row.err - } - return row.rows.Columns() -} - -func (row *Row) Scan(dest ...interface{}) error { - if row.err != nil { - return row.err - } - defer row.rows.Close() - - for _, dp := range dest { - if _, ok := dp.(*sql.RawBytes); ok { - return errors.New("sql: RawBytes isn't allowed on Row.Scan") - } - } - - if !row.rows.Next() { - if err := row.rows.Err(); err != nil { - return err - } - return sql.ErrNoRows - } - err := row.rows.Scan(dest...) - if err != nil { - return err - } - // Make sure the query can be processed to completion with no errors. - return row.rows.Close() -} - -func (row *Row) ScanStructByName(dest interface{}) error { - if row.err != nil { - return row.err - } - defer row.rows.Close() - - if !row.rows.Next() { - if err := row.rows.Err(); err != nil { - return err - } - return sql.ErrNoRows - } - err := row.rows.ScanStructByName(dest) - if err != nil { - return err - } - // Make sure the query can be processed to completion with no errors. - return row.rows.Close() -} - -func (row *Row) ScanStructByIndex(dest interface{}) error { - if row.err != nil { - return row.err - } - defer row.rows.Close() - - if !row.rows.Next() { - if err := row.rows.Err(); err != nil { - return err - } - return sql.ErrNoRows - } - err := row.rows.ScanStructByIndex(dest) - if err != nil { - return err - } - // Make sure the query can be processed to completion with no errors. - return row.rows.Close() -} - -// scan data to a slice's pointer, slice's length should equal to columns' number -func (row *Row) ScanSlice(dest interface{}) error { - if row.err != nil { - return row.err - } - defer row.rows.Close() - - if !row.rows.Next() { - if err := row.rows.Err(); err != nil { - return err - } - return sql.ErrNoRows - } - err := row.rows.ScanSlice(dest) - if err != nil { - return err - } - - // Make sure the query can be processed to completion with no errors. - return row.rows.Close() -} - -// scan data to a map's pointer -func (row *Row) ScanMap(dest interface{}) error { - if row.err != nil { - return row.err - } - defer row.rows.Close() - - if !row.rows.Next() { - if err := row.rows.Err(); err != nil { - return err - } - return sql.ErrNoRows - } - err := row.rows.ScanMap(dest) - if err != nil { - return err - } - - // Make sure the query can be processed to completion with no errors. - return row.rows.Close() -} - -func (row *Row) ToMapString() (map[string]string, error) { - cols, err := row.Columns() - if err != nil { - return nil, err - } - - var record = make(map[string]string, len(cols)) - err = row.ScanMap(&record) - if err != nil { - return nil, err - } - - return record, nil -} diff --git a/vendor/github.com/go-xorm/core/scan.go b/vendor/github.com/go-xorm/core/scan.go deleted file mode 100644 index b7c159b274..0000000000 --- a/vendor/github.com/go-xorm/core/scan.go +++ /dev/null @@ -1,55 +0,0 @@ -package core - -import ( - "database/sql/driver" - "fmt" - "time" -) - -type NullTime time.Time - -var ( - _ driver.Valuer = NullTime{} -) - -func (ns *NullTime) Scan(value interface{}) error { - if value == nil { - return nil - } - return convertTime(ns, value) -} - -// Value implements the driver Valuer interface. -func (ns NullTime) Value() (driver.Value, error) { - if (time.Time)(ns).IsZero() { - return nil, nil - } - return (time.Time)(ns).Format("2006-01-02 15:04:05"), nil -} - -func convertTime(dest *NullTime, src interface{}) error { - // Common cases, without reflect. - switch s := src.(type) { - case string: - t, err := time.Parse("2006-01-02 15:04:05", s) - if err != nil { - return err - } - *dest = NullTime(t) - return nil - case []uint8: - t, err := time.Parse("2006-01-02 15:04:05", string(s)) - if err != nil { - return err - } - *dest = NullTime(t) - return nil - case time.Time: - *dest = NullTime(s) - return nil - case nil: - default: - return fmt.Errorf("unsupported driver -> Scan pair: %T -> %T", src, dest) - } - return nil -} diff --git a/vendor/github.com/go-xorm/core/table.go b/vendor/github.com/go-xorm/core/table.go deleted file mode 100644 index b5d079404c..0000000000 --- a/vendor/github.com/go-xorm/core/table.go +++ /dev/null @@ -1,150 +0,0 @@ -package core - -import ( - "reflect" - "strings" -) - -// database table -type Table struct { - Name string - Type reflect.Type - columnsSeq []string - columnsMap map[string][]*Column - columns []*Column - Indexes map[string]*Index - PrimaryKeys []string - AutoIncrement string - Created map[string]bool - Updated string - Deleted string - Version string - Cacher Cacher - StoreEngine string - Charset string - Comment string -} - -func (table *Table) Columns() []*Column { - return table.columns -} - -func (table *Table) ColumnsSeq() []string { - return table.columnsSeq -} - -func NewEmptyTable() *Table { - return NewTable("", nil) -} - -func NewTable(name string, t reflect.Type) *Table { - return &Table{Name: name, Type: t, - columnsSeq: make([]string, 0), - columns: make([]*Column, 0), - columnsMap: make(map[string][]*Column), - Indexes: make(map[string]*Index), - Created: make(map[string]bool), - PrimaryKeys: make([]string, 0), - } -} - -func (table *Table) columnsByName(name string) []*Column { - n := len(name) - - for k := range table.columnsMap { - if len(k) != n { - continue - } - if strings.EqualFold(k, name) { - return table.columnsMap[k] - } - } - return nil -} - -func (table *Table) GetColumn(name string) *Column { - - cols := table.columnsByName(name) - - if cols != nil { - return cols[0] - } - - return nil -} - -func (table *Table) GetColumnIdx(name string, idx int) *Column { - cols := table.columnsByName(name) - - if cols != nil && idx < len(cols) { - return cols[idx] - } - - return nil -} - -// if has primary key, return column -func (table *Table) PKColumns() []*Column { - columns := make([]*Column, len(table.PrimaryKeys)) - for i, name := range table.PrimaryKeys { - columns[i] = table.GetColumn(name) - } - return columns -} - -func (table *Table) ColumnType(name string) reflect.Type { - t, _ := table.Type.FieldByName(name) - return t.Type -} - -func (table *Table) AutoIncrColumn() *Column { - return table.GetColumn(table.AutoIncrement) -} - -func (table *Table) VersionColumn() *Column { - return table.GetColumn(table.Version) -} - -func (table *Table) UpdatedColumn() *Column { - return table.GetColumn(table.Updated) -} - -func (table *Table) DeletedColumn() *Column { - return table.GetColumn(table.Deleted) -} - -// add a column to table -func (table *Table) AddColumn(col *Column) { - table.columnsSeq = append(table.columnsSeq, col.Name) - table.columns = append(table.columns, col) - colName := strings.ToLower(col.Name) - if c, ok := table.columnsMap[colName]; ok { - table.columnsMap[colName] = append(c, col) - } else { - table.columnsMap[colName] = []*Column{col} - } - - if col.IsPrimaryKey { - table.PrimaryKeys = append(table.PrimaryKeys, col.Name) - } - if col.IsAutoIncrement { - table.AutoIncrement = col.Name - } - if col.IsCreated { - table.Created[col.Name] = true - } - if col.IsUpdated { - table.Updated = col.Name - } - if col.IsDeleted { - table.Deleted = col.Name - } - if col.IsVersion { - table.Version = col.Name - } -} - -// add an index or an unique to table -func (table *Table) AddIndex(index *Index) { - table.Indexes[index.Name] = index -} diff --git a/vendor/github.com/go-xorm/core/type.go b/vendor/github.com/go-xorm/core/type.go deleted file mode 100644 index 5cbf930573..0000000000 --- a/vendor/github.com/go-xorm/core/type.go +++ /dev/null @@ -1,311 +0,0 @@ -package core - -import ( - "reflect" - "sort" - "strings" - "time" -) - -const ( - POSTGRES = "postgres" - SQLITE = "sqlite3" - MYSQL = "mysql" - MSSQL = "mssql" - ORACLE = "oracle" -) - -// xorm SQL types -type SQLType struct { - Name string - DefaultLength int - DefaultLength2 int -} - -const ( - UNKNOW_TYPE = iota - TEXT_TYPE - BLOB_TYPE - TIME_TYPE - NUMERIC_TYPE -) - -func (s *SQLType) IsType(st int) bool { - if t, ok := SqlTypes[s.Name]; ok && t == st { - return true - } - return false -} - -func (s *SQLType) IsText() bool { - return s.IsType(TEXT_TYPE) -} - -func (s *SQLType) IsBlob() bool { - return s.IsType(BLOB_TYPE) -} - -func (s *SQLType) IsTime() bool { - return s.IsType(TIME_TYPE) -} - -func (s *SQLType) IsNumeric() bool { - return s.IsType(NUMERIC_TYPE) -} - -func (s *SQLType) IsJson() bool { - return s.Name == Json || s.Name == Jsonb -} - -var ( - Bit = "BIT" - TinyInt = "TINYINT" - SmallInt = "SMALLINT" - MediumInt = "MEDIUMINT" - Int = "INT" - Integer = "INTEGER" - BigInt = "BIGINT" - - Enum = "ENUM" - Set = "SET" - - Char = "CHAR" - Varchar = "VARCHAR" - NVarchar = "NVARCHAR" - TinyText = "TINYTEXT" - Text = "TEXT" - NText = "NTEXT" - Clob = "CLOB" - MediumText = "MEDIUMTEXT" - LongText = "LONGTEXT" - Uuid = "UUID" - UniqueIdentifier = "UNIQUEIDENTIFIER" - SysName = "SYSNAME" - - Date = "DATE" - DateTime = "DATETIME" - Time = "TIME" - TimeStamp = "TIMESTAMP" - TimeStampz = "TIMESTAMPZ" - - Decimal = "DECIMAL" - Numeric = "NUMERIC" - - Real = "REAL" - Float = "FLOAT" - Double = "DOUBLE" - - Binary = "BINARY" - VarBinary = "VARBINARY" - TinyBlob = "TINYBLOB" - Blob = "BLOB" - MediumBlob = "MEDIUMBLOB" - LongBlob = "LONGBLOB" - Bytea = "BYTEA" - - Bool = "BOOL" - Boolean = "BOOLEAN" - - Serial = "SERIAL" - BigSerial = "BIGSERIAL" - - Json = "JSON" - Jsonb = "JSONB" - - SqlTypes = map[string]int{ - Bit: NUMERIC_TYPE, - TinyInt: NUMERIC_TYPE, - SmallInt: NUMERIC_TYPE, - MediumInt: NUMERIC_TYPE, - Int: NUMERIC_TYPE, - Integer: NUMERIC_TYPE, - BigInt: NUMERIC_TYPE, - - Enum: TEXT_TYPE, - Set: TEXT_TYPE, - Json: TEXT_TYPE, - Jsonb: TEXT_TYPE, - - Char: TEXT_TYPE, - Varchar: TEXT_TYPE, - NVarchar: TEXT_TYPE, - TinyText: TEXT_TYPE, - Text: TEXT_TYPE, - NText: TEXT_TYPE, - MediumText: TEXT_TYPE, - LongText: TEXT_TYPE, - Uuid: TEXT_TYPE, - Clob: TEXT_TYPE, - SysName: TEXT_TYPE, - - Date: TIME_TYPE, - DateTime: TIME_TYPE, - Time: TIME_TYPE, - TimeStamp: TIME_TYPE, - TimeStampz: TIME_TYPE, - - Decimal: NUMERIC_TYPE, - Numeric: NUMERIC_TYPE, - Real: NUMERIC_TYPE, - Float: NUMERIC_TYPE, - Double: NUMERIC_TYPE, - - Binary: BLOB_TYPE, - VarBinary: BLOB_TYPE, - - TinyBlob: BLOB_TYPE, - Blob: BLOB_TYPE, - MediumBlob: BLOB_TYPE, - LongBlob: BLOB_TYPE, - Bytea: BLOB_TYPE, - UniqueIdentifier: BLOB_TYPE, - - Bool: NUMERIC_TYPE, - - Serial: NUMERIC_TYPE, - BigSerial: NUMERIC_TYPE, - } - - intTypes = sort.StringSlice{"*int", "*int16", "*int32", "*int8"} - uintTypes = sort.StringSlice{"*uint", "*uint16", "*uint32", "*uint8"} -) - -// !nashtsai! treat following var as interal const values, these are used for reflect.TypeOf comparison -var ( - c_EMPTY_STRING string - c_BOOL_DEFAULT bool - c_BYTE_DEFAULT byte - c_COMPLEX64_DEFAULT complex64 - c_COMPLEX128_DEFAULT complex128 - c_FLOAT32_DEFAULT float32 - c_FLOAT64_DEFAULT float64 - c_INT64_DEFAULT int64 - c_UINT64_DEFAULT uint64 - c_INT32_DEFAULT int32 - c_UINT32_DEFAULT uint32 - c_INT16_DEFAULT int16 - c_UINT16_DEFAULT uint16 - c_INT8_DEFAULT int8 - c_UINT8_DEFAULT uint8 - c_INT_DEFAULT int - c_UINT_DEFAULT uint - c_TIME_DEFAULT time.Time -) - -var ( - IntType = reflect.TypeOf(c_INT_DEFAULT) - Int8Type = reflect.TypeOf(c_INT8_DEFAULT) - Int16Type = reflect.TypeOf(c_INT16_DEFAULT) - Int32Type = reflect.TypeOf(c_INT32_DEFAULT) - Int64Type = reflect.TypeOf(c_INT64_DEFAULT) - - UintType = reflect.TypeOf(c_UINT_DEFAULT) - Uint8Type = reflect.TypeOf(c_UINT8_DEFAULT) - Uint16Type = reflect.TypeOf(c_UINT16_DEFAULT) - Uint32Type = reflect.TypeOf(c_UINT32_DEFAULT) - Uint64Type = reflect.TypeOf(c_UINT64_DEFAULT) - - Float32Type = reflect.TypeOf(c_FLOAT32_DEFAULT) - Float64Type = reflect.TypeOf(c_FLOAT64_DEFAULT) - - Complex64Type = reflect.TypeOf(c_COMPLEX64_DEFAULT) - Complex128Type = reflect.TypeOf(c_COMPLEX128_DEFAULT) - - StringType = reflect.TypeOf(c_EMPTY_STRING) - BoolType = reflect.TypeOf(c_BOOL_DEFAULT) - ByteType = reflect.TypeOf(c_BYTE_DEFAULT) - BytesType = reflect.SliceOf(ByteType) - - TimeType = reflect.TypeOf(c_TIME_DEFAULT) -) - -var ( - PtrIntType = reflect.PtrTo(IntType) - PtrInt8Type = reflect.PtrTo(Int8Type) - PtrInt16Type = reflect.PtrTo(Int16Type) - PtrInt32Type = reflect.PtrTo(Int32Type) - PtrInt64Type = reflect.PtrTo(Int64Type) - - PtrUintType = reflect.PtrTo(UintType) - PtrUint8Type = reflect.PtrTo(Uint8Type) - PtrUint16Type = reflect.PtrTo(Uint16Type) - PtrUint32Type = reflect.PtrTo(Uint32Type) - PtrUint64Type = reflect.PtrTo(Uint64Type) - - PtrFloat32Type = reflect.PtrTo(Float32Type) - PtrFloat64Type = reflect.PtrTo(Float64Type) - - PtrComplex64Type = reflect.PtrTo(Complex64Type) - PtrComplex128Type = reflect.PtrTo(Complex128Type) - - PtrStringType = reflect.PtrTo(StringType) - PtrBoolType = reflect.PtrTo(BoolType) - PtrByteType = reflect.PtrTo(ByteType) - - PtrTimeType = reflect.PtrTo(TimeType) -) - -// Type2SQLType generate SQLType acorrding Go's type -func Type2SQLType(t reflect.Type) (st SQLType) { - switch k := t.Kind(); k { - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32: - st = SQLType{Int, 0, 0} - case reflect.Int64, reflect.Uint64: - st = SQLType{BigInt, 0, 0} - case reflect.Float32: - st = SQLType{Float, 0, 0} - case reflect.Float64: - st = SQLType{Double, 0, 0} - case reflect.Complex64, reflect.Complex128: - st = SQLType{Varchar, 64, 0} - case reflect.Array, reflect.Slice, reflect.Map: - if t.Elem() == reflect.TypeOf(c_BYTE_DEFAULT) { - st = SQLType{Blob, 0, 0} - } else { - st = SQLType{Text, 0, 0} - } - case reflect.Bool: - st = SQLType{Bool, 0, 0} - case reflect.String: - st = SQLType{Varchar, 255, 0} - case reflect.Struct: - if t.ConvertibleTo(TimeType) { - st = SQLType{DateTime, 0, 0} - } else { - // TODO need to handle association struct - st = SQLType{Text, 0, 0} - } - case reflect.Ptr: - st = Type2SQLType(t.Elem()) - default: - st = SQLType{Text, 0, 0} - } - return -} - -// default sql type change to go types -func SQLType2Type(st SQLType) reflect.Type { - name := strings.ToUpper(st.Name) - switch name { - case Bit, TinyInt, SmallInt, MediumInt, Int, Integer, Serial: - return reflect.TypeOf(1) - case BigInt, BigSerial: - return reflect.TypeOf(int64(1)) - case Float, Real: - return reflect.TypeOf(float32(1)) - case Double: - return reflect.TypeOf(float64(1)) - case Char, Varchar, NVarchar, TinyText, Text, NText, MediumText, LongText, Enum, Set, Uuid, Clob, SysName: - return reflect.TypeOf("") - case TinyBlob, Blob, LongBlob, Bytea, Binary, MediumBlob, VarBinary, UniqueIdentifier: - return reflect.TypeOf([]byte{}) - case Bool: - return reflect.TypeOf(true) - case DateTime, Date, Time, TimeStamp, TimeStampz: - return reflect.TypeOf(c_TIME_DEFAULT) - case Decimal, Numeric: - return reflect.TypeOf("") - default: - return reflect.TypeOf("") - } -} diff --git a/vendor/github.com/go-xorm/xorm/.drone.yml b/vendor/github.com/go-xorm/xorm/.drone.yml index 0a79ed0216..df9d405bc2 100644 --- a/vendor/github.com/go-xorm/xorm/.drone.yml +++ b/vendor/github.com/go-xorm/xorm/.drone.yml @@ -59,8 +59,8 @@ pipeline: image: golang:${GO_VERSION} commands: - go get -t -d -v ./... - - go get -u github.com/go-xorm/core - - go get -u github.com/go-xorm/builder + - go get -u xorm.io/core + - go get -u xorm.io/builder - go build -v when: event: [ push, pull_request ] diff --git a/vendor/github.com/go-xorm/xorm/README.md b/vendor/github.com/go-xorm/xorm/README.md index 6a57606e7f..2b839d520f 100644 --- a/vendor/github.com/go-xorm/xorm/README.md +++ b/vendor/github.com/go-xorm/xorm/README.md @@ -28,7 +28,7 @@ Xorm is a simple and powerful ORM for Go. * Optimistic Locking support -* SQL Builder support via [github.com/go-xorm/builder](https://github.com/go-xorm/builder) +* SQL Builder support via [xorm.io/builder](https://xorm.io/builder) * Automatical Read/Write seperatelly @@ -151,20 +151,20 @@ has, err := engine.Where("name = ?", name).Desc("id").Get(&user) // SELECT * FROM user WHERE name = ? ORDER BY id DESC LIMIT 1 var name string -has, err := engine.Where("id = ?", id).Cols("name").Get(&name) +has, err := engine.Table(&user).Where("id = ?", id).Cols("name").Get(&name) // SELECT name FROM user WHERE id = ? var id int64 -has, err := engine.Where("name = ?", name).Cols("id").Get(&id) +has, err := engine.Table(&user).Where("name = ?", name).Cols("id").Get(&id) has, err := engine.SQL("select id from user").Get(&id) // SELECT id FROM user WHERE name = ? var valuesMap = make(map[string]string) -has, err := engine.Where("id = ?", id).Get(&valuesMap) +has, err := engine.Table(&user).Where("id = ?", id).Get(&valuesMap) // SELECT * FROM user WHERE id = ? var valuesSlice = make([]interface{}, len(cols)) -has, err := engine.Where("id = ?", id).Cols(cols...).Get(&valuesSlice) +has, err := engine.Table(&user).Where("id = ?", id).Cols(cols...).Get(&valuesSlice) // SELECT col1, col2, col3 FROM user WHERE id = ? ``` @@ -363,7 +363,7 @@ return session.Commit() * Or you can use `Transaction` to replace above codes. ```Go -res, err := engine.Transaction(func(sess *xorm.Session) (interface{}, error) { +res, err := engine.Transaction(func(session *xorm.Session) (interface{}, error) { user1 := Userinfo{Username: "xiaoxiao", Departname: "dev", Alias: "lunny", Created: time.Now()} if _, err := session.Insert(&user1); err != nil { return nil, err @@ -493,4 +493,4 @@ Support this project by becoming a sponsor. Your logo will show up here with a l ## LICENSE -BSD License [http://creativecommons.org/licenses/BSD/](http://creativecommons.org/licenses/BSD/)
\ No newline at end of file +BSD License [http://creativecommons.org/licenses/BSD/](http://creativecommons.org/licenses/BSD/) diff --git a/vendor/github.com/go-xorm/xorm/README_CN.md b/vendor/github.com/go-xorm/xorm/README_CN.md index e2ed95b62c..0cec6ed5c6 100644 --- a/vendor/github.com/go-xorm/xorm/README_CN.md +++ b/vendor/github.com/go-xorm/xorm/README_CN.md @@ -153,20 +153,20 @@ has, err := engine.Where("name = ?", name).Desc("id").Get(&user) // SELECT * FROM user WHERE name = ? ORDER BY id DESC LIMIT 1 var name string -has, err := engine.Where("id = ?", id).Cols("name").Get(&name) +has, err := engine.Table(&user).Where("id = ?", id).Cols("name").Get(&name) // SELECT name FROM user WHERE id = ? var id int64 -has, err := engine.Where("name = ?", name).Cols("id").Get(&id) +has, err := engine.Table(&user).Where("name = ?", name).Cols("id").Get(&id) has, err := engine.SQL("select id from user").Get(&id) // SELECT id FROM user WHERE name = ? var valuesMap = make(map[string]string) -has, err := engine.Where("id = ?", id).Get(&valuesMap) +has, err := engine.Table(&user).Where("id = ?", id).Get(&valuesMap) // SELECT * FROM user WHERE id = ? var valuesSlice = make([]interface{}, len(cols)) -has, err := engine.Where("id = ?", id).Cols(cols...).Get(&valuesSlice) +has, err := engine.Table(&user).Where("id = ?", id).Cols(cols...).Get(&valuesSlice) // SELECT col1, col2, col3 FROM user WHERE id = ? ``` @@ -362,7 +362,7 @@ if _, err := session.Exec("delete from userinfo where username = ?", user2.Usern return session.Commit() ``` -* 事物的简写方法 +* 事务的简写方法 ```Go res, err := engine.Transaction(func(session *xorm.Session) (interface{}, error) { diff --git a/vendor/github.com/go-xorm/xorm/cache_lru.go b/vendor/github.com/go-xorm/xorm/cache_lru.go index c9672cebe4..ab948bd28e 100644 --- a/vendor/github.com/go-xorm/xorm/cache_lru.go +++ b/vendor/github.com/go-xorm/xorm/cache_lru.go @@ -10,7 +10,7 @@ import ( "sync" "time" - "github.com/go-xorm/core" + "xorm.io/core" ) // LRUCacher implments cache object facilities diff --git a/vendor/github.com/go-xorm/xorm/cache_memory_store.go b/vendor/github.com/go-xorm/xorm/cache_memory_store.go index 36853b19e3..0c483f4583 100644 --- a/vendor/github.com/go-xorm/xorm/cache_memory_store.go +++ b/vendor/github.com/go-xorm/xorm/cache_memory_store.go @@ -7,7 +7,7 @@ package xorm import ( "sync" - "github.com/go-xorm/core" + "xorm.io/core" ) var _ core.CacheStore = NewMemoryStore() diff --git a/vendor/github.com/go-xorm/xorm/circle.yml b/vendor/github.com/go-xorm/xorm/circle.yml deleted file mode 100644 index 8fde316921..0000000000 --- a/vendor/github.com/go-xorm/xorm/circle.yml +++ /dev/null @@ -1,41 +0,0 @@ -dependencies: - override: - # './...' is a relative pattern which means all subdirectories - - go get -t -d -v ./... - - go get -t -d -v github.com/go-xorm/tests - - go get -u github.com/go-xorm/core - - go get -u github.com/go-xorm/builder - - go build -v - -database: - override: - - mysql -u root -e "CREATE DATABASE xorm_test DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci" - - mysql -u root -e "CREATE DATABASE xorm_test1 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci" - - mysql -u root -e "CREATE DATABASE xorm_test2 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci" - - mysql -u root -e "CREATE DATABASE xorm_test3 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci" - - createdb -p 5432 -e -U postgres xorm_test - - createdb -p 5432 -e -U postgres xorm_test1 - - createdb -p 5432 -e -U postgres xorm_test2 - - createdb -p 5432 -e -U postgres xorm_test3 - - psql xorm_test postgres -c "create schema xorm" - -test: - override: - # './...' is a relative pattern which means all subdirectories - - go get -u github.com/wadey/gocovmerge - - go test -v -race -db="sqlite3" -conn_str="./test.db" -coverprofile=coverage1-1.txt -covermode=atomic - - go test -v -race -db="sqlite3" -conn_str="./test.db" -cache=true -coverprofile=coverage1-2.txt -covermode=atomic - - go test -v -race -db="mysql" -conn_str="root:@/xorm_test" -coverprofile=coverage2-1.txt -covermode=atomic - - go test -v -race -db="mysql" -conn_str="root:@/xorm_test" -cache=true -coverprofile=coverage2-2.txt -covermode=atomic - - go test -v -race -db="mymysql" -conn_str="xorm_test/root/" -coverprofile=coverage3-1.txt -covermode=atomic - - go test -v -race -db="mymysql" -conn_str="xorm_test/root/" -cache=true -coverprofile=coverage3-2.txt -covermode=atomic - - go test -v -race -db="postgres" -conn_str="dbname=xorm_test sslmode=disable" -coverprofile=coverage4-1.txt -covermode=atomic - - go test -v -race -db="postgres" -conn_str="dbname=xorm_test sslmode=disable" -cache=true -coverprofile=coverage4-2.txt -covermode=atomic - - go test -v -race -db="postgres" -conn_str="dbname=xorm_test sslmode=disable" -schema=xorm -coverprofile=coverage5-1.txt -covermode=atomic - - go test -v -race -db="postgres" -conn_str="dbname=xorm_test sslmode=disable" -schema=xorm -cache=true -coverprofile=coverage5-2.txt -covermode=atomic - - gocovmerge coverage1-1.txt coverage1-2.txt coverage2-1.txt coverage2-2.txt coverage3-1.txt coverage3-2.txt coverage4-1.txt coverage4-2.txt coverage5-1.txt coverage5-2.txt > coverage.txt - - cd /home/ubuntu/.go_workspace/src/github.com/go-xorm/tests && ./sqlite3.sh - - cd /home/ubuntu/.go_workspace/src/github.com/go-xorm/tests && ./mysql.sh - - cd /home/ubuntu/.go_workspace/src/github.com/go-xorm/tests && ./postgres.sh - post: - - bash <(curl -s https://codecov.io/bash)
\ No newline at end of file diff --git a/vendor/github.com/go-xorm/xorm/dialect_mssql.go b/vendor/github.com/go-xorm/xorm/dialect_mssql.go index fb1247094c..3330212c12 100644 --- a/vendor/github.com/go-xorm/xorm/dialect_mssql.go +++ b/vendor/github.com/go-xorm/xorm/dialect_mssql.go @@ -7,10 +7,11 @@ package xorm import ( "errors" "fmt" + "net/url" "strconv" "strings" - "github.com/go-xorm/core" + "xorm.io/core" ) var ( @@ -544,14 +545,23 @@ type odbcDriver struct { } func (p *odbcDriver) Parse(driverName, dataSourceName string) (*core.Uri, error) { - kv := strings.Split(dataSourceName, ";") var dbName string - for _, c := range kv { - vv := strings.Split(strings.TrimSpace(c), "=") - if len(vv) == 2 { - switch strings.ToLower(vv[0]) { - case "database": - dbName = vv[1] + + if strings.HasPrefix(dataSourceName, "sqlserver://") { + u, err := url.Parse(dataSourceName) + if err != nil { + return nil, err + } + dbName = u.Query().Get("database") + } else { + kv := strings.Split(dataSourceName, ";") + for _, c := range kv { + vv := strings.Split(strings.TrimSpace(c), "=") + if len(vv) == 2 { + switch strings.ToLower(vv[0]) { + case "database": + dbName = vv[1] + } } } } diff --git a/vendor/github.com/go-xorm/xorm/dialect_mysql.go b/vendor/github.com/go-xorm/xorm/dialect_mysql.go index 9f5ae3b2e5..2628042ab3 100644 --- a/vendor/github.com/go-xorm/xorm/dialect_mysql.go +++ b/vendor/github.com/go-xorm/xorm/dialect_mysql.go @@ -13,7 +13,7 @@ import ( "strings" "time" - "github.com/go-xorm/core" + "xorm.io/core" ) var ( @@ -393,6 +393,9 @@ func (db *mysql) GetColumns(tableName string) ([]string, map[string]*core.Column if colType == "FLOAT UNSIGNED" { colType = "FLOAT" } + if colType == "DOUBLE UNSIGNED" { + colType = "DOUBLE" + } col.Length = len1 col.Length2 = len2 if _, ok := core.SqlTypes[colType]; ok { diff --git a/vendor/github.com/go-xorm/xorm/dialect_oracle.go b/vendor/github.com/go-xorm/xorm/dialect_oracle.go index ac0081b38f..b66145bcbe 100644 --- a/vendor/github.com/go-xorm/xorm/dialect_oracle.go +++ b/vendor/github.com/go-xorm/xorm/dialect_oracle.go @@ -11,7 +11,7 @@ import ( "strconv" "strings" - "github.com/go-xorm/core" + "xorm.io/core" ) var ( diff --git a/vendor/github.com/go-xorm/xorm/dialect_postgres.go b/vendor/github.com/go-xorm/xorm/dialect_postgres.go index 738c6a1581..662f6401c1 100644 --- a/vendor/github.com/go-xorm/xorm/dialect_postgres.go +++ b/vendor/github.com/go-xorm/xorm/dialect_postgres.go @@ -11,7 +11,7 @@ import ( "strconv" "strings" - "github.com/go-xorm/core" + "xorm.io/core" ) // from http://www.postgresql.org/docs/current/static/sql-keywords-appendix.html @@ -1093,6 +1093,19 @@ func (db *postgres) GetTables() ([]*core.Table, error) { return tables, nil } + +func getIndexColName(indexdef string) []string { + var colNames []string + + cs := strings.Split(indexdef, "(") + for _, v := range strings.Split(strings.Split(cs[1], ")")[0], ",") { + colNames = append(colNames, strings.Split(strings.TrimLeft(v, " "), " ")[0]) + } + + return colNames +} + + func (db *postgres) GetIndexes(tableName string) (map[string]*core.Index, error) { args := []interface{}{tableName} s := fmt.Sprintf("SELECT indexname, indexdef FROM pg_indexes WHERE tablename=$1") @@ -1126,8 +1139,7 @@ func (db *postgres) GetIndexes(tableName string) (map[string]*core.Index, error) } else { indexType = core.IndexType } - cs := strings.Split(indexdef, "(") - colNames = strings.Split(cs[1][0:len(cs[1])-1], ",") + colNames = getIndexColName(indexdef) var isRegular bool if strings.HasPrefix(indexName, "IDX_"+tableName) || strings.HasPrefix(indexName, "UQE_"+tableName) { newIdxName := indexName[5+len(tableName):] diff --git a/vendor/github.com/go-xorm/xorm/dialect_sqlite3.go b/vendor/github.com/go-xorm/xorm/dialect_sqlite3.go index e129481466..e30a7751bf 100644 --- a/vendor/github.com/go-xorm/xorm/dialect_sqlite3.go +++ b/vendor/github.com/go-xorm/xorm/dialect_sqlite3.go @@ -11,7 +11,7 @@ import ( "regexp" "strings" - "github.com/go-xorm/core" + "xorm.io/core" ) var ( diff --git a/vendor/github.com/go-xorm/xorm/engine.go b/vendor/github.com/go-xorm/xorm/engine.go index c1bf06e15c..962df125bb 100644 --- a/vendor/github.com/go-xorm/xorm/engine.go +++ b/vendor/github.com/go-xorm/xorm/engine.go @@ -7,6 +7,7 @@ package xorm import ( "bufio" "bytes" + "context" "database/sql" "encoding/gob" "errors" @@ -19,8 +20,8 @@ import ( "sync" "time" - "github.com/go-xorm/builder" - "github.com/go-xorm/core" + "xorm.io/builder" + "xorm.io/core" ) // Engine is the major struct of xorm, it means a database manager. @@ -52,6 +53,8 @@ type Engine struct { cachers map[string]core.Cacher cacherLock sync.RWMutex + + defaultContext context.Context } func (engine *Engine) setCacher(tableName string, cacher core.Cacher) { @@ -122,6 +125,7 @@ func (engine *Engine) Logger() core.ILogger { // SetLogger set the new logger func (engine *Engine) SetLogger(logger core.ILogger) { engine.logger = logger + engine.showSQL = logger.IsShowSQL() engine.dialect.SetLogger(logger) } @@ -1351,31 +1355,31 @@ func (engine *Engine) DropIndexes(bean interface{}) error { } // Exec raw sql -func (engine *Engine) Exec(sqlorArgs ...interface{}) (sql.Result, error) { +func (engine *Engine) Exec(sqlOrArgs ...interface{}) (sql.Result, error) { session := engine.NewSession() defer session.Close() - return session.Exec(sqlorArgs...) + return session.Exec(sqlOrArgs...) } // Query a raw sql and return records as []map[string][]byte -func (engine *Engine) Query(sqlorArgs ...interface{}) (resultsSlice []map[string][]byte, err error) { +func (engine *Engine) Query(sqlOrArgs ...interface{}) (resultsSlice []map[string][]byte, err error) { session := engine.NewSession() defer session.Close() - return session.Query(sqlorArgs...) + return session.Query(sqlOrArgs...) } // QueryString runs a raw sql and return records as []map[string]string -func (engine *Engine) QueryString(sqlorArgs ...interface{}) ([]map[string]string, error) { +func (engine *Engine) QueryString(sqlOrArgs ...interface{}) ([]map[string]string, error) { session := engine.NewSession() defer session.Close() - return session.QueryString(sqlorArgs...) + return session.QueryString(sqlOrArgs...) } // QueryInterface runs a raw sql and return records as []map[string]interface{} -func (engine *Engine) QueryInterface(sqlorArgs ...interface{}) ([]map[string]interface{}, error) { +func (engine *Engine) QueryInterface(sqlOrArgs ...interface{}) ([]map[string]interface{}, error) { session := engine.NewSession() defer session.Close() - return session.QueryInterface(sqlorArgs...) + return session.QueryInterface(sqlOrArgs...) } // Insert one or more records diff --git a/vendor/github.com/go-xorm/xorm/engine_cond.go b/vendor/github.com/go-xorm/xorm/engine_cond.go index 4dde8662e1..702ac80434 100644 --- a/vendor/github.com/go-xorm/xorm/engine_cond.go +++ b/vendor/github.com/go-xorm/xorm/engine_cond.go @@ -6,14 +6,13 @@ package xorm import ( "database/sql/driver" - "encoding/json" "fmt" "reflect" "strings" "time" - "github.com/go-xorm/builder" - "github.com/go-xorm/core" + "xorm.io/builder" + "xorm.io/core" ) func (engine *Engine) buildConds(table *core.Table, bean interface{}, @@ -147,7 +146,7 @@ func (engine *Engine) buildConds(table *core.Table, bean interface{}, } else { if col.SQLType.IsJson() { if col.SQLType.IsText() { - bytes, err := json.Marshal(fieldValue.Interface()) + bytes, err := DefaultJSONHandler.Marshal(fieldValue.Interface()) if err != nil { engine.logger.Error(err) continue @@ -156,7 +155,7 @@ func (engine *Engine) buildConds(table *core.Table, bean interface{}, } else if col.SQLType.IsBlob() { var bytes []byte var err error - bytes, err = json.Marshal(fieldValue.Interface()) + bytes, err = DefaultJSONHandler.Marshal(fieldValue.Interface()) if err != nil { engine.logger.Error(err) continue @@ -195,7 +194,7 @@ func (engine *Engine) buildConds(table *core.Table, bean interface{}, } if col.SQLType.IsText() { - bytes, err := json.Marshal(fieldValue.Interface()) + bytes, err := DefaultJSONHandler.Marshal(fieldValue.Interface()) if err != nil { engine.logger.Error(err) continue @@ -212,7 +211,7 @@ func (engine *Engine) buildConds(table *core.Table, bean interface{}, continue } } else { - bytes, err = json.Marshal(fieldValue.Interface()) + bytes, err = DefaultJSONHandler.Marshal(fieldValue.Interface()) if err != nil { engine.logger.Error(err) continue diff --git a/vendor/github.com/go-xorm/xorm/engine_context.go b/vendor/github.com/go-xorm/xorm/engine_context.go new file mode 100644 index 0000000000..c6cbb76c1d --- /dev/null +++ b/vendor/github.com/go-xorm/xorm/engine_context.go @@ -0,0 +1,28 @@ +// Copyright 2019 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. + +// +build go1.8 + +package xorm + +import "context" + +// Context creates a session with the context +func (engine *Engine) Context(ctx context.Context) *Session { + session := engine.NewSession() + session.isAutoClose = true + return session.Context(ctx) +} + +// SetDefaultContext set the default context +func (engine *Engine) SetDefaultContext(ctx context.Context) { + engine.defaultContext = ctx +} + +// PingContext tests if database is alive +func (engine *Engine) PingContext(ctx context.Context) error { + session := engine.NewSession() + defer session.Close() + return session.PingContext(ctx) +} diff --git a/vendor/github.com/go-xorm/xorm/engine_group.go b/vendor/github.com/go-xorm/xorm/engine_group.go index 5eee3e6183..42d49eca93 100644 --- a/vendor/github.com/go-xorm/xorm/engine_group.go +++ b/vendor/github.com/go-xorm/xorm/engine_group.go @@ -5,9 +5,10 @@ package xorm import ( + "context" "time" - "github.com/go-xorm/core" + "xorm.io/core" ) // EngineGroup defines an engine group @@ -74,6 +75,20 @@ func (eg *EngineGroup) Close() error { return nil } +// Context returned a group session +func (eg *EngineGroup) Context(ctx context.Context) *Session { + sess := eg.NewSession() + sess.isAutoClose = true + return sess.Context(ctx) +} + +// NewSession returned a group session +func (eg *EngineGroup) NewSession() *Session { + sess := eg.Engine.NewSession() + sess.sessionType = groupSession + return sess +} + // Master returns the master engine func (eg *EngineGroup) Master() *Engine { return eg.Engine diff --git a/vendor/github.com/go-xorm/xorm/engine_table.go b/vendor/github.com/go-xorm/xorm/engine_table.go index 94871a4bce..eb5aa850af 100644 --- a/vendor/github.com/go-xorm/xorm/engine_table.go +++ b/vendor/github.com/go-xorm/xorm/engine_table.go @@ -9,10 +9,10 @@ import ( "reflect" "strings" - "github.com/go-xorm/core" + "xorm.io/core" ) -// TableNameWithSchema will automatically add schema prefix on table name +// tbNameWithSchema will automatically add schema prefix on table name func (engine *Engine) tbNameWithSchema(v string) string { // Add schema name as prefix of table name. // Only for postgres database. diff --git a/vendor/github.com/go-xorm/xorm/error.go b/vendor/github.com/go-xorm/xorm/error.go index a223fc4a86..a67527acda 100644 --- a/vendor/github.com/go-xorm/xorm/error.go +++ b/vendor/github.com/go-xorm/xorm/error.go @@ -26,6 +26,8 @@ var ( ErrNotImplemented = errors.New("Not implemented") // ErrConditionType condition type unsupported ErrConditionType = errors.New("Unsupported condition type") + // ErrUnSupportedSQLType parameter of SQL is not supported + ErrUnSupportedSQLType = errors.New("unsupported sql type") ) // ErrFieldIsNotExist columns does not exist diff --git a/vendor/github.com/go-xorm/xorm/go.mod b/vendor/github.com/go-xorm/xorm/go.mod index 1856169558..9a30b4b48a 100644 --- a/vendor/github.com/go-xorm/xorm/go.mod +++ b/vendor/github.com/go-xorm/xorm/go.mod @@ -1,24 +1,24 @@ module github.com/go-xorm/xorm require ( + cloud.google.com/go v0.34.0 // indirect github.com/cockroachdb/apd v1.1.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/denisenkom/go-mssqldb v0.0.0-20181014144952-4e0d7dc8888f - github.com/go-sql-driver/mysql v1.4.0 - github.com/go-xorm/builder v0.3.2 - github.com/go-xorm/core v0.6.0 - github.com/go-xorm/sqlfiddle v0.0.0-20180821085327-62ce714f951a // indirect + github.com/denisenkom/go-mssqldb v0.0.0-20190121005146-b04fd42d9952 + github.com/go-sql-driver/mysql v1.4.1 + github.com/google/go-cmp v0.2.0 // indirect github.com/jackc/fake v0.0.0-20150926172116-812a484cc733 // indirect - github.com/jackc/pgx v3.2.0+incompatible + github.com/jackc/pgx v3.3.0+incompatible github.com/kr/pretty v0.1.0 // indirect github.com/lib/pq v1.0.0 - github.com/mattn/go-sqlite3 v1.9.0 - github.com/pkg/errors v0.8.0 // indirect - github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/mattn/go-sqlite3 v1.10.0 + github.com/pkg/errors v0.8.1 // indirect github.com/satori/go.uuid v1.2.0 // indirect github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24 // indirect - github.com/stretchr/testify v1.2.2 + github.com/stretchr/testify v1.3.0 github.com/ziutek/mymysql v1.5.4 + golang.org/x/crypto v0.0.0-20190122013713-64072686203f // indirect gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 // indirect - gopkg.in/stretchr/testify.v1 v1.2.2 + xorm.io/builder v0.3.5 + xorm.io/core v0.6.3 ) diff --git a/vendor/github.com/go-xorm/xorm/go.sum b/vendor/github.com/go-xorm/xorm/go.sum index dbf757d1d3..307d46d9ad 100644 --- a/vendor/github.com/go-xorm/xorm/go.sum +++ b/vendor/github.com/go-xorm/xorm/go.sum @@ -1,21 +1,24 @@ +cloud.google.com/go v0.34.0 h1:eOI3/cP2VTU6uZLDYAoic+eyzzB9YyGmJ7eIjl8rOPg= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= github.com/cockroachdb/apd v1.1.0 h1:3LFP3629v+1aKXU5Q37mxmRxX/pIu1nijXydLShEq5I= github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= +github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/denisenkom/go-mssqldb v0.0.0-20181014144952-4e0d7dc8888f h1:WH0w/R4Yoey+04HhFxqZ6VX6I0d7RMyw5aXQ9UTvQPs= -github.com/denisenkom/go-mssqldb v0.0.0-20181014144952-4e0d7dc8888f/go.mod h1:xN/JuLBIz4bjkxNmByTiV1IbhfnYb6oo99phBn4Eqhc= -github.com/go-sql-driver/mysql v1.4.0 h1:7LxgVwFb2hIQtMm87NdgAVfXjnt4OePseqT1tKx+opk= -github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= -github.com/go-xorm/builder v0.3.2 h1:pSsZQRRzJNapKEAEhigw3xLmiLPeAYv5GFlpYZ8+a5I= -github.com/go-xorm/builder v0.3.2/go.mod h1:v8mE3MFBgtL+RGFNfUnAMUqqfk/Y4W5KuwCFQIEpQLk= -github.com/go-xorm/core v0.6.0 h1:tp6hX+ku4OD9khFZS8VGBDRY3kfVCtelPfmkgCyHxL0= -github.com/go-xorm/core v0.6.0/go.mod h1:d8FJ9Br8OGyQl12MCclmYBuBqqxsyeedpXciV5Myih8= +github.com/denisenkom/go-mssqldb v0.0.0-20190121005146-b04fd42d9952 h1:b5OnbZD49x9g+/FcYbs/vukEt8C/jUbGhCJ3uduQmu8= +github.com/denisenkom/go-mssqldb v0.0.0-20190121005146-b04fd42d9952/go.mod h1:xN/JuLBIz4bjkxNmByTiV1IbhfnYb6oo99phBn4Eqhc= +github.com/go-sql-driver/mysql v1.4.1 h1:g24URVg0OFbNUTx9qqY1IRZ9D9z3iPyi5zKhQZpNwpA= +github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-xorm/sqlfiddle v0.0.0-20180821085327-62ce714f951a h1:9wScpmSP5A3Bk8V3XHWUcJmYTh+ZnlHVyc+A4oZYS3Y= github.com/go-xorm/sqlfiddle v0.0.0-20180821085327-62ce714f951a/go.mod h1:56xuuqnHyryaerycW3BfssRdxQstACi0Epw/yC5E2xM= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/google/go-cmp v0.2.0 h1:+dTQ8DZQJz0Mb/HjFlkptS1FeQ4cWSnN941F8aEG4SQ= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/jackc/fake v0.0.0-20150926172116-812a484cc733 h1:vr3AYkKovP8uR8AvSGGUK1IDqRa5lAAvEkZG1LKaCRc= github.com/jackc/fake v0.0.0-20150926172116-812a484cc733/go.mod h1:WrMFNQdiFJ80sQsxDoMokWK1W5TQtxBFNpzWTD84ibQ= -github.com/jackc/pgx v3.2.0+incompatible h1:0Vihzu20St42/UDsvZGdNE6jak7oi/UOeMzwMPHkgFY= -github.com/jackc/pgx v3.2.0+incompatible/go.mod h1:0ZGrqGqkRlliWnWB4zKnWtjbSWbGkVEFm4TeybAXq+I= +github.com/jackc/pgx v3.3.0+incompatible h1:Wa90/+qsITBAPkAZjiByeIGHFcj3Ztu+VzrrIpHjL90= +github.com/jackc/pgx v3.3.0+incompatible/go.mod h1:0ZGrqGqkRlliWnWB4zKnWtjbSWbGkVEFm4TeybAXq+I= github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= @@ -23,21 +26,32 @@ github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/lib/pq v1.0.0 h1:X5PMW56eZitiTeO7tKzZxFCSpbFZJtkMMooicw2us9A= github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/mattn/go-sqlite3 v1.9.0 h1:pDRiWfl+++eC2FEFRy6jXmQlvp4Yh3z1MJKg4UeYM/4= -github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= -github.com/pkg/errors v0.8.0 h1:WdK/asTD0HN+q6hsWO3/vpuAkAr+tw6aNJNDFFf0+qw= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/mattn/go-sqlite3 v1.10.0 h1:jbhqpg7tQe4SupckyijYiy0mJJ/pRyHvXf7JdWK860o= +github.com/mattn/go-sqlite3 v1.10.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= +github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24 h1:pntxY8Ary0t43dCZ5dqY4YTJCObLY1kIXl0uzMv+7DE= github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= -github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/ziutek/mymysql v1.5.4 h1:GB0qdRGsTwQSBVYuVShFBKaXSnSnYYC2d9knnE1LHFs= github.com/ziutek/mymysql v1.5.4/go.mod h1:LMSpPZ6DbqWFxNCHW77HeMg9I646SAhApZ/wKdgO/C0= +golang.org/x/crypto v0.0.0-20190122013713-64072686203f h1:u1CmMhe3a44hy8VIgpInORnI01UVaUYheqR7x9BxT3c= +golang.org/x/crypto v0.0.0-20190122013713-64072686203f/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +google.golang.org/appengine v1.4.0 h1:/wp5JvzpHIxhs/dumFmF7BXTf3Z+dd4uXta4kVyO508= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/stretchr/testify.v1 v1.2.2 h1:yhQC6Uy5CqibAIlk1wlusa/MJ3iAN49/BsR/dCCKz3M= -gopkg.in/stretchr/testify.v1 v1.2.2/go.mod h1:QI5V/q6UbPmuhtm10CaFZxED9NreB8PnFYN9JcR6TxU= +xorm.io/builder v0.3.5 h1:EilU39fvWDxjb1cDaELpYhsF+zziRBhew8xk4pngO+A= +xorm.io/builder v0.3.5/go.mod h1:ZFbByS/KxZI1FKRjL05PyJ4YrK2bcxlUaAxdum5aTR8= +xorm.io/core v0.6.2 h1:EJLcSxf336POJr670wKB55Mah9f93xzvGYzNRgnT8/Y= +xorm.io/core v0.6.2/go.mod h1:bwPIfLdm/FzWgVUH8WPVlr+uJhscvNGFcaZKXsI3n2c= +xorm.io/core v0.6.3 h1:n1NhVZt1s2oLw1BZfX2ocIJsHyso259uPgg63BGr37M= +xorm.io/core v0.6.3/go.mod h1:8kz/C6arVW/O9vk3PgCiMJO2hIAm1UcuOL3dSPyZ2qo= diff --git a/vendor/github.com/go-xorm/xorm/helpers.go b/vendor/github.com/go-xorm/xorm/helpers.go index f1705782e3..db8fc581f3 100644 --- a/vendor/github.com/go-xorm/xorm/helpers.go +++ b/vendor/github.com/go-xorm/xorm/helpers.go @@ -12,7 +12,7 @@ import ( "strconv" "strings" - "github.com/go-xorm/core" + "xorm.io/core" ) // str2PK convert string value to primary key value according to tp diff --git a/vendor/github.com/go-xorm/xorm/interface.go b/vendor/github.com/go-xorm/xorm/interface.go index 33d2078e44..0928f66a9a 100644 --- a/vendor/github.com/go-xorm/xorm/interface.go +++ b/vendor/github.com/go-xorm/xorm/interface.go @@ -5,11 +5,12 @@ package xorm import ( + "context" "database/sql" "reflect" "time" - "github.com/go-xorm/core" + "xorm.io/core" ) // Interface defines the interface which Engine, EngineGroup and Session will implementate. @@ -27,7 +28,7 @@ type Interface interface { Delete(interface{}) (int64, error) Distinct(columns ...string) *Session DropIndexes(bean interface{}) error - Exec(sqlOrAgrs ...interface{}) (sql.Result, error) + Exec(sqlOrArgs ...interface{}) (sql.Result, error) Exist(bean ...interface{}) (bool, error) Find(interface{}, ...interface{}) error FindAndCount(interface{}, ...interface{}) (int64, error) @@ -49,9 +50,9 @@ type Interface interface { Omit(columns ...string) *Session OrderBy(order string) *Session Ping() error - Query(sqlOrAgrs ...interface{}) (resultsSlice []map[string][]byte, err error) - QueryInterface(sqlorArgs ...interface{}) ([]map[string]interface{}, error) - QueryString(sqlorArgs ...interface{}) ([]map[string]string, error) + Query(sqlOrArgs ...interface{}) (resultsSlice []map[string][]byte, err error) + QueryInterface(sqlOrArgs ...interface{}) ([]map[string]interface{}, error) + QueryString(sqlOrArgs ...interface{}) ([]map[string]string, error) Rows(bean interface{}) (*Rows, error) SetExpr(string, string) *Session SQL(interface{}, ...interface{}) *Session @@ -73,6 +74,7 @@ type EngineInterface interface { Before(func(interface{})) *Session Charset(charset string) *Session ClearCache(...interface{}) error + Context(context.Context) *Session CreateTables(...interface{}) error DBMetas() ([]*core.Table, error) Dialect() core.Dialect diff --git a/vendor/github.com/go-xorm/xorm/json.go b/vendor/github.com/go-xorm/xorm/json.go new file mode 100644 index 0000000000..fdb6ce5654 --- /dev/null +++ b/vendor/github.com/go-xorm/xorm/json.go @@ -0,0 +1,31 @@ +// Copyright 2019 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 xorm + +import "encoding/json" + +// JSONInterface represents an interface to handle json data +type JSONInterface interface { + Marshal(v interface{}) ([]byte, error) + Unmarshal(data []byte, v interface{}) error +} + +var ( + // DefaultJSONHandler default json handler + DefaultJSONHandler JSONInterface = StdJSON{} +) + +// StdJSON implements JSONInterface via encoding/json +type StdJSON struct{} + +// Marshal implements JSONInterface +func (StdJSON) Marshal(v interface{}) ([]byte, error) { + return json.Marshal(v) +} + +// Unmarshal implements JSONInterface +func (StdJSON) Unmarshal(data []byte, v interface{}) error { + return json.Unmarshal(data, v) +} diff --git a/vendor/github.com/go-xorm/xorm/logger.go b/vendor/github.com/go-xorm/xorm/logger.go index 727d030a4c..7b26e77f3b 100644 --- a/vendor/github.com/go-xorm/xorm/logger.go +++ b/vendor/github.com/go-xorm/xorm/logger.go @@ -9,7 +9,7 @@ import ( "io" "log" - "github.com/go-xorm/core" + "xorm.io/core" ) // default log options diff --git a/vendor/github.com/go-xorm/xorm/rows.go b/vendor/github.com/go-xorm/xorm/rows.go index 54ec7f37a2..bdd44589f8 100644 --- a/vendor/github.com/go-xorm/xorm/rows.go +++ b/vendor/github.com/go-xorm/xorm/rows.go @@ -9,16 +9,13 @@ import ( "fmt" "reflect" - "github.com/go-xorm/core" + "xorm.io/core" ) // Rows rows wrapper a rows to type Rows struct { - NoTypeCheck bool - session *Session rows *core.Rows - fields []string beanType reflect.Type lastError error } @@ -57,13 +54,6 @@ func newRows(session *Session, bean interface{}) (*Rows, error) { return nil, err } - rows.fields, err = rows.rows.Columns() - if err != nil { - rows.lastError = err - rows.Close() - return nil, err - } - return rows, nil } @@ -90,7 +80,7 @@ func (rows *Rows) Scan(bean interface{}) error { return rows.lastError } - if !rows.NoTypeCheck && reflect.Indirect(reflect.ValueOf(bean)).Type() != rows.beanType { + if reflect.Indirect(reflect.ValueOf(bean)).Type() != rows.beanType { return fmt.Errorf("scan arg is incompatible type to [%v]", rows.beanType) } @@ -98,13 +88,18 @@ func (rows *Rows) Scan(bean interface{}) error { return err } - scanResults, err := rows.session.row2Slice(rows.rows, rows.fields, bean) + fields, err := rows.rows.Columns() + if err != nil { + return err + } + + scanResults, err := rows.session.row2Slice(rows.rows, fields, bean) if err != nil { return err } dataStruct := rValue(bean) - _, err = rows.session.slice2Bean(scanResults, rows.fields, bean, &dataStruct, rows.session.statement.RefTable) + _, err = rows.session.slice2Bean(scanResults, fields, bean, &dataStruct, rows.session.statement.RefTable) if err != nil { return err } @@ -118,17 +113,9 @@ func (rows *Rows) Close() error { defer rows.session.Close() } - if rows.lastError == nil { - if rows.rows != nil { - rows.lastError = rows.rows.Close() - if rows.lastError != nil { - return rows.lastError - } - } - } else { - if rows.rows != nil { - defer rows.rows.Close() - } + if rows.rows != nil { + return rows.rows.Close() } + return rows.lastError } diff --git a/vendor/github.com/go-xorm/xorm/session.go b/vendor/github.com/go-xorm/xorm/session.go index e3437b9181..b33955fdce 100644 --- a/vendor/github.com/go-xorm/xorm/session.go +++ b/vendor/github.com/go-xorm/xorm/session.go @@ -5,8 +5,8 @@ package xorm import ( + "context" "database/sql" - "encoding/json" "errors" "fmt" "hash/crc32" @@ -14,7 +14,14 @@ import ( "strings" "time" - "github.com/go-xorm/core" + "xorm.io/core" +) + +type sessionType int + +const ( + engineSession sessionType = iota + groupSession ) // Session keep a pointer to sql.DB and provides all execution of all @@ -51,7 +58,8 @@ type Session struct { lastSQL string lastSQLArgs []interface{} - err error + ctx context.Context + sessionType sessionType } // Clone copy all the session's content and return a new session @@ -82,6 +90,8 @@ func (session *Session) Init() { session.lastSQL = "" session.lastSQLArgs = []interface{}{} + + session.ctx = session.engine.defaultContext } // Close release the connection from pool @@ -275,7 +285,7 @@ func (session *Session) doPrepare(db *core.DB, sqlStr string) (stmt *core.Stmt, var has bool stmt, has = session.stmtCache[crc] if !has { - stmt, err = db.Prepare(sqlStr) + stmt, err = db.PrepareContext(session.ctx, sqlStr) if err != nil { return nil, err } @@ -480,13 +490,13 @@ func (session *Session) slice2Bean(scanResults []interface{}, fields []string, b continue } if fieldValue.CanAddr() { - err := json.Unmarshal(bs, fieldValue.Addr().Interface()) + err := DefaultJSONHandler.Unmarshal(bs, fieldValue.Addr().Interface()) if err != nil { return nil, err } } else { x := reflect.New(fieldType) - err := json.Unmarshal(bs, x.Interface()) + err := DefaultJSONHandler.Unmarshal(bs, x.Interface()) if err != nil { return nil, err } @@ -510,13 +520,13 @@ func (session *Session) slice2Bean(scanResults []interface{}, fields []string, b hasAssigned = true if len(bs) > 0 { if fieldValue.CanAddr() { - err := json.Unmarshal(bs, fieldValue.Addr().Interface()) + err := DefaultJSONHandler.Unmarshal(bs, fieldValue.Addr().Interface()) if err != nil { return nil, err } } else { x := reflect.New(fieldType) - err := json.Unmarshal(bs, x.Interface()) + err := DefaultJSONHandler.Unmarshal(bs, x.Interface()) if err != nil { return nil, err } @@ -532,7 +542,7 @@ func (session *Session) slice2Bean(scanResults []interface{}, fields []string, b hasAssigned = true if col.SQLType.IsText() { x := reflect.New(fieldType) - err := json.Unmarshal(vv.Bytes(), x.Interface()) + err := DefaultJSONHandler.Unmarshal(vv.Bytes(), x.Interface()) if err != nil { return nil, err } @@ -647,7 +657,7 @@ func (session *Session) slice2Bean(scanResults []interface{}, fields []string, b hasAssigned = true x := reflect.New(fieldType) if len([]byte(vv.String())) > 0 { - err := json.Unmarshal([]byte(vv.String()), x.Interface()) + err := DefaultJSONHandler.Unmarshal([]byte(vv.String()), x.Interface()) if err != nil { return nil, err } @@ -657,7 +667,7 @@ func (session *Session) slice2Bean(scanResults []interface{}, fields []string, b hasAssigned = true x := reflect.New(fieldType) if len(vv.Bytes()) > 0 { - err := json.Unmarshal(vv.Bytes(), x.Interface()) + err := DefaultJSONHandler.Unmarshal(vv.Bytes(), x.Interface()) if err != nil { return nil, err } @@ -793,7 +803,7 @@ func (session *Session) slice2Bean(scanResults []interface{}, fields []string, b case core.Complex64Type: var x complex64 if len([]byte(vv.String())) > 0 { - err := json.Unmarshal([]byte(vv.String()), &x) + err := DefaultJSONHandler.Unmarshal([]byte(vv.String()), &x) if err != nil { return nil, err } @@ -803,7 +813,7 @@ func (session *Session) slice2Bean(scanResults []interface{}, fields []string, b case core.Complex128Type: var x complex128 if len([]byte(vv.String())) > 0 { - err := json.Unmarshal([]byte(vv.String()), &x) + err := DefaultJSONHandler.Unmarshal([]byte(vv.String()), &x) if err != nil { return nil, err } diff --git a/vendor/github.com/go-xorm/xorm/session_cols.go b/vendor/github.com/go-xorm/xorm/session_cols.go index 47d109c6cb..dc3befcf6b 100644 --- a/vendor/github.com/go-xorm/xorm/session_cols.go +++ b/vendor/github.com/go-xorm/xorm/session_cols.go @@ -9,7 +9,7 @@ import ( "strings" "time" - "github.com/go-xorm/core" + "xorm.io/core" ) type incrParam struct { diff --git a/vendor/github.com/go-xorm/xorm/session_cond.go b/vendor/github.com/go-xorm/xorm/session_cond.go index e1d528f2db..b16bdea8e0 100644 --- a/vendor/github.com/go-xorm/xorm/session_cond.go +++ b/vendor/github.com/go-xorm/xorm/session_cond.go @@ -4,7 +4,7 @@ package xorm -import "github.com/go-xorm/builder" +import "xorm.io/builder" // Sql provides raw sql input parameter. When you have a complex SQL statement // and cannot use Where, Id, In and etc. Methods to describe, you can use SQL. diff --git a/vendor/github.com/go-xorm/xorm/context.go b/vendor/github.com/go-xorm/xorm/session_context.go index 074ba35a80..915f056858 100644 --- a/vendor/github.com/go-xorm/xorm/context.go +++ b/vendor/github.com/go-xorm/xorm/session_context.go @@ -1,18 +1,15 @@ -// Copyright 2017 The Xorm Authors. All rights reserved. +// Copyright 2019 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. -// +build go1.8 - package xorm import "context" -// PingContext tests if database is alive -func (engine *Engine) PingContext(ctx context.Context) error { - session := engine.NewSession() - defer session.Close() - return session.PingContext(ctx) +// Context sets the context on this session +func (session *Session) Context(ctx context.Context) *Session { + session.ctx = ctx + return session } // PingContext test if database is ok diff --git a/vendor/github.com/go-xorm/xorm/session_convert.go b/vendor/github.com/go-xorm/xorm/session_convert.go index 1f9d8aa1bd..c13b003d6b 100644 --- a/vendor/github.com/go-xorm/xorm/session_convert.go +++ b/vendor/github.com/go-xorm/xorm/session_convert.go @@ -7,7 +7,6 @@ package xorm import ( "database/sql" "database/sql/driver" - "encoding/json" "errors" "fmt" "reflect" @@ -15,7 +14,7 @@ import ( "strings" "time" - "github.com/go-xorm/core" + "xorm.io/core" ) func (session *Session) str2Time(col *core.Column, data string) (outTime time.Time, outErr error) { @@ -103,7 +102,7 @@ func (session *Session) bytes2Value(col *core.Column, fieldValue *reflect.Value, case reflect.Complex64, reflect.Complex128: x := reflect.New(fieldType) if len(data) > 0 { - err := json.Unmarshal(data, x.Interface()) + err := DefaultJSONHandler.Unmarshal(data, x.Interface()) if err != nil { session.engine.logger.Error(err) return err @@ -117,7 +116,7 @@ func (session *Session) bytes2Value(col *core.Column, fieldValue *reflect.Value, if col.SQLType.IsText() { x := reflect.New(fieldType) if len(data) > 0 { - err := json.Unmarshal(data, x.Interface()) + err := DefaultJSONHandler.Unmarshal(data, x.Interface()) if err != nil { session.engine.logger.Error(err) return err @@ -130,7 +129,7 @@ func (session *Session) bytes2Value(col *core.Column, fieldValue *reflect.Value, } else { x := reflect.New(fieldType) if len(data) > 0 { - err := json.Unmarshal(data, x.Interface()) + err := DefaultJSONHandler.Unmarshal(data, x.Interface()) if err != nil { session.engine.logger.Error(err) return err @@ -259,7 +258,7 @@ func (session *Session) bytes2Value(col *core.Column, fieldValue *reflect.Value, case core.Complex64Type.Kind(): var x complex64 if len(data) > 0 { - err := json.Unmarshal(data, &x) + err := DefaultJSONHandler.Unmarshal(data, &x) if err != nil { session.engine.logger.Error(err) return err @@ -270,7 +269,7 @@ func (session *Session) bytes2Value(col *core.Column, fieldValue *reflect.Value, case core.Complex128Type.Kind(): var x complex128 if len(data) > 0 { - err := json.Unmarshal(data, &x) + err := DefaultJSONHandler.Unmarshal(data, &x) if err != nil { session.engine.logger.Error(err) return err @@ -604,14 +603,14 @@ func (session *Session) value2Interface(col *core.Column, fieldValue reflect.Val } if col.SQLType.IsText() { - bytes, err := json.Marshal(fieldValue.Interface()) + bytes, err := DefaultJSONHandler.Marshal(fieldValue.Interface()) if err != nil { session.engine.logger.Error(err) return 0, err } return string(bytes), nil } else if col.SQLType.IsBlob() { - bytes, err := json.Marshal(fieldValue.Interface()) + bytes, err := DefaultJSONHandler.Marshal(fieldValue.Interface()) if err != nil { session.engine.logger.Error(err) return 0, err @@ -620,7 +619,7 @@ func (session *Session) value2Interface(col *core.Column, fieldValue reflect.Val } return nil, fmt.Errorf("Unsupported type %v", fieldValue.Type()) case reflect.Complex64, reflect.Complex128: - bytes, err := json.Marshal(fieldValue.Interface()) + bytes, err := DefaultJSONHandler.Marshal(fieldValue.Interface()) if err != nil { session.engine.logger.Error(err) return 0, err @@ -632,7 +631,7 @@ func (session *Session) value2Interface(col *core.Column, fieldValue reflect.Val } if col.SQLType.IsText() { - bytes, err := json.Marshal(fieldValue.Interface()) + bytes, err := DefaultJSONHandler.Marshal(fieldValue.Interface()) if err != nil { session.engine.logger.Error(err) return 0, err @@ -645,7 +644,7 @@ func (session *Session) value2Interface(col *core.Column, fieldValue reflect.Val (fieldValue.Type().Elem().Kind() == reflect.Uint8) { bytes = fieldValue.Bytes() } else { - bytes, err = json.Marshal(fieldValue.Interface()) + bytes, err = DefaultJSONHandler.Marshal(fieldValue.Interface()) if err != nil { session.engine.logger.Error(err) return 0, err diff --git a/vendor/github.com/go-xorm/xorm/session_delete.go b/vendor/github.com/go-xorm/xorm/session_delete.go index dcce543a3a..675d4d8c7d 100644 --- a/vendor/github.com/go-xorm/xorm/session_delete.go +++ b/vendor/github.com/go-xorm/xorm/session_delete.go @@ -9,7 +9,7 @@ import ( "fmt" "strconv" - "github.com/go-xorm/core" + "xorm.io/core" ) func (session *Session) cacheDelete(table *core.Table, tableName, sqlStr string, args ...interface{}) error { @@ -79,6 +79,10 @@ func (session *Session) Delete(bean interface{}) (int64, error) { defer session.Close() } + if session.statement.lastError != nil { + return 0, session.statement.lastError + } + if err := session.statement.setRefBean(bean); err != nil { return 0, err } diff --git a/vendor/github.com/go-xorm/xorm/session_exist.go b/vendor/github.com/go-xorm/xorm/session_exist.go index 74a660e852..660cc47e42 100644 --- a/vendor/github.com/go-xorm/xorm/session_exist.go +++ b/vendor/github.com/go-xorm/xorm/session_exist.go @@ -9,8 +9,8 @@ import ( "fmt" "reflect" - "github.com/go-xorm/builder" - "github.com/go-xorm/core" + "xorm.io/builder" + "xorm.io/core" ) // Exist returns true if the record exist otherwise return false @@ -19,6 +19,10 @@ func (session *Session) Exist(bean ...interface{}) (bool, error) { defer session.Close() } + if session.statement.lastError != nil { + return false, session.statement.lastError + } + var sqlStr string var args []interface{} var err error @@ -30,6 +34,8 @@ func (session *Session) Exist(bean ...interface{}) (bool, error) { return false, ErrTableNotFound } + tableName = session.statement.Engine.Quote(tableName) + if session.statement.cond.IsValid() { condSQL, condArgs, err := builder.ToSQL(session.statement.cond) if err != nil { @@ -37,14 +43,18 @@ func (session *Session) Exist(bean ...interface{}) (bool, error) { } if session.engine.dialect.DBType() == core.MSSQL { - sqlStr = fmt.Sprintf("SELECT top 1 * FROM %s WHERE %s", tableName, condSQL) + sqlStr = fmt.Sprintf("SELECT TOP 1 * FROM %s WHERE %s", tableName, condSQL) + } else if session.engine.dialect.DBType() == core.ORACLE { + sqlStr = fmt.Sprintf("SELECT * FROM %s WHERE (%s) AND ROWNUM=1", tableName, condSQL) } else { sqlStr = fmt.Sprintf("SELECT * FROM %s WHERE %s LIMIT 1", tableName, condSQL) } args = condArgs } else { if session.engine.dialect.DBType() == core.MSSQL { - sqlStr = fmt.Sprintf("SELECT top 1 * FROM %s", tableName) + sqlStr = fmt.Sprintf("SELECT TOP 1 * FROM %s", tableName) + } else if session.engine.dialect.DBType() == core.ORACLE { + sqlStr = fmt.Sprintf("SELECT * FROM %s WHERE ROWNUM=1", tableName) } else { sqlStr = fmt.Sprintf("SELECT * FROM %s LIMIT 1", tableName) } diff --git a/vendor/github.com/go-xorm/xorm/session_find.go b/vendor/github.com/go-xorm/xorm/session_find.go index a5b4f79342..d3fc0d30dd 100644 --- a/vendor/github.com/go-xorm/xorm/session_find.go +++ b/vendor/github.com/go-xorm/xorm/session_find.go @@ -10,8 +10,8 @@ import ( "reflect" "strings" - "github.com/go-xorm/builder" - "github.com/go-xorm/core" + "xorm.io/builder" + "xorm.io/core" ) const ( @@ -63,6 +63,10 @@ func (session *Session) FindAndCount(rowsSlicePtr interface{}, condiBean ...inte } func (session *Session) find(rowsSlicePtr interface{}, condiBean ...interface{}) error { + if session.statement.lastError != nil { + return session.statement.lastError + } + sliceValue := reflect.Indirect(reflect.ValueOf(rowsSlicePtr)) if sliceValue.Kind() != reflect.Slice && sliceValue.Kind() != reflect.Map { return errors.New("needs a pointer to a slice or a map") diff --git a/vendor/github.com/go-xorm/xorm/session_get.go b/vendor/github.com/go-xorm/xorm/session_get.go index 1cea31c5f8..a38707c8c6 100644 --- a/vendor/github.com/go-xorm/xorm/session_get.go +++ b/vendor/github.com/go-xorm/xorm/session_get.go @@ -11,7 +11,7 @@ import ( "reflect" "strconv" - "github.com/go-xorm/core" + "xorm.io/core" ) // Get retrieve one record from database, bean's non-empty fields @@ -24,6 +24,10 @@ func (session *Session) Get(bean interface{}) (bool, error) { } func (session *Session) get(bean interface{}) (bool, error) { + if session.statement.lastError != nil { + return false, session.statement.lastError + } + beanValue := reflect.ValueOf(bean) if beanValue.Kind() != reflect.Ptr { return false, errors.New("needs a pointer to a value") diff --git a/vendor/github.com/go-xorm/xorm/session_insert.go b/vendor/github.com/go-xorm/xorm/session_insert.go index e673e87425..3cff48f613 100644 --- a/vendor/github.com/go-xorm/xorm/session_insert.go +++ b/vendor/github.com/go-xorm/xorm/session_insert.go @@ -8,10 +8,11 @@ import ( "errors" "fmt" "reflect" + "sort" "strconv" "strings" - "github.com/go-xorm/core" + "xorm.io/core" ) // Insert insert one or more beans @@ -24,32 +25,67 @@ func (session *Session) Insert(beans ...interface{}) (int64, error) { } for _, bean := range beans { - sliceValue := reflect.Indirect(reflect.ValueOf(bean)) - if sliceValue.Kind() == reflect.Slice { - size := sliceValue.Len() - if size > 0 { - if session.engine.SupportInsertMany() { - cnt, err := session.innerInsertMulti(bean) - if err != nil { - return affected, err - } - affected += cnt - } else { - for i := 0; i < size; i++ { - cnt, err := session.innerInsert(sliceValue.Index(i).Interface()) + switch bean.(type) { + case map[string]interface{}: + cnt, err := session.insertMapInterface(bean.(map[string]interface{})) + if err != nil { + return affected, err + } + affected += cnt + case []map[string]interface{}: + s := bean.([]map[string]interface{}) + session.autoResetStatement = false + for i := 0; i < len(s); i++ { + cnt, err := session.insertMapInterface(s[i]) + if err != nil { + return affected, err + } + affected += cnt + } + case map[string]string: + cnt, err := session.insertMapString(bean.(map[string]string)) + if err != nil { + return affected, err + } + affected += cnt + case []map[string]string: + s := bean.([]map[string]string) + session.autoResetStatement = false + for i := 0; i < len(s); i++ { + cnt, err := session.insertMapString(s[i]) + if err != nil { + return affected, err + } + affected += cnt + } + default: + sliceValue := reflect.Indirect(reflect.ValueOf(bean)) + if sliceValue.Kind() == reflect.Slice { + size := sliceValue.Len() + if size > 0 { + if session.engine.SupportInsertMany() { + cnt, err := session.innerInsertMulti(bean) if err != nil { return affected, err } affected += cnt + } else { + for i := 0; i < size; i++ { + cnt, err := session.innerInsert(sliceValue.Index(i).Interface()) + if err != nil { + return affected, err + } + affected += cnt + } } } + } else { + cnt, err := session.innerInsert(bean) + if err != nil { + return affected, err + } + affected += cnt } - } else { - cnt, err := session.innerInsert(bean) - if err != nil { - return affected, err - } - affected += cnt } } @@ -337,21 +373,30 @@ func (session *Session) innerInsert(bean interface{}) (int64, error) { var sqlStr string var tableName = session.statement.TableName() + var output string + if session.engine.dialect.DBType() == core.MSSQL && len(table.AutoIncrement) > 0 { + output = fmt.Sprintf(" OUTPUT Inserted.%s", table.AutoIncrement) + } if len(colPlaces) > 0 { - sqlStr = fmt.Sprintf("INSERT INTO %s (%v%v%v) VALUES (%v)", + sqlStr = fmt.Sprintf("INSERT INTO %s (%v%v%v)%s VALUES (%v)", session.engine.Quote(tableName), session.engine.QuoteStr(), strings.Join(colNames, session.engine.Quote(", ")), session.engine.QuoteStr(), + output, colPlaces) } else { if session.engine.dialect.DBType() == core.MYSQL { sqlStr = fmt.Sprintf("INSERT INTO %s VALUES ()", session.engine.Quote(tableName)) } else { - sqlStr = fmt.Sprintf("INSERT INTO %s DEFAULT VALUES", session.engine.Quote(tableName)) + sqlStr = fmt.Sprintf("INSERT INTO %s%s DEFAULT VALUES", session.engine.Quote(tableName), output) } } + if len(table.AutoIncrement) > 0 && session.engine.dialect.DBType() == core.POSTGRES { + sqlStr = sqlStr + " RETURNING " + session.engine.Quote(table.AutoIncrement) + } + handleAfterInsertProcessorFunc := func(bean interface{}) { if session.isAutoCommit { for _, closure := range session.afterClosures { @@ -423,9 +468,7 @@ func (session *Session) innerInsert(bean interface{}) (int64, error) { aiValue.Set(int64ToIntValue(id, aiValue.Type())) return 1, nil - } else if session.engine.dialect.DBType() == core.POSTGRES && len(table.AutoIncrement) > 0 { - //assert table.AutoIncrement != "" - sqlStr = sqlStr + " RETURNING " + session.engine.Quote(table.AutoIncrement) + } else if len(table.AutoIncrement) > 0 && (session.engine.dialect.DBType() == core.POSTGRES || session.engine.dialect.DBType() == core.MSSQL) { res, err := session.queryBytes(sqlStr, args...) if err != nil { @@ -445,7 +488,7 @@ func (session *Session) innerInsert(bean interface{}) (int64, error) { } if len(res) < 1 { - return 0, errors.New("insert no error but not returned id") + return 0, errors.New("insert successfully but not returned id") } idByte := res[0][table.AutoIncrement] @@ -622,3 +665,83 @@ func (session *Session) genInsertColumns(bean interface{}) ([]string, []interfac } return colNames, args, nil } + +func (session *Session) insertMapInterface(m map[string]interface{}) (int64, error) { + if len(m) == 0 { + return 0, ErrParamsType + } + + var columns = make([]string, 0, len(m)) + for k := range m { + columns = append(columns, k) + } + sort.Strings(columns) + + qm := strings.Repeat("?,", len(columns)) + qm = "(" + qm[:len(qm)-1] + ")" + + tableName := session.statement.TableName() + if len(tableName) <= 0 { + return 0, ErrTableNotFound + } + + var sql = fmt.Sprintf("INSERT INTO %s (`%s`) VALUES %s", session.engine.Quote(tableName), strings.Join(columns, "`,`"), qm) + var args = make([]interface{}, 0, len(m)) + for _, colName := range columns { + args = append(args, m[colName]) + } + + if err := session.cacheInsert(tableName); err != nil { + return 0, err + } + + res, err := session.exec(sql, args...) + if err != nil { + return 0, err + } + affected, err := res.RowsAffected() + if err != nil { + return 0, err + } + return affected, nil +} + +func (session *Session) insertMapString(m map[string]string) (int64, error) { + if len(m) == 0 { + return 0, ErrParamsType + } + + var columns = make([]string, 0, len(m)) + for k := range m { + columns = append(columns, k) + } + sort.Strings(columns) + + qm := strings.Repeat("?,", len(columns)) + qm = "(" + qm[:len(qm)-1] + ")" + + tableName := session.statement.TableName() + if len(tableName) <= 0 { + return 0, ErrTableNotFound + } + + var sql = fmt.Sprintf("INSERT INTO %s (`%s`) VALUES %s", session.engine.Quote(tableName), strings.Join(columns, "`,`"), qm) + var args = make([]interface{}, 0, len(m)) + for _, colName := range columns { + args = append(args, m[colName]) + } + + if err := session.cacheInsert(tableName); err != nil { + return 0, err + } + + res, err := session.exec(sql, args...) + if err != nil { + return 0, err + } + affected, err := res.RowsAffected() + if err != nil { + return 0, err + } + return affected, nil +} diff --git a/vendor/github.com/go-xorm/xorm/session_iterate.go b/vendor/github.com/go-xorm/xorm/session_iterate.go index 071fce4992..ca996c2884 100644 --- a/vendor/github.com/go-xorm/xorm/session_iterate.go +++ b/vendor/github.com/go-xorm/xorm/session_iterate.go @@ -23,6 +23,10 @@ func (session *Session) Iterate(bean interface{}, fun IterFunc) error { defer session.Close() } + if session.statement.lastError != nil { + return session.statement.lastError + } + if session.statement.bufferSize > 0 { return session.bufferIterate(bean, fun) } diff --git a/vendor/github.com/go-xorm/xorm/session_query.go b/vendor/github.com/go-xorm/xorm/session_query.go index 6d597cc459..21c00b8d7f 100644 --- a/vendor/github.com/go-xorm/xorm/session_query.go +++ b/vendor/github.com/go-xorm/xorm/session_query.go @@ -11,13 +11,13 @@ import ( "strings" "time" - "github.com/go-xorm/builder" - "github.com/go-xorm/core" + "xorm.io/builder" + "xorm.io/core" ) -func (session *Session) genQuerySQL(sqlorArgs ...interface{}) (string, []interface{}, error) { - if len(sqlorArgs) > 0 { - return convertSQLOrArgs(sqlorArgs...) +func (session *Session) genQuerySQL(sqlOrArgs ...interface{}) (string, []interface{}, error) { + if len(sqlOrArgs) > 0 { + return convertSQLOrArgs(sqlOrArgs...) } if session.statement.RawSQL != "" { @@ -78,12 +78,12 @@ func (session *Session) genQuerySQL(sqlorArgs ...interface{}) (string, []interfa } // Query runs a raw sql and return records as []map[string][]byte -func (session *Session) Query(sqlorArgs ...interface{}) ([]map[string][]byte, error) { +func (session *Session) Query(sqlOrArgs ...interface{}) ([]map[string][]byte, error) { if session.isAutoClose { defer session.Close() } - sqlStr, args, err := session.genQuerySQL(sqlorArgs...) + sqlStr, args, err := session.genQuerySQL(sqlOrArgs...) if err != nil { return nil, err } @@ -227,12 +227,12 @@ func rows2SliceString(rows *core.Rows) (resultsSlice [][]string, err error) { } // QueryString runs a raw sql and return records as []map[string]string -func (session *Session) QueryString(sqlorArgs ...interface{}) ([]map[string]string, error) { +func (session *Session) QueryString(sqlOrArgs ...interface{}) ([]map[string]string, error) { if session.isAutoClose { defer session.Close() } - sqlStr, args, err := session.genQuerySQL(sqlorArgs...) + sqlStr, args, err := session.genQuerySQL(sqlOrArgs...) if err != nil { return nil, err } @@ -247,12 +247,12 @@ func (session *Session) QueryString(sqlorArgs ...interface{}) ([]map[string]stri } // QuerySliceString runs a raw sql and return records as [][]string -func (session *Session) QuerySliceString(sqlorArgs ...interface{}) ([][]string, error) { +func (session *Session) QuerySliceString(sqlOrArgs ...interface{}) ([][]string, error) { if session.isAutoClose { defer session.Close() } - sqlStr, args, err := session.genQuerySQL(sqlorArgs...) + sqlStr, args, err := session.genQuerySQL(sqlOrArgs...) if err != nil { return nil, err } @@ -300,12 +300,12 @@ func rows2Interfaces(rows *core.Rows) (resultsSlice []map[string]interface{}, er } // QueryInterface runs a raw sql and return records as []map[string]interface{} -func (session *Session) QueryInterface(sqlorArgs ...interface{}) ([]map[string]interface{}, error) { +func (session *Session) QueryInterface(sqlOrArgs ...interface{}) ([]map[string]interface{}, error) { if session.isAutoClose { defer session.Close() } - sqlStr, args, err := session.genQuerySQL(sqlorArgs...) + sqlStr, args, err := session.genQuerySQL(sqlOrArgs...) if err != nil { return nil, err } diff --git a/vendor/github.com/go-xorm/xorm/session_raw.go b/vendor/github.com/go-xorm/xorm/session_raw.go index 47823d6706..67648ef130 100644 --- a/vendor/github.com/go-xorm/xorm/session_raw.go +++ b/vendor/github.com/go-xorm/xorm/session_raw.go @@ -9,8 +9,8 @@ import ( "reflect" "time" - "github.com/go-xorm/builder" - "github.com/go-xorm/core" + "xorm.io/builder" + "xorm.io/core" ) func (session *Session) queryPreprocess(sqlStr *string, paramStr ...interface{}) { @@ -49,7 +49,7 @@ func (session *Session) queryRows(sqlStr string, args ...interface{}) (*core.Row if session.isAutoCommit { var db *core.DB - if session.engine.engineGroup != nil { + if session.sessionType == groupSession { db = session.engine.engineGroup.Slave().DB() } else { db = session.DB() @@ -62,21 +62,21 @@ func (session *Session) queryRows(sqlStr string, args ...interface{}) (*core.Row return nil, err } - rows, err := stmt.Query(args...) + rows, err := stmt.QueryContext(session.ctx, args...) if err != nil { return nil, err } return rows, nil } - rows, err := db.Query(sqlStr, args...) + rows, err := db.QueryContext(session.ctx, sqlStr, args...) if err != nil { return nil, err } return rows, nil } - rows, err := session.tx.Query(sqlStr, args...) + rows, err := session.tx.QueryContext(session.ctx, sqlStr, args...) if err != nil { return nil, err } @@ -175,7 +175,7 @@ func (session *Session) exec(sqlStr string, args ...interface{}) (sql.Result, er } if !session.isAutoCommit { - return session.tx.Exec(sqlStr, args...) + return session.tx.ExecContext(session.ctx, sqlStr, args...) } if session.prepareStmt { @@ -184,24 +184,24 @@ func (session *Session) exec(sqlStr string, args ...interface{}) (sql.Result, er return nil, err } - res, err := stmt.Exec(args...) + res, err := stmt.ExecContext(session.ctx, args...) if err != nil { return nil, err } return res, nil } - return session.DB().Exec(sqlStr, args...) + return session.DB().ExecContext(session.ctx, sqlStr, args...) } -func convertSQLOrArgs(sqlorArgs ...interface{}) (string, []interface{}, error) { - switch sqlorArgs[0].(type) { +func convertSQLOrArgs(sqlOrArgs ...interface{}) (string, []interface{}, error) { + switch sqlOrArgs[0].(type) { case string: - return sqlorArgs[0].(string), sqlorArgs[1:], nil + return sqlOrArgs[0].(string), sqlOrArgs[1:], nil case *builder.Builder: - return sqlorArgs[0].(*builder.Builder).ToSQL() + return sqlOrArgs[0].(*builder.Builder).ToSQL() case builder.Builder: - bd := sqlorArgs[0].(builder.Builder) + bd := sqlOrArgs[0].(builder.Builder) return bd.ToSQL() } @@ -209,16 +209,16 @@ func convertSQLOrArgs(sqlorArgs ...interface{}) (string, []interface{}, error) { } // Exec raw sql -func (session *Session) Exec(sqlorArgs ...interface{}) (sql.Result, error) { +func (session *Session) Exec(sqlOrArgs ...interface{}) (sql.Result, error) { if session.isAutoClose { defer session.Close() } - if len(sqlorArgs) == 0 { + if len(sqlOrArgs) == 0 { return nil, ErrUnSupportedType } - sqlStr, args, err := convertSQLOrArgs(sqlorArgs...) + sqlStr, args, err := convertSQLOrArgs(sqlOrArgs...) if err != nil { return nil, err } diff --git a/vendor/github.com/go-xorm/xorm/session_schema.go b/vendor/github.com/go-xorm/xorm/session_schema.go index 369ec72a4d..da5c885599 100644 --- a/vendor/github.com/go-xorm/xorm/session_schema.go +++ b/vendor/github.com/go-xorm/xorm/session_schema.go @@ -9,7 +9,7 @@ import ( "fmt" "strings" - "github.com/go-xorm/core" + "xorm.io/core" ) // Ping test if database is ok @@ -19,7 +19,7 @@ func (session *Session) Ping() error { } session.engine.logger.Infof("PING DATABASE %v", session.engine.DriverName()) - return session.DB().Ping() + return session.DB().PingContext(session.ctx) } // CreateTable create a table according a bean diff --git a/vendor/github.com/go-xorm/xorm/session_tx.go b/vendor/github.com/go-xorm/xorm/session_tx.go index c8d759a31a..ee3d473f95 100644 --- a/vendor/github.com/go-xorm/xorm/session_tx.go +++ b/vendor/github.com/go-xorm/xorm/session_tx.go @@ -7,7 +7,7 @@ package xorm // Begin a transaction func (session *Session) Begin() error { if session.isAutoCommit { - tx, err := session.DB().Begin() + tx, err := session.DB().BeginTx(session.ctx, nil) if err != nil { return err } diff --git a/vendor/github.com/go-xorm/xorm/session_update.go b/vendor/github.com/go-xorm/xorm/session_update.go index 37b34ff3dd..216c4e87dd 100644 --- a/vendor/github.com/go-xorm/xorm/session_update.go +++ b/vendor/github.com/go-xorm/xorm/session_update.go @@ -11,8 +11,8 @@ import ( "strconv" "strings" - "github.com/go-xorm/builder" - "github.com/go-xorm/core" + "xorm.io/builder" + "xorm.io/core" ) func (session *Session) cacheUpdate(table *core.Table, tableName, sqlStr string, args ...interface{}) error { @@ -147,6 +147,10 @@ func (session *Session) Update(bean interface{}, condiBean ...interface{}) (int6 defer session.Close() } + if session.statement.lastError != nil { + return 0, session.statement.lastError + } + v := rValue(bean) t := v.Type() @@ -240,23 +244,39 @@ func (session *Session) Update(bean interface{}, condiBean ...interface{}) (int6 } var autoCond builder.Cond - if !session.statement.noAutoCondition && len(condiBean) > 0 { - if c, ok := condiBean[0].(map[string]interface{}); ok { - autoCond = builder.Eq(c) - } else { - ct := reflect.TypeOf(condiBean[0]) - k := ct.Kind() - if k == reflect.Ptr { - k = ct.Elem().Kind() + if !session.statement.noAutoCondition { + condBeanIsStruct := false + if len(condiBean) > 0 { + if c, ok := condiBean[0].(map[string]interface{}); ok { + autoCond = builder.Eq(c) + } else { + ct := reflect.TypeOf(condiBean[0]) + k := ct.Kind() + if k == reflect.Ptr { + k = ct.Elem().Kind() + } + if k == reflect.Struct { + var err error + autoCond, err = session.statement.buildConds(session.statement.RefTable, condiBean[0], true, true, false, true, false) + if err != nil { + return 0, err + } + condBeanIsStruct = true + } else { + return 0, ErrConditionType + } } - if k == reflect.Struct { - var err error - autoCond, err = session.statement.buildConds(session.statement.RefTable, condiBean[0], true, true, false, true, false) - if err != nil { - return 0, err + } + + if !condBeanIsStruct && table != nil { + if col := table.DeletedColumn(); col != nil && !session.statement.unscoped { // tag "deleted" is enabled + autoCond1 := session.engine.CondDeleted(session.engine.Quote(col.Name)) + + if autoCond == nil { + autoCond = autoCond1 + } else { + autoCond = autoCond.And(autoCond1) } - } else { - return 0, ErrConditionType } } } diff --git a/vendor/github.com/go-xorm/xorm/statement.go b/vendor/github.com/go-xorm/xorm/statement.go index a7f7010ad2..88b8423517 100644 --- a/vendor/github.com/go-xorm/xorm/statement.go +++ b/vendor/github.com/go-xorm/xorm/statement.go @@ -6,15 +6,14 @@ package xorm import ( "database/sql/driver" - "encoding/json" "errors" "fmt" "reflect" "strings" "time" - "github.com/go-xorm/builder" - "github.com/go-xorm/core" + "xorm.io/builder" + "xorm.io/core" ) // Statement save all the sql info for executing SQL @@ -60,6 +59,7 @@ type Statement struct { cond builder.Cond bufferSize int context ContextCache + lastError error } // Init reset all the statement's fields @@ -101,6 +101,7 @@ func (statement *Statement) Init() { statement.cond = builder.NewCond() statement.bufferSize = 0 statement.context = nil + statement.lastError = nil } // NoAutoCondition if you do not want convert bean's field as query condition, then use this function @@ -125,13 +126,13 @@ func (statement *Statement) SQL(query interface{}, args ...interface{}) *Stateme var err error statement.RawSQL, statement.RawParams, err = query.(*builder.Builder).ToSQL() if err != nil { - statement.Engine.logger.Error(err) + statement.lastError = err } case string: statement.RawSQL = query.(string) statement.RawParams = args default: - statement.Engine.logger.Error("unsupported sql type") + statement.lastError = ErrUnSupportedSQLType } return statement @@ -160,7 +161,7 @@ func (statement *Statement) And(query interface{}, args ...interface{}) *Stateme } } default: - // TODO: not support condition type + statement.lastError = ErrConditionType } return statement @@ -406,7 +407,7 @@ func (statement *Statement) buildUpdates(bean interface{}, } else { // Blank struct could not be as update data if requiredField || !isStructZero(fieldValue) { - bytes, err := json.Marshal(fieldValue.Interface()) + bytes, err := DefaultJSONHandler.Marshal(fieldValue.Interface()) if err != nil { panic(fmt.Sprintf("mashal %v failed", fieldValue.Interface())) } @@ -435,7 +436,7 @@ func (statement *Statement) buildUpdates(bean interface{}, } if col.SQLType.IsText() { - bytes, err := json.Marshal(fieldValue.Interface()) + bytes, err := DefaultJSONHandler.Marshal(fieldValue.Interface()) if err != nil { engine.logger.Error(err) continue @@ -455,7 +456,7 @@ func (statement *Statement) buildUpdates(bean interface{}, fieldType.Elem().Kind() == reflect.Uint8 { val = fieldValue.Slice(0, 0).Interface() } else { - bytes, err = json.Marshal(fieldValue.Interface()) + bytes, err = DefaultJSONHandler.Marshal(fieldValue.Interface()) if err != nil { engine.logger.Error(err) continue @@ -755,9 +756,32 @@ func (statement *Statement) Join(joinOP string, tablename interface{}, condition fmt.Fprintf(&buf, "%v JOIN ", joinOP) } - tbName := statement.Engine.TableName(tablename, true) + switch tp := tablename.(type) { + case builder.Builder: + subSQL, subQueryArgs, err := tp.ToSQL() + if err != nil { + statement.lastError = err + return statement + } + tbs := strings.Split(tp.TableName(), ".") + var aliasName = strings.Trim(tbs[len(tbs)-1], statement.Engine.QuoteStr()) + fmt.Fprintf(&buf, "(%s) %s ON %v", subSQL, aliasName, condition) + statement.joinArgs = append(statement.joinArgs, subQueryArgs...) + case *builder.Builder: + subSQL, subQueryArgs, err := tp.ToSQL() + if err != nil { + statement.lastError = err + return statement + } + tbs := strings.Split(tp.TableName(), ".") + var aliasName = strings.Trim(tbs[len(tbs)-1], statement.Engine.QuoteStr()) + fmt.Fprintf(&buf, "(%s) %s ON %v", subSQL, aliasName, condition) + statement.joinArgs = append(statement.joinArgs, subQueryArgs...) + default: + tbName := statement.Engine.TableName(tablename, true) + fmt.Fprintf(&buf, "%s ON %v", tbName, condition) + } - fmt.Fprintf(&buf, "%s ON %v", tbName, condition) statement.JoinStr = buf.String() statement.joinArgs = append(statement.joinArgs, args...) return statement @@ -1064,7 +1088,7 @@ func (statement *Statement) genSelectSQL(columnStr, condSQL string, needLimit, n if dialect.DBType() == core.MSSQL { if statement.LimitN > 0 { - top = fmt.Sprintf(" TOP %d ", statement.LimitN) + top = fmt.Sprintf("TOP %d ", statement.LimitN) } if statement.Start > 0 { var column string diff --git a/vendor/github.com/go-xorm/xorm/syslogger.go b/vendor/github.com/go-xorm/xorm/syslogger.go index 8840635d4c..11ba01e7bd 100644 --- a/vendor/github.com/go-xorm/xorm/syslogger.go +++ b/vendor/github.com/go-xorm/xorm/syslogger.go @@ -10,7 +10,7 @@ import ( "fmt" "log/syslog" - "github.com/go-xorm/core" + "xorm.io/core" ) var _ core.ILogger = &SyslogLogger{} diff --git a/vendor/github.com/go-xorm/xorm/tag.go b/vendor/github.com/go-xorm/xorm/tag.go index e1c821fb54..eb87be7829 100644 --- a/vendor/github.com/go-xorm/xorm/tag.go +++ b/vendor/github.com/go-xorm/xorm/tag.go @@ -11,7 +11,7 @@ import ( "strings" "time" - "github.com/go-xorm/core" + "xorm.io/core" ) type tagContext struct { diff --git a/vendor/github.com/go-xorm/xorm/test_mssql.sh b/vendor/github.com/go-xorm/xorm/test_mssql.sh index 6f9cf7295f..7f060cff32 100644 --- a/vendor/github.com/go-xorm/xorm/test_mssql.sh +++ b/vendor/github.com/go-xorm/xorm/test_mssql.sh @@ -1 +1 @@ -go test -db=mssql -conn_str="server=192.168.1.58;user id=sa;password=123456;database=xorm_test"
\ No newline at end of file +go test -db=mssql -conn_str="server=localhost;user id=sa;password=yourStrong(!)Password;database=xorm_test"
\ No newline at end of file diff --git a/vendor/github.com/go-xorm/xorm/test_tidb.sh b/vendor/github.com/go-xorm/xorm/test_tidb.sh new file mode 100644 index 0000000000..03d2d6cd82 --- /dev/null +++ b/vendor/github.com/go-xorm/xorm/test_tidb.sh @@ -0,0 +1 @@ +go test -db=mysql -conn_str="root:@tcp(localhost:4000)/xorm_test" -ignore_select_update=true
\ No newline at end of file diff --git a/vendor/github.com/go-xorm/xorm/types.go b/vendor/github.com/go-xorm/xorm/types.go index 99d761c278..c76a546065 100644 --- a/vendor/github.com/go-xorm/xorm/types.go +++ b/vendor/github.com/go-xorm/xorm/types.go @@ -1,9 +1,13 @@ +// Copyright 2017 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 xorm import ( "reflect" - "github.com/go-xorm/core" + "xorm.io/core" ) var ( diff --git a/vendor/github.com/go-xorm/xorm/xorm.go b/vendor/github.com/go-xorm/xorm/xorm.go index 739de8d429..26d00d264d 100644 --- a/vendor/github.com/go-xorm/xorm/xorm.go +++ b/vendor/github.com/go-xorm/xorm/xorm.go @@ -7,6 +7,7 @@ package xorm import ( + "context" "fmt" "os" "reflect" @@ -14,7 +15,7 @@ import ( "sync" "time" - "github.com/go-xorm/core" + "xorm.io/core" ) const ( @@ -85,14 +86,15 @@ func NewEngine(driverName string, dataSourceName string) (*Engine, error) { } engine := &Engine{ - db: db, - dialect: dialect, - Tables: make(map[reflect.Type]*core.Table), - mutex: &sync.RWMutex{}, - TagIdentifier: "xorm", - TZLocation: time.Local, - tagHandlers: defaultTagHandlers, - cachers: make(map[string]core.Cacher), + db: db, + dialect: dialect, + Tables: make(map[reflect.Type]*core.Table), + mutex: &sync.RWMutex{}, + TagIdentifier: "xorm", + TZLocation: time.Local, + tagHandlers: defaultTagHandlers, + cachers: make(map[string]core.Cacher), + defaultContext: context.Background(), } if uri.DbType == core.SQLITE { |