Update dependencies and build to go1.22 (#2113)
* Update dependencies and build to go1.22 * Fix api changes wrt to dependencies * Update golangci config
This commit is contained in:
301
vendor/modernc.org/sqlite/sqlite.go
generated
vendored
301
vendor/modernc.org/sqlite/sqlite.go
generated
vendored
@@ -492,10 +492,34 @@ func toNamedValues(vals []driver.Value) (r []driver.NamedValue) {
|
||||
func (s *stmt) exec(ctx context.Context, args []driver.NamedValue) (r driver.Result, err error) {
|
||||
var pstmt uintptr
|
||||
var done int32
|
||||
if ctx != nil && ctx.Done() != nil {
|
||||
defer interruptOnDone(ctx, s.c, &done)()
|
||||
if ctx != nil {
|
||||
if ctxDone := ctx.Done(); ctxDone != nil {
|
||||
select {
|
||||
case <-ctxDone:
|
||||
return nil, ctx.Err()
|
||||
default:
|
||||
}
|
||||
defer interruptOnDone(ctx, s.c, &done)()
|
||||
}
|
||||
}
|
||||
|
||||
defer func() {
|
||||
if pstmt != 0 {
|
||||
// ensure stmt finalized.
|
||||
e := s.c.finalize(pstmt)
|
||||
|
||||
if err == nil && e != nil {
|
||||
// prioritize original
|
||||
// returned error.
|
||||
err = e
|
||||
}
|
||||
}
|
||||
|
||||
if ctx != nil && atomic.LoadInt32(&done) != 0 {
|
||||
r, err = nil, ctx.Err()
|
||||
}
|
||||
}()
|
||||
|
||||
for psql := s.psql; *(*byte)(unsafe.Pointer(psql)) != 0 && atomic.LoadInt32(&done) == 0; {
|
||||
if pstmt, err = s.c.prepareV2(&psql); err != nil {
|
||||
return nil, err
|
||||
@@ -532,7 +556,7 @@ func (s *stmt) exec(ctx context.Context, args []driver.NamedValue) (r driver.Res
|
||||
|
||||
switch rc & 0xff {
|
||||
case sqlite3.SQLITE_DONE, sqlite3.SQLITE_ROW:
|
||||
// nop
|
||||
r, err = newResult(s.c)
|
||||
default:
|
||||
return s.c.errstr(int32(rc))
|
||||
}
|
||||
@@ -540,7 +564,12 @@ func (s *stmt) exec(ctx context.Context, args []driver.NamedValue) (r driver.Res
|
||||
return nil
|
||||
}()
|
||||
|
||||
if e := s.c.finalize(pstmt); e != nil && err == nil {
|
||||
e := s.c.finalize(pstmt)
|
||||
pstmt = 0 // done with
|
||||
|
||||
if err == nil && e != nil {
|
||||
// prioritize original
|
||||
// returned error.
|
||||
err = e
|
||||
}
|
||||
|
||||
@@ -548,7 +577,7 @@ func (s *stmt) exec(ctx context.Context, args []driver.NamedValue) (r driver.Res
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
return newResult(s.c)
|
||||
return r, err
|
||||
}
|
||||
|
||||
// NumInput returns the number of placeholder parameters.
|
||||
@@ -576,14 +605,34 @@ func (s *stmt) Query(args []driver.Value) (driver.Rows, error) { //TODO StmtQuer
|
||||
func (s *stmt) query(ctx context.Context, args []driver.NamedValue) (r driver.Rows, err error) {
|
||||
var pstmt uintptr
|
||||
var done int32
|
||||
if ctx != nil && ctx.Done() != nil {
|
||||
defer interruptOnDone(ctx, s.c, &done)()
|
||||
if ctx != nil {
|
||||
if ctxDone := ctx.Done(); ctxDone != nil {
|
||||
select {
|
||||
case <-ctxDone:
|
||||
return nil, ctx.Err()
|
||||
default:
|
||||
}
|
||||
defer interruptOnDone(ctx, s.c, &done)()
|
||||
}
|
||||
}
|
||||
|
||||
var allocs []uintptr
|
||||
|
||||
defer func() {
|
||||
if r == nil && err == nil {
|
||||
if pstmt != 0 {
|
||||
// ensure stmt finalized.
|
||||
e := s.c.finalize(pstmt)
|
||||
|
||||
if err == nil && e != nil {
|
||||
// prioritize original
|
||||
// returned error.
|
||||
err = e
|
||||
}
|
||||
}
|
||||
|
||||
if ctx != nil && atomic.LoadInt32(&done) != 0 {
|
||||
r, err = nil, ctx.Err()
|
||||
} else if r == nil && err == nil {
|
||||
r, err = newRows(s.c, pstmt, allocs, true)
|
||||
}
|
||||
}()
|
||||
@@ -651,7 +700,13 @@ func (s *stmt) query(ctx context.Context, args []driver.NamedValue) (r driver.Ro
|
||||
}
|
||||
return nil
|
||||
}()
|
||||
if e := s.c.finalize(pstmt); e != nil && err == nil {
|
||||
|
||||
e := s.c.finalize(pstmt)
|
||||
pstmt = 0 // done with
|
||||
|
||||
if err == nil && e != nil {
|
||||
// prioritize original
|
||||
// returned error.
|
||||
err = e
|
||||
}
|
||||
|
||||
@@ -666,7 +721,7 @@ type tx struct {
|
||||
c *conn
|
||||
}
|
||||
|
||||
func newTx(c *conn, opts driver.TxOptions) (*tx, error) {
|
||||
func newTx(ctx context.Context, c *conn, opts driver.TxOptions) (*tx, error) {
|
||||
r := &tx{c: c}
|
||||
|
||||
sql := "begin"
|
||||
@@ -674,7 +729,7 @@ func newTx(c *conn, opts driver.TxOptions) (*tx, error) {
|
||||
sql = "begin " + c.beginMode
|
||||
}
|
||||
|
||||
if err := r.exec(context.Background(), sql); err != nil {
|
||||
if err := r.exec(ctx, sql); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
@@ -1148,32 +1203,6 @@ func (c *conn) bindText(pstmt uintptr, idx1 int, value string) (uintptr, error)
|
||||
return p, nil
|
||||
}
|
||||
|
||||
// C documentation
|
||||
//
|
||||
// int sqlite3_bind_blob(sqlite3_stmt*, int, const void*, int n, void(*)(void*));
|
||||
func (c *conn) bindBlob(pstmt uintptr, idx1 int, value []byte) (uintptr, error) {
|
||||
if value != nil && len(value) == 0 {
|
||||
if rc := sqlite3.Xsqlite3_bind_zeroblob(c.tls, pstmt, int32(idx1), 0); rc != sqlite3.SQLITE_OK {
|
||||
return 0, c.errstr(rc)
|
||||
}
|
||||
return 0, nil
|
||||
}
|
||||
|
||||
p, err := c.malloc(len(value))
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
if len(value) != 0 {
|
||||
copy((*libc.RawMem)(unsafe.Pointer(p))[:len(value):len(value)], value)
|
||||
}
|
||||
if rc := sqlite3.Xsqlite3_bind_blob(c.tls, pstmt, int32(idx1), p, int32(len(value)), 0); rc != sqlite3.SQLITE_OK {
|
||||
c.free(p)
|
||||
return 0, c.errstr(rc)
|
||||
}
|
||||
|
||||
return p, nil
|
||||
}
|
||||
|
||||
// C documentation
|
||||
//
|
||||
// int sqlite3_bind_int(sqlite3_stmt*, int, int);
|
||||
@@ -1390,7 +1419,7 @@ func (c *conn) Begin() (dt driver.Tx, err error) {
|
||||
}
|
||||
|
||||
func (c *conn) begin(ctx context.Context, opts driver.TxOptions) (t driver.Tx, err error) {
|
||||
return newTx(c, opts)
|
||||
return newTx(ctx, c, opts)
|
||||
}
|
||||
|
||||
// Close invalidates and potentially stops any current prepared statements and
|
||||
@@ -1540,6 +1569,91 @@ func (c *conn) createFunctionInternal(fun *userDefinedFunction) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
type collation struct {
|
||||
zName uintptr
|
||||
pApp uintptr
|
||||
enc int32
|
||||
}
|
||||
|
||||
// RegisterCollationUtf8 makes a Go function available as a collation named zName.
|
||||
// impl receives two UTF-8 strings: left and right.
|
||||
// The result needs to be:
|
||||
//
|
||||
// - 0 if left == right
|
||||
// - 1 if left < right
|
||||
// - +1 if left > right
|
||||
//
|
||||
// impl must always return the same result given the same inputs.
|
||||
// Additionally, it must have the following properties for all strings A, B and C:
|
||||
// - if A==B, then B==A
|
||||
// - if A==B and B==C, then A==C
|
||||
// - if A<B, then B>A
|
||||
// - if A<B and B<C, then A<C.
|
||||
//
|
||||
// The new collation will be available to all new connections opened after
|
||||
// executing RegisterCollationUtf8.
|
||||
func RegisterCollationUtf8(
|
||||
zName string,
|
||||
impl func(left, right string) int,
|
||||
) error {
|
||||
return registerCollation(zName, impl, sqlite3.SQLITE_UTF8)
|
||||
}
|
||||
|
||||
// MustRegisterCollationUtf8 is like RegisterCollationUtf8 but panics on error.
|
||||
func MustRegisterCollationUtf8(
|
||||
zName string,
|
||||
impl func(left, right string) int,
|
||||
) {
|
||||
if err := RegisterCollationUtf8(zName, impl); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
}
|
||||
|
||||
func registerCollation(
|
||||
zName string,
|
||||
impl func(left, right string) int,
|
||||
enc int32,
|
||||
) error {
|
||||
if _, ok := d.collations[zName]; ok {
|
||||
return fmt.Errorf("a collation %q is already registered", zName)
|
||||
}
|
||||
|
||||
// dont free, collations registered on the driver live as long as the program
|
||||
name, err := libc.CString(zName)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
xCollations.mu.Lock()
|
||||
id := xCollations.ids.next()
|
||||
xCollations.m[id] = impl
|
||||
xCollations.mu.Unlock()
|
||||
|
||||
d.collations[zName] = &collation{
|
||||
zName: name,
|
||||
pApp: id,
|
||||
enc: enc,
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (c *conn) createCollationInternal(coll *collation) error {
|
||||
rc := sqlite3.Xsqlite3_create_collation_v2(
|
||||
c.tls,
|
||||
c.db,
|
||||
coll.zName,
|
||||
coll.enc,
|
||||
coll.pApp,
|
||||
cFuncPointer(collationTrampoline),
|
||||
0,
|
||||
)
|
||||
if rc != sqlite3.SQLITE_OK {
|
||||
return c.errstr(rc)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// Execer is an optional interface that may be implemented by a Conn.
|
||||
//
|
||||
// If a Conn does not implement Execer, the sql package's DB.Exec will first
|
||||
@@ -1759,17 +1873,52 @@ func (b *Backup) Finish() error {
|
||||
}
|
||||
}
|
||||
|
||||
type ExecQuerierContext interface {
|
||||
driver.ExecerContext
|
||||
driver.QueryerContext
|
||||
}
|
||||
|
||||
// Commit releases all resources associated with the Backup object but does not
|
||||
// close the destination database connection.
|
||||
//
|
||||
// The destination database connection is returned to the caller or an error if raised.
|
||||
// It is the responsibility of the caller to handle the connection closure.
|
||||
func (b *Backup) Commit() (driver.Conn, error) {
|
||||
rc := sqlite3.Xsqlite3_backup_finish(b.srcConn.tls, b.pBackup)
|
||||
|
||||
if rc == sqlite3.SQLITE_OK {
|
||||
return b.dstConn, nil
|
||||
} else {
|
||||
return nil, b.srcConn.errstr(rc)
|
||||
}
|
||||
}
|
||||
|
||||
// ConnectionHookFn function type for a connection hook on the Driver. Connection
|
||||
// hooks are called after the connection has been set up.
|
||||
type ConnectionHookFn func(
|
||||
conn ExecQuerierContext,
|
||||
dsn string,
|
||||
) error
|
||||
|
||||
// Driver implements database/sql/driver.Driver.
|
||||
type Driver struct {
|
||||
// user defined functions that are added to every new connection on Open
|
||||
udfs map[string]*userDefinedFunction
|
||||
// collations that are added to every new connection on Open
|
||||
collations map[string]*collation
|
||||
// connection hooks are called after a connection is opened
|
||||
connectionHooks []ConnectionHookFn
|
||||
}
|
||||
|
||||
var d = &Driver{udfs: make(map[string]*userDefinedFunction)}
|
||||
var d = &Driver{
|
||||
udfs: make(map[string]*userDefinedFunction, 0),
|
||||
collations: make(map[string]*collation, 0),
|
||||
connectionHooks: make([]ConnectionHookFn, 0),
|
||||
}
|
||||
|
||||
func newDriver() *Driver { return d }
|
||||
|
||||
// Open returns a new connection to the database. The name is a string in a
|
||||
// Open returns a new connection to the database. The name is a string in a
|
||||
// driver-specific format.
|
||||
//
|
||||
// Open may return a cached connection (one previously closed), but doing so is
|
||||
@@ -1778,14 +1927,14 @@ func newDriver() *Driver { return d }
|
||||
//
|
||||
// The returned connection is only used by one goroutine at a time.
|
||||
//
|
||||
// If name contains a '?', what follows is treated as a query string. This
|
||||
// driver supports the following query parameters:
|
||||
// The name may be a filename, e.g., "/tmp/mydata.sqlite", or a URI, in which
|
||||
// case it may include a '?' followed by one or more query parameters.
|
||||
// For example, "file:///tmp/mydata.sqlite?_pragma=foreign_keys(1)&_time_format=sqlite".
|
||||
// The supported query parameters are:
|
||||
//
|
||||
// _pragma: Each value will be run as a "PRAGMA ..." statement (with the PRAGMA
|
||||
// keyword added for you). May be specified more than once. Example:
|
||||
// "_pragma=foreign_keys(1)" will enable foreign key enforcement. More
|
||||
// information on supported PRAGMAs is available from the SQLite documentation:
|
||||
// https://www.sqlite.org/pragma.html
|
||||
// keyword added for you). May be specified more than once, '&'-separated. For more
|
||||
// information on supported PRAGMAs see: https://www.sqlite.org/pragma.html
|
||||
//
|
||||
// _time_format: The name of a format to use when writing time values to the
|
||||
// database. Currently the only supported value is "sqlite", which corresponds
|
||||
@@ -1794,9 +1943,7 @@ func newDriver() *Driver { return d }
|
||||
// the default String() format will be used.
|
||||
//
|
||||
// _txlock: The locking behavior to use when beginning a transaction. May be
|
||||
// "deferred", "immediate", or "exclusive" (case insensitive). The default is to
|
||||
// not specify one, which SQLite maps to "deferred". More information is
|
||||
// available at
|
||||
// "deferred" (the default), "immediate", or "exclusive" (case insensitive). See:
|
||||
// https://www.sqlite.org/lang_transaction.html#deferred_immediate_and_exclusive_transactions
|
||||
func (d *Driver) Open(name string) (conn driver.Conn, err error) {
|
||||
if dmesgs {
|
||||
@@ -1815,6 +1962,18 @@ func (d *Driver) Open(name string) (conn driver.Conn, err error) {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
for _, coll := range d.collations {
|
||||
if err = c.createCollationInternal(coll); err != nil {
|
||||
c.Close()
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
for _, connHookFn := range d.connectionHooks {
|
||||
if err = connHookFn(c, name); err != nil {
|
||||
c.Close()
|
||||
return nil, fmt.Errorf("connection hook: %w", err)
|
||||
}
|
||||
}
|
||||
return c, nil
|
||||
}
|
||||
|
||||
@@ -1969,6 +2128,18 @@ func registerFunction(
|
||||
return nil
|
||||
}
|
||||
|
||||
// RegisterConnectionHook registers a function to be called after each connection
|
||||
// is opened. This is called after all the connection has been set up.
|
||||
func (d *Driver) RegisterConnectionHook(fn ConnectionHookFn) {
|
||||
d.connectionHooks = append(d.connectionHooks, fn)
|
||||
}
|
||||
|
||||
// RegisterConnectionHook registers a function to be called after each connection
|
||||
// is opened. This is called after all the connection has been set up.
|
||||
func RegisterConnectionHook(fn ConnectionHookFn) {
|
||||
d.RegisterConnectionHook(fn)
|
||||
}
|
||||
|
||||
func origin(skip int) string {
|
||||
pc, fn, fl, _ := runtime.Caller(skip)
|
||||
f := runtime.FuncForPC(pc)
|
||||
@@ -2100,6 +2271,14 @@ var (
|
||||
}{
|
||||
m: make(map[uintptr]AggregateFunction),
|
||||
}
|
||||
|
||||
xCollations = struct {
|
||||
mu sync.RWMutex
|
||||
m map[uintptr]func(string, string) int
|
||||
ids idGen
|
||||
}{
|
||||
m: make(map[uintptr]func(string, string) int),
|
||||
}
|
||||
)
|
||||
|
||||
type idGen struct {
|
||||
@@ -2267,6 +2446,30 @@ func finalTrampoline(tls *libc.TLS, ctx uintptr) {
|
||||
xAggregateContext.ids.reclaim(id)
|
||||
}
|
||||
|
||||
func collationTrampoline(tls *libc.TLS, pApp uintptr, nLeft int32, zLeft uintptr, nRight int32, zRight uintptr) int32 {
|
||||
xCollations.mu.RLock()
|
||||
xCollation := xCollations.m[pApp]
|
||||
xCollations.mu.RUnlock()
|
||||
|
||||
left := string(libc.GoBytes(zLeft, int(nLeft)))
|
||||
right := string(libc.GoBytes(zRight, int(nRight)))
|
||||
|
||||
// res is of type int, which can be 64-bit wide
|
||||
// Since we just need to know if the value is positive, negative, or zero, we can ensure it's -1, 0, +1
|
||||
res := xCollation(left, right)
|
||||
switch {
|
||||
case res < 0:
|
||||
return -1
|
||||
case res == 0:
|
||||
return 0
|
||||
case res > 0:
|
||||
return 1
|
||||
default:
|
||||
// Should never hit here, make the compiler happy
|
||||
return 0
|
||||
}
|
||||
}
|
||||
|
||||
// C documentation
|
||||
//
|
||||
// int sqlite3_limit(sqlite3*, int id, int newVal);
|
||||
|
||||
Reference in New Issue
Block a user