mirror of
				https://gitee.com/gitea/gitea
				synced 2025-11-04 08:30:25 +08:00 
			
		
		
		
	Update vendor/go-sqlite3 (#5133)
This commit is contained in:
		
							
								
								
									
										40
									
								
								vendor/github.com/mattn/go-sqlite3/callback.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										40
									
								
								vendor/github.com/mattn/go-sqlite3/callback.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -53,6 +53,36 @@ func doneTrampoline(ctx *C.sqlite3_context) {
 | 
			
		||||
	ai.Done(ctx)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//export compareTrampoline
 | 
			
		||||
func compareTrampoline(handlePtr uintptr, la C.int, a *C.char, lb C.int, b *C.char) C.int {
 | 
			
		||||
	cmp := lookupHandle(handlePtr).(func(string, string) int)
 | 
			
		||||
	return C.int(cmp(C.GoStringN(a, la), C.GoStringN(b, lb)))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//export commitHookTrampoline
 | 
			
		||||
func commitHookTrampoline(handle uintptr) int {
 | 
			
		||||
	callback := lookupHandle(handle).(func() int)
 | 
			
		||||
	return callback()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//export rollbackHookTrampoline
 | 
			
		||||
func rollbackHookTrampoline(handle uintptr) {
 | 
			
		||||
	callback := lookupHandle(handle).(func())
 | 
			
		||||
	callback()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//export updateHookTrampoline
 | 
			
		||||
func updateHookTrampoline(handle uintptr, op int, db *C.char, table *C.char, rowid int64) {
 | 
			
		||||
	callback := lookupHandle(handle).(func(int, string, string, int64))
 | 
			
		||||
	callback(op, C.GoString(db), C.GoString(table), rowid)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//export authorizerTrampoline
 | 
			
		||||
func authorizerTrampoline(handle uintptr, op int, arg1 *C.char, arg2 *C.char, arg3 *C.char) int {
 | 
			
		||||
	callback := lookupHandle(handle).(func(int, string, string, string) int)
 | 
			
		||||
	return callback(op, C.GoString(arg1), C.GoString(arg2), C.GoString(arg3))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Use handles to avoid passing Go pointers to C.
 | 
			
		||||
 | 
			
		||||
type handleVal struct {
 | 
			
		||||
@@ -307,8 +337,18 @@ func callbackRetText(ctx *C.sqlite3_context, v reflect.Value) error {
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func callbackRetNil(ctx *C.sqlite3_context, v reflect.Value) error {
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func callbackRet(typ reflect.Type) (callbackRetConverter, error) {
 | 
			
		||||
	switch typ.Kind() {
 | 
			
		||||
	case reflect.Interface:
 | 
			
		||||
		errorInterface := reflect.TypeOf((*error)(nil)).Elem()
 | 
			
		||||
		if typ.Implements(errorInterface) {
 | 
			
		||||
			return callbackRetNil, nil
 | 
			
		||||
		}
 | 
			
		||||
		fallthrough
 | 
			
		||||
	case reflect.Slice:
 | 
			
		||||
		if typ.Elem().Kind() != reflect.Uint8 {
 | 
			
		||||
			return nil, errors.New("the only supported slice type is []byte")
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										46171
									
								
								vendor/github.com/mattn/go-sqlite3/sqlite3-binding.c
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										46171
									
								
								vendor/github.com/mattn/go-sqlite3/sqlite3-binding.c
									
									
									
										generated
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										1877
									
								
								vendor/github.com/mattn/go-sqlite3/sqlite3-binding.h
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										1877
									
								
								vendor/github.com/mattn/go-sqlite3/sqlite3-binding.h
									
									
									
										generated
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										1210
									
								
								vendor/github.com/mattn/go-sqlite3/sqlite3.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										1210
									
								
								vendor/github.com/mattn/go-sqlite3/sqlite3.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										120
									
								
								vendor/github.com/mattn/go-sqlite3/sqlite3_func_crypt.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										120
									
								
								vendor/github.com/mattn/go-sqlite3/sqlite3_func_crypt.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,120 @@
 | 
			
		||||
// Copyright (C) 2018 G.J.R. Timmer <gjr.timmer@gmail.com>.
 | 
			
		||||
//
 | 
			
		||||
// Use of this source code is governed by an MIT-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
package sqlite3
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"crypto/sha1"
 | 
			
		||||
	"crypto/sha256"
 | 
			
		||||
	"crypto/sha512"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// This file provides several different implementations for the
 | 
			
		||||
// default embedded sqlite_crypt function.
 | 
			
		||||
// This function is uses a ceasar-cypher by default
 | 
			
		||||
// and is used within the UserAuthentication module to encode
 | 
			
		||||
// the password.
 | 
			
		||||
//
 | 
			
		||||
// The provided functions can be used as an overload to the sqlite_crypt
 | 
			
		||||
// function through the use of the RegisterFunc on the connection.
 | 
			
		||||
//
 | 
			
		||||
// Because the functions can serv a purpose to an end-user
 | 
			
		||||
// without using the UserAuthentication module
 | 
			
		||||
// the functions are default compiled in.
 | 
			
		||||
//
 | 
			
		||||
// From SQLITE3 - user-auth.txt
 | 
			
		||||
// The sqlite_user.pw field is encoded by a built-in SQL function
 | 
			
		||||
// "sqlite_crypt(X,Y)".  The two arguments are both BLOBs.  The first argument
 | 
			
		||||
// is the plaintext password supplied to the sqlite3_user_authenticate()
 | 
			
		||||
// interface.  The second argument is the sqlite_user.pw value and is supplied
 | 
			
		||||
// so that the function can extract the "salt" used by the password encoder.
 | 
			
		||||
// The result of sqlite_crypt(X,Y) is another blob which is the value that
 | 
			
		||||
// ends up being stored in sqlite_user.pw.  To verify credentials X supplied
 | 
			
		||||
// by the sqlite3_user_authenticate() routine, SQLite runs:
 | 
			
		||||
//
 | 
			
		||||
//     sqlite_user.pw == sqlite_crypt(X, sqlite_user.pw)
 | 
			
		||||
//
 | 
			
		||||
// To compute an appropriate sqlite_user.pw value from a new or modified
 | 
			
		||||
// password X, sqlite_crypt(X,NULL) is run.  A new random salt is selected
 | 
			
		||||
// when the second argument is NULL.
 | 
			
		||||
//
 | 
			
		||||
// The built-in version of of sqlite_crypt() uses a simple Ceasar-cypher
 | 
			
		||||
// which prevents passwords from being revealed by searching the raw database
 | 
			
		||||
// for ASCII text, but is otherwise trivally broken.  For better password
 | 
			
		||||
// security, the database should be encrypted using the SQLite Encryption
 | 
			
		||||
// Extension or similar technology.  Or, the application can use the
 | 
			
		||||
// sqlite3_create_function() interface to provide an alternative
 | 
			
		||||
// implementation of sqlite_crypt() that computes a stronger password hash,
 | 
			
		||||
// perhaps using a cryptographic hash function like SHA1.
 | 
			
		||||
 | 
			
		||||
// CryptEncoderSHA1 encodes a password with SHA1
 | 
			
		||||
func CryptEncoderSHA1(pass []byte, hash interface{}) []byte {
 | 
			
		||||
	h := sha1.Sum(pass)
 | 
			
		||||
	return h[:]
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// CryptEncoderSSHA1 encodes a password with SHA1 with the
 | 
			
		||||
// configured salt.
 | 
			
		||||
func CryptEncoderSSHA1(salt string) func(pass []byte, hash interface{}) []byte {
 | 
			
		||||
	return func(pass []byte, hash interface{}) []byte {
 | 
			
		||||
		s := []byte(salt)
 | 
			
		||||
		p := append(pass, s...)
 | 
			
		||||
		h := sha1.Sum(p)
 | 
			
		||||
		return h[:]
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// CryptEncoderSHA256 encodes a password with SHA256
 | 
			
		||||
func CryptEncoderSHA256(pass []byte, hash interface{}) []byte {
 | 
			
		||||
	h := sha256.Sum256(pass)
 | 
			
		||||
	return h[:]
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// CryptEncoderSSHA256 encodes a password with SHA256
 | 
			
		||||
// with the configured salt
 | 
			
		||||
func CryptEncoderSSHA256(salt string) func(pass []byte, hash interface{}) []byte {
 | 
			
		||||
	return func(pass []byte, hash interface{}) []byte {
 | 
			
		||||
		s := []byte(salt)
 | 
			
		||||
		p := append(pass, s...)
 | 
			
		||||
		h := sha256.Sum256(p)
 | 
			
		||||
		return h[:]
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// CryptEncoderSHA384 encodes a password with SHA384
 | 
			
		||||
func CryptEncoderSHA384(pass []byte, hash interface{}) []byte {
 | 
			
		||||
	h := sha512.Sum384(pass)
 | 
			
		||||
	return h[:]
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// CryptEncoderSSHA384 encodes a password with SHA384
 | 
			
		||||
// with the configured salt
 | 
			
		||||
func CryptEncoderSSHA384(salt string) func(pass []byte, hash interface{}) []byte {
 | 
			
		||||
	return func(pass []byte, hash interface{}) []byte {
 | 
			
		||||
		s := []byte(salt)
 | 
			
		||||
		p := append(pass, s...)
 | 
			
		||||
		h := sha512.Sum384(p)
 | 
			
		||||
		return h[:]
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// CryptEncoderSHA512 encodes a password with SHA512
 | 
			
		||||
func CryptEncoderSHA512(pass []byte, hash interface{}) []byte {
 | 
			
		||||
	h := sha512.Sum512(pass)
 | 
			
		||||
	return h[:]
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// CryptEncoderSSHA512 encodes a password with SHA512
 | 
			
		||||
// with the configured salt
 | 
			
		||||
func CryptEncoderSSHA512(salt string) func(pass []byte, hash interface{}) []byte {
 | 
			
		||||
	return func(pass []byte, hash interface{}) []byte {
 | 
			
		||||
		s := []byte(salt)
 | 
			
		||||
		p := append(pass, s...)
 | 
			
		||||
		h := sha512.Sum512(p)
 | 
			
		||||
		return h[:]
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// EOF
 | 
			
		||||
							
								
								
									
										1
									
								
								vendor/github.com/mattn/go-sqlite3/sqlite3_go18.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								vendor/github.com/mattn/go-sqlite3/sqlite3_go18.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -3,6 +3,7 @@
 | 
			
		||||
// Use of this source code is governed by an MIT-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
// +build cgo
 | 
			
		||||
// +build go1.8
 | 
			
		||||
 | 
			
		||||
package sqlite3
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										3
									
								
								vendor/github.com/mattn/go-sqlite3/sqlite3_libsqlite3.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								vendor/github.com/mattn/go-sqlite3/sqlite3_libsqlite3.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -2,6 +2,7 @@
 | 
			
		||||
//
 | 
			
		||||
// Use of this source code is governed by an MIT-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
// +build libsqlite3
 | 
			
		||||
 | 
			
		||||
package sqlite3
 | 
			
		||||
@@ -10,5 +11,7 @@ package sqlite3
 | 
			
		||||
#cgo CFLAGS: -DUSE_LIBSQLITE3
 | 
			
		||||
#cgo linux LDFLAGS: -lsqlite3
 | 
			
		||||
#cgo darwin LDFLAGS: -L/usr/local/opt/sqlite/lib -lsqlite3
 | 
			
		||||
#cgo openbsd LDFLAGS: -lsqlite3
 | 
			
		||||
#cgo solaris LDFLAGS: -lsqlite3
 | 
			
		||||
*/
 | 
			
		||||
import "C"
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										1
									
								
								vendor/github.com/mattn/go-sqlite3/sqlite3_load_extension.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								vendor/github.com/mattn/go-sqlite3/sqlite3_load_extension.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -2,6 +2,7 @@
 | 
			
		||||
//
 | 
			
		||||
// Use of this source code is governed by an MIT-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
// +build !sqlite_omit_load_extension
 | 
			
		||||
 | 
			
		||||
package sqlite3
 | 
			
		||||
 
 | 
			
		||||
@@ -2,6 +2,7 @@
 | 
			
		||||
//
 | 
			
		||||
// Use of this source code is governed by an MIT-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
// +build sqlite_omit_load_extension
 | 
			
		||||
 | 
			
		||||
package sqlite3
 | 
			
		||||
							
								
								
									
										15
									
								
								vendor/github.com/mattn/go-sqlite3/sqlite3_opt_allow_uri_authority.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								vendor/github.com/mattn/go-sqlite3/sqlite3_opt_allow_uri_authority.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,15 @@
 | 
			
		||||
// Copyright (C) 2014 Yasuhiro Matsumoto <mattn.jp@gmail.com>.
 | 
			
		||||
// Copyright (C) 2018 G.J.R. Timmer <gjr.timmer@gmail.com>.
 | 
			
		||||
//
 | 
			
		||||
// Use of this source code is governed by an MIT-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
// +build sqlite_allow_uri_authority
 | 
			
		||||
 | 
			
		||||
package sqlite3
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
#cgo CFLAGS: -DSQLITE_ALLOW_URI_AUTHORITY
 | 
			
		||||
#cgo LDFLAGS: -lm
 | 
			
		||||
*/
 | 
			
		||||
import "C"
 | 
			
		||||
							
								
								
									
										16
									
								
								vendor/github.com/mattn/go-sqlite3/sqlite3_opt_app_armor.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								vendor/github.com/mattn/go-sqlite3/sqlite3_opt_app_armor.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,16 @@
 | 
			
		||||
// Copyright (C) 2014 Yasuhiro Matsumoto <mattn.jp@gmail.com>.
 | 
			
		||||
// Copyright (C) 2018 G.J.R. Timmer <gjr.timmer@gmail.com>.
 | 
			
		||||
 | 
			
		||||
// Use of this source code is governed by an MIT-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
// +build !windows
 | 
			
		||||
// +build sqlite_app_armor
 | 
			
		||||
 | 
			
		||||
package sqlite3
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
#cgo CFLAGS: -DSQLITE_ENABLE_API_ARMOR
 | 
			
		||||
#cgo LDFLAGS: -lm
 | 
			
		||||
*/
 | 
			
		||||
import "C"
 | 
			
		||||
							
								
								
									
										15
									
								
								vendor/github.com/mattn/go-sqlite3/sqlite3_opt_foreign_keys.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								vendor/github.com/mattn/go-sqlite3/sqlite3_opt_foreign_keys.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,15 @@
 | 
			
		||||
// Copyright (C) 2014 Yasuhiro Matsumoto <mattn.jp@gmail.com>.
 | 
			
		||||
// Copyright (C) 2018 G.J.R. Timmer <gjr.timmer@gmail.com>.
 | 
			
		||||
//
 | 
			
		||||
// Use of this source code is governed by an MIT-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
// +build sqlite_foreign_keys
 | 
			
		||||
 | 
			
		||||
package sqlite3
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
#cgo CFLAGS: -DSQLITE_DEFAULT_FOREIGN_KEYS=1
 | 
			
		||||
#cgo LDFLAGS: -lm
 | 
			
		||||
*/
 | 
			
		||||
import "C"
 | 
			
		||||
@@ -2,7 +2,8 @@
 | 
			
		||||
//
 | 
			
		||||
// Use of this source code is governed by an MIT-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
// +build fts5
 | 
			
		||||
 | 
			
		||||
// +build sqlite_fts5 fts5
 | 
			
		||||
 | 
			
		||||
package sqlite3
 | 
			
		||||
 | 
			
		||||
@@ -2,12 +2,16 @@
 | 
			
		||||
//
 | 
			
		||||
// Use of this source code is governed by an MIT-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
// +build icu
 | 
			
		||||
 | 
			
		||||
// +build sqlite_icu icu
 | 
			
		||||
 | 
			
		||||
package sqlite3
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
#cgo LDFLAGS: -licuuc -licui18n
 | 
			
		||||
#cgo CFLAGS: -DSQLITE_ENABLE_ICU
 | 
			
		||||
#cgo darwin CFLAGS: -I/usr/local/opt/icu4c/include
 | 
			
		||||
#cgo darwin LDFLAGS: -L/usr/local/opt/icu4c/lib
 | 
			
		||||
#cgo openbsd LDFLAGS: -lsqlite3
 | 
			
		||||
*/
 | 
			
		||||
import "C"
 | 
			
		||||
							
								
								
									
										15
									
								
								vendor/github.com/mattn/go-sqlite3/sqlite3_opt_introspect.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								vendor/github.com/mattn/go-sqlite3/sqlite3_opt_introspect.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,15 @@
 | 
			
		||||
// Copyright (C) 2014 Yasuhiro Matsumoto <mattn.jp@gmail.com>.
 | 
			
		||||
// Copyright (C) 2018 G.J.R. Timmer <gjr.timmer@gmail.com>.
 | 
			
		||||
 | 
			
		||||
// Use of this source code is governed by an MIT-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
// +build sqlite_introspect
 | 
			
		||||
 | 
			
		||||
package sqlite3
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
#cgo CFLAGS: -DSQLITE_INTROSPECTION_PRAGMAS
 | 
			
		||||
#cgo LDFLAGS: -lm
 | 
			
		||||
*/
 | 
			
		||||
import "C"
 | 
			
		||||
@@ -2,7 +2,8 @@
 | 
			
		||||
//
 | 
			
		||||
// Use of this source code is governed by an MIT-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
// +build json1
 | 
			
		||||
 | 
			
		||||
// +build sqlite_json sqlite_json1 json1
 | 
			
		||||
 | 
			
		||||
package sqlite3
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										15
									
								
								vendor/github.com/mattn/go-sqlite3/sqlite3_opt_secure_delete.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								vendor/github.com/mattn/go-sqlite3/sqlite3_opt_secure_delete.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,15 @@
 | 
			
		||||
// Copyright (C) 2014 Yasuhiro Matsumoto <mattn.jp@gmail.com>.
 | 
			
		||||
// Copyright (C) 2018 G.J.R. Timmer <gjr.timmer@gmail.com>.
 | 
			
		||||
//
 | 
			
		||||
// Use of this source code is governed by an MIT-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
// +build sqlite_secure_delete
 | 
			
		||||
 | 
			
		||||
package sqlite3
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
#cgo CFLAGS: -DSQLITE_SECURE_DELETE=1
 | 
			
		||||
#cgo LDFLAGS: -lm
 | 
			
		||||
*/
 | 
			
		||||
import "C"
 | 
			
		||||
							
								
								
									
										15
									
								
								vendor/github.com/mattn/go-sqlite3/sqlite3_opt_secure_delete_fast.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								vendor/github.com/mattn/go-sqlite3/sqlite3_opt_secure_delete_fast.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,15 @@
 | 
			
		||||
// Copyright (C) 2014 Yasuhiro Matsumoto <mattn.jp@gmail.com>.
 | 
			
		||||
// Copyright (C) 2018 G.J.R. Timmer <gjr.timmer@gmail.com>.
 | 
			
		||||
//
 | 
			
		||||
// Use of this source code is governed by an MIT-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
// +build sqlite_secure_delete_fast
 | 
			
		||||
 | 
			
		||||
package sqlite3
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
#cgo CFLAGS: -DSQLITE_SECURE_DELETE=FAST
 | 
			
		||||
#cgo LDFLAGS: -lm
 | 
			
		||||
*/
 | 
			
		||||
import "C"
 | 
			
		||||
							
								
								
									
										15
									
								
								vendor/github.com/mattn/go-sqlite3/sqlite3_opt_stat4.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								vendor/github.com/mattn/go-sqlite3/sqlite3_opt_stat4.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,15 @@
 | 
			
		||||
// Copyright (C) 2014 Yasuhiro Matsumoto <mattn.jp@gmail.com>.
 | 
			
		||||
// Copyright (C) 2018 G.J.R. Timmer <gjr.timmer@gmail.com>.
 | 
			
		||||
//
 | 
			
		||||
// Use of this source code is governed by an MIT-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
// +build sqlite_stat4
 | 
			
		||||
 | 
			
		||||
package sqlite3
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
#cgo CFLAGS: -DSQLITE_ENABLE_STAT4
 | 
			
		||||
#cgo LDFLAGS: -lm
 | 
			
		||||
*/
 | 
			
		||||
import "C"
 | 
			
		||||
							
								
								
									
										85
									
								
								vendor/github.com/mattn/go-sqlite3/sqlite3_opt_unlock_notify.c
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										85
									
								
								vendor/github.com/mattn/go-sqlite3/sqlite3_opt_unlock_notify.c
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,85 @@
 | 
			
		||||
// Copyright (C) 2018 Yasuhiro Matsumoto <mattn.jp@gmail.com>.
 | 
			
		||||
//
 | 
			
		||||
// Use of this source code is governed by an MIT-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
#ifdef SQLITE_ENABLE_UNLOCK_NOTIFY
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <sqlite3-binding.h>
 | 
			
		||||
 | 
			
		||||
extern int unlock_notify_wait(sqlite3 *db);
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
_sqlite3_step_blocking(sqlite3_stmt *stmt)
 | 
			
		||||
{
 | 
			
		||||
  int rv;
 | 
			
		||||
  sqlite3* db;
 | 
			
		||||
 | 
			
		||||
  db = sqlite3_db_handle(stmt);
 | 
			
		||||
  for (;;) {
 | 
			
		||||
    rv = sqlite3_step(stmt);
 | 
			
		||||
    if (rv != SQLITE_LOCKED) {
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
    if (sqlite3_extended_errcode(db) != SQLITE_LOCKED_SHAREDCACHE) {
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
    rv = unlock_notify_wait(db);
 | 
			
		||||
    if (rv != SQLITE_OK) {
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
    sqlite3_reset(stmt);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return rv;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
_sqlite3_step_row_blocking(sqlite3_stmt* stmt, long long* rowid, long long* changes)
 | 
			
		||||
{
 | 
			
		||||
  int rv;
 | 
			
		||||
  sqlite3* db;
 | 
			
		||||
 | 
			
		||||
  db = sqlite3_db_handle(stmt);
 | 
			
		||||
  for (;;) {
 | 
			
		||||
    rv = sqlite3_step(stmt);
 | 
			
		||||
    if (rv!=SQLITE_LOCKED) {
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
    if (sqlite3_extended_errcode(db) != SQLITE_LOCKED_SHAREDCACHE) {
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
    rv = unlock_notify_wait(db);
 | 
			
		||||
    if (rv != SQLITE_OK) {
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
    sqlite3_reset(stmt);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  *rowid = (long long) sqlite3_last_insert_rowid(db);
 | 
			
		||||
  *changes = (long long) sqlite3_changes(db);
 | 
			
		||||
  return rv;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
_sqlite3_prepare_v2_blocking(sqlite3 *db, const char *zSql, int nBytes, sqlite3_stmt **ppStmt, const char **pzTail)
 | 
			
		||||
{
 | 
			
		||||
  int rv;
 | 
			
		||||
 | 
			
		||||
  for (;;) {
 | 
			
		||||
    rv = sqlite3_prepare_v2(db, zSql, nBytes, ppStmt, pzTail);
 | 
			
		||||
    if (rv!=SQLITE_LOCKED) {
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
    if (sqlite3_extended_errcode(db) != SQLITE_LOCKED_SHAREDCACHE) {
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
    rv = unlock_notify_wait(db);
 | 
			
		||||
    if (rv != SQLITE_OK) {
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return rv;
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
							
								
								
									
										92
									
								
								vendor/github.com/mattn/go-sqlite3/sqlite3_opt_unlock_notify.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										92
									
								
								vendor/github.com/mattn/go-sqlite3/sqlite3_opt_unlock_notify.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,92 @@
 | 
			
		||||
// Copyright (C) 2018 Yasuhiro Matsumoto <mattn.jp@gmail.com>.
 | 
			
		||||
//
 | 
			
		||||
// Use of this source code is governed by an MIT-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
// +build cgo
 | 
			
		||||
// +build sqlite_unlock_notify
 | 
			
		||||
 | 
			
		||||
package sqlite3
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
#cgo CFLAGS: -DSQLITE_ENABLE_UNLOCK_NOTIFY
 | 
			
		||||
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <sqlite3-binding.h>
 | 
			
		||||
 | 
			
		||||
extern void unlock_notify_callback(void *arg, int argc);
 | 
			
		||||
*/
 | 
			
		||||
import "C"
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"sync"
 | 
			
		||||
	"unsafe"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type unlock_notify_table struct {
 | 
			
		||||
	sync.Mutex
 | 
			
		||||
	seqnum uint
 | 
			
		||||
	table  map[uint]chan struct{}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var unt unlock_notify_table = unlock_notify_table{table: make(map[uint]chan struct{})}
 | 
			
		||||
 | 
			
		||||
func (t *unlock_notify_table) add(c chan struct{}) uint {
 | 
			
		||||
	t.Lock()
 | 
			
		||||
	defer t.Unlock()
 | 
			
		||||
	h := t.seqnum
 | 
			
		||||
	t.table[h] = c
 | 
			
		||||
	t.seqnum++
 | 
			
		||||
	return h
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (t *unlock_notify_table) remove(h uint) {
 | 
			
		||||
	t.Lock()
 | 
			
		||||
	defer t.Unlock()
 | 
			
		||||
	delete(t.table, h)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (t *unlock_notify_table) get(h uint) chan struct{} {
 | 
			
		||||
	t.Lock()
 | 
			
		||||
	defer t.Unlock()
 | 
			
		||||
	c, ok := t.table[h]
 | 
			
		||||
	if !ok {
 | 
			
		||||
		panic(fmt.Sprintf("Non-existent key for unlcok-notify channel: %d", h))
 | 
			
		||||
	}
 | 
			
		||||
	return c
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//export unlock_notify_callback
 | 
			
		||||
func unlock_notify_callback(argv unsafe.Pointer, argc C.int) {
 | 
			
		||||
	for i := 0; i < int(argc); i++ {
 | 
			
		||||
		parg := ((*(*[1 << 30]*[1]uint)(argv))[i])
 | 
			
		||||
		arg := *parg
 | 
			
		||||
		h := arg[0]
 | 
			
		||||
		c := unt.get(h)
 | 
			
		||||
		c <- struct{}{}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//export unlock_notify_wait
 | 
			
		||||
func unlock_notify_wait(db *C.sqlite3) C.int {
 | 
			
		||||
	// It has to be a bufferred channel to not block in sqlite_unlock_notify
 | 
			
		||||
	// as sqlite_unlock_notify could invoke the callback before it returns.
 | 
			
		||||
	c := make(chan struct{}, 1)
 | 
			
		||||
	defer close(c)
 | 
			
		||||
 | 
			
		||||
	h := unt.add(c)
 | 
			
		||||
	defer unt.remove(h)
 | 
			
		||||
 | 
			
		||||
	pargv := C.malloc(C.sizeof_uint)
 | 
			
		||||
	defer C.free(pargv)
 | 
			
		||||
 | 
			
		||||
	argv := (*[1]uint)(pargv)
 | 
			
		||||
	argv[0] = h
 | 
			
		||||
	if rv := C.sqlite3_unlock_notify(db, (*[0]byte)(C.unlock_notify_callback), unsafe.Pointer(pargv)); rv != C.SQLITE_OK {
 | 
			
		||||
		return rv
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	<-c
 | 
			
		||||
 | 
			
		||||
	return C.SQLITE_OK
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										289
									
								
								vendor/github.com/mattn/go-sqlite3/sqlite3_opt_userauth.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										289
									
								
								vendor/github.com/mattn/go-sqlite3/sqlite3_opt_userauth.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,289 @@
 | 
			
		||||
// Copyright (C) 2018 G.J.R. Timmer <gjr.timmer@gmail.com>.
 | 
			
		||||
//
 | 
			
		||||
// Use of this source code is governed by an MIT-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
// +build sqlite_userauth
 | 
			
		||||
 | 
			
		||||
package sqlite3
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
#cgo CFLAGS: -DSQLITE_USER_AUTHENTICATION
 | 
			
		||||
#cgo LDFLAGS: -lm
 | 
			
		||||
#ifndef USE_LIBSQLITE3
 | 
			
		||||
#include <sqlite3-binding.h>
 | 
			
		||||
#else
 | 
			
		||||
#include <sqlite3.h>
 | 
			
		||||
#endif
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
 | 
			
		||||
static int
 | 
			
		||||
_sqlite3_user_authenticate(sqlite3* db, const char* zUsername, const char* aPW, int nPW)
 | 
			
		||||
{
 | 
			
		||||
  return sqlite3_user_authenticate(db, zUsername, aPW, nPW);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int
 | 
			
		||||
_sqlite3_user_add(sqlite3* db, const char* zUsername, const char* aPW, int nPW, int isAdmin)
 | 
			
		||||
{
 | 
			
		||||
  return sqlite3_user_add(db, zUsername, aPW, nPW, isAdmin);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int
 | 
			
		||||
_sqlite3_user_change(sqlite3* db, const char* zUsername, const char* aPW, int nPW, int isAdmin)
 | 
			
		||||
{
 | 
			
		||||
  return sqlite3_user_change(db, zUsername, aPW, nPW, isAdmin);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int
 | 
			
		||||
_sqlite3_user_delete(sqlite3* db, const char* zUsername)
 | 
			
		||||
{
 | 
			
		||||
  return sqlite3_user_delete(db, zUsername);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int
 | 
			
		||||
_sqlite3_auth_enabled(sqlite3* db)
 | 
			
		||||
{
 | 
			
		||||
	int exists = -1;
 | 
			
		||||
 | 
			
		||||
	sqlite3_stmt *stmt;
 | 
			
		||||
	sqlite3_prepare_v2(db, "select count(type) from sqlite_master WHERE type='table' and name='sqlite_user';", -1, &stmt, NULL);
 | 
			
		||||
 | 
			
		||||
	while ( sqlite3_step(stmt) == SQLITE_ROW) {
 | 
			
		||||
		exists = sqlite3_column_int(stmt, 0);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	sqlite3_finalize(stmt);
 | 
			
		||||
 | 
			
		||||
	return exists;
 | 
			
		||||
}
 | 
			
		||||
*/
 | 
			
		||||
import "C"
 | 
			
		||||
import (
 | 
			
		||||
	"errors"
 | 
			
		||||
	"unsafe"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	SQLITE_AUTH = C.SQLITE_AUTH
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	ErrUnauthorized  = errors.New("SQLITE_AUTH: Unauthorized")
 | 
			
		||||
	ErrAdminRequired = errors.New("SQLITE_AUTH: Unauthorized; Admin Privileges Required")
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Authenticate will perform an authentication of the provided username
 | 
			
		||||
// and password against the database.
 | 
			
		||||
//
 | 
			
		||||
// If a database contains the SQLITE_USER table, then the
 | 
			
		||||
// call to Authenticate must be invoked with an
 | 
			
		||||
// appropriate username and password prior to enable read and write
 | 
			
		||||
//access to the database.
 | 
			
		||||
//
 | 
			
		||||
// Return SQLITE_OK on success or SQLITE_ERROR if the username/password
 | 
			
		||||
// combination is incorrect or unknown.
 | 
			
		||||
//
 | 
			
		||||
// If the SQLITE_USER table is not present in the database file, then
 | 
			
		||||
// this interface is a harmless no-op returnning SQLITE_OK.
 | 
			
		||||
func (c *SQLiteConn) Authenticate(username, password string) error {
 | 
			
		||||
	rv := c.authenticate(username, password)
 | 
			
		||||
	switch rv {
 | 
			
		||||
	case C.SQLITE_ERROR, C.SQLITE_AUTH:
 | 
			
		||||
		return ErrUnauthorized
 | 
			
		||||
	case C.SQLITE_OK:
 | 
			
		||||
		return nil
 | 
			
		||||
	default:
 | 
			
		||||
		return c.lastError()
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// authenticate provides the actual authentication to SQLite.
 | 
			
		||||
// This is not exported for usage in Go.
 | 
			
		||||
// It is however exported for usage within SQL by the user.
 | 
			
		||||
//
 | 
			
		||||
// Returns:
 | 
			
		||||
//	C.SQLITE_OK (0)
 | 
			
		||||
//	C.SQLITE_ERROR (1)
 | 
			
		||||
//  C.SQLITE_AUTH (23)
 | 
			
		||||
func (c *SQLiteConn) authenticate(username, password string) int {
 | 
			
		||||
	// Allocate C Variables
 | 
			
		||||
	cuser := C.CString(username)
 | 
			
		||||
	cpass := C.CString(password)
 | 
			
		||||
 | 
			
		||||
	// Free C Variables
 | 
			
		||||
	defer func() {
 | 
			
		||||
		C.free(unsafe.Pointer(cuser))
 | 
			
		||||
		C.free(unsafe.Pointer(cpass))
 | 
			
		||||
	}()
 | 
			
		||||
 | 
			
		||||
	return int(C._sqlite3_user_authenticate(c.db, cuser, cpass, C.int(len(password))))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// AuthUserAdd can be used (by an admin user only)
 | 
			
		||||
// to create a new user. When called on a no-authentication-required
 | 
			
		||||
// database, this routine converts the database into an authentication-
 | 
			
		||||
// required database, automatically makes the added user an
 | 
			
		||||
// administrator, and logs in the current connection as that user.
 | 
			
		||||
// The AuthUserAdd only works for the "main" database, not
 | 
			
		||||
// for any ATTACH-ed databases. Any call to AuthUserAdd by a
 | 
			
		||||
// non-admin user results in an error.
 | 
			
		||||
func (c *SQLiteConn) AuthUserAdd(username, password string, admin bool) error {
 | 
			
		||||
	isAdmin := 0
 | 
			
		||||
	if admin {
 | 
			
		||||
		isAdmin = 1
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	rv := c.authUserAdd(username, password, isAdmin)
 | 
			
		||||
	switch rv {
 | 
			
		||||
	case C.SQLITE_ERROR, C.SQLITE_AUTH:
 | 
			
		||||
		return ErrAdminRequired
 | 
			
		||||
	case C.SQLITE_OK:
 | 
			
		||||
		return nil
 | 
			
		||||
	default:
 | 
			
		||||
		return c.lastError()
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// authUserAdd enables the User Authentication if not enabled.
 | 
			
		||||
// Otherwise it will add a user.
 | 
			
		||||
//
 | 
			
		||||
// When user authentication is already enabled then this function
 | 
			
		||||
// can only be called by an admin.
 | 
			
		||||
//
 | 
			
		||||
// This is not exported for usage in Go.
 | 
			
		||||
// It is however exported for usage within SQL by the user.
 | 
			
		||||
//
 | 
			
		||||
// Returns:
 | 
			
		||||
//	C.SQLITE_OK (0)
 | 
			
		||||
//	C.SQLITE_ERROR (1)
 | 
			
		||||
//  C.SQLITE_AUTH (23)
 | 
			
		||||
func (c *SQLiteConn) authUserAdd(username, password string, admin int) int {
 | 
			
		||||
	// Allocate C Variables
 | 
			
		||||
	cuser := C.CString(username)
 | 
			
		||||
	cpass := C.CString(password)
 | 
			
		||||
 | 
			
		||||
	// Free C Variables
 | 
			
		||||
	defer func() {
 | 
			
		||||
		C.free(unsafe.Pointer(cuser))
 | 
			
		||||
		C.free(unsafe.Pointer(cpass))
 | 
			
		||||
	}()
 | 
			
		||||
 | 
			
		||||
	return int(C._sqlite3_user_add(c.db, cuser, cpass, C.int(len(password)), C.int(admin)))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// AuthUserChange can be used to change a users
 | 
			
		||||
// login credentials or admin privilege.  Any user can change their own
 | 
			
		||||
// login credentials. Only an admin user can change another users login
 | 
			
		||||
// credentials or admin privilege setting. No user may change their own
 | 
			
		||||
// admin privilege setting.
 | 
			
		||||
func (c *SQLiteConn) AuthUserChange(username, password string, admin bool) error {
 | 
			
		||||
	isAdmin := 0
 | 
			
		||||
	if admin {
 | 
			
		||||
		isAdmin = 1
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	rv := c.authUserChange(username, password, isAdmin)
 | 
			
		||||
	switch rv {
 | 
			
		||||
	case C.SQLITE_ERROR, C.SQLITE_AUTH:
 | 
			
		||||
		return ErrAdminRequired
 | 
			
		||||
	case C.SQLITE_OK:
 | 
			
		||||
		return nil
 | 
			
		||||
	default:
 | 
			
		||||
		return c.lastError()
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// authUserChange allows to modify a user.
 | 
			
		||||
// Users can change their own password.
 | 
			
		||||
//
 | 
			
		||||
// Only admins can change passwords for other users
 | 
			
		||||
// and modify the admin flag.
 | 
			
		||||
//
 | 
			
		||||
// The admin flag of the current logged in user cannot be changed.
 | 
			
		||||
// THis ensures that their is always an admin.
 | 
			
		||||
//
 | 
			
		||||
// This is not exported for usage in Go.
 | 
			
		||||
// It is however exported for usage within SQL by the user.
 | 
			
		||||
//
 | 
			
		||||
// Returns:
 | 
			
		||||
//	C.SQLITE_OK (0)
 | 
			
		||||
//	C.SQLITE_ERROR (1)
 | 
			
		||||
//  C.SQLITE_AUTH (23)
 | 
			
		||||
func (c *SQLiteConn) authUserChange(username, password string, admin int) int {
 | 
			
		||||
	// Allocate C Variables
 | 
			
		||||
	cuser := C.CString(username)
 | 
			
		||||
	cpass := C.CString(password)
 | 
			
		||||
 | 
			
		||||
	// Free C Variables
 | 
			
		||||
	defer func() {
 | 
			
		||||
		C.free(unsafe.Pointer(cuser))
 | 
			
		||||
		C.free(unsafe.Pointer(cpass))
 | 
			
		||||
	}()
 | 
			
		||||
 | 
			
		||||
	return int(C._sqlite3_user_change(c.db, cuser, cpass, C.int(len(password)), C.int(admin)))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// AuthUserDelete can be used (by an admin user only)
 | 
			
		||||
// to delete a user. The currently logged-in user cannot be deleted,
 | 
			
		||||
// which guarantees that there is always an admin user and hence that
 | 
			
		||||
// the database cannot be converted into a no-authentication-required
 | 
			
		||||
// database.
 | 
			
		||||
func (c *SQLiteConn) AuthUserDelete(username string) error {
 | 
			
		||||
	rv := c.authUserDelete(username)
 | 
			
		||||
	switch rv {
 | 
			
		||||
	case C.SQLITE_ERROR, C.SQLITE_AUTH:
 | 
			
		||||
		return ErrAdminRequired
 | 
			
		||||
	case C.SQLITE_OK:
 | 
			
		||||
		return nil
 | 
			
		||||
	default:
 | 
			
		||||
		return c.lastError()
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// authUserDelete can be used to delete a user.
 | 
			
		||||
//
 | 
			
		||||
// This function can only be executed by an admin.
 | 
			
		||||
//
 | 
			
		||||
// This is not exported for usage in Go.
 | 
			
		||||
// It is however exported for usage within SQL by the user.
 | 
			
		||||
//
 | 
			
		||||
// Returns:
 | 
			
		||||
//	C.SQLITE_OK (0)
 | 
			
		||||
//	C.SQLITE_ERROR (1)
 | 
			
		||||
//  C.SQLITE_AUTH (23)
 | 
			
		||||
func (c *SQLiteConn) authUserDelete(username string) int {
 | 
			
		||||
	// Allocate C Variables
 | 
			
		||||
	cuser := C.CString(username)
 | 
			
		||||
 | 
			
		||||
	// Free C Variables
 | 
			
		||||
	defer func() {
 | 
			
		||||
		C.free(unsafe.Pointer(cuser))
 | 
			
		||||
	}()
 | 
			
		||||
 | 
			
		||||
	return int(C._sqlite3_user_delete(c.db, cuser))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// AuthEnabled checks if the database is protected by user authentication
 | 
			
		||||
func (c *SQLiteConn) AuthEnabled() (exists bool) {
 | 
			
		||||
	rv := c.authEnabled()
 | 
			
		||||
	if rv == 1 {
 | 
			
		||||
		exists = true
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// authEnabled perform the actual check for user authentication.
 | 
			
		||||
//
 | 
			
		||||
// This is not exported for usage in Go.
 | 
			
		||||
// It is however exported for usage within SQL by the user.
 | 
			
		||||
//
 | 
			
		||||
// Returns:
 | 
			
		||||
//	0 - Disabled
 | 
			
		||||
//  1 - Enabled
 | 
			
		||||
func (c *SQLiteConn) authEnabled() int {
 | 
			
		||||
	return int(C._sqlite3_auth_enabled(c.db))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// EOF
 | 
			
		||||
							
								
								
									
										152
									
								
								vendor/github.com/mattn/go-sqlite3/sqlite3_opt_userauth_omit.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										152
									
								
								vendor/github.com/mattn/go-sqlite3/sqlite3_opt_userauth_omit.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,152 @@
 | 
			
		||||
// Copyright (C) 2018 G.J.R. Timmer <gjr.timmer@gmail.com>.
 | 
			
		||||
//
 | 
			
		||||
// Use of this source code is governed by an MIT-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
// +build !sqlite_userauth
 | 
			
		||||
 | 
			
		||||
package sqlite3
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"C"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Authenticate will perform an authentication of the provided username
 | 
			
		||||
// and password against the database.
 | 
			
		||||
//
 | 
			
		||||
// If a database contains the SQLITE_USER table, then the
 | 
			
		||||
// call to Authenticate must be invoked with an
 | 
			
		||||
// appropriate username and password prior to enable read and write
 | 
			
		||||
//access to the database.
 | 
			
		||||
//
 | 
			
		||||
// Return SQLITE_OK on success or SQLITE_ERROR if the username/password
 | 
			
		||||
// combination is incorrect or unknown.
 | 
			
		||||
//
 | 
			
		||||
// If the SQLITE_USER table is not present in the database file, then
 | 
			
		||||
// this interface is a harmless no-op returnning SQLITE_OK.
 | 
			
		||||
func (c *SQLiteConn) Authenticate(username, password string) error {
 | 
			
		||||
	// NOOP
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// authenticate provides the actual authentication to SQLite.
 | 
			
		||||
// This is not exported for usage in Go.
 | 
			
		||||
// It is however exported for usage within SQL by the user.
 | 
			
		||||
//
 | 
			
		||||
// Returns:
 | 
			
		||||
//	C.SQLITE_OK (0)
 | 
			
		||||
//	C.SQLITE_ERROR (1)
 | 
			
		||||
//  C.SQLITE_AUTH (23)
 | 
			
		||||
func (c *SQLiteConn) authenticate(username, password string) int {
 | 
			
		||||
	// NOOP
 | 
			
		||||
	return 0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// AuthUserAdd can be used (by an admin user only)
 | 
			
		||||
// to create a new user.  When called on a no-authentication-required
 | 
			
		||||
// database, this routine converts the database into an authentication-
 | 
			
		||||
// required database, automatically makes the added user an
 | 
			
		||||
// administrator, and logs in the current connection as that user.
 | 
			
		||||
// The AuthUserAdd only works for the "main" database, not
 | 
			
		||||
// for any ATTACH-ed databases. Any call to AuthUserAdd by a
 | 
			
		||||
// non-admin user results in an error.
 | 
			
		||||
func (c *SQLiteConn) AuthUserAdd(username, password string, admin bool) error {
 | 
			
		||||
	// NOOP
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// authUserAdd enables the User Authentication if not enabled.
 | 
			
		||||
// Otherwise it will add a user.
 | 
			
		||||
//
 | 
			
		||||
// When user authentication is already enabled then this function
 | 
			
		||||
// can only be called by an admin.
 | 
			
		||||
//
 | 
			
		||||
// This is not exported for usage in Go.
 | 
			
		||||
// It is however exported for usage within SQL by the user.
 | 
			
		||||
//
 | 
			
		||||
// Returns:
 | 
			
		||||
//	C.SQLITE_OK (0)
 | 
			
		||||
//	C.SQLITE_ERROR (1)
 | 
			
		||||
//  C.SQLITE_AUTH (23)
 | 
			
		||||
func (c *SQLiteConn) authUserAdd(username, password string, admin int) int {
 | 
			
		||||
	// NOOP
 | 
			
		||||
	return 0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// AuthUserChange can be used to change a users
 | 
			
		||||
// login credentials or admin privilege.  Any user can change their own
 | 
			
		||||
// login credentials.  Only an admin user can change another users login
 | 
			
		||||
// credentials or admin privilege setting.  No user may change their own
 | 
			
		||||
// admin privilege setting.
 | 
			
		||||
func (c *SQLiteConn) AuthUserChange(username, password string, admin bool) error {
 | 
			
		||||
	// NOOP
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// authUserChange allows to modify a user.
 | 
			
		||||
// Users can change their own password.
 | 
			
		||||
//
 | 
			
		||||
// Only admins can change passwords for other users
 | 
			
		||||
// and modify the admin flag.
 | 
			
		||||
//
 | 
			
		||||
// The admin flag of the current logged in user cannot be changed.
 | 
			
		||||
// THis ensures that their is always an admin.
 | 
			
		||||
//
 | 
			
		||||
// This is not exported for usage in Go.
 | 
			
		||||
// It is however exported for usage within SQL by the user.
 | 
			
		||||
//
 | 
			
		||||
// Returns:
 | 
			
		||||
//	C.SQLITE_OK (0)
 | 
			
		||||
//	C.SQLITE_ERROR (1)
 | 
			
		||||
//  C.SQLITE_AUTH (23)
 | 
			
		||||
func (c *SQLiteConn) authUserChange(username, password string, admin int) int {
 | 
			
		||||
	// NOOP
 | 
			
		||||
	return 0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// AuthUserDelete can be used (by an admin user only)
 | 
			
		||||
// to delete a user.  The currently logged-in user cannot be deleted,
 | 
			
		||||
// which guarantees that there is always an admin user and hence that
 | 
			
		||||
// the database cannot be converted into a no-authentication-required
 | 
			
		||||
// database.
 | 
			
		||||
func (c *SQLiteConn) AuthUserDelete(username string) error {
 | 
			
		||||
	// NOOP
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// authUserDelete can be used to delete a user.
 | 
			
		||||
//
 | 
			
		||||
// This function can only be executed by an admin.
 | 
			
		||||
//
 | 
			
		||||
// This is not exported for usage in Go.
 | 
			
		||||
// It is however exported for usage within SQL by the user.
 | 
			
		||||
//
 | 
			
		||||
// Returns:
 | 
			
		||||
//	C.SQLITE_OK (0)
 | 
			
		||||
//	C.SQLITE_ERROR (1)
 | 
			
		||||
//  C.SQLITE_AUTH (23)
 | 
			
		||||
func (c *SQLiteConn) authUserDelete(username string) int {
 | 
			
		||||
	// NOOP
 | 
			
		||||
	return 0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// AuthEnabled checks if the database is protected by user authentication
 | 
			
		||||
func (c *SQLiteConn) AuthEnabled() (exists bool) {
 | 
			
		||||
	// NOOP
 | 
			
		||||
	return false
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// authEnabled perform the actual check for user authentication.
 | 
			
		||||
//
 | 
			
		||||
// This is not exported for usage in Go.
 | 
			
		||||
// It is however exported for usage within SQL by the user.
 | 
			
		||||
//
 | 
			
		||||
// Returns:
 | 
			
		||||
//	0 - Disabled
 | 
			
		||||
//  1 - Enabled
 | 
			
		||||
func (c *SQLiteConn) authEnabled() int {
 | 
			
		||||
	// NOOP
 | 
			
		||||
	return 0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// EOF
 | 
			
		||||
							
								
								
									
										15
									
								
								vendor/github.com/mattn/go-sqlite3/sqlite3_opt_vacuum_full.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								vendor/github.com/mattn/go-sqlite3/sqlite3_opt_vacuum_full.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,15 @@
 | 
			
		||||
// Copyright (C) 2014 Yasuhiro Matsumoto <mattn.jp@gmail.com>.
 | 
			
		||||
// Copyright (C) 2018 G.J.R. Timmer <gjr.timmer@gmail.com>.
 | 
			
		||||
//
 | 
			
		||||
// Use of this source code is governed by an MIT-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
// +build sqlite_vacuum_full
 | 
			
		||||
 | 
			
		||||
package sqlite3
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
#cgo CFLAGS: -DSQLITE_DEFAULT_AUTOVACUUM=1
 | 
			
		||||
#cgo LDFLAGS: -lm
 | 
			
		||||
*/
 | 
			
		||||
import "C"
 | 
			
		||||
							
								
								
									
										15
									
								
								vendor/github.com/mattn/go-sqlite3/sqlite3_opt_vacuum_incr.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								vendor/github.com/mattn/go-sqlite3/sqlite3_opt_vacuum_incr.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,15 @@
 | 
			
		||||
// Copyright (C) 2014 Yasuhiro Matsumoto <mattn.jp@gmail.com>.
 | 
			
		||||
// Copyright (C) 2018 G.J.R. Timmer <gjr.timmer@gmail.com>.
 | 
			
		||||
//
 | 
			
		||||
// Use of this source code is governed by an MIT-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
// +build sqlite_vacuum_incr
 | 
			
		||||
 | 
			
		||||
package sqlite3
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
#cgo CFLAGS: -DSQLITE_DEFAULT_AUTOVACUUM=2
 | 
			
		||||
#cgo LDFLAGS: -lm
 | 
			
		||||
*/
 | 
			
		||||
import "C"
 | 
			
		||||
@@ -2,14 +2,18 @@
 | 
			
		||||
//
 | 
			
		||||
// Use of this source code is governed by an MIT-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
// +build vtable
 | 
			
		||||
 | 
			
		||||
// +build sqlite_vtable vtable
 | 
			
		||||
 | 
			
		||||
package sqlite3
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
#cgo CFLAGS: -std=gnu99
 | 
			
		||||
#cgo CFLAGS: -DSQLITE_ENABLE_RTREE -DSQLITE_THREADSAFE
 | 
			
		||||
#cgo CFLAGS: -DSQLITE_ENABLE_FTS3 -DSQLITE_ENABLE_FTS3_PARENTHESIS -DSQLITE_ENABLE_FTS4_UNICODE61
 | 
			
		||||
#cgo CFLAGS: -DSQLITE_ENABLE_RTREE
 | 
			
		||||
#cgo CFLAGS: -DSQLITE_THREADSAFE
 | 
			
		||||
#cgo CFLAGS: -DSQLITE_ENABLE_FTS3
 | 
			
		||||
#cgo CFLAGS: -DSQLITE_ENABLE_FTS3_PARENTHESIS
 | 
			
		||||
#cgo CFLAGS: -DSQLITE_ENABLE_FTS4_UNICODE61
 | 
			
		||||
#cgo CFLAGS: -DSQLITE_TRACE_SIZE_LIMIT=15
 | 
			
		||||
#cgo CFLAGS: -DSQLITE_ENABLE_COLUMN_METADATA=1
 | 
			
		||||
#cgo CFLAGS: -Wno-deprecated-declarations
 | 
			
		||||
							
								
								
									
										4
									
								
								vendor/github.com/mattn/go-sqlite3/sqlite3_other.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								vendor/github.com/mattn/go-sqlite3/sqlite3_other.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -2,6 +2,7 @@
 | 
			
		||||
//
 | 
			
		||||
// Use of this source code is governed by an MIT-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
// +build !windows
 | 
			
		||||
 | 
			
		||||
package sqlite3
 | 
			
		||||
@@ -9,5 +10,8 @@ package sqlite3
 | 
			
		||||
/*
 | 
			
		||||
#cgo CFLAGS: -I.
 | 
			
		||||
#cgo linux LDFLAGS: -ldl
 | 
			
		||||
#cgo linux,ppc LDFLAGS: -lpthread
 | 
			
		||||
#cgo linux,ppc64 LDFLAGS: -lpthread
 | 
			
		||||
#cgo linux,ppc64le LDFLAGS: -lpthread
 | 
			
		||||
*/
 | 
			
		||||
import "C"
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										14
									
								
								vendor/github.com/mattn/go-sqlite3/sqlite3_solaris.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								vendor/github.com/mattn/go-sqlite3/sqlite3_solaris.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,14 @@
 | 
			
		||||
// Copyright (C) 2018 Yasuhiro Matsumoto <mattn.jp@gmail.com>.
 | 
			
		||||
//
 | 
			
		||||
// Use of this source code is governed by an MIT-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
// +build solaris
 | 
			
		||||
 | 
			
		||||
package sqlite3
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
#cgo CFLAGS: -D__EXTENSIONS__=1
 | 
			
		||||
#cgo LDFLAGS: -lc
 | 
			
		||||
*/
 | 
			
		||||
import "C"
 | 
			
		||||
							
								
								
									
										154
									
								
								vendor/github.com/mattn/go-sqlite3/sqlite3_trace.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										154
									
								
								vendor/github.com/mattn/go-sqlite3/sqlite3_trace.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -2,7 +2,8 @@
 | 
			
		||||
//
 | 
			
		||||
// Use of this source code is governed by an MIT-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
// +build trace
 | 
			
		||||
 | 
			
		||||
// +build sqlite_trace trace
 | 
			
		||||
 | 
			
		||||
package sqlite3
 | 
			
		||||
 | 
			
		||||
@@ -14,16 +15,12 @@ package sqlite3
 | 
			
		||||
#endif
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
 | 
			
		||||
void stepTrampoline(sqlite3_context*, int, sqlite3_value**);
 | 
			
		||||
void doneTrampoline(sqlite3_context*);
 | 
			
		||||
int traceCallbackTrampoline(unsigned int traceEventCode, void *ctx, void *p, void *x);
 | 
			
		||||
*/
 | 
			
		||||
import "C"
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"errors"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"reflect"
 | 
			
		||||
	"strings"
 | 
			
		||||
	"sync"
 | 
			
		||||
	"unsafe"
 | 
			
		||||
@@ -32,10 +29,10 @@ import (
 | 
			
		||||
// Trace... constants identify the possible events causing callback invocation.
 | 
			
		||||
// Values are same as the corresponding SQLite Trace Event Codes.
 | 
			
		||||
const (
 | 
			
		||||
	TraceStmt    = C.SQLITE_TRACE_STMT
 | 
			
		||||
	TraceProfile = C.SQLITE_TRACE_PROFILE
 | 
			
		||||
	TraceRow     = C.SQLITE_TRACE_ROW
 | 
			
		||||
	TraceClose   = C.SQLITE_TRACE_CLOSE
 | 
			
		||||
	TraceStmt    = uint32(C.SQLITE_TRACE_STMT)
 | 
			
		||||
	TraceProfile = uint32(C.SQLITE_TRACE_PROFILE)
 | 
			
		||||
	TraceRow     = uint32(C.SQLITE_TRACE_ROW)
 | 
			
		||||
	TraceClose   = uint32(C.SQLITE_TRACE_CLOSE)
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type TraceInfo struct {
 | 
			
		||||
@@ -75,7 +72,7 @@ type TraceUserCallback func(TraceInfo) int
 | 
			
		||||
 | 
			
		||||
type TraceConfig struct {
 | 
			
		||||
	Callback        TraceUserCallback
 | 
			
		||||
	EventMask       C.uint
 | 
			
		||||
	EventMask       uint32
 | 
			
		||||
	WantExpandedSQL bool
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -109,6 +106,8 @@ func traceCallbackTrampoline(
 | 
			
		||||
	// Parameter named 'X' in SQLite docs (eXtra event data?):
 | 
			
		||||
	xValue unsafe.Pointer) C.int {
 | 
			
		||||
 | 
			
		||||
	eventCode := uint32(traceEventCode)
 | 
			
		||||
 | 
			
		||||
	if ctx == nil {
 | 
			
		||||
		panic(fmt.Sprintf("No context (ev 0x%x)", traceEventCode))
 | 
			
		||||
	}
 | 
			
		||||
@@ -118,7 +117,7 @@ func traceCallbackTrampoline(
 | 
			
		||||
 | 
			
		||||
	var traceConf TraceConfig
 | 
			
		||||
	var found bool
 | 
			
		||||
	if traceEventCode == TraceClose {
 | 
			
		||||
	if eventCode == TraceClose {
 | 
			
		||||
		// clean up traceMap: 'pop' means get and delete
 | 
			
		||||
		traceConf, found = popTraceMapping(connHandle)
 | 
			
		||||
	} else {
 | 
			
		||||
@@ -127,16 +126,16 @@ func traceCallbackTrampoline(
 | 
			
		||||
 | 
			
		||||
	if !found {
 | 
			
		||||
		panic(fmt.Sprintf("Mapping not found for handle 0x%x (ev 0x%x)",
 | 
			
		||||
			connHandle, traceEventCode))
 | 
			
		||||
			connHandle, eventCode))
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var info TraceInfo
 | 
			
		||||
 | 
			
		||||
	info.EventCode = uint32(traceEventCode)
 | 
			
		||||
	info.EventCode = eventCode
 | 
			
		||||
	info.AutoCommit = (int(C.sqlite3_get_autocommit(contextDB)) != 0)
 | 
			
		||||
	info.ConnHandle = connHandle
 | 
			
		||||
 | 
			
		||||
	switch traceEventCode {
 | 
			
		||||
	switch eventCode {
 | 
			
		||||
	case TraceStmt:
 | 
			
		||||
		info.StmtHandle = uintptr(p)
 | 
			
		||||
 | 
			
		||||
@@ -187,7 +186,7 @@ func traceCallbackTrampoline(
 | 
			
		||||
	// registering this callback trampoline with SQLite --- for cleanup.
 | 
			
		||||
	// In the future there may be more events forced to "selected" in SQLite
 | 
			
		||||
	// for the driver's needs.
 | 
			
		||||
	if traceConf.EventMask&traceEventCode == 0 {
 | 
			
		||||
	if traceConf.EventMask&eventCode == 0 {
 | 
			
		||||
		return 0
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@@ -239,131 +238,6 @@ func popTraceMapping(connHandle uintptr) (TraceConfig, bool) {
 | 
			
		||||
	return entryCopy.config, found
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// RegisterAggregator makes a Go type available as a SQLite aggregation function.
 | 
			
		||||
//
 | 
			
		||||
// Because aggregation is incremental, it's implemented in Go with a
 | 
			
		||||
// type that has 2 methods: func Step(values) accumulates one row of
 | 
			
		||||
// data into the accumulator, and func Done() ret finalizes and
 | 
			
		||||
// returns the aggregate value. "values" and "ret" may be any type
 | 
			
		||||
// supported by RegisterFunc.
 | 
			
		||||
//
 | 
			
		||||
// RegisterAggregator takes as implementation a constructor function
 | 
			
		||||
// that constructs an instance of the aggregator type each time an
 | 
			
		||||
// aggregation begins. The constructor must return a pointer to a
 | 
			
		||||
// type, or an interface that implements Step() and Done().
 | 
			
		||||
//
 | 
			
		||||
// The constructor function and the Step/Done methods may optionally
 | 
			
		||||
// return an error in addition to their other return values.
 | 
			
		||||
//
 | 
			
		||||
// See _example/go_custom_funcs for a detailed example.
 | 
			
		||||
func (c *SQLiteConn) RegisterAggregator(name string, impl interface{}, pure bool) error {
 | 
			
		||||
	var ai aggInfo
 | 
			
		||||
	ai.constructor = reflect.ValueOf(impl)
 | 
			
		||||
	t := ai.constructor.Type()
 | 
			
		||||
	if t.Kind() != reflect.Func {
 | 
			
		||||
		return errors.New("non-function passed to RegisterAggregator")
 | 
			
		||||
	}
 | 
			
		||||
	if t.NumOut() != 1 && t.NumOut() != 2 {
 | 
			
		||||
		return errors.New("SQLite aggregator constructors must return 1 or 2 values")
 | 
			
		||||
	}
 | 
			
		||||
	if t.NumOut() == 2 && !t.Out(1).Implements(reflect.TypeOf((*error)(nil)).Elem()) {
 | 
			
		||||
		return errors.New("Second return value of SQLite function must be error")
 | 
			
		||||
	}
 | 
			
		||||
	if t.NumIn() != 0 {
 | 
			
		||||
		return errors.New("SQLite aggregator constructors must not have arguments")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	agg := t.Out(0)
 | 
			
		||||
	switch agg.Kind() {
 | 
			
		||||
	case reflect.Ptr, reflect.Interface:
 | 
			
		||||
	default:
 | 
			
		||||
		return errors.New("SQlite aggregator constructor must return a pointer object")
 | 
			
		||||
	}
 | 
			
		||||
	stepFn, found := agg.MethodByName("Step")
 | 
			
		||||
	if !found {
 | 
			
		||||
		return errors.New("SQlite aggregator doesn't have a Step() function")
 | 
			
		||||
	}
 | 
			
		||||
	step := stepFn.Type
 | 
			
		||||
	if step.NumOut() != 0 && step.NumOut() != 1 {
 | 
			
		||||
		return errors.New("SQlite aggregator Step() function must return 0 or 1 values")
 | 
			
		||||
	}
 | 
			
		||||
	if step.NumOut() == 1 && !step.Out(0).Implements(reflect.TypeOf((*error)(nil)).Elem()) {
 | 
			
		||||
		return errors.New("type of SQlite aggregator Step() return value must be error")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	stepNArgs := step.NumIn()
 | 
			
		||||
	start := 0
 | 
			
		||||
	if agg.Kind() == reflect.Ptr {
 | 
			
		||||
		// Skip over the method receiver
 | 
			
		||||
		stepNArgs--
 | 
			
		||||
		start++
 | 
			
		||||
	}
 | 
			
		||||
	if step.IsVariadic() {
 | 
			
		||||
		stepNArgs--
 | 
			
		||||
	}
 | 
			
		||||
	for i := start; i < start+stepNArgs; i++ {
 | 
			
		||||
		conv, err := callbackArg(step.In(i))
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
		ai.stepArgConverters = append(ai.stepArgConverters, conv)
 | 
			
		||||
	}
 | 
			
		||||
	if step.IsVariadic() {
 | 
			
		||||
		conv, err := callbackArg(t.In(start + stepNArgs).Elem())
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
		ai.stepVariadicConverter = conv
 | 
			
		||||
		// Pass -1 to sqlite so that it allows any number of
 | 
			
		||||
		// arguments. The call helper verifies that the minimum number
 | 
			
		||||
		// of arguments is present for variadic functions.
 | 
			
		||||
		stepNArgs = -1
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	doneFn, found := agg.MethodByName("Done")
 | 
			
		||||
	if !found {
 | 
			
		||||
		return errors.New("SQlite aggregator doesn't have a Done() function")
 | 
			
		||||
	}
 | 
			
		||||
	done := doneFn.Type
 | 
			
		||||
	doneNArgs := done.NumIn()
 | 
			
		||||
	if agg.Kind() == reflect.Ptr {
 | 
			
		||||
		// Skip over the method receiver
 | 
			
		||||
		doneNArgs--
 | 
			
		||||
	}
 | 
			
		||||
	if doneNArgs != 0 {
 | 
			
		||||
		return errors.New("SQlite aggregator Done() function must have no arguments")
 | 
			
		||||
	}
 | 
			
		||||
	if done.NumOut() != 1 && done.NumOut() != 2 {
 | 
			
		||||
		return errors.New("SQLite aggregator Done() function must return 1 or 2 values")
 | 
			
		||||
	}
 | 
			
		||||
	if done.NumOut() == 2 && !done.Out(1).Implements(reflect.TypeOf((*error)(nil)).Elem()) {
 | 
			
		||||
		return errors.New("second return value of SQLite aggregator Done() function must be error")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	conv, err := callbackRet(done.Out(0))
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	ai.doneRetConverter = conv
 | 
			
		||||
	ai.active = make(map[int64]reflect.Value)
 | 
			
		||||
	ai.next = 1
 | 
			
		||||
 | 
			
		||||
	// ai must outlast the database connection, or we'll have dangling pointers.
 | 
			
		||||
	c.aggregators = append(c.aggregators, &ai)
 | 
			
		||||
 | 
			
		||||
	cname := C.CString(name)
 | 
			
		||||
	defer C.free(unsafe.Pointer(cname))
 | 
			
		||||
	opts := C.SQLITE_UTF8
 | 
			
		||||
	if pure {
 | 
			
		||||
		opts |= C.SQLITE_DETERMINISTIC
 | 
			
		||||
	}
 | 
			
		||||
	rv := sqlite3CreateFunction(c.db, cname, C.int(stepNArgs), C.int(opts), newHandle(c, &ai), nil, C.stepTrampoline, C.doneTrampoline)
 | 
			
		||||
	if rv != C.SQLITE_OK {
 | 
			
		||||
		return c.lastError()
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// SetTrace installs or removes the trace callback for the given database connection.
 | 
			
		||||
// It's not named 'RegisterTrace' because only one callback can be kept and called.
 | 
			
		||||
// Calling SetTrace a second time on same database connection
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										39
									
								
								vendor/github.com/mattn/go-sqlite3/sqlite3_usleep_windows.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								vendor/github.com/mattn/go-sqlite3/sqlite3_usleep_windows.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,39 @@
 | 
			
		||||
// Copyright (C) 2018 G.J.R. Timmer <gjr.timmer@gmail.com>.
 | 
			
		||||
//
 | 
			
		||||
// Use of this source code is governed by an MIT-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
// +build cgo
 | 
			
		||||
 | 
			
		||||
package sqlite3
 | 
			
		||||
 | 
			
		||||
// usleep is a function available on *nix based systems.
 | 
			
		||||
// This function is not present in Windows.
 | 
			
		||||
// Windows has a sleep function but this works with seconds
 | 
			
		||||
// and not with microseconds as usleep.
 | 
			
		||||
//
 | 
			
		||||
// This code should improve performance on windows because
 | 
			
		||||
// without the presence of usleep SQLite waits 1 second.
 | 
			
		||||
//
 | 
			
		||||
// Source: https://stackoverflow.com/questions/5801813/c-usleep-is-obsolete-workarounds-for-windows-mingw?utm_medium=organic&utm_source=google_rich_qa&utm_campaign=google_rich_qa
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
#include <windows.h>
 | 
			
		||||
 | 
			
		||||
void usleep(__int64 usec)
 | 
			
		||||
{
 | 
			
		||||
    HANDLE timer;
 | 
			
		||||
    LARGE_INTEGER ft;
 | 
			
		||||
 | 
			
		||||
    // Convert to 100 nanosecond interval, negative value indicates relative time
 | 
			
		||||
    ft.QuadPart = -(10*usec);
 | 
			
		||||
 | 
			
		||||
    timer = CreateWaitableTimer(NULL, TRUE, NULL);
 | 
			
		||||
    SetWaitableTimer(timer, &ft, 0, NULL, NULL, 0);
 | 
			
		||||
    WaitForSingleObject(timer, INFINITE);
 | 
			
		||||
    CloseHandle(timer);
 | 
			
		||||
}
 | 
			
		||||
*/
 | 
			
		||||
import "C"
 | 
			
		||||
 | 
			
		||||
// EOF
 | 
			
		||||
							
								
								
									
										8
									
								
								vendor/github.com/mattn/go-sqlite3/sqlite3_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										8
									
								
								vendor/github.com/mattn/go-sqlite3/sqlite3_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -2,13 +2,17 @@
 | 
			
		||||
//
 | 
			
		||||
// Use of this source code is governed by an MIT-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
// +build windows
 | 
			
		||||
 | 
			
		||||
package sqlite3
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
#cgo CFLAGS: -I. -fno-stack-check -fno-stack-protector -mno-stack-arg-probe
 | 
			
		||||
#cgo windows,386 CFLAGS: -D_USE_32BIT_TIME_T
 | 
			
		||||
#cgo CFLAGS: -I.
 | 
			
		||||
#cgo CFLAGS: -fno-stack-check
 | 
			
		||||
#cgo CFLAGS: -fno-stack-protector
 | 
			
		||||
#cgo CFLAGS: -mno-stack-arg-probe
 | 
			
		||||
#cgo LDFLAGS: -lmingwex -lmingw32
 | 
			
		||||
#cgo windows,386 CFLAGS: -D_USE_32BIT_TIME_T
 | 
			
		||||
*/
 | 
			
		||||
import "C"
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										75
									
								
								vendor/github.com/mattn/go-sqlite3/sqlite3ext.h
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										75
									
								
								vendor/github.com/mattn/go-sqlite3/sqlite3ext.h
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -18,7 +18,7 @@
 | 
			
		||||
*/
 | 
			
		||||
#ifndef SQLITE3EXT_H
 | 
			
		||||
#define SQLITE3EXT_H
 | 
			
		||||
#include "sqlite3.h"
 | 
			
		||||
#include "sqlite3-binding.h"
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
** The following structure holds pointers to all of the SQLite API
 | 
			
		||||
@@ -135,7 +135,7 @@ struct sqlite3_api_routines {
 | 
			
		||||
  int  (*set_authorizer)(sqlite3*,int(*)(void*,int,const char*,const char*,
 | 
			
		||||
                         const char*,const char*),void*);
 | 
			
		||||
  void  (*set_auxdata)(sqlite3_context*,int,void*,void (*)(void*));
 | 
			
		||||
  char * (*snprintf)(int,char*,const char*,...);
 | 
			
		||||
  char * (*xsnprintf)(int,char*,const char*,...);
 | 
			
		||||
  int  (*step)(sqlite3_stmt*);
 | 
			
		||||
  int  (*table_column_metadata)(sqlite3*,const char*,const char*,const char*,
 | 
			
		||||
                                char const**,char const**,int*,int*,int*);
 | 
			
		||||
@@ -247,7 +247,7 @@ struct sqlite3_api_routines {
 | 
			
		||||
  int (*uri_boolean)(const char*,const char*,int);
 | 
			
		||||
  sqlite3_int64 (*uri_int64)(const char*,const char*,sqlite3_int64);
 | 
			
		||||
  const char *(*uri_parameter)(const char*,const char*);
 | 
			
		||||
  char *(*vsnprintf)(int,char*,const char*,va_list);
 | 
			
		||||
  char *(*xvsnprintf)(int,char*,const char*,va_list);
 | 
			
		||||
  int (*wal_checkpoint_v2)(sqlite3*,const char*,int,int*,int*);
 | 
			
		||||
  /* Version 3.8.7 and later */
 | 
			
		||||
  int (*auto_extension)(void(*)(void));
 | 
			
		||||
@@ -283,6 +283,40 @@ struct sqlite3_api_routines {
 | 
			
		||||
  /* Version 3.14.0 and later */
 | 
			
		||||
  int (*trace_v2)(sqlite3*,unsigned,int(*)(unsigned,void*,void*,void*),void*);
 | 
			
		||||
  char *(*expanded_sql)(sqlite3_stmt*);
 | 
			
		||||
  /* Version 3.18.0 and later */
 | 
			
		||||
  void (*set_last_insert_rowid)(sqlite3*,sqlite3_int64);
 | 
			
		||||
  /* Version 3.20.0 and later */
 | 
			
		||||
  int (*prepare_v3)(sqlite3*,const char*,int,unsigned int,
 | 
			
		||||
                    sqlite3_stmt**,const char**);
 | 
			
		||||
  int (*prepare16_v3)(sqlite3*,const void*,int,unsigned int,
 | 
			
		||||
                      sqlite3_stmt**,const void**);
 | 
			
		||||
  int (*bind_pointer)(sqlite3_stmt*,int,void*,const char*,void(*)(void*));
 | 
			
		||||
  void (*result_pointer)(sqlite3_context*,void*,const char*,void(*)(void*));
 | 
			
		||||
  void *(*value_pointer)(sqlite3_value*,const char*);
 | 
			
		||||
  int (*vtab_nochange)(sqlite3_context*);
 | 
			
		||||
  int (*value_nochange)(sqlite3_value*);
 | 
			
		||||
  const char *(*vtab_collation)(sqlite3_index_info*,int);
 | 
			
		||||
  /* Version 3.24.0 and later */
 | 
			
		||||
  int (*keyword_count)(void);
 | 
			
		||||
  int (*keyword_name)(int,const char**,int*);
 | 
			
		||||
  int (*keyword_check)(const char*,int);
 | 
			
		||||
  sqlite3_str *(*str_new)(sqlite3*);
 | 
			
		||||
  char *(*str_finish)(sqlite3_str*);
 | 
			
		||||
  void (*str_appendf)(sqlite3_str*, const char *zFormat, ...);
 | 
			
		||||
  void (*str_vappendf)(sqlite3_str*, const char *zFormat, va_list);
 | 
			
		||||
  void (*str_append)(sqlite3_str*, const char *zIn, int N);
 | 
			
		||||
  void (*str_appendall)(sqlite3_str*, const char *zIn);
 | 
			
		||||
  void (*str_appendchar)(sqlite3_str*, int N, char C);
 | 
			
		||||
  void (*str_reset)(sqlite3_str*);
 | 
			
		||||
  int (*str_errcode)(sqlite3_str*);
 | 
			
		||||
  int (*str_length)(sqlite3_str*);
 | 
			
		||||
  char *(*str_value)(sqlite3_str*);
 | 
			
		||||
  int (*create_window_function)(sqlite3*,const char*,int,int,void*,
 | 
			
		||||
                            void (*xStep)(sqlite3_context*,int,sqlite3_value**),
 | 
			
		||||
                            void (*xFinal)(sqlite3_context*),
 | 
			
		||||
                            void (*xValue)(sqlite3_context*),
 | 
			
		||||
                            void (*xInv)(sqlite3_context*,int,sqlite3_value**),
 | 
			
		||||
                            void(*xDestroy)(void*));
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
@@ -409,7 +443,7 @@ typedef int (*sqlite3_loadext_entry)(
 | 
			
		||||
#define sqlite3_rollback_hook          sqlite3_api->rollback_hook
 | 
			
		||||
#define sqlite3_set_authorizer         sqlite3_api->set_authorizer
 | 
			
		||||
#define sqlite3_set_auxdata            sqlite3_api->set_auxdata
 | 
			
		||||
#define sqlite3_snprintf               sqlite3_api->snprintf
 | 
			
		||||
#define sqlite3_snprintf               sqlite3_api->xsnprintf
 | 
			
		||||
#define sqlite3_step                   sqlite3_api->step
 | 
			
		||||
#define sqlite3_table_column_metadata  sqlite3_api->table_column_metadata
 | 
			
		||||
#define sqlite3_thread_cleanup         sqlite3_api->thread_cleanup
 | 
			
		||||
@@ -433,7 +467,7 @@ typedef int (*sqlite3_loadext_entry)(
 | 
			
		||||
#define sqlite3_value_text16le         sqlite3_api->value_text16le
 | 
			
		||||
#define sqlite3_value_type             sqlite3_api->value_type
 | 
			
		||||
#define sqlite3_vmprintf               sqlite3_api->vmprintf
 | 
			
		||||
#define sqlite3_vsnprintf              sqlite3_api->vsnprintf
 | 
			
		||||
#define sqlite3_vsnprintf              sqlite3_api->xvsnprintf
 | 
			
		||||
#define sqlite3_overload_function      sqlite3_api->overload_function
 | 
			
		||||
#define sqlite3_prepare_v2             sqlite3_api->prepare_v2
 | 
			
		||||
#define sqlite3_prepare16_v2           sqlite3_api->prepare16_v2
 | 
			
		||||
@@ -509,7 +543,7 @@ typedef int (*sqlite3_loadext_entry)(
 | 
			
		||||
#define sqlite3_uri_boolean            sqlite3_api->uri_boolean
 | 
			
		||||
#define sqlite3_uri_int64              sqlite3_api->uri_int64
 | 
			
		||||
#define sqlite3_uri_parameter          sqlite3_api->uri_parameter
 | 
			
		||||
#define sqlite3_uri_vsnprintf          sqlite3_api->vsnprintf
 | 
			
		||||
#define sqlite3_uri_vsnprintf          sqlite3_api->xvsnprintf
 | 
			
		||||
#define sqlite3_wal_checkpoint_v2      sqlite3_api->wal_checkpoint_v2
 | 
			
		||||
/* Version 3.8.7 and later */
 | 
			
		||||
#define sqlite3_auto_extension         sqlite3_api->auto_extension
 | 
			
		||||
@@ -541,6 +575,35 @@ typedef int (*sqlite3_loadext_entry)(
 | 
			
		||||
/* Version 3.14.0 and later */
 | 
			
		||||
#define sqlite3_trace_v2               sqlite3_api->trace_v2
 | 
			
		||||
#define sqlite3_expanded_sql           sqlite3_api->expanded_sql
 | 
			
		||||
/* Version 3.18.0 and later */
 | 
			
		||||
#define sqlite3_set_last_insert_rowid  sqlite3_api->set_last_insert_rowid
 | 
			
		||||
/* Version 3.20.0 and later */
 | 
			
		||||
#define sqlite3_prepare_v3             sqlite3_api->prepare_v3
 | 
			
		||||
#define sqlite3_prepare16_v3           sqlite3_api->prepare16_v3
 | 
			
		||||
#define sqlite3_bind_pointer           sqlite3_api->bind_pointer
 | 
			
		||||
#define sqlite3_result_pointer         sqlite3_api->result_pointer
 | 
			
		||||
#define sqlite3_value_pointer          sqlite3_api->value_pointer
 | 
			
		||||
/* Version 3.22.0 and later */
 | 
			
		||||
#define sqlite3_vtab_nochange          sqlite3_api->vtab_nochange
 | 
			
		||||
#define sqlite3_value_nochange         sqlite3_api->value_nochange
 | 
			
		||||
#define sqlite3_vtab_collation         sqlite3_api->vtab_collation
 | 
			
		||||
/* Version 3.24.0 and later */
 | 
			
		||||
#define sqlite3_keyword_count          sqlite3_api->keyword_count
 | 
			
		||||
#define sqlite3_keyword_name           sqlite3_api->keyword_name
 | 
			
		||||
#define sqlite3_keyword_check          sqlite3_api->keyword_check
 | 
			
		||||
#define sqlite3_str_new                sqlite3_api->str_new
 | 
			
		||||
#define sqlite3_str_finish             sqlite3_api->str_finish
 | 
			
		||||
#define sqlite3_str_appendf            sqlite3_api->str_appendf
 | 
			
		||||
#define sqlite3_str_vappendf           sqlite3_api->str_vappendf
 | 
			
		||||
#define sqlite3_str_append             sqlite3_api->str_append
 | 
			
		||||
#define sqlite3_str_appendall          sqlite3_api->str_appendall
 | 
			
		||||
#define sqlite3_str_appendchar         sqlite3_api->str_appendchar
 | 
			
		||||
#define sqlite3_str_reset              sqlite3_api->str_reset
 | 
			
		||||
#define sqlite3_str_errcode            sqlite3_api->str_errcode
 | 
			
		||||
#define sqlite3_str_length             sqlite3_api->str_length
 | 
			
		||||
#define sqlite3_str_value              sqlite3_api->str_value
 | 
			
		||||
/* Version 3.25.0 and later */
 | 
			
		||||
#define sqlite3_create_window_function sqlite3_api->create_window_function
 | 
			
		||||
#endif /* !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION) */
 | 
			
		||||
 | 
			
		||||
#if !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION)
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										21
									
								
								vendor/github.com/mattn/go-sqlite3/static_mock.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								vendor/github.com/mattn/go-sqlite3/static_mock.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,21 @@
 | 
			
		||||
// +build !cgo
 | 
			
		||||
 | 
			
		||||
package sqlite3
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"database/sql"
 | 
			
		||||
	"database/sql/driver"
 | 
			
		||||
	"errors"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func init() {
 | 
			
		||||
	sql.Register("sqlite3", &SQLiteDriverMock{})
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type SQLiteDriverMock struct{}
 | 
			
		||||
 | 
			
		||||
var errorMsg = errors.New("Binary was compiled with 'CGO_ENABLED=0', go-sqlite3 requires cgo to work. This is a stub")
 | 
			
		||||
 | 
			
		||||
func (SQLiteDriverMock) Open(s string) (driver.Conn, error) {
 | 
			
		||||
	return nil, errorMsg
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user