mirror of
				https://gitee.com/gitea/gitea
				synced 2025-11-04 08:30:25 +08:00 
			
		
		
		
	Fix error log when loading issues caused by a xorm bug (#7271)
* fix error log when loading issues caused by a xorm bug * upgrade packages * fix fmt * fix Consistency * fix tests
This commit is contained in:
		
							
								
								
									
										2
									
								
								vendor/github.com/go-sql-driver/mysql/.travis.yml
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/go-sql-driver/mysql/.travis.yml
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -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:
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										5
									
								
								vendor/github.com/go-sql-driver/mysql/AUTHORS
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										5
									
								
								vendor/github.com/go-sql-driver/mysql/AUTHORS
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -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.
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										11
									
								
								vendor/github.com/go-sql-driver/mysql/CHANGELOG.md
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										11
									
								
								vendor/github.com/go-sql-driver/mysql/CHANGELOG.md
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -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:
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										6
									
								
								vendor/github.com/go-sql-driver/mysql/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										6
									
								
								vendor/github.com/go-sql-driver/mysql/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -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`
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										8
									
								
								vendor/github.com/go-sql-driver/mysql/auth.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										8
									
								
								vendor/github.com/go-sql-driver/mysql/auth.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -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
 | 
			
		||||
						}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										49
									
								
								vendor/github.com/go-sql-driver/mysql/buffer.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										49
									
								
								vendor/github.com/go-sql-driver/mysql/buffer.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -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) {
 | 
			
		||||
func (b *buffer) takeCompleteBuffer() []byte {
 | 
			
		||||
	if b.length > 0 {
 | 
			
		||||
		return nil, ErrBusyBuffer
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
	return b.buf, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// store stores buf, an updated buffer, if its suitable to do so.
 | 
			
		||||
func (b *buffer) store(buf []byte) error {
 | 
			
		||||
	if b.length > 0 {
 | 
			
		||||
		return ErrBusyBuffer
 | 
			
		||||
	} else if cap(buf) <= maxPacketSize && cap(buf) > cap(b.buf) {
 | 
			
		||||
		b.buf = buf[:cap(buf)]
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
	return b.buf
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										210
									
								
								vendor/github.com/go-sql-driver/mysql/connection.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										210
									
								
								vendor/github.com/go-sql-driver/mysql/connection.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -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
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										207
									
								
								vendor/github.com/go-sql-driver/mysql/connection_go18.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										207
									
								
								vendor/github.com/go-sql-driver/mysql/connection_go18.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -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
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										15
									
								
								vendor/github.com/go-sql-driver/mysql/driver.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										15
									
								
								vendor/github.com/go-sql-driver/mysql/driver.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -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)
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										2
									
								
								vendor/github.com/go-sql-driver/mysql/dsn.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/go-sql-driver/mysql/dsn.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -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 {
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										60
									
								
								vendor/github.com/go-sql-driver/mysql/packets.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										60
									
								
								vendor/github.com/go-sql-driver/mysql/packets.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -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)
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										31
									
								
								vendor/github.com/go-sql-driver/mysql/utils.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										31
									
								
								vendor/github.com/go-sql-driver/mysql/utils.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -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)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										40
									
								
								vendor/github.com/go-sql-driver/mysql/utils_go17.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								vendor/github.com/go-sql-driver/mysql/utils_go17.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -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,
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										50
									
								
								vendor/github.com/go-sql-driver/mysql/utils_go18.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										50
									
								
								vendor/github.com/go-sql-driver/mysql/utils_go18.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -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)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										37
									
								
								vendor/github.com/go-xorm/builder/.drone.yml
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										37
									
								
								vendor/github.com/go-xorm/builder/.drone.yml
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -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 ]
 | 
			
		||||
							
								
								
									
										27
									
								
								vendor/github.com/go-xorm/builder/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										27
									
								
								vendor/github.com/go-xorm/builder/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -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.
 | 
			
		||||
							
								
								
									
										206
									
								
								vendor/github.com/go-xorm/builder/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										206
									
								
								vendor/github.com/go-xorm/builder/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,206 +0,0 @@
 | 
			
		||||
# SQL builder
 | 
			
		||||
 | 
			
		||||
[](https://gitci.cn/go-xorm/builder)  [](https://codecov.io/gh/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`.
 | 
			
		||||
							
								
								
									
										394
									
								
								vendor/github.com/go-xorm/builder/builder.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										394
									
								
								vendor/github.com/go-xorm/builder/builder.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -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)
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										27
									
								
								vendor/github.com/go-xorm/builder/builder_delete.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										27
									
								
								vendor/github.com/go-xorm/builder/builder_delete.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -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)
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										89
									
								
								vendor/github.com/go-xorm/builder/builder_insert.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										89
									
								
								vendor/github.com/go-xorm/builder/builder_insert.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -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
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										100
									
								
								vendor/github.com/go-xorm/builder/builder_limit.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										100
									
								
								vendor/github.com/go-xorm/builder/builder_limit.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -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
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										145
									
								
								vendor/github.com/go-xorm/builder/builder_select.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										145
									
								
								vendor/github.com/go-xorm/builder/builder_select.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -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
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										47
									
								
								vendor/github.com/go-xorm/builder/builder_union.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										47
									
								
								vendor/github.com/go-xorm/builder/builder_union.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -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
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										46
									
								
								vendor/github.com/go-xorm/builder/builder_update.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										46
									
								
								vendor/github.com/go-xorm/builder/builder_update.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -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)
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										74
									
								
								vendor/github.com/go-xorm/builder/cond.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										74
									
								
								vendor/github.com/go-xorm/builder/cond.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -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
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										61
									
								
								vendor/github.com/go-xorm/builder/cond_and.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										61
									
								
								vendor/github.com/go-xorm/builder/cond_and.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -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
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										65
									
								
								vendor/github.com/go-xorm/builder/cond_between.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										65
									
								
								vendor/github.com/go-xorm/builder/cond_between.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -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
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										160
									
								
								vendor/github.com/go-xorm/builder/cond_compare.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										160
									
								
								vendor/github.com/go-xorm/builder/cond_compare.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -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
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										112
									
								
								vendor/github.com/go-xorm/builder/cond_eq.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										112
									
								
								vendor/github.com/go-xorm/builder/cond_eq.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -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
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										39
									
								
								vendor/github.com/go-xorm/builder/cond_expr.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										39
									
								
								vendor/github.com/go-xorm/builder/cond_expr.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -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
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										237
									
								
								vendor/github.com/go-xorm/builder/cond_in.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										237
									
								
								vendor/github.com/go-xorm/builder/cond_in.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -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
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										41
									
								
								vendor/github.com/go-xorm/builder/cond_like.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										41
									
								
								vendor/github.com/go-xorm/builder/cond_like.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -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
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										94
									
								
								vendor/github.com/go-xorm/builder/cond_neq.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										94
									
								
								vendor/github.com/go-xorm/builder/cond_neq.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -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
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										77
									
								
								vendor/github.com/go-xorm/builder/cond_not.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										77
									
								
								vendor/github.com/go-xorm/builder/cond_not.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -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()
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										234
									
								
								vendor/github.com/go-xorm/builder/cond_notin.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										234
									
								
								vendor/github.com/go-xorm/builder/cond_notin.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -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
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										59
									
								
								vendor/github.com/go-xorm/builder/cond_null.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										59
									
								
								vendor/github.com/go-xorm/builder/cond_null.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -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
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										69
									
								
								vendor/github.com/go-xorm/builder/cond_or.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										69
									
								
								vendor/github.com/go-xorm/builder/cond_or.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -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
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										120
									
								
								vendor/github.com/go-xorm/builder/doc.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										120
									
								
								vendor/github.com/go-xorm/builder/doc.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -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
 | 
			
		||||
							
								
								
									
										40
									
								
								vendor/github.com/go-xorm/builder/error.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										40
									
								
								vendor/github.com/go-xorm/builder/error.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -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")
 | 
			
		||||
)
 | 
			
		||||
							
								
								
									
										1
									
								
								vendor/github.com/go-xorm/builder/go.mod
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								vendor/github.com/go-xorm/builder/go.mod
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1 +0,0 @@
 | 
			
		||||
module "github.com/go-xorm/builder"
 | 
			
		||||
							
								
								
									
										156
									
								
								vendor/github.com/go-xorm/builder/sql.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										156
									
								
								vendor/github.com/go-xorm/builder/sql.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -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
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										119
									
								
								vendor/github.com/go-xorm/builder/string_builder.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										119
									
								
								vendor/github.com/go-xorm/builder/string_builder.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -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
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										1
									
								
								vendor/github.com/go-xorm/core/.gitignore
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								vendor/github.com/go-xorm/core/.gitignore
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1 +0,0 @@
 | 
			
		||||
*.db
 | 
			
		||||
							
								
								
									
										27
									
								
								vendor/github.com/go-xorm/core/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										27
									
								
								vendor/github.com/go-xorm/core/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -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.
 | 
			
		||||
							
								
								
									
										116
									
								
								vendor/github.com/go-xorm/core/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										116
									
								
								vendor/github.com/go-xorm/core/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,116 +0,0 @@
 | 
			
		||||
Core is a lightweight wrapper of sql.DB.
 | 
			
		||||
 | 
			
		||||
[](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)
 | 
			
		||||
```
 | 
			
		||||
							
								
								
									
										1
									
								
								vendor/github.com/go-xorm/core/benchmark.sh
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								vendor/github.com/go-xorm/core/benchmark.sh
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1 +0,0 @@
 | 
			
		||||
go test -v -bench=. -run=XXX
 | 
			
		||||
							
								
								
									
										87
									
								
								vendor/github.com/go-xorm/core/cache.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										87
									
								
								vendor/github.com/go-xorm/core/cache.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -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)
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										15
									
								
								vendor/github.com/go-xorm/core/circle.yml
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										15
									
								
								vendor/github.com/go-xorm/core/circle.yml
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -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
 | 
			
		||||
							
								
								
									
										159
									
								
								vendor/github.com/go-xorm/core/column.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										159
									
								
								vendor/github.com/go-xorm/core/column.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -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
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										8
									
								
								vendor/github.com/go-xorm/core/converstion.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										8
									
								
								vendor/github.com/go-xorm/core/converstion.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -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)
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										401
									
								
								vendor/github.com/go-xorm/core/db.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										401
									
								
								vendor/github.com/go-xorm/core/db.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -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...)
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										315
									
								
								vendor/github.com/go-xorm/core/dialect.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										315
									
								
								vendor/github.com/go-xorm/core/dialect.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -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
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										27
									
								
								vendor/github.com/go-xorm/core/driver.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										27
									
								
								vendor/github.com/go-xorm/core/driver.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -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)
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										8
									
								
								vendor/github.com/go-xorm/core/error.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										8
									
								
								vendor/github.com/go-xorm/core/error.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -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")
 | 
			
		||||
)
 | 
			
		||||
							
								
								
									
										64
									
								
								vendor/github.com/go-xorm/core/filter.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										64
									
								
								vendor/github.com/go-xorm/core/filter.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -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
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										1
									
								
								vendor/github.com/go-xorm/core/go.mod
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								vendor/github.com/go-xorm/core/go.mod
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1 +0,0 @@
 | 
			
		||||
module "github.com/go-xorm/core"
 | 
			
		||||
							
								
								
									
										31
									
								
								vendor/github.com/go-xorm/core/ilogger.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										31
									
								
								vendor/github.com/go-xorm/core/ilogger.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -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
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										63
									
								
								vendor/github.com/go-xorm/core/index.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										63
									
								
								vendor/github.com/go-xorm/core/index.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -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)}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										254
									
								
								vendor/github.com/go-xorm/core/mapper.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										254
									
								
								vendor/github.com/go-xorm/core/mapper.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -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}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										26
									
								
								vendor/github.com/go-xorm/core/pk.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										26
									
								
								vendor/github.com/go-xorm/core/pk.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -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
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										334
									
								
								vendor/github.com/go-xorm/core/rows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										334
									
								
								vendor/github.com/go-xorm/core/rows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -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
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										55
									
								
								vendor/github.com/go-xorm/core/scan.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										55
									
								
								vendor/github.com/go-xorm/core/scan.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -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
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										150
									
								
								vendor/github.com/go-xorm/core/table.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										150
									
								
								vendor/github.com/go-xorm/core/table.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -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
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										311
									
								
								vendor/github.com/go-xorm/core/type.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										311
									
								
								vendor/github.com/go-xorm/core/type.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -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("")
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										4
									
								
								vendor/github.com/go-xorm/xorm/.drone.yml
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								vendor/github.com/go-xorm/xorm/.drone.yml
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -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 ]
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										14
									
								
								vendor/github.com/go-xorm/xorm/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										14
									
								
								vendor/github.com/go-xorm/xorm/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -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/)
 | 
			
		||||
BSD License [http://creativecommons.org/licenses/BSD/](http://creativecommons.org/licenses/BSD/)
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										10
									
								
								vendor/github.com/go-xorm/xorm/README_CN.md
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										10
									
								
								vendor/github.com/go-xorm/xorm/README_CN.md
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -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) {
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										2
									
								
								vendor/github.com/go-xorm/xorm/cache_lru.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/go-xorm/xorm/cache_lru.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -10,7 +10,7 @@ import (
 | 
			
		||||
	"sync"
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	"github.com/go-xorm/core"
 | 
			
		||||
	"xorm.io/core"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// LRUCacher implments cache object facilities
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										2
									
								
								vendor/github.com/go-xorm/xorm/cache_memory_store.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/go-xorm/xorm/cache_memory_store.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -7,7 +7,7 @@ package xorm
 | 
			
		||||
import (
 | 
			
		||||
	"sync"
 | 
			
		||||
 | 
			
		||||
	"github.com/go-xorm/core"
 | 
			
		||||
	"xorm.io/core"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var _ core.CacheStore = NewMemoryStore()
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										41
									
								
								vendor/github.com/go-xorm/xorm/circle.yml
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										41
									
								
								vendor/github.com/go-xorm/xorm/circle.yml
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -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)
 | 
			
		||||
							
								
								
									
										26
									
								
								vendor/github.com/go-xorm/xorm/dialect_mssql.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										26
									
								
								vendor/github.com/go-xorm/xorm/dialect_mssql.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -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]
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										5
									
								
								vendor/github.com/go-xorm/xorm/dialect_mysql.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										5
									
								
								vendor/github.com/go-xorm/xorm/dialect_mysql.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -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 {
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										2
									
								
								vendor/github.com/go-xorm/xorm/dialect_oracle.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/go-xorm/xorm/dialect_oracle.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -11,7 +11,7 @@ import (
 | 
			
		||||
	"strconv"
 | 
			
		||||
	"strings"
 | 
			
		||||
 | 
			
		||||
	"github.com/go-xorm/core"
 | 
			
		||||
	"xorm.io/core"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										18
									
								
								vendor/github.com/go-xorm/xorm/dialect_postgres.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										18
									
								
								vendor/github.com/go-xorm/xorm/dialect_postgres.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -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):]
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										2
									
								
								vendor/github.com/go-xorm/xorm/dialect_sqlite3.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/go-xorm/xorm/dialect_sqlite3.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -11,7 +11,7 @@ import (
 | 
			
		||||
	"regexp"
 | 
			
		||||
	"strings"
 | 
			
		||||
 | 
			
		||||
	"github.com/go-xorm/core"
 | 
			
		||||
	"xorm.io/core"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										24
									
								
								vendor/github.com/go-xorm/xorm/engine.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										24
									
								
								vendor/github.com/go-xorm/xorm/engine.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -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
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										13
									
								
								vendor/github.com/go-xorm/xorm/engine_cond.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										13
									
								
								vendor/github.com/go-xorm/xorm/engine_cond.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -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
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										28
									
								
								vendor/github.com/go-xorm/xorm/engine_context.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								vendor/github.com/go-xorm/xorm/engine_context.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -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)
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										17
									
								
								vendor/github.com/go-xorm/xorm/engine_group.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										17
									
								
								vendor/github.com/go-xorm/xorm/engine_group.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -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
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										4
									
								
								vendor/github.com/go-xorm/xorm/engine_table.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								vendor/github.com/go-xorm/xorm/engine_table.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -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.
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										2
									
								
								vendor/github.com/go-xorm/xorm/error.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/go-xorm/xorm/error.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -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
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										22
									
								
								vendor/github.com/go-xorm/xorm/go.mod
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										22
									
								
								vendor/github.com/go-xorm/xorm/go.mod
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -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
 | 
			
		||||
)
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										50
									
								
								vendor/github.com/go-xorm/xorm/go.sum
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										50
									
								
								vendor/github.com/go-xorm/xorm/go.sum
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -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=
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										2
									
								
								vendor/github.com/go-xorm/xorm/helpers.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/go-xorm/xorm/helpers.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -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
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										12
									
								
								vendor/github.com/go-xorm/xorm/interface.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										12
									
								
								vendor/github.com/go-xorm/xorm/interface.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -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
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										31
									
								
								vendor/github.com/go-xorm/xorm/json.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								vendor/github.com/go-xorm/xorm/json.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -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)
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										2
									
								
								vendor/github.com/go-xorm/xorm/logger.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/go-xorm/xorm/logger.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -9,7 +9,7 @@ import (
 | 
			
		||||
	"io"
 | 
			
		||||
	"log"
 | 
			
		||||
 | 
			
		||||
	"github.com/go-xorm/core"
 | 
			
		||||
	"xorm.io/core"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// default log options
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										37
									
								
								vendor/github.com/go-xorm/xorm/rows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										37
									
								
								vendor/github.com/go-xorm/xorm/rows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -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
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										36
									
								
								vendor/github.com/go-xorm/xorm/session.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										36
									
								
								vendor/github.com/go-xorm/xorm/session.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -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
 | 
			
		||||
					}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										2
									
								
								vendor/github.com/go-xorm/xorm/session_cols.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/go-xorm/xorm/session_cols.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -9,7 +9,7 @@ import (
 | 
			
		||||
	"strings"
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	"github.com/go-xorm/core"
 | 
			
		||||
	"xorm.io/core"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type incrParam struct {
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										2
									
								
								vendor/github.com/go-xorm/xorm/session_cond.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/go-xorm/xorm/session_cond.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -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.
 | 
			
		||||
 
 | 
			
		||||
@@ -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
 | 
			
		||||
							
								
								
									
										23
									
								
								vendor/github.com/go-xorm/xorm/session_convert.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										23
									
								
								vendor/github.com/go-xorm/xorm/session_convert.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -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
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										6
									
								
								vendor/github.com/go-xorm/xorm/session_delete.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										6
									
								
								vendor/github.com/go-xorm/xorm/session_delete.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -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
 | 
			
		||||
	}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										18
									
								
								vendor/github.com/go-xorm/xorm/session_exist.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										18
									
								
								vendor/github.com/go-xorm/xorm/session_exist.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -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)
 | 
			
		||||
				}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										8
									
								
								vendor/github.com/go-xorm/xorm/session_find.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										8
									
								
								vendor/github.com/go-xorm/xorm/session_find.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -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")
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										6
									
								
								vendor/github.com/go-xorm/xorm/session_get.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										6
									
								
								vendor/github.com/go-xorm/xorm/session_get.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -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")
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										181
									
								
								vendor/github.com/go-xorm/xorm/session_insert.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										181
									
								
								vendor/github.com/go-xorm/xorm/session_insert.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -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())
 | 
			
		||||
						if err != nil {
 | 
			
		||||
							return affected, err
 | 
			
		||||
						}
 | 
			
		||||
						affected += cnt
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		} else {
 | 
			
		||||
			cnt, err := session.innerInsert(bean)
 | 
			
		||||
		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
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@@ -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
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										4
									
								
								vendor/github.com/go-xorm/xorm/session_iterate.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								vendor/github.com/go-xorm/xorm/session_iterate.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -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)
 | 
			
		||||
	}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										26
									
								
								vendor/github.com/go-xorm/xorm/session_query.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										26
									
								
								vendor/github.com/go-xorm/xorm/session_query.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -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
 | 
			
		||||
	}
 | 
			
		||||
 
 | 
			
		||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user