From 24f6760c0e355903458f71e539201c8bf37cfac6 Mon Sep 17 00:00:00 2001 From: kim <89579420+NyaaaWhatsUpDoc@users.noreply.github.com> Date: Thu, 13 Feb 2025 08:53:40 +0000 Subject: [PATCH] [chore] bump ncruces go-sqlite3 => v0.23.0 (#3785) * bump ncruces go-sqlite3 => v0.23.0 * whoops, add missing vendor changes... --- go.mod | 2 +- go.sum | 4 +- .../github.com/ncruces/go-sqlite3/.gitignore | 3 + .../github.com/ncruces/go-sqlite3/backup.go | 38 +-- vendor/github.com/ncruces/go-sqlite3/blob.go | 64 ++--- .../github.com/ncruces/go-sqlite3/config.go | 158 +++++------ vendor/github.com/ncruces/go-sqlite3/conn.go | 147 +++++----- vendor/github.com/ncruces/go-sqlite3/const.go | 16 +- .../github.com/ncruces/go-sqlite3/context.go | 40 +-- .../ncruces/go-sqlite3/driver/driver.go | 28 +- .../ncruces/go-sqlite3/embed/README.md | 2 +- .../ncruces/go-sqlite3/embed/sqlite3.wasm | Bin 1395963 -> 1397089 bytes vendor/github.com/ncruces/go-sqlite3/error.go | 16 +- vendor/github.com/ncruces/go-sqlite3/func.go | 77 +++--- vendor/github.com/ncruces/go-sqlite3/go.work | 7 - .../github.com/ncruces/go-sqlite3/go.work.sum | 17 -- .../ncruces/go-sqlite3/internal/util/func.go | 3 - .../go-sqlite3/internal/util/handle.go | 12 +- .../ncruces/go-sqlite3/internal/util/json.go | 17 +- .../ncruces/go-sqlite3/internal/util/mem.go | 101 ++++--- .../go-sqlite3/internal/util/mmap_unix.go | 18 +- .../go-sqlite3/internal/util/mmap_windows.go | 6 +- .../github.com/ncruces/go-sqlite3/sqlite.go | 79 +++--- vendor/github.com/ncruces/go-sqlite3/stmt.go | 256 +++++++++--------- vendor/github.com/ncruces/go-sqlite3/txn.go | 29 +- .../ncruces/go-sqlite3/util/sql3util/parse.go | 18 +- vendor/github.com/ncruces/go-sqlite3/value.go | 65 +++-- .../github.com/ncruces/go-sqlite3/vfs/api.go | 4 +- .../github.com/ncruces/go-sqlite3/vfs/cksm.go | 8 +- .../ncruces/go-sqlite3/vfs/const.go | 7 +- .../github.com/ncruces/go-sqlite3/vfs/file.go | 8 +- .../ncruces/go-sqlite3/vfs/filename.go | 34 +-- .../ncruces/go-sqlite3/vfs/memdb/memdb.go | 4 +- .../ncruces/go-sqlite3/vfs/shm_bsd.go | 2 +- .../ncruces/go-sqlite3/vfs/shm_dotlk.go | 14 +- .../ncruces/go-sqlite3/vfs/shm_ofd.go | 2 +- .../ncruces/go-sqlite3/vfs/shm_windows.go | 14 +- .../github.com/ncruces/go-sqlite3/vfs/vfs.go | 157 ++++++----- vendor/github.com/ncruces/go-sqlite3/vtab.go | 186 +++++++------ vendor/modules.txt | 6 +- 40 files changed, 836 insertions(+), 833 deletions(-) delete mode 100644 vendor/github.com/ncruces/go-sqlite3/go.work delete mode 100644 vendor/github.com/ncruces/go-sqlite3/go.work.sum diff --git a/go.mod b/go.mod index b7d816a63..c3ed7ce1d 100644 --- a/go.mod +++ b/go.mod @@ -48,7 +48,7 @@ require ( github.com/miekg/dns v1.1.63 github.com/minio/minio-go/v7 v7.0.85 github.com/mitchellh/mapstructure v1.5.0 - github.com/ncruces/go-sqlite3 v0.22.0 + github.com/ncruces/go-sqlite3 v0.23.0 github.com/oklog/ulid v1.3.1 github.com/prometheus/client_golang v1.20.5 github.com/rivo/uniseg v0.4.7 diff --git a/go.sum b/go.sum index a3481ce82..edd0345bd 100644 --- a/go.sum +++ b/go.sum @@ -424,8 +424,8 @@ github.com/moul/http2curl v1.0.0 h1:dRMWoAtb+ePxMlLkrCbAqh4TlPHXvoGUSQ323/9Zahs= github.com/moul/http2curl v1.0.0/go.mod h1:8UbvGypXm98wA/IqH45anm5Y2Z6ep6O31QGOAZ3H0fQ= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/ncruces/go-sqlite3 v0.22.0 h1:FkGSBhd0TY6e66k1LVhyEpA+RnG/8QkQNed5pjIk4cs= -github.com/ncruces/go-sqlite3 v0.22.0/go.mod h1:ueXOZXYZS2OFQirCU3mHneDwJm5fGKHrtccYBeGEV7M= +github.com/ncruces/go-sqlite3 v0.23.0 h1:90j/ar8Ywu2AtsfDl5WhO9sgP/rNk76BcKGIzAHO8AQ= +github.com/ncruces/go-sqlite3 v0.23.0/go.mod h1:gq2nriHSczOs11SqGW5+0X+SgLdkdj4K+j4F/AhQ+8g= github.com/ncruces/go-strftime v0.1.9 h1:bY0MQC28UADQmHmaF5dgpLmImcShSi2kHU9XLdhx/f4= github.com/ncruces/go-strftime v0.1.9/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJmn9CehxcKcls= github.com/ncruces/julianday v1.0.0 h1:fH0OKwa7NWvniGQtxdJRxAgkBMolni2BjDHaWTxqt7M= diff --git a/vendor/github.com/ncruces/go-sqlite3/.gitignore b/vendor/github.com/ncruces/go-sqlite3/.gitignore index c8b2376cd..9a50edc5c 100644 --- a/vendor/github.com/ncruces/go-sqlite3/.gitignore +++ b/vendor/github.com/ncruces/go-sqlite3/.gitignore @@ -5,6 +5,9 @@ *.so *.dylib +# Go workspace +go.work* + # Test binary, built with `go test -c` *.test diff --git a/vendor/github.com/ncruces/go-sqlite3/backup.go b/vendor/github.com/ncruces/go-sqlite3/backup.go index b16c7511e..58b6229a7 100644 --- a/vendor/github.com/ncruces/go-sqlite3/backup.go +++ b/vendor/github.com/ncruces/go-sqlite3/backup.go @@ -5,8 +5,8 @@ package sqlite3 // https://sqlite.org/c3ref/backup.html type Backup struct { c *Conn - handle uint32 - otherc uint32 + handle ptr_t + otherc ptr_t } // Backup backs up srcDB on the src connection to the "main" database in dstURI. @@ -61,7 +61,7 @@ func (src *Conn) BackupInit(srcDB, dstURI string) (*Backup, error) { return src.backupInit(dst, "main", src.handle, srcDB) } -func (c *Conn) backupInit(dst uint32, dstName string, src uint32, srcName string) (*Backup, error) { +func (c *Conn) backupInit(dst ptr_t, dstName string, src ptr_t, srcName string) (*Backup, error) { defer c.arena.mark()() dstPtr := c.arena.string(dstName) srcPtr := c.arena.string(srcName) @@ -71,19 +71,19 @@ func (c *Conn) backupInit(dst uint32, dstName string, src uint32, srcName string other = src } - r := c.call("sqlite3_backup_init", - uint64(dst), uint64(dstPtr), - uint64(src), uint64(srcPtr)) - if r == 0 { + ptr := ptr_t(c.call("sqlite3_backup_init", + stk_t(dst), stk_t(dstPtr), + stk_t(src), stk_t(srcPtr))) + if ptr == 0 { defer c.closeDB(other) - r = c.call("sqlite3_errcode", uint64(dst)) - return nil, c.sqlite.error(r, dst) + rc := res_t(c.call("sqlite3_errcode", stk_t(dst))) + return nil, c.sqlite.error(rc, dst) } return &Backup{ c: c, otherc: other, - handle: uint32(r), + handle: ptr, }, nil } @@ -97,10 +97,10 @@ func (b *Backup) Close() error { return nil } - r := b.c.call("sqlite3_backup_finish", uint64(b.handle)) + rc := res_t(b.c.call("sqlite3_backup_finish", stk_t(b.handle))) b.c.closeDB(b.otherc) b.handle = 0 - return b.c.error(r) + return b.c.error(rc) } // Step copies up to nPage pages between the source and destination databases. @@ -108,11 +108,11 @@ func (b *Backup) Close() error { // // https://sqlite.org/c3ref/backup_finish.html#sqlite3backupstep func (b *Backup) Step(nPage int) (done bool, err error) { - r := b.c.call("sqlite3_backup_step", uint64(b.handle), uint64(nPage)) - if r == _DONE { + rc := res_t(b.c.call("sqlite3_backup_step", stk_t(b.handle), stk_t(nPage))) + if rc == _DONE { return true, nil } - return false, b.c.error(r) + return false, b.c.error(rc) } // Remaining returns the number of pages still to be backed up @@ -120,8 +120,8 @@ func (b *Backup) Step(nPage int) (done bool, err error) { // // https://sqlite.org/c3ref/backup_finish.html#sqlite3backupremaining func (b *Backup) Remaining() int { - r := b.c.call("sqlite3_backup_remaining", uint64(b.handle)) - return int(int32(r)) + n := int32(b.c.call("sqlite3_backup_remaining", stk_t(b.handle))) + return int(n) } // PageCount returns the total number of pages in the source database @@ -129,6 +129,6 @@ func (b *Backup) Remaining() int { // // https://sqlite.org/c3ref/backup_finish.html#sqlite3backuppagecount func (b *Backup) PageCount() int { - r := b.c.call("sqlite3_backup_pagecount", uint64(b.handle)) - return int(int32(r)) + n := int32(b.c.call("sqlite3_backup_pagecount", stk_t(b.handle))) + return int(n) } diff --git a/vendor/github.com/ncruces/go-sqlite3/blob.go b/vendor/github.com/ncruces/go-sqlite3/blob.go index a0969eb69..2fac72045 100644 --- a/vendor/github.com/ncruces/go-sqlite3/blob.go +++ b/vendor/github.com/ncruces/go-sqlite3/blob.go @@ -20,8 +20,8 @@ type Blob struct { c *Conn bytes int64 offset int64 - handle uint32 - bufptr uint32 + handle ptr_t + bufptr ptr_t buflen int64 } @@ -37,23 +37,23 @@ func (c *Conn) OpenBlob(db, table, column string, row int64, write bool) (*Blob, tablePtr := c.arena.string(table) columnPtr := c.arena.string(column) - var flags uint64 + var flags int32 if write { flags = 1 } c.checkInterrupt(c.handle) - r := c.call("sqlite3_blob_open", uint64(c.handle), - uint64(dbPtr), uint64(tablePtr), uint64(columnPtr), - uint64(row), flags, uint64(blobPtr)) + rc := res_t(c.call("sqlite3_blob_open", stk_t(c.handle), + stk_t(dbPtr), stk_t(tablePtr), stk_t(columnPtr), + stk_t(row), stk_t(flags), stk_t(blobPtr))) - if err := c.error(r); err != nil { + if err := c.error(rc); err != nil { return nil, err } blob := Blob{c: c} - blob.handle = util.ReadUint32(c.mod, blobPtr) - blob.bytes = int64(c.call("sqlite3_blob_bytes", uint64(blob.handle))) + blob.handle = util.Read32[ptr_t](c.mod, blobPtr) + blob.bytes = int64(int32(c.call("sqlite3_blob_bytes", stk_t(blob.handle)))) return &blob, nil } @@ -67,10 +67,10 @@ func (b *Blob) Close() error { return nil } - r := b.c.call("sqlite3_blob_close", uint64(b.handle)) + rc := res_t(b.c.call("sqlite3_blob_close", stk_t(b.handle))) b.c.free(b.bufptr) b.handle = 0 - return b.c.error(r) + return b.c.error(rc) } // Size returns the size of the BLOB in bytes. @@ -94,13 +94,13 @@ func (b *Blob) Read(p []byte) (n int, err error) { want = avail } if want > b.buflen { - b.bufptr = b.c.realloc(b.bufptr, uint64(want)) + b.bufptr = b.c.realloc(b.bufptr, want) b.buflen = want } - r := b.c.call("sqlite3_blob_read", uint64(b.handle), - uint64(b.bufptr), uint64(want), uint64(b.offset)) - err = b.c.error(r) + rc := res_t(b.c.call("sqlite3_blob_read", stk_t(b.handle), + stk_t(b.bufptr), stk_t(want), stk_t(b.offset))) + err = b.c.error(rc) if err != nil { return 0, err } @@ -109,7 +109,7 @@ func (b *Blob) Read(p []byte) (n int, err error) { err = io.EOF } - copy(p, util.View(b.c.mod, b.bufptr, uint64(want))) + copy(p, util.View(b.c.mod, b.bufptr, want)) return int(want), err } @@ -127,19 +127,19 @@ func (b *Blob) WriteTo(w io.Writer) (n int64, err error) { want = avail } if want > b.buflen { - b.bufptr = b.c.realloc(b.bufptr, uint64(want)) + b.bufptr = b.c.realloc(b.bufptr, want) b.buflen = want } for want > 0 { - r := b.c.call("sqlite3_blob_read", uint64(b.handle), - uint64(b.bufptr), uint64(want), uint64(b.offset)) - err = b.c.error(r) + rc := res_t(b.c.call("sqlite3_blob_read", stk_t(b.handle), + stk_t(b.bufptr), stk_t(want), stk_t(b.offset))) + err = b.c.error(rc) if err != nil { return n, err } - mem := util.View(b.c.mod, b.bufptr, uint64(want)) + mem := util.View(b.c.mod, b.bufptr, want) m, err := w.Write(mem[:want]) b.offset += int64(m) n += int64(m) @@ -165,14 +165,14 @@ func (b *Blob) WriteTo(w io.Writer) (n int64, err error) { func (b *Blob) Write(p []byte) (n int, err error) { want := int64(len(p)) if want > b.buflen { - b.bufptr = b.c.realloc(b.bufptr, uint64(want)) + b.bufptr = b.c.realloc(b.bufptr, want) b.buflen = want } util.WriteBytes(b.c.mod, b.bufptr, p) - r := b.c.call("sqlite3_blob_write", uint64(b.handle), - uint64(b.bufptr), uint64(want), uint64(b.offset)) - err = b.c.error(r) + rc := res_t(b.c.call("sqlite3_blob_write", stk_t(b.handle), + stk_t(b.bufptr), stk_t(want), stk_t(b.offset))) + err = b.c.error(rc) if err != nil { return 0, err } @@ -196,17 +196,17 @@ func (b *Blob) ReadFrom(r io.Reader) (n int64, err error) { want = 1 } if want > b.buflen { - b.bufptr = b.c.realloc(b.bufptr, uint64(want)) + b.bufptr = b.c.realloc(b.bufptr, want) b.buflen = want } for { - mem := util.View(b.c.mod, b.bufptr, uint64(want)) + mem := util.View(b.c.mod, b.bufptr, want) m, err := r.Read(mem[:want]) if m > 0 { - r := b.c.call("sqlite3_blob_write", uint64(b.handle), - uint64(b.bufptr), uint64(m), uint64(b.offset)) - err := b.c.error(r) + rc := res_t(b.c.call("sqlite3_blob_write", stk_t(b.handle), + stk_t(b.bufptr), stk_t(m), stk_t(b.offset))) + err := b.c.error(rc) if err != nil { return n, err } @@ -254,8 +254,8 @@ func (b *Blob) Seek(offset int64, whence int) (int64, error) { // https://sqlite.org/c3ref/blob_reopen.html func (b *Blob) Reopen(row int64) error { b.c.checkInterrupt(b.c.handle) - err := b.c.error(b.c.call("sqlite3_blob_reopen", uint64(b.handle), uint64(row))) - b.bytes = int64(b.c.call("sqlite3_blob_bytes", uint64(b.handle))) + err := b.c.error(res_t(b.c.call("sqlite3_blob_reopen", stk_t(b.handle), stk_t(row)))) + b.bytes = int64(int32(b.c.call("sqlite3_blob_bytes", stk_t(b.handle)))) b.offset = 0 return err } diff --git a/vendor/github.com/ncruces/go-sqlite3/config.go b/vendor/github.com/ncruces/go-sqlite3/config.go index 474f960a2..7fff6ead3 100644 --- a/vendor/github.com/ncruces/go-sqlite3/config.go +++ b/vendor/github.com/ncruces/go-sqlite3/config.go @@ -32,7 +32,7 @@ func (c *Conn) Config(op DBConfig, arg ...bool) (bool, error) { defer c.arena.mark()() argsPtr := c.arena.new(intlen + ptrlen) - var flag int + var flag int32 switch { case len(arg) == 0: flag = -1 @@ -40,31 +40,31 @@ func (c *Conn) Config(op DBConfig, arg ...bool) (bool, error) { flag = 1 } - util.WriteUint32(c.mod, argsPtr+0*ptrlen, uint32(flag)) - util.WriteUint32(c.mod, argsPtr+1*ptrlen, argsPtr) + util.Write32(c.mod, argsPtr+0*ptrlen, flag) + util.Write32(c.mod, argsPtr+1*ptrlen, argsPtr) - r := c.call("sqlite3_db_config", uint64(c.handle), - uint64(op), uint64(argsPtr)) - return util.ReadUint32(c.mod, argsPtr) != 0, c.error(r) + rc := res_t(c.call("sqlite3_db_config", stk_t(c.handle), + stk_t(op), stk_t(argsPtr))) + return util.Read32[uint32](c.mod, argsPtr) != 0, c.error(rc) } // ConfigLog sets up the error logging callback for the connection. // // https://sqlite.org/errlog.html func (c *Conn) ConfigLog(cb func(code ExtendedErrorCode, msg string)) error { - var enable uint64 + var enable int32 if cb != nil { enable = 1 } - r := c.call("sqlite3_config_log_go", enable) - if err := c.error(r); err != nil { + rc := res_t(c.call("sqlite3_config_log_go", stk_t(enable))) + if err := c.error(rc); err != nil { return err } c.log = cb return nil } -func logCallback(ctx context.Context, mod api.Module, _, iCode, zMsg uint32) { +func logCallback(ctx context.Context, mod api.Module, _ ptr_t, iCode res_t, zMsg ptr_t) { if c, ok := ctx.Value(connKey{}).(*Conn); ok && c.log != nil { msg := util.ReadString(mod, zMsg, _MAX_LENGTH) c.log(xErrorCode(iCode), msg) @@ -88,93 +88,93 @@ func (c *Conn) FileControl(schema string, op FcntlOpcode, arg ...any) (any, erro defer c.arena.mark()() ptr := c.arena.new(max(ptrlen, intlen)) - var schemaPtr uint32 + var schemaPtr ptr_t if schema != "" { schemaPtr = c.arena.string(schema) } - var rc uint64 - var res any + var rc res_t + var ret any switch op { default: return nil, MISUSE case FCNTL_RESET_CACHE: - rc = c.call("sqlite3_file_control", - uint64(c.handle), uint64(schemaPtr), - uint64(op), 0) + rc = res_t(c.call("sqlite3_file_control", + stk_t(c.handle), stk_t(schemaPtr), + stk_t(op), 0)) case FCNTL_PERSIST_WAL, FCNTL_POWERSAFE_OVERWRITE: - var flag int + var flag int32 switch { case len(arg) == 0: flag = -1 case arg[0]: flag = 1 } - util.WriteUint32(c.mod, ptr, uint32(flag)) - rc = c.call("sqlite3_file_control", - uint64(c.handle), uint64(schemaPtr), - uint64(op), uint64(ptr)) - res = util.ReadUint32(c.mod, ptr) != 0 + util.Write32(c.mod, ptr, flag) + rc = res_t(c.call("sqlite3_file_control", + stk_t(c.handle), stk_t(schemaPtr), + stk_t(op), stk_t(ptr))) + ret = util.Read32[uint32](c.mod, ptr) != 0 case FCNTL_CHUNK_SIZE: - util.WriteUint32(c.mod, ptr, uint32(arg[0].(int))) - rc = c.call("sqlite3_file_control", - uint64(c.handle), uint64(schemaPtr), - uint64(op), uint64(ptr)) + util.Write32(c.mod, ptr, int32(arg[0].(int))) + rc = res_t(c.call("sqlite3_file_control", + stk_t(c.handle), stk_t(schemaPtr), + stk_t(op), stk_t(ptr))) case FCNTL_RESERVE_BYTES: bytes := -1 if len(arg) > 0 { bytes = arg[0].(int) } - util.WriteUint32(c.mod, ptr, uint32(bytes)) - rc = c.call("sqlite3_file_control", - uint64(c.handle), uint64(schemaPtr), - uint64(op), uint64(ptr)) - res = int(util.ReadUint32(c.mod, ptr)) + util.Write32(c.mod, ptr, int32(bytes)) + rc = res_t(c.call("sqlite3_file_control", + stk_t(c.handle), stk_t(schemaPtr), + stk_t(op), stk_t(ptr))) + ret = int(util.Read32[int32](c.mod, ptr)) case FCNTL_DATA_VERSION: - rc = c.call("sqlite3_file_control", - uint64(c.handle), uint64(schemaPtr), - uint64(op), uint64(ptr)) - res = util.ReadUint32(c.mod, ptr) + rc = res_t(c.call("sqlite3_file_control", + stk_t(c.handle), stk_t(schemaPtr), + stk_t(op), stk_t(ptr))) + ret = util.Read32[uint32](c.mod, ptr) case FCNTL_LOCKSTATE: - rc = c.call("sqlite3_file_control", - uint64(c.handle), uint64(schemaPtr), - uint64(op), uint64(ptr)) - res = vfs.LockLevel(util.ReadUint32(c.mod, ptr)) + rc = res_t(c.call("sqlite3_file_control", + stk_t(c.handle), stk_t(schemaPtr), + stk_t(op), stk_t(ptr))) + ret = util.Read32[vfs.LockLevel](c.mod, ptr) case FCNTL_VFS_POINTER: - rc = c.call("sqlite3_file_control", - uint64(c.handle), uint64(schemaPtr), - uint64(op), uint64(ptr)) + rc = res_t(c.call("sqlite3_file_control", + stk_t(c.handle), stk_t(schemaPtr), + stk_t(op), stk_t(ptr))) if rc == _OK { const zNameOffset = 16 - ptr = util.ReadUint32(c.mod, ptr) - ptr = util.ReadUint32(c.mod, ptr+zNameOffset) + ptr = util.Read32[ptr_t](c.mod, ptr) + ptr = util.Read32[ptr_t](c.mod, ptr+zNameOffset) name := util.ReadString(c.mod, ptr, _MAX_NAME) - res = vfs.Find(name) + ret = vfs.Find(name) } case FCNTL_FILE_POINTER, FCNTL_JOURNAL_POINTER: - rc = c.call("sqlite3_file_control", - uint64(c.handle), uint64(schemaPtr), - uint64(op), uint64(ptr)) + rc = res_t(c.call("sqlite3_file_control", + stk_t(c.handle), stk_t(schemaPtr), + stk_t(op), stk_t(ptr))) if rc == _OK { const fileHandleOffset = 4 - ptr = util.ReadUint32(c.mod, ptr) - ptr = util.ReadUint32(c.mod, ptr+fileHandleOffset) - res = util.GetHandle(c.ctx, ptr) + ptr = util.Read32[ptr_t](c.mod, ptr) + ptr = util.Read32[ptr_t](c.mod, ptr+fileHandleOffset) + ret = util.GetHandle(c.ctx, ptr) } } if err := c.error(rc); err != nil { return nil, err } - return res, nil + return ret, nil } // Limit allows the size of various constructs to be @@ -182,20 +182,20 @@ func (c *Conn) FileControl(schema string, op FcntlOpcode, arg ...any) (any, erro // // https://sqlite.org/c3ref/limit.html func (c *Conn) Limit(id LimitCategory, value int) int { - r := c.call("sqlite3_limit", uint64(c.handle), uint64(id), uint64(value)) - return int(int32(r)) + v := int32(c.call("sqlite3_limit", stk_t(c.handle), stk_t(id), stk_t(value))) + return int(v) } // SetAuthorizer registers an authorizer callback with the database connection. // // https://sqlite.org/c3ref/set_authorizer.html func (c *Conn) SetAuthorizer(cb func(action AuthorizerActionCode, name3rd, name4th, schema, inner string) AuthorizerReturnCode) error { - var enable uint64 + var enable int32 if cb != nil { enable = 1 } - r := c.call("sqlite3_set_authorizer_go", uint64(c.handle), enable) - if err := c.error(r); err != nil { + rc := res_t(c.call("sqlite3_set_authorizer_go", stk_t(c.handle), stk_t(enable))) + if err := c.error(rc); err != nil { return err } c.authorizer = cb @@ -203,7 +203,7 @@ func (c *Conn) SetAuthorizer(cb func(action AuthorizerActionCode, name3rd, name4 } -func authorizerCallback(ctx context.Context, mod api.Module, pDB uint32, action AuthorizerActionCode, zName3rd, zName4th, zSchema, zInner uint32) (rc AuthorizerReturnCode) { +func authorizerCallback(ctx context.Context, mod api.Module, pDB ptr_t, action AuthorizerActionCode, zName3rd, zName4th, zSchema, zInner ptr_t) (rc AuthorizerReturnCode) { if c, ok := ctx.Value(connKey{}).(*Conn); ok && c.handle == pDB && c.authorizer != nil { var name3rd, name4th, schema, inner string if zName3rd != 0 { @@ -227,15 +227,15 @@ func authorizerCallback(ctx context.Context, mod api.Module, pDB uint32, action // // https://sqlite.org/c3ref/trace_v2.html func (c *Conn) Trace(mask TraceEvent, cb func(evt TraceEvent, arg1 any, arg2 any) error) error { - r := c.call("sqlite3_trace_go", uint64(c.handle), uint64(mask)) - if err := c.error(r); err != nil { + rc := res_t(c.call("sqlite3_trace_go", stk_t(c.handle), stk_t(mask))) + if err := c.error(rc); err != nil { return err } c.trace = cb return nil } -func traceCallback(ctx context.Context, mod api.Module, evt TraceEvent, pDB, pArg1, pArg2 uint32) (rc uint32) { +func traceCallback(ctx context.Context, mod api.Module, evt TraceEvent, pDB, pArg1, pArg2 ptr_t) (rc res_t) { if c, ok := ctx.Value(connKey{}).(*Conn); ok && c.handle == pDB && c.trace != nil { var arg1, arg2 any if evt == TRACE_CLOSE { @@ -248,7 +248,7 @@ func traceCallback(ctx context.Context, mod api.Module, evt TraceEvent, pDB, pAr case TRACE_STMT: arg2 = s.SQL() case TRACE_PROFILE: - arg2 = int64(util.ReadUint64(mod, pArg2)) + arg2 = util.Read64[int64](mod, pArg2) } break } @@ -269,20 +269,20 @@ func (c *Conn) WALCheckpoint(schema string, mode CheckpointMode) (nLog, nCkpt in nLogPtr := c.arena.new(ptrlen) nCkptPtr := c.arena.new(ptrlen) schemaPtr := c.arena.string(schema) - r := c.call("sqlite3_wal_checkpoint_v2", - uint64(c.handle), uint64(schemaPtr), uint64(mode), - uint64(nLogPtr), uint64(nCkptPtr)) - nLog = int(int32(util.ReadUint32(c.mod, nLogPtr))) - nCkpt = int(int32(util.ReadUint32(c.mod, nCkptPtr))) - return nLog, nCkpt, c.error(r) + rc := res_t(c.call("sqlite3_wal_checkpoint_v2", + stk_t(c.handle), stk_t(schemaPtr), stk_t(mode), + stk_t(nLogPtr), stk_t(nCkptPtr))) + nLog = int(util.Read32[int32](c.mod, nLogPtr)) + nCkpt = int(util.Read32[int32](c.mod, nCkptPtr)) + return nLog, nCkpt, c.error(rc) } // WALAutoCheckpoint configures WAL auto-checkpoints. // // https://sqlite.org/c3ref/wal_autocheckpoint.html func (c *Conn) WALAutoCheckpoint(pages int) error { - r := c.call("sqlite3_wal_autocheckpoint", uint64(c.handle), uint64(pages)) - return c.error(r) + rc := res_t(c.call("sqlite3_wal_autocheckpoint", stk_t(c.handle), stk_t(pages))) + return c.error(rc) } // WALHook registers a callback function to be invoked @@ -290,15 +290,15 @@ func (c *Conn) WALAutoCheckpoint(pages int) error { // // https://sqlite.org/c3ref/wal_hook.html func (c *Conn) WALHook(cb func(db *Conn, schema string, pages int) error) { - var enable uint64 + var enable int32 if cb != nil { enable = 1 } - c.call("sqlite3_wal_hook_go", uint64(c.handle), enable) + c.call("sqlite3_wal_hook_go", stk_t(c.handle), stk_t(enable)) c.wal = cb } -func walCallback(ctx context.Context, mod api.Module, _, pDB, zSchema uint32, pages int32) (rc uint32) { +func walCallback(ctx context.Context, mod api.Module, _, pDB, zSchema ptr_t, pages int32) (rc res_t) { if c, ok := ctx.Value(connKey{}).(*Conn); ok && c.handle == pDB && c.wal != nil { schema := util.ReadString(mod, zSchema, _MAX_NAME) err := c.wal(c, schema, int(pages)) @@ -311,15 +311,15 @@ func walCallback(ctx context.Context, mod api.Module, _, pDB, zSchema uint32, pa // // https://sqlite.org/c3ref/autovacuum_pages.html func (c *Conn) AutoVacuumPages(cb func(schema string, dbPages, freePages, bytesPerPage uint) uint) error { - var funcPtr uint32 + var funcPtr ptr_t if cb != nil { funcPtr = util.AddHandle(c.ctx, cb) } - r := c.call("sqlite3_autovacuum_pages_go", uint64(c.handle), uint64(funcPtr)) - return c.error(r) + rc := res_t(c.call("sqlite3_autovacuum_pages_go", stk_t(c.handle), stk_t(funcPtr))) + return c.error(rc) } -func autoVacuumCallback(ctx context.Context, mod api.Module, pApp, zSchema, nDbPage, nFreePage, nBytePerPage uint32) uint32 { +func autoVacuumCallback(ctx context.Context, mod api.Module, pApp, zSchema ptr_t, nDbPage, nFreePage, nBytePerPage uint32) uint32 { fn := util.GetHandle(ctx, pApp).(func(schema string, dbPages, freePages, bytesPerPage uint) uint) schema := util.ReadString(mod, zSchema, _MAX_NAME) return uint32(fn(schema, uint(nDbPage), uint(nFreePage), uint(nBytePerPage))) @@ -329,14 +329,14 @@ func autoVacuumCallback(ctx context.Context, mod api.Module, pApp, zSchema, nDbP // // https://sqlite.org/c3ref/hard_heap_limit64.html func (c *Conn) SoftHeapLimit(n int64) int64 { - return int64(c.call("sqlite3_soft_heap_limit64", uint64(n))) + return int64(c.call("sqlite3_soft_heap_limit64", stk_t(n))) } // HardHeapLimit imposes a hard limit on heap size. // // https://sqlite.org/c3ref/hard_heap_limit64.html func (c *Conn) HardHeapLimit(n int64) int64 { - return int64(c.call("sqlite3_hard_heap_limit64", uint64(n))) + return int64(c.call("sqlite3_hard_heap_limit64", stk_t(n))) } // EnableChecksums enables checksums on a database. diff --git a/vendor/github.com/ncruces/go-sqlite3/conn.go b/vendor/github.com/ncruces/go-sqlite3/conn.go index 862d43061..fffc7416a 100644 --- a/vendor/github.com/ncruces/go-sqlite3/conn.go +++ b/vendor/github.com/ncruces/go-sqlite3/conn.go @@ -35,11 +35,11 @@ type Conn struct { update func(AuthorizerActionCode, string, string, int64) commit func() bool rollback func() - arena arena busy1st time.Time busylst time.Time - handle uint32 + arena arena + handle ptr_t } // Open calls [OpenFlags] with [OPEN_READWRITE], [OPEN_CREATE] and [OPEN_URI]. @@ -70,7 +70,7 @@ func OpenFlags(filename string, flags OpenFlag) (*Conn, error) { type connKey = util.ConnKey -func newConn(ctx context.Context, filename string, flags OpenFlag) (res *Conn, _ error) { +func newConn(ctx context.Context, filename string, flags OpenFlag) (ret *Conn, _ error) { err := ctx.Err() if err != nil { return nil, err @@ -82,7 +82,7 @@ func newConn(ctx context.Context, filename string, flags OpenFlag) (res *Conn, _ return nil, err } defer func() { - if res == nil { + if ret == nil { c.Close() c.sqlite.close() } else { @@ -91,7 +91,7 @@ func newConn(ctx context.Context, filename string, flags OpenFlag) (res *Conn, _ }() c.ctx = context.WithValue(c.ctx, connKey{}, c) - c.arena = c.newArena(1024) + c.arena = c.newArena() c.handle, err = c.openDB(filename, flags) if err == nil { err = initExtensions(c) @@ -102,21 +102,21 @@ func newConn(ctx context.Context, filename string, flags OpenFlag) (res *Conn, _ return c, nil } -func (c *Conn) openDB(filename string, flags OpenFlag) (uint32, error) { +func (c *Conn) openDB(filename string, flags OpenFlag) (ptr_t, error) { defer c.arena.mark()() connPtr := c.arena.new(ptrlen) namePtr := c.arena.string(filename) flags |= OPEN_EXRESCODE - r := c.call("sqlite3_open_v2", uint64(namePtr), uint64(connPtr), uint64(flags), 0) + rc := res_t(c.call("sqlite3_open_v2", stk_t(namePtr), stk_t(connPtr), stk_t(flags), 0)) - handle := util.ReadUint32(c.mod, connPtr) - if err := c.sqlite.error(r, handle); err != nil { + handle := util.Read32[ptr_t](c.mod, connPtr) + if err := c.sqlite.error(rc, handle); err != nil { c.closeDB(handle) return 0, err } - c.call("sqlite3_progress_handler_go", uint64(handle), 100) + c.call("sqlite3_progress_handler_go", stk_t(handle), 100) if flags|OPEN_URI != 0 && strings.HasPrefix(filename, "file:") { var pragmas strings.Builder if _, after, ok := strings.Cut(filename, "?"); ok { @@ -130,8 +130,8 @@ func (c *Conn) openDB(filename string, flags OpenFlag) (uint32, error) { if pragmas.Len() != 0 { c.checkInterrupt(handle) pragmaPtr := c.arena.string(pragmas.String()) - r := c.call("sqlite3_exec", uint64(handle), uint64(pragmaPtr), 0, 0, 0) - if err := c.sqlite.error(r, handle, pragmas.String()); err != nil { + rc := res_t(c.call("sqlite3_exec", stk_t(handle), stk_t(pragmaPtr), 0, 0, 0)) + if err := c.sqlite.error(rc, handle, pragmas.String()); err != nil { err = fmt.Errorf("sqlite3: invalid _pragma: %w", err) c.closeDB(handle) return 0, err @@ -141,9 +141,9 @@ func (c *Conn) openDB(filename string, flags OpenFlag) (uint32, error) { return handle, nil } -func (c *Conn) closeDB(handle uint32) { - r := c.call("sqlite3_close_v2", uint64(handle)) - if err := c.sqlite.error(r, handle); err != nil { +func (c *Conn) closeDB(handle ptr_t) { + rc := res_t(c.call("sqlite3_close_v2", stk_t(handle))) + if err := c.sqlite.error(rc, handle); err != nil { panic(err) } } @@ -165,8 +165,8 @@ func (c *Conn) Close() error { c.pending.Close() c.pending = nil - r := c.call("sqlite3_close", uint64(c.handle)) - if err := c.error(r); err != nil { + rc := res_t(c.call("sqlite3_close", stk_t(c.handle))) + if err := c.error(rc); err != nil { return err } @@ -183,8 +183,8 @@ func (c *Conn) Exec(sql string) error { sqlPtr := c.arena.string(sql) c.checkInterrupt(c.handle) - r := c.call("sqlite3_exec", uint64(c.handle), uint64(sqlPtr), 0, 0, 0) - return c.error(r, sql) + rc := res_t(c.call("sqlite3_exec", stk_t(c.handle), stk_t(sqlPtr), 0, 0, 0)) + return c.error(rc, sql) } // Prepare calls [Conn.PrepareFlags] with no flags. @@ -209,17 +209,17 @@ func (c *Conn) PrepareFlags(sql string, flags PrepareFlag) (stmt *Stmt, tail str sqlPtr := c.arena.string(sql) c.checkInterrupt(c.handle) - r := c.call("sqlite3_prepare_v3", uint64(c.handle), - uint64(sqlPtr), uint64(len(sql)+1), uint64(flags), - uint64(stmtPtr), uint64(tailPtr)) + rc := res_t(c.call("sqlite3_prepare_v3", stk_t(c.handle), + stk_t(sqlPtr), stk_t(len(sql)+1), stk_t(flags), + stk_t(stmtPtr), stk_t(tailPtr))) stmt = &Stmt{c: c} - stmt.handle = util.ReadUint32(c.mod, stmtPtr) - if sql := sql[util.ReadUint32(c.mod, tailPtr)-sqlPtr:]; sql != "" { + stmt.handle = util.Read32[ptr_t](c.mod, stmtPtr) + if sql := sql[util.Read32[ptr_t](c.mod, tailPtr)-sqlPtr:]; sql != "" { tail = sql } - if err := c.error(r, sql); err != nil { + if err := c.error(rc, sql); err != nil { return nil, "", err } if stmt.handle == 0 { @@ -233,9 +233,7 @@ func (c *Conn) PrepareFlags(sql string, flags PrepareFlag) (stmt *Stmt, tail str // // https://sqlite.org/c3ref/db_name.html func (c *Conn) DBName(n int) string { - r := c.call("sqlite3_db_name", uint64(c.handle), uint64(n)) - - ptr := uint32(r) + ptr := ptr_t(c.call("sqlite3_db_name", stk_t(c.handle), stk_t(n))) if ptr == 0 { return "" } @@ -246,34 +244,34 @@ func (c *Conn) DBName(n int) string { // // https://sqlite.org/c3ref/db_filename.html func (c *Conn) Filename(schema string) *vfs.Filename { - var ptr uint32 + var ptr ptr_t if schema != "" { defer c.arena.mark()() ptr = c.arena.string(schema) } - r := c.call("sqlite3_db_filename", uint64(c.handle), uint64(ptr)) - return vfs.GetFilename(c.ctx, c.mod, uint32(r), vfs.OPEN_MAIN_DB) + ptr = ptr_t(c.call("sqlite3_db_filename", stk_t(c.handle), stk_t(ptr))) + return vfs.GetFilename(c.ctx, c.mod, ptr, vfs.OPEN_MAIN_DB) } // ReadOnly determines if a database is read-only. // // https://sqlite.org/c3ref/db_readonly.html func (c *Conn) ReadOnly(schema string) (ro bool, ok bool) { - var ptr uint32 + var ptr ptr_t if schema != "" { defer c.arena.mark()() ptr = c.arena.string(schema) } - r := c.call("sqlite3_db_readonly", uint64(c.handle), uint64(ptr)) - return int32(r) > 0, int32(r) < 0 + b := int32(c.call("sqlite3_db_readonly", stk_t(c.handle), stk_t(ptr))) + return b > 0, b < 0 } // GetAutocommit tests the connection for auto-commit mode. // // https://sqlite.org/c3ref/get_autocommit.html func (c *Conn) GetAutocommit() bool { - r := c.call("sqlite3_get_autocommit", uint64(c.handle)) - return r != 0 + b := int32(c.call("sqlite3_get_autocommit", stk_t(c.handle))) + return b != 0 } // LastInsertRowID returns the rowid of the most recent successful INSERT @@ -281,8 +279,7 @@ func (c *Conn) GetAutocommit() bool { // // https://sqlite.org/c3ref/last_insert_rowid.html func (c *Conn) LastInsertRowID() int64 { - r := c.call("sqlite3_last_insert_rowid", uint64(c.handle)) - return int64(r) + return int64(c.call("sqlite3_last_insert_rowid", stk_t(c.handle))) } // SetLastInsertRowID allows the application to set the value returned by @@ -290,7 +287,7 @@ func (c *Conn) LastInsertRowID() int64 { // // https://sqlite.org/c3ref/set_last_insert_rowid.html func (c *Conn) SetLastInsertRowID(id int64) { - c.call("sqlite3_set_last_insert_rowid", uint64(c.handle), uint64(id)) + c.call("sqlite3_set_last_insert_rowid", stk_t(c.handle), stk_t(id)) } // Changes returns the number of rows modified, inserted or deleted @@ -299,8 +296,7 @@ func (c *Conn) SetLastInsertRowID(id int64) { // // https://sqlite.org/c3ref/changes.html func (c *Conn) Changes() int64 { - r := c.call("sqlite3_changes64", uint64(c.handle)) - return int64(r) + return int64(c.call("sqlite3_changes64", stk_t(c.handle))) } // TotalChanges returns the number of rows modified, inserted or deleted @@ -309,16 +305,15 @@ func (c *Conn) Changes() int64 { // // https://sqlite.org/c3ref/total_changes.html func (c *Conn) TotalChanges() int64 { - r := c.call("sqlite3_total_changes64", uint64(c.handle)) - return int64(r) + return int64(c.call("sqlite3_total_changes64", stk_t(c.handle))) } // ReleaseMemory frees memory used by a database connection. // // https://sqlite.org/c3ref/db_release_memory.html func (c *Conn) ReleaseMemory() error { - r := c.call("sqlite3_db_release_memory", uint64(c.handle)) - return c.error(r) + rc := res_t(c.call("sqlite3_db_release_memory", stk_t(c.handle))) + return c.error(rc) } // GetInterrupt gets the context set with [Conn.SetInterrupt]. @@ -354,10 +349,10 @@ func (c *Conn) SetInterrupt(ctx context.Context) (old context.Context) { defer c.arena.mark()() stmtPtr := c.arena.new(ptrlen) loopPtr := c.arena.string(`WITH RECURSIVE c(x) AS (VALUES(0) UNION ALL SELECT x FROM c) SELECT x FROM c`) - c.call("sqlite3_prepare_v3", uint64(c.handle), uint64(loopPtr), math.MaxUint64, - uint64(PREPARE_PERSISTENT), uint64(stmtPtr), 0) + c.call("sqlite3_prepare_v3", stk_t(c.handle), stk_t(loopPtr), math.MaxUint64, + stk_t(PREPARE_PERSISTENT), stk_t(stmtPtr), 0) c.pending = &Stmt{c: c} - c.pending.handle = util.ReadUint32(c.mod, stmtPtr) + c.pending.handle = util.Read32[ptr_t](c.mod, stmtPtr) } if old.Done() != nil && ctx.Err() == nil { @@ -369,13 +364,13 @@ func (c *Conn) SetInterrupt(ctx context.Context) (old context.Context) { return old } -func (c *Conn) checkInterrupt(handle uint32) { +func (c *Conn) checkInterrupt(handle ptr_t) { if c.interrupt.Err() != nil { - c.call("sqlite3_interrupt", uint64(handle)) + c.call("sqlite3_interrupt", stk_t(handle)) } } -func progressCallback(ctx context.Context, mod api.Module, _ uint32) (interrupt uint32) { +func progressCallback(ctx context.Context, mod api.Module, _ ptr_t) (interrupt int32) { if c, ok := ctx.Value(connKey{}).(*Conn); ok { if c.interrupt.Done() != nil { runtime.Gosched() @@ -392,11 +387,11 @@ func progressCallback(ctx context.Context, mod api.Module, _ uint32) (interrupt // https://sqlite.org/c3ref/busy_timeout.html func (c *Conn) BusyTimeout(timeout time.Duration) error { ms := min((timeout+time.Millisecond-1)/time.Millisecond, math.MaxInt32) - r := c.call("sqlite3_busy_timeout", uint64(c.handle), uint64(ms)) - return c.error(r) + rc := res_t(c.call("sqlite3_busy_timeout", stk_t(c.handle), stk_t(ms))) + return c.error(rc) } -func timeoutCallback(ctx context.Context, mod api.Module, count, tmout int32) (retry uint32) { +func timeoutCallback(ctx context.Context, mod api.Module, count, tmout int32) (retry int32) { // https://fractaledmind.github.io/2024/04/15/sqlite-on-rails-the-how-and-why-of-optimal-performance/ if c, ok := ctx.Value(connKey{}).(*Conn); ok && c.interrupt.Err() == nil { switch { @@ -419,19 +414,19 @@ func timeoutCallback(ctx context.Context, mod api.Module, count, tmout int32) (r // // https://sqlite.org/c3ref/busy_handler.html func (c *Conn) BusyHandler(cb func(ctx context.Context, count int) (retry bool)) error { - var enable uint64 + var enable int32 if cb != nil { enable = 1 } - r := c.call("sqlite3_busy_handler_go", uint64(c.handle), enable) - if err := c.error(r); err != nil { + rc := res_t(c.call("sqlite3_busy_handler_go", stk_t(c.handle), stk_t(enable))) + if err := c.error(rc); err != nil { return err } c.busy = cb return nil } -func busyCallback(ctx context.Context, mod api.Module, pDB uint32, count int32) (retry uint32) { +func busyCallback(ctx context.Context, mod api.Module, pDB ptr_t, count int32) (retry int32) { if c, ok := ctx.Value(connKey{}).(*Conn); ok && c.handle == pDB && c.busy != nil { interrupt := c.interrupt if interrupt == nil { @@ -452,16 +447,16 @@ func (c *Conn) Status(op DBStatus, reset bool) (current, highwater int, err erro hiPtr := c.arena.new(intlen) curPtr := c.arena.new(intlen) - var i uint64 + var i int32 if reset { i = 1 } - r := c.call("sqlite3_db_status", uint64(c.handle), - uint64(op), uint64(curPtr), uint64(hiPtr), i) - if err = c.error(r); err == nil { - current = int(util.ReadUint32(c.mod, curPtr)) - highwater = int(util.ReadUint32(c.mod, hiPtr)) + rc := res_t(c.call("sqlite3_db_status", stk_t(c.handle), + stk_t(op), stk_t(curPtr), stk_t(hiPtr), stk_t(i))) + if err = c.error(rc); err == nil { + current = int(util.Read32[int32](c.mod, curPtr)) + highwater = int(util.Read32[int32](c.mod, hiPtr)) } return } @@ -472,7 +467,7 @@ func (c *Conn) Status(op DBStatus, reset bool) (current, highwater int, err erro func (c *Conn) TableColumnMetadata(schema, table, column string) (declType, collSeq string, notNull, primaryKey, autoInc bool, err error) { defer c.arena.mark()() - var schemaPtr, columnPtr uint32 + var schemaPtr, columnPtr ptr_t declTypePtr := c.arena.new(ptrlen) collSeqPtr := c.arena.new(ptrlen) notNullPtr := c.arena.new(ptrlen) @@ -486,25 +481,25 @@ func (c *Conn) TableColumnMetadata(schema, table, column string) (declType, coll columnPtr = c.arena.string(column) } - r := c.call("sqlite3_table_column_metadata", uint64(c.handle), - uint64(schemaPtr), uint64(tablePtr), uint64(columnPtr), - uint64(declTypePtr), uint64(collSeqPtr), - uint64(notNullPtr), uint64(primaryKeyPtr), uint64(autoIncPtr)) - if err = c.error(r); err == nil && column != "" { - if ptr := util.ReadUint32(c.mod, declTypePtr); ptr != 0 { + rc := res_t(c.call("sqlite3_table_column_metadata", stk_t(c.handle), + stk_t(schemaPtr), stk_t(tablePtr), stk_t(columnPtr), + stk_t(declTypePtr), stk_t(collSeqPtr), + stk_t(notNullPtr), stk_t(primaryKeyPtr), stk_t(autoIncPtr))) + if err = c.error(rc); err == nil && column != "" { + if ptr := util.Read32[ptr_t](c.mod, declTypePtr); ptr != 0 { declType = util.ReadString(c.mod, ptr, _MAX_NAME) } - if ptr := util.ReadUint32(c.mod, collSeqPtr); ptr != 0 { + if ptr := util.Read32[ptr_t](c.mod, collSeqPtr); ptr != 0 { collSeq = util.ReadString(c.mod, ptr, _MAX_NAME) } - notNull = util.ReadUint32(c.mod, notNullPtr) != 0 - autoInc = util.ReadUint32(c.mod, autoIncPtr) != 0 - primaryKey = util.ReadUint32(c.mod, primaryKeyPtr) != 0 + notNull = util.Read32[uint32](c.mod, notNullPtr) != 0 + autoInc = util.Read32[uint32](c.mod, autoIncPtr) != 0 + primaryKey = util.Read32[uint32](c.mod, primaryKeyPtr) != 0 } return } -func (c *Conn) error(rc uint64, sql ...string) error { +func (c *Conn) error(rc res_t, sql ...string) error { return c.sqlite.error(rc, c.handle, sql...) } diff --git a/vendor/github.com/ncruces/go-sqlite3/const.go b/vendor/github.com/ncruces/go-sqlite3/const.go index d4908de00..086902a6c 100644 --- a/vendor/github.com/ncruces/go-sqlite3/const.go +++ b/vendor/github.com/ncruces/go-sqlite3/const.go @@ -1,6 +1,10 @@ package sqlite3 -import "strconv" +import ( + "strconv" + + "github.com/ncruces/go-sqlite3/internal/util" +) const ( _OK = 0 /* Successful result */ @@ -12,8 +16,14 @@ const ( _MAX_SQL_LENGTH = 1e9 _MAX_FUNCTION_ARG = 100 - ptrlen = 4 - intlen = 4 + ptrlen = util.PtrLen + intlen = util.IntLen +) + +type ( + stk_t = util.Stk_t + ptr_t = util.Ptr_t + res_t = util.Res_t ) // ErrorCode is a result code that [Error.Code] might return. diff --git a/vendor/github.com/ncruces/go-sqlite3/context.go b/vendor/github.com/ncruces/go-sqlite3/context.go index 86be214e2..637ddc282 100644 --- a/vendor/github.com/ncruces/go-sqlite3/context.go +++ b/vendor/github.com/ncruces/go-sqlite3/context.go @@ -15,7 +15,7 @@ import ( // https://sqlite.org/c3ref/context.html type Context struct { c *Conn - handle uint32 + handle ptr_t } // Conn returns the database connection of the @@ -32,14 +32,14 @@ func (ctx Context) Conn() *Conn { // https://sqlite.org/c3ref/get_auxdata.html func (ctx Context) SetAuxData(n int, data any) { ptr := util.AddHandle(ctx.c.ctx, data) - ctx.c.call("sqlite3_set_auxdata_go", uint64(ctx.handle), uint64(n), uint64(ptr)) + ctx.c.call("sqlite3_set_auxdata_go", stk_t(ctx.handle), stk_t(n), stk_t(ptr)) } // GetAuxData returns metadata for argument n of the function. // // https://sqlite.org/c3ref/get_auxdata.html func (ctx Context) GetAuxData(n int) any { - ptr := uint32(ctx.c.call("sqlite3_get_auxdata", uint64(ctx.handle), uint64(n))) + ptr := ptr_t(ctx.c.call("sqlite3_get_auxdata", stk_t(ctx.handle), stk_t(n))) return util.GetHandle(ctx.c.ctx, ptr) } @@ -68,7 +68,7 @@ func (ctx Context) ResultInt(value int) { // https://sqlite.org/c3ref/result_blob.html func (ctx Context) ResultInt64(value int64) { ctx.c.call("sqlite3_result_int64", - uint64(ctx.handle), uint64(value)) + stk_t(ctx.handle), stk_t(value)) } // ResultFloat sets the result of the function to a float64. @@ -76,7 +76,7 @@ func (ctx Context) ResultInt64(value int64) { // https://sqlite.org/c3ref/result_blob.html func (ctx Context) ResultFloat(value float64) { ctx.c.call("sqlite3_result_double", - uint64(ctx.handle), math.Float64bits(value)) + stk_t(ctx.handle), stk_t(math.Float64bits(value))) } // ResultText sets the result of the function to a string. @@ -85,7 +85,7 @@ func (ctx Context) ResultFloat(value float64) { func (ctx Context) ResultText(value string) { ptr := ctx.c.newString(value) ctx.c.call("sqlite3_result_text_go", - uint64(ctx.handle), uint64(ptr), uint64(len(value))) + stk_t(ctx.handle), stk_t(ptr), stk_t(len(value))) } // ResultRawText sets the text result of the function to a []byte. @@ -95,7 +95,7 @@ func (ctx Context) ResultText(value string) { func (ctx Context) ResultRawText(value []byte) { ptr := ctx.c.newBytes(value) ctx.c.call("sqlite3_result_text_go", - uint64(ctx.handle), uint64(ptr), uint64(len(value))) + stk_t(ctx.handle), stk_t(ptr), stk_t(len(value))) } // ResultBlob sets the result of the function to a []byte. @@ -105,7 +105,7 @@ func (ctx Context) ResultRawText(value []byte) { func (ctx Context) ResultBlob(value []byte) { ptr := ctx.c.newBytes(value) ctx.c.call("sqlite3_result_blob_go", - uint64(ctx.handle), uint64(ptr), uint64(len(value))) + stk_t(ctx.handle), stk_t(ptr), stk_t(len(value))) } // ResultZeroBlob sets the result of the function to a zero-filled, length n BLOB. @@ -113,7 +113,7 @@ func (ctx Context) ResultBlob(value []byte) { // https://sqlite.org/c3ref/result_blob.html func (ctx Context) ResultZeroBlob(n int64) { ctx.c.call("sqlite3_result_zeroblob64", - uint64(ctx.handle), uint64(n)) + stk_t(ctx.handle), stk_t(n)) } // ResultNull sets the result of the function to NULL. @@ -121,7 +121,7 @@ func (ctx Context) ResultZeroBlob(n int64) { // https://sqlite.org/c3ref/result_blob.html func (ctx Context) ResultNull() { ctx.c.call("sqlite3_result_null", - uint64(ctx.handle)) + stk_t(ctx.handle)) } // ResultTime sets the result of the function to a [time.Time]. @@ -146,14 +146,14 @@ func (ctx Context) ResultTime(value time.Time, format TimeFormat) { } func (ctx Context) resultRFC3339Nano(value time.Time) { - const maxlen = uint64(len(time.RFC3339Nano)) + 5 + const maxlen = int64(len(time.RFC3339Nano)) + 5 ptr := ctx.c.new(maxlen) buf := util.View(ctx.c.mod, ptr, maxlen) buf = value.AppendFormat(buf[:0], time.RFC3339Nano) ctx.c.call("sqlite3_result_text_go", - uint64(ctx.handle), uint64(ptr), uint64(len(buf))) + stk_t(ctx.handle), stk_t(ptr), stk_t(len(buf))) } // ResultPointer sets the result of the function to NULL, just like [Context.ResultNull], @@ -164,7 +164,7 @@ func (ctx Context) resultRFC3339Nano(value time.Time) { func (ctx Context) ResultPointer(ptr any) { valPtr := util.AddHandle(ctx.c.ctx, ptr) ctx.c.call("sqlite3_result_pointer_go", - uint64(ctx.handle), uint64(valPtr)) + stk_t(ctx.handle), stk_t(valPtr)) } // ResultJSON sets the result of the function to the JSON encoding of value. @@ -188,7 +188,7 @@ func (ctx Context) ResultValue(value Value) { return } ctx.c.call("sqlite3_result_value", - uint64(ctx.handle), uint64(value.handle)) + stk_t(ctx.handle), stk_t(value.handle)) } // ResultError sets the result of the function an error. @@ -196,12 +196,12 @@ func (ctx Context) ResultValue(value Value) { // https://sqlite.org/c3ref/result_blob.html func (ctx Context) ResultError(err error) { if errors.Is(err, NOMEM) { - ctx.c.call("sqlite3_result_error_nomem", uint64(ctx.handle)) + ctx.c.call("sqlite3_result_error_nomem", stk_t(ctx.handle)) return } if errors.Is(err, TOOBIG) { - ctx.c.call("sqlite3_result_error_toobig", uint64(ctx.handle)) + ctx.c.call("sqlite3_result_error_toobig", stk_t(ctx.handle)) return } @@ -210,11 +210,11 @@ func (ctx Context) ResultError(err error) { defer ctx.c.arena.mark()() ptr := ctx.c.arena.string(msg) ctx.c.call("sqlite3_result_error", - uint64(ctx.handle), uint64(ptr), uint64(len(msg))) + stk_t(ctx.handle), stk_t(ptr), stk_t(len(msg))) } if code != _OK { ctx.c.call("sqlite3_result_error_code", - uint64(ctx.handle), uint64(code)) + stk_t(ctx.handle), stk_t(code)) } } @@ -223,6 +223,6 @@ func (ctx Context) ResultError(err error) { // // https://sqlite.org/c3ref/vtab_nochange.html func (ctx Context) VTabNoChange() bool { - r := ctx.c.call("sqlite3_vtab_nochange", uint64(ctx.handle)) - return r != 0 + b := int32(ctx.c.call("sqlite3_vtab_nochange", stk_t(ctx.handle))) + return b != 0 } diff --git a/vendor/github.com/ncruces/go-sqlite3/driver/driver.go b/vendor/github.com/ncruces/go-sqlite3/driver/driver.go index 742f308af..21799aeb2 100644 --- a/vendor/github.com/ncruces/go-sqlite3/driver/driver.go +++ b/vendor/github.com/ncruces/go-sqlite3/driver/driver.go @@ -201,7 +201,7 @@ func (n *connector) Driver() driver.Driver { return &SQLite{} } -func (n *connector) Connect(ctx context.Context) (res driver.Conn, err error) { +func (n *connector) Connect(ctx context.Context) (ret driver.Conn, err error) { c := &conn{ txLock: n.txLock, tmRead: n.tmRead, @@ -213,7 +213,7 @@ func (n *connector) Connect(ctx context.Context) (res driver.Conn, err error) { return nil, err } defer func() { - if res == nil { + if ret == nil { c.Close() } }() @@ -466,8 +466,9 @@ func (s *stmt) ExecContext(ctx context.Context, args []driver.NamedValue) (drive old := s.Stmt.Conn().SetInterrupt(ctx) defer s.Stmt.Conn().SetInterrupt(old) - err = s.Stmt.Exec() - s.Stmt.ClearBindings() + err = errors.Join( + s.Stmt.Exec(), + s.Stmt.ClearBindings()) if err != nil { return nil, err } @@ -604,8 +605,9 @@ var ( ) func (r *rows) Close() error { - r.Stmt.ClearBindings() - return r.Stmt.Reset() + return errors.Join( + r.Stmt.Reset(), + r.Stmt.ClearBindings()) } func (r *rows) Columns() []string { @@ -718,19 +720,19 @@ func (r *rows) ColumnTypeScanType(index int) (typ reflect.Type) { switch scan { case _INT: - return reflect.TypeOf(int64(0)) + return reflect.TypeFor[int64]() case _REAL: - return reflect.TypeOf(float64(0)) + return reflect.TypeFor[float64]() case _TEXT: - return reflect.TypeOf("") + return reflect.TypeFor[string]() case _BLOB: - return reflect.TypeOf([]byte{}) + return reflect.TypeFor[[]byte]() case _BOOL: - return reflect.TypeOf(false) + return reflect.TypeFor[bool]() case _TIME: - return reflect.TypeOf(time.Time{}) + return reflect.TypeFor[time.Time]() default: - return reflect.TypeOf((*any)(nil)).Elem() + return reflect.TypeFor[any]() } } diff --git a/vendor/github.com/ncruces/go-sqlite3/embed/README.md b/vendor/github.com/ncruces/go-sqlite3/embed/README.md index ca5108c8c..59329a917 100644 --- a/vendor/github.com/ncruces/go-sqlite3/embed/README.md +++ b/vendor/github.com/ncruces/go-sqlite3/embed/README.md @@ -1,6 +1,6 @@ # Embeddable Wasm build of SQLite -This folder includes an embeddable Wasm build of SQLite 3.48.0 for use with +This folder includes an embeddable Wasm build of SQLite 3.49.0 for use with [`github.com/ncruces/go-sqlite3`](https://pkg.go.dev/github.com/ncruces/go-sqlite3). The following optional features are compiled in: diff --git a/vendor/github.com/ncruces/go-sqlite3/embed/sqlite3.wasm b/vendor/github.com/ncruces/go-sqlite3/embed/sqlite3.wasm index 1d274557ae751eea2db41cbca042ae992d7189d7..e61dc9356ab014ca91e7b68094f134df1ce56807 100644 GIT binary patch delta 182013 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
1J%{Cs_sPWu>e0V7&nAEk>wjwZtJ$5NPwJJO{e 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 Ar~m)} delta 180396 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

*&yk#HvMJveOA@C1+vdjKkcdSd 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 L%sie{H}!u3*q^Ke diff --git a/vendor/github.com/ncruces/go-sqlite3/error.go b/vendor/github.com/ncruces/go-sqlite3/error.go index 870aa3ab1..6d4bd63f8 100644 --- a/vendor/github.com/ncruces/go-sqlite3/error.go +++ b/vendor/github.com/ncruces/go-sqlite3/error.go @@ -15,7 +15,7 @@ type Error struct { str string msg string sql string - code uint64 + code res_t } // Code returns the primary error code for this error. @@ -146,27 +146,27 @@ func (e ExtendedErrorCode) Code() ErrorCode { return ErrorCode(e) } -func errorCode(err error, def ErrorCode) (msg string, code uint32) { +func errorCode(err error, def ErrorCode) (msg string, code res_t) { switch code := err.(type) { case nil: return "", _OK case ErrorCode: - return "", uint32(code) + return "", res_t(code) case xErrorCode: - return "", uint32(code) + return "", res_t(code) case *Error: - return code.msg, uint32(code.code) + return code.msg, res_t(code.code) } var ecode ErrorCode var xcode xErrorCode switch { case errors.As(err, &xcode): - code = uint32(xcode) + code = res_t(xcode) case errors.As(err, &ecode): - code = uint32(ecode) + code = res_t(ecode) default: - code = uint32(def) + code = res_t(def) } return err.Error(), code } diff --git a/vendor/github.com/ncruces/go-sqlite3/func.go b/vendor/github.com/ncruces/go-sqlite3/func.go index 621c0957d..6b69368b4 100644 --- a/vendor/github.com/ncruces/go-sqlite3/func.go +++ b/vendor/github.com/ncruces/go-sqlite3/func.go @@ -14,12 +14,12 @@ import ( // // https://sqlite.org/c3ref/collation_needed.html func (c *Conn) CollationNeeded(cb func(db *Conn, name string)) error { - var enable uint64 + var enable int32 if cb != nil { enable = 1 } - r := c.call("sqlite3_collation_needed_go", uint64(c.handle), enable) - if err := c.error(r); err != nil { + rc := res_t(c.call("sqlite3_collation_needed_go", stk_t(c.handle), stk_t(enable))) + if err := c.error(rc); err != nil { return err } c.collation = cb @@ -33,8 +33,8 @@ func (c *Conn) CollationNeeded(cb func(db *Conn, name string)) error { // This can be used to load schemas that contain // one or more unknown collating sequences. func (c Conn) AnyCollationNeeded() error { - r := c.call("sqlite3_anycollseq_init", uint64(c.handle), 0, 0) - if err := c.error(r); err != nil { + rc := res_t(c.call("sqlite3_anycollseq_init", stk_t(c.handle), 0, 0)) + if err := c.error(rc); err != nil { return err } c.collation = nil @@ -45,31 +45,31 @@ func (c Conn) AnyCollationNeeded() error { // // https://sqlite.org/c3ref/create_collation.html func (c *Conn) CreateCollation(name string, fn func(a, b []byte) int) error { - var funcPtr uint32 + var funcPtr ptr_t defer c.arena.mark()() namePtr := c.arena.string(name) if fn != nil { funcPtr = util.AddHandle(c.ctx, fn) } - r := c.call("sqlite3_create_collation_go", - uint64(c.handle), uint64(namePtr), uint64(funcPtr)) - return c.error(r) + rc := res_t(c.call("sqlite3_create_collation_go", + stk_t(c.handle), stk_t(namePtr), stk_t(funcPtr))) + return c.error(rc) } // CreateFunction defines a new scalar SQL function. // // https://sqlite.org/c3ref/create_function.html func (c *Conn) CreateFunction(name string, nArg int, flag FunctionFlag, fn ScalarFunction) error { - var funcPtr uint32 + var funcPtr ptr_t defer c.arena.mark()() namePtr := c.arena.string(name) if fn != nil { funcPtr = util.AddHandle(c.ctx, fn) } - r := c.call("sqlite3_create_function_go", - uint64(c.handle), uint64(namePtr), uint64(nArg), - uint64(flag), uint64(funcPtr)) - return c.error(r) + rc := res_t(c.call("sqlite3_create_function_go", + stk_t(c.handle), stk_t(namePtr), stk_t(nArg), + stk_t(flag), stk_t(funcPtr))) + return c.error(rc) } // ScalarFunction is the type of a scalar SQL function. @@ -82,7 +82,7 @@ type ScalarFunction func(ctx Context, arg ...Value) // // https://sqlite.org/c3ref/create_function.html func (c *Conn) CreateWindowFunction(name string, nArg int, flag FunctionFlag, fn func() AggregateFunction) error { - var funcPtr uint32 + var funcPtr ptr_t defer c.arena.mark()() namePtr := c.arena.string(name) if fn != nil { @@ -92,10 +92,10 @@ func (c *Conn) CreateWindowFunction(name string, nArg int, flag FunctionFlag, fn if _, ok := fn().(WindowFunction); ok { call = "sqlite3_create_window_function_go" } - r := c.call(call, - uint64(c.handle), uint64(namePtr), uint64(nArg), - uint64(flag), uint64(funcPtr)) - return c.error(r) + rc := res_t(c.call(call, + stk_t(c.handle), stk_t(namePtr), stk_t(nArg), + stk_t(flag), stk_t(funcPtr))) + return c.error(rc) } // AggregateFunction is the interface an aggregate function should implement. @@ -129,28 +129,28 @@ type WindowFunction interface { func (c *Conn) OverloadFunction(name string, nArg int) error { defer c.arena.mark()() namePtr := c.arena.string(name) - r := c.call("sqlite3_overload_function", - uint64(c.handle), uint64(namePtr), uint64(nArg)) - return c.error(r) + rc := res_t(c.call("sqlite3_overload_function", + stk_t(c.handle), stk_t(namePtr), stk_t(nArg))) + return c.error(rc) } -func destroyCallback(ctx context.Context, mod api.Module, pApp uint32) { +func destroyCallback(ctx context.Context, mod api.Module, pApp ptr_t) { util.DelHandle(ctx, pApp) } -func collationCallback(ctx context.Context, mod api.Module, pArg, pDB, eTextRep, zName uint32) { +func collationCallback(ctx context.Context, mod api.Module, pArg, pDB ptr_t, eTextRep uint32, zName ptr_t) { if c, ok := ctx.Value(connKey{}).(*Conn); ok && c.handle == pDB && c.collation != nil { name := util.ReadString(mod, zName, _MAX_NAME) c.collation(c, name) } } -func compareCallback(ctx context.Context, mod api.Module, pApp, nKey1, pKey1, nKey2, pKey2 uint32) uint32 { +func compareCallback(ctx context.Context, mod api.Module, pApp ptr_t, nKey1 int32, pKey1 ptr_t, nKey2 int32, pKey2 ptr_t) uint32 { fn := util.GetHandle(ctx, pApp).(func(a, b []byte) int) - return uint32(fn(util.View(mod, pKey1, uint64(nKey1)), util.View(mod, pKey2, uint64(nKey2)))) + return uint32(fn(util.View(mod, pKey1, int64(nKey1)), util.View(mod, pKey2, int64(nKey2)))) } -func funcCallback(ctx context.Context, mod api.Module, pCtx, pApp, nArg, pArg uint32) { +func funcCallback(ctx context.Context, mod api.Module, pCtx, pApp ptr_t, nArg int32, pArg ptr_t) { args := getFuncArgs() defer putFuncArgs(args) db := ctx.Value(connKey{}).(*Conn) @@ -159,7 +159,7 @@ func funcCallback(ctx context.Context, mod api.Module, pCtx, pApp, nArg, pArg ui fn(Context{db, pCtx}, args[:nArg]...) } -func stepCallback(ctx context.Context, mod api.Module, pCtx, pAgg, pApp, nArg, pArg uint32) { +func stepCallback(ctx context.Context, mod api.Module, pCtx, pAgg, pApp ptr_t, nArg int32, pArg ptr_t) { args := getFuncArgs() defer putFuncArgs(args) db := ctx.Value(connKey{}).(*Conn) @@ -168,20 +168,23 @@ func stepCallback(ctx context.Context, mod api.Module, pCtx, pAgg, pApp, nArg, p fn.Step(Context{db, pCtx}, args[:nArg]...) } -func finalCallback(ctx context.Context, mod api.Module, pCtx, pAgg, pApp uint32) { +func finalCallback(ctx context.Context, mod api.Module, pCtx, pAgg, pApp ptr_t) { db := ctx.Value(connKey{}).(*Conn) fn, handle := callbackAggregate(db, pAgg, pApp) fn.Value(Context{db, pCtx}) - util.DelHandle(ctx, handle) + if err := util.DelHandle(ctx, handle); err != nil { + Context{db, pCtx}.ResultError(err) + return // notest + } } -func valueCallback(ctx context.Context, mod api.Module, pCtx, pAgg uint32) { +func valueCallback(ctx context.Context, mod api.Module, pCtx, pAgg ptr_t) { db := ctx.Value(connKey{}).(*Conn) fn := util.GetHandle(db.ctx, pAgg).(AggregateFunction) fn.Value(Context{db, pCtx}) } -func inverseCallback(ctx context.Context, mod api.Module, pCtx, pAgg, nArg, pArg uint32) { +func inverseCallback(ctx context.Context, mod api.Module, pCtx, pAgg ptr_t, nArg int32, pArg ptr_t) { args := getFuncArgs() defer putFuncArgs(args) db := ctx.Value(connKey{}).(*Conn) @@ -190,9 +193,9 @@ func inverseCallback(ctx context.Context, mod api.Module, pCtx, pAgg, nArg, pArg fn.Inverse(Context{db, pCtx}, args[:nArg]...) } -func callbackAggregate(db *Conn, pAgg, pApp uint32) (AggregateFunction, uint32) { +func callbackAggregate(db *Conn, pAgg, pApp ptr_t) (AggregateFunction, ptr_t) { if pApp == 0 { - handle := util.ReadUint32(db.mod, pAgg) + handle := util.Read32[ptr_t](db.mod, pAgg) return util.GetHandle(db.ctx, handle).(AggregateFunction), handle } @@ -200,17 +203,17 @@ func callbackAggregate(db *Conn, pAgg, pApp uint32) (AggregateFunction, uint32) fn := util.GetHandle(db.ctx, pApp).(func() AggregateFunction)() if pAgg != 0 { handle := util.AddHandle(db.ctx, fn) - util.WriteUint32(db.mod, pAgg, handle) + util.Write32(db.mod, pAgg, handle) return fn, handle } return fn, 0 } -func callbackArgs(db *Conn, arg []Value, pArg uint32) { +func callbackArgs(db *Conn, arg []Value, pArg ptr_t) { for i := range arg { arg[i] = Value{ c: db, - handle: util.ReadUint32(db.mod, pArg+ptrlen*uint32(i)), + handle: util.Read32[ptr_t](db.mod, pArg+ptr_t(i)*ptrlen), } } } diff --git a/vendor/github.com/ncruces/go-sqlite3/go.work b/vendor/github.com/ncruces/go-sqlite3/go.work deleted file mode 100644 index ff5d6b514..000000000 --- a/vendor/github.com/ncruces/go-sqlite3/go.work +++ /dev/null @@ -1,7 +0,0 @@ -go 1.21 - -use ( - . - ./gormlite - ./embed/bcw2 -) diff --git a/vendor/github.com/ncruces/go-sqlite3/go.work.sum b/vendor/github.com/ncruces/go-sqlite3/go.work.sum deleted file mode 100644 index 224b04377..000000000 --- a/vendor/github.com/ncruces/go-sqlite3/go.work.sum +++ /dev/null @@ -1,17 +0,0 @@ -github.com/ncruces/go-sqlite3 v0.21.0/go.mod h1:zxMOaSG5kFYVFK4xQa0pdwIszqxqJ0W0BxBgwdrNjuA= -golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= -golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= -golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE= -golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= -golang.org/x/term v0.21.0/go.mod h1:ooXLefLobQVslOqselCNF4SxFAaoS6KujMbsGzSDmX0= -golang.org/x/term v0.22.0/go.mod h1:F3qCibpT5AMpCRfhfT53vVJwhLtIVHhB9XDjfFvnMI4= -golang.org/x/term v0.23.0/go.mod h1:DgV24QBUrK6jhZXl+20l6UWznPlwAHm1Q1mGHtydmSk= -golang.org/x/term v0.24.0/go.mod h1:lOBK/LVxemqiMij05LGJ0tzNr8xlmwBRJ81PX6wVLH8= -golang.org/x/term v0.25.0/go.mod h1:RPyXicDX+6vLxogjjRxjgD2TKtmAO6NZBsBRfrOLu7M= -golang.org/x/term v0.26.0/go.mod h1:Si5m1o57C5nBNQo5z1iq+XDijt21BDBDp2bK0QI8e3E= -golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM= -golang.org/x/term v0.28.0/go.mod h1:Sw/lC2IAUZ92udQNf3WodGtn4k/XoLyZoh8v/8uiwek= -golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= diff --git a/vendor/github.com/ncruces/go-sqlite3/internal/util/func.go b/vendor/github.com/ncruces/go-sqlite3/internal/util/func.go index 468ff741c..e705f3181 100644 --- a/vendor/github.com/ncruces/go-sqlite3/internal/util/func.go +++ b/vendor/github.com/ncruces/go-sqlite3/internal/util/func.go @@ -7,9 +7,6 @@ import ( "github.com/tetratelabs/wazero/api" ) -type i32 interface{ ~int32 | ~uint32 } -type i64 interface{ ~int64 | ~uint64 } - type funcVI[T0 i32] func(context.Context, api.Module, T0) func (fn funcVI[T0]) Call(ctx context.Context, mod api.Module, stack []uint64) { diff --git a/vendor/github.com/ncruces/go-sqlite3/internal/util/handle.go b/vendor/github.com/ncruces/go-sqlite3/internal/util/handle.go index e4e338549..f9f39b449 100644 --- a/vendor/github.com/ncruces/go-sqlite3/internal/util/handle.go +++ b/vendor/github.com/ncruces/go-sqlite3/internal/util/handle.go @@ -20,7 +20,7 @@ func (s *handleState) CloseNotify(ctx context.Context, exitCode uint32) { s.holes = 0 } -func GetHandle(ctx context.Context, id uint32) any { +func GetHandle(ctx context.Context, id Ptr_t) any { if id == 0 { return nil } @@ -28,14 +28,14 @@ func GetHandle(ctx context.Context, id uint32) any { return s.handles[^id] } -func DelHandle(ctx context.Context, id uint32) error { +func DelHandle(ctx context.Context, id Ptr_t) error { if id == 0 { return nil } s := ctx.Value(moduleKey{}).(*moduleState) a := s.handles[^id] s.handles[^id] = nil - if l := uint32(len(s.handles)); l == ^id { + if l := Ptr_t(len(s.handles)); l == ^id { s.handles = s.handles[:l-1] } else { s.holes++ @@ -46,7 +46,7 @@ func DelHandle(ctx context.Context, id uint32) error { return nil } -func AddHandle(ctx context.Context, a any) uint32 { +func AddHandle(ctx context.Context, a any) Ptr_t { if a == nil { panic(NilErr) } @@ -59,12 +59,12 @@ func AddHandle(ctx context.Context, a any) uint32 { if h == nil { s.holes-- s.handles[id] = a - return ^uint32(id) + return ^Ptr_t(id) } } } // Add a new slot. s.handles = append(s.handles, a) - return -uint32(len(s.handles)) + return -Ptr_t(len(s.handles)) } diff --git a/vendor/github.com/ncruces/go-sqlite3/internal/util/json.go b/vendor/github.com/ncruces/go-sqlite3/internal/util/json.go index 7f6849a42..846237405 100644 --- a/vendor/github.com/ncruces/go-sqlite3/internal/util/json.go +++ b/vendor/github.com/ncruces/go-sqlite3/internal/util/json.go @@ -2,6 +2,7 @@ package util import ( "encoding/json" + "math" "strconv" "time" "unsafe" @@ -20,7 +21,7 @@ func (j JSON) Scan(value any) error { case int64: buf = strconv.AppendInt(nil, v, 10) case float64: - buf = strconv.AppendFloat(nil, v, 'g', -1, 64) + buf = AppendNumber(nil, v) case time.Time: buf = append(buf, '"') buf = v.AppendFormat(buf, time.RFC3339Nano) @@ -33,3 +34,17 @@ func (j JSON) Scan(value any) error { return json.Unmarshal(buf, j.Value) } + +func AppendNumber(dst []byte, f float64) []byte { + switch { + case math.IsNaN(f): + dst = append(dst, "null"...) + case math.IsInf(f, 1): + dst = append(dst, "9.0e999"...) + case math.IsInf(f, -1): + dst = append(dst, "-9.0e999"...) + default: + return strconv.AppendFloat(dst, f, 'g', -1, 64) + } + return dst +} diff --git a/vendor/github.com/ncruces/go-sqlite3/internal/util/mem.go b/vendor/github.com/ncruces/go-sqlite3/internal/util/mem.go index a09523fd1..bfb1a6440 100644 --- a/vendor/github.com/ncruces/go-sqlite3/internal/util/mem.go +++ b/vendor/github.com/ncruces/go-sqlite3/internal/util/mem.go @@ -7,110 +7,121 @@ import ( "github.com/tetratelabs/wazero/api" ) -func View(mod api.Module, ptr uint32, size uint64) []byte { +const ( + PtrLen = 4 + IntLen = 4 +) + +type ( + i8 interface{ ~int8 | ~uint8 } + i32 interface{ ~int32 | ~uint32 } + i64 interface{ ~int64 | ~uint64 } + + Stk_t = uint64 + Ptr_t uint32 + Res_t int32 +) + +func View(mod api.Module, ptr Ptr_t, size int64) []byte { if ptr == 0 { panic(NilErr) } - if size > math.MaxUint32 { - panic(RangeErr) - } if size == 0 { return nil } - buf, ok := mod.Memory().Read(ptr, uint32(size)) + if uint64(size) > math.MaxUint32 { + panic(RangeErr) + } + buf, ok := mod.Memory().Read(uint32(ptr), uint32(size)) if !ok { panic(RangeErr) } return buf } -func ReadUint8(mod api.Module, ptr uint32) uint8 { +func Read[T i8](mod api.Module, ptr Ptr_t) T { if ptr == 0 { panic(NilErr) } - v, ok := mod.Memory().ReadByte(ptr) + v, ok := mod.Memory().ReadByte(uint32(ptr)) if !ok { panic(RangeErr) } - return v + return T(v) } -func ReadUint32(mod api.Module, ptr uint32) uint32 { +func Write[T i8](mod api.Module, ptr Ptr_t, v T) { if ptr == 0 { panic(NilErr) } - v, ok := mod.Memory().ReadUint32Le(ptr) - if !ok { - panic(RangeErr) - } - return v -} - -func WriteUint8(mod api.Module, ptr uint32, v uint8) { - if ptr == 0 { - panic(NilErr) - } - ok := mod.Memory().WriteByte(ptr, v) + ok := mod.Memory().WriteByte(uint32(ptr), uint8(v)) if !ok { panic(RangeErr) } } -func WriteUint32(mod api.Module, ptr uint32, v uint32) { +func Read32[T i32](mod api.Module, ptr Ptr_t) T { if ptr == 0 { panic(NilErr) } - ok := mod.Memory().WriteUint32Le(ptr, v) + v, ok := mod.Memory().ReadUint32Le(uint32(ptr)) + if !ok { + panic(RangeErr) + } + return T(v) +} + +func Write32[T i32](mod api.Module, ptr Ptr_t, v T) { + if ptr == 0 { + panic(NilErr) + } + ok := mod.Memory().WriteUint32Le(uint32(ptr), uint32(v)) if !ok { panic(RangeErr) } } -func ReadUint64(mod api.Module, ptr uint32) uint64 { +func Read64[T i64](mod api.Module, ptr Ptr_t) T { if ptr == 0 { panic(NilErr) } - v, ok := mod.Memory().ReadUint64Le(ptr) + v, ok := mod.Memory().ReadUint64Le(uint32(ptr)) if !ok { panic(RangeErr) } - return v + return T(v) } -func WriteUint64(mod api.Module, ptr uint32, v uint64) { +func Write64[T i64](mod api.Module, ptr Ptr_t, v T) { if ptr == 0 { panic(NilErr) } - ok := mod.Memory().WriteUint64Le(ptr, v) + ok := mod.Memory().WriteUint64Le(uint32(ptr), uint64(v)) if !ok { panic(RangeErr) } } -func ReadFloat64(mod api.Module, ptr uint32) float64 { - return math.Float64frombits(ReadUint64(mod, ptr)) +func ReadFloat64(mod api.Module, ptr Ptr_t) float64 { + return math.Float64frombits(Read64[uint64](mod, ptr)) } -func WriteFloat64(mod api.Module, ptr uint32, v float64) { - WriteUint64(mod, ptr, math.Float64bits(v)) +func WriteFloat64(mod api.Module, ptr Ptr_t, v float64) { + Write64(mod, ptr, math.Float64bits(v)) } -func ReadString(mod api.Module, ptr, maxlen uint32) string { +func ReadString(mod api.Module, ptr Ptr_t, maxlen int64) string { if ptr == 0 { panic(NilErr) } - switch maxlen { - case 0: + if maxlen <= 0 { return "" - case math.MaxUint32: - // avoid overflow - default: - maxlen = maxlen + 1 } mem := mod.Memory() - buf, ok := mem.Read(ptr, maxlen) + maxlen = min(maxlen, math.MaxInt32-1) + 1 + buf, ok := mem.Read(uint32(ptr), uint32(maxlen)) if !ok { - buf, ok = mem.Read(ptr, mem.Size()-ptr) + buf, ok = mem.Read(uint32(ptr), mem.Size()-uint32(ptr)) if !ok { panic(RangeErr) } @@ -122,13 +133,13 @@ func ReadString(mod api.Module, ptr, maxlen uint32) string { } } -func WriteBytes(mod api.Module, ptr uint32, b []byte) { - buf := View(mod, ptr, uint64(len(b))) +func WriteBytes(mod api.Module, ptr Ptr_t, b []byte) { + buf := View(mod, ptr, int64(len(b))) copy(buf, b) } -func WriteString(mod api.Module, ptr uint32, s string) { - buf := View(mod, ptr, uint64(len(s)+1)) +func WriteString(mod api.Module, ptr Ptr_t, s string) { + buf := View(mod, ptr, int64(len(s))+1) buf[len(s)] = 0 copy(buf, s) } diff --git a/vendor/github.com/ncruces/go-sqlite3/internal/util/mmap_unix.go b/vendor/github.com/ncruces/go-sqlite3/internal/util/mmap_unix.go index 4ff056666..42a247529 100644 --- a/vendor/github.com/ncruces/go-sqlite3/internal/util/mmap_unix.go +++ b/vendor/github.com/ncruces/go-sqlite3/internal/util/mmap_unix.go @@ -25,9 +25,9 @@ func (s *mmapState) new(ctx context.Context, mod api.Module, size int32) *Mapped // Allocate page aligned memmory. alloc := mod.ExportedFunction("aligned_alloc") - stack := [...]uint64{ - uint64(unix.Getpagesize()), - uint64(size), + stack := [...]Stk_t{ + Stk_t(unix.Getpagesize()), + Stk_t(size), } if err := alloc.CallWithStack(ctx, stack[:]); err != nil { panic(err) @@ -37,20 +37,20 @@ func (s *mmapState) new(ctx context.Context, mod api.Module, size int32) *Mapped } // Save the newly allocated region. - ptr := uint32(stack[0]) - buf := View(mod, ptr, uint64(size)) - res := &MappedRegion{ + ptr := Ptr_t(stack[0]) + buf := View(mod, ptr, int64(size)) + ret := &MappedRegion{ Ptr: ptr, size: size, addr: unsafe.Pointer(&buf[0]), } - s.regions = append(s.regions, res) - return res + s.regions = append(s.regions, ret) + return ret } type MappedRegion struct { addr unsafe.Pointer - Ptr uint32 + Ptr Ptr_t size int32 used bool } diff --git a/vendor/github.com/ncruces/go-sqlite3/internal/util/mmap_windows.go b/vendor/github.com/ncruces/go-sqlite3/internal/util/mmap_windows.go index efff1e733..913a5f733 100644 --- a/vendor/github.com/ncruces/go-sqlite3/internal/util/mmap_windows.go +++ b/vendor/github.com/ncruces/go-sqlite3/internal/util/mmap_windows.go @@ -29,13 +29,13 @@ func MapRegion(ctx context.Context, mod api.Module, f *os.File, offset int64, si return nil, err } - res := &MappedRegion{Handle: h, addr: a} + ret := &MappedRegion{Handle: h, addr: a} // SliceHeader, although deprecated, avoids a go vet warning. - sh := (*reflect.SliceHeader)(unsafe.Pointer(&res.Data)) + sh := (*reflect.SliceHeader)(unsafe.Pointer(&ret.Data)) sh.Len = int(size) sh.Cap = int(size) sh.Data = a - return res, nil + return ret, nil } func (r *MappedRegion) Unmap() error { diff --git a/vendor/github.com/ncruces/go-sqlite3/sqlite.go b/vendor/github.com/ncruces/go-sqlite3/sqlite.go index 18f8241df..8203603e7 100644 --- a/vendor/github.com/ncruces/go-sqlite3/sqlite.go +++ b/vendor/github.com/ncruces/go-sqlite3/sqlite.go @@ -3,7 +3,6 @@ package sqlite3 import ( "context" - "math" "math/bits" "os" "sync" @@ -58,8 +57,8 @@ func compileSQLite() { } else { cfg = cfg.WithMemoryLimitPages(4096) // 256MB } + cfg = cfg.WithCoreFeatures(api.CoreFeaturesV2) } - cfg = cfg.WithCoreFeatures(api.CoreFeaturesV2) instance.runtime = wazero.NewRuntimeWithConfig(ctx, cfg) @@ -94,7 +93,7 @@ type sqlite struct { id [32]*byte mask uint32 } - stack [9]uint64 + stack [9]stk_t } func instantiateSQLite() (sqlt *sqlite, err error) { @@ -120,7 +119,7 @@ func (sqlt *sqlite) close() error { return sqlt.mod.Close(sqlt.ctx) } -func (sqlt *sqlite) error(rc uint64, handle uint32, sql ...string) error { +func (sqlt *sqlite) error(rc res_t, handle ptr_t, sql ...string) error { if rc == _OK { return nil } @@ -131,18 +130,18 @@ func (sqlt *sqlite) error(rc uint64, handle uint32, sql ...string) error { panic(util.OOMErr) } - if r := sqlt.call("sqlite3_errstr", rc); r != 0 { - err.str = util.ReadString(sqlt.mod, uint32(r), _MAX_NAME) + if ptr := ptr_t(sqlt.call("sqlite3_errstr", stk_t(rc))); ptr != 0 { + err.str = util.ReadString(sqlt.mod, ptr, _MAX_NAME) } if handle != 0 { - if r := sqlt.call("sqlite3_errmsg", uint64(handle)); r != 0 { - err.msg = util.ReadString(sqlt.mod, uint32(r), _MAX_LENGTH) + if ptr := ptr_t(sqlt.call("sqlite3_errmsg", stk_t(handle))); ptr != 0 { + err.msg = util.ReadString(sqlt.mod, ptr, _MAX_LENGTH) } if len(sql) != 0 { - if r := sqlt.call("sqlite3_error_offset", uint64(handle)); r != math.MaxUint32 { - err.sql = sql[0][r:] + if i := int32(sqlt.call("sqlite3_error_offset", stk_t(handle))); i != -1 { + err.sql = sql[0][i:] } } } @@ -182,7 +181,7 @@ func (sqlt *sqlite) putfn(name string, fn api.Function) { } } -func (sqlt *sqlite) call(name string, params ...uint64) uint64 { +func (sqlt *sqlite) call(name string, params ...stk_t) stk_t { copy(sqlt.stack[:], params) fn := sqlt.getfn(name) err := fn.CallWithStack(sqlt.ctx, sqlt.stack[:]) @@ -190,33 +189,33 @@ func (sqlt *sqlite) call(name string, params ...uint64) uint64 { panic(err) } sqlt.putfn(name, fn) - return sqlt.stack[0] + return stk_t(sqlt.stack[0]) } -func (sqlt *sqlite) free(ptr uint32) { +func (sqlt *sqlite) free(ptr ptr_t) { if ptr == 0 { return } - sqlt.call("sqlite3_free", uint64(ptr)) + sqlt.call("sqlite3_free", stk_t(ptr)) } -func (sqlt *sqlite) new(size uint64) uint32 { - ptr := uint32(sqlt.call("sqlite3_malloc64", size)) +func (sqlt *sqlite) new(size int64) ptr_t { + ptr := ptr_t(sqlt.call("sqlite3_malloc64", stk_t(size))) if ptr == 0 && size != 0 { panic(util.OOMErr) } return ptr } -func (sqlt *sqlite) realloc(ptr uint32, size uint64) uint32 { - ptr = uint32(sqlt.call("sqlite3_realloc64", uint64(ptr), size)) +func (sqlt *sqlite) realloc(ptr ptr_t, size int64) ptr_t { + ptr = ptr_t(sqlt.call("sqlite3_realloc64", stk_t(ptr), stk_t(size))) if ptr == 0 && size != 0 { panic(util.OOMErr) } return ptr } -func (sqlt *sqlite) newBytes(b []byte) uint32 { +func (sqlt *sqlite) newBytes(b []byte) ptr_t { if (*[0]byte)(b) == nil { return 0 } @@ -224,33 +223,31 @@ func (sqlt *sqlite) newBytes(b []byte) uint32 { if size == 0 { size = 1 } - ptr := sqlt.new(uint64(size)) + ptr := sqlt.new(int64(size)) util.WriteBytes(sqlt.mod, ptr, b) return ptr } -func (sqlt *sqlite) newString(s string) uint32 { - ptr := sqlt.new(uint64(len(s) + 1)) +func (sqlt *sqlite) newString(s string) ptr_t { + ptr := sqlt.new(int64(len(s)) + 1) util.WriteString(sqlt.mod, ptr, s) return ptr } -func (sqlt *sqlite) newArena(size uint64) arena { - // Ensure the arena's size is a multiple of 8. - size = (size + 7) &^ 7 +const arenaSize = 4096 + +func (sqlt *sqlite) newArena() arena { return arena{ sqlt: sqlt, - size: uint32(size), - base: sqlt.new(size), + base: sqlt.new(arenaSize), } } type arena struct { sqlt *sqlite - ptrs []uint32 - base uint32 - next uint32 - size uint32 + ptrs []ptr_t + base ptr_t + next int32 } func (a *arena) free() { @@ -277,34 +274,34 @@ func (a *arena) mark() (reset func()) { } } -func (a *arena) new(size uint64) uint32 { +func (a *arena) new(size int64) ptr_t { // Align the next address, to 4 or 8 bytes. if size&7 != 0 { a.next = (a.next + 3) &^ 3 } else { a.next = (a.next + 7) &^ 7 } - if size <= uint64(a.size-a.next) { - ptr := a.base + a.next - a.next += uint32(size) - return ptr + if size <= arenaSize-int64(a.next) { + ptr := a.base + ptr_t(a.next) + a.next += int32(size) + return ptr_t(ptr) } ptr := a.sqlt.new(size) a.ptrs = append(a.ptrs, ptr) - return ptr + return ptr_t(ptr) } -func (a *arena) bytes(b []byte) uint32 { +func (a *arena) bytes(b []byte) ptr_t { if (*[0]byte)(b) == nil { return 0 } - ptr := a.new(uint64(len(b))) + ptr := a.new(int64(len(b))) util.WriteBytes(a.sqlt.mod, ptr, b) return ptr } -func (a *arena) string(s string) uint32 { - ptr := a.new(uint64(len(s) + 1)) +func (a *arena) string(s string) ptr_t { + ptr := a.new(int64(len(s)) + 1) util.WriteString(a.sqlt.mod, ptr, s) return ptr } diff --git a/vendor/github.com/ncruces/go-sqlite3/stmt.go b/vendor/github.com/ncruces/go-sqlite3/stmt.go index f1648f076..4e17d1039 100644 --- a/vendor/github.com/ncruces/go-sqlite3/stmt.go +++ b/vendor/github.com/ncruces/go-sqlite3/stmt.go @@ -16,7 +16,7 @@ type Stmt struct { c *Conn err error sql string - handle uint32 + handle ptr_t } // Close destroys the prepared statement object. @@ -29,7 +29,7 @@ func (s *Stmt) Close() error { return nil } - r := s.c.call("sqlite3_finalize", uint64(s.handle)) + rc := res_t(s.c.call("sqlite3_finalize", stk_t(s.handle))) stmts := s.c.stmts for i := range stmts { if s == stmts[i] { @@ -42,7 +42,7 @@ func (s *Stmt) Close() error { } s.handle = 0 - return s.c.error(r) + return s.c.error(rc) } // Conn returns the database connection to which the prepared statement belongs. @@ -64,9 +64,9 @@ func (s *Stmt) SQL() string { // // https://sqlite.org/c3ref/expanded_sql.html func (s *Stmt) ExpandedSQL() string { - r := s.c.call("sqlite3_expanded_sql", uint64(s.handle)) - sql := util.ReadString(s.c.mod, uint32(r), _MAX_SQL_LENGTH) - s.c.free(uint32(r)) + ptr := ptr_t(s.c.call("sqlite3_expanded_sql", stk_t(s.handle))) + sql := util.ReadString(s.c.mod, ptr, _MAX_SQL_LENGTH) + s.c.free(ptr) return sql } @@ -75,25 +75,25 @@ func (s *Stmt) ExpandedSQL() string { // // https://sqlite.org/c3ref/stmt_readonly.html func (s *Stmt) ReadOnly() bool { - r := s.c.call("sqlite3_stmt_readonly", uint64(s.handle)) - return r != 0 + b := int32(s.c.call("sqlite3_stmt_readonly", stk_t(s.handle))) + return b != 0 } // Reset resets the prepared statement object. // // https://sqlite.org/c3ref/reset.html func (s *Stmt) Reset() error { - r := s.c.call("sqlite3_reset", uint64(s.handle)) + rc := res_t(s.c.call("sqlite3_reset", stk_t(s.handle))) s.err = nil - return s.c.error(r) + return s.c.error(rc) } // Busy determines if a prepared statement has been reset. // // https://sqlite.org/c3ref/stmt_busy.html func (s *Stmt) Busy() bool { - r := s.c.call("sqlite3_stmt_busy", uint64(s.handle)) - return r != 0 + rc := res_t(s.c.call("sqlite3_stmt_busy", stk_t(s.handle))) + return rc != 0 } // Step evaluates the SQL statement. @@ -107,15 +107,15 @@ func (s *Stmt) Busy() bool { // https://sqlite.org/c3ref/step.html func (s *Stmt) Step() bool { s.c.checkInterrupt(s.c.handle) - r := s.c.call("sqlite3_step", uint64(s.handle)) - switch r { + rc := res_t(s.c.call("sqlite3_step", stk_t(s.handle))) + switch rc { case _ROW: s.err = nil return true case _DONE: s.err = nil default: - s.err = s.c.error(r) + s.err = s.c.error(rc) } return false } @@ -143,30 +143,30 @@ func (s *Stmt) Status(op StmtStatus, reset bool) int { if op > STMTSTATUS_FILTER_HIT && op != STMTSTATUS_MEMUSED { return 0 } - var i uint64 + var i int32 if reset { i = 1 } - r := s.c.call("sqlite3_stmt_status", uint64(s.handle), - uint64(op), i) - return int(int32(r)) + n := int32(s.c.call("sqlite3_stmt_status", stk_t(s.handle), + stk_t(op), stk_t(i))) + return int(n) } // ClearBindings resets all bindings on the prepared statement. // // https://sqlite.org/c3ref/clear_bindings.html func (s *Stmt) ClearBindings() error { - r := s.c.call("sqlite3_clear_bindings", uint64(s.handle)) - return s.c.error(r) + rc := res_t(s.c.call("sqlite3_clear_bindings", stk_t(s.handle))) + return s.c.error(rc) } // BindCount returns the number of SQL parameters in the prepared statement. // // https://sqlite.org/c3ref/bind_parameter_count.html func (s *Stmt) BindCount() int { - r := s.c.call("sqlite3_bind_parameter_count", - uint64(s.handle)) - return int(int32(r)) + n := int32(s.c.call("sqlite3_bind_parameter_count", + stk_t(s.handle))) + return int(n) } // BindIndex returns the index of a parameter in the prepared statement @@ -176,9 +176,9 @@ func (s *Stmt) BindCount() int { func (s *Stmt) BindIndex(name string) int { defer s.c.arena.mark()() namePtr := s.c.arena.string(name) - r := s.c.call("sqlite3_bind_parameter_index", - uint64(s.handle), uint64(namePtr)) - return int(int32(r)) + i := int32(s.c.call("sqlite3_bind_parameter_index", + stk_t(s.handle), stk_t(namePtr))) + return int(i) } // BindName returns the name of a parameter in the prepared statement. @@ -186,10 +186,8 @@ func (s *Stmt) BindIndex(name string) int { // // https://sqlite.org/c3ref/bind_parameter_name.html func (s *Stmt) BindName(param int) string { - r := s.c.call("sqlite3_bind_parameter_name", - uint64(s.handle), uint64(param)) - - ptr := uint32(r) + ptr := ptr_t(s.c.call("sqlite3_bind_parameter_name", + stk_t(s.handle), stk_t(param))) if ptr == 0 { return "" } @@ -223,9 +221,9 @@ func (s *Stmt) BindInt(param int, value int) error { // // https://sqlite.org/c3ref/bind_blob.html func (s *Stmt) BindInt64(param int, value int64) error { - r := s.c.call("sqlite3_bind_int64", - uint64(s.handle), uint64(param), uint64(value)) - return s.c.error(r) + rc := res_t(s.c.call("sqlite3_bind_int64", + stk_t(s.handle), stk_t(param), stk_t(value))) + return s.c.error(rc) } // BindFloat binds a float64 to the prepared statement. @@ -233,9 +231,10 @@ func (s *Stmt) BindInt64(param int, value int64) error { // // https://sqlite.org/c3ref/bind_blob.html func (s *Stmt) BindFloat(param int, value float64) error { - r := s.c.call("sqlite3_bind_double", - uint64(s.handle), uint64(param), math.Float64bits(value)) - return s.c.error(r) + rc := res_t(s.c.call("sqlite3_bind_double", + stk_t(s.handle), stk_t(param), + stk_t(math.Float64bits(value)))) + return s.c.error(rc) } // BindText binds a string to the prepared statement. @@ -247,10 +246,10 @@ func (s *Stmt) BindText(param int, value string) error { return TOOBIG } ptr := s.c.newString(value) - r := s.c.call("sqlite3_bind_text_go", - uint64(s.handle), uint64(param), - uint64(ptr), uint64(len(value))) - return s.c.error(r) + rc := res_t(s.c.call("sqlite3_bind_text_go", + stk_t(s.handle), stk_t(param), + stk_t(ptr), stk_t(len(value)))) + return s.c.error(rc) } // BindRawText binds a []byte to the prepared statement as text. @@ -263,10 +262,10 @@ func (s *Stmt) BindRawText(param int, value []byte) error { return TOOBIG } ptr := s.c.newBytes(value) - r := s.c.call("sqlite3_bind_text_go", - uint64(s.handle), uint64(param), - uint64(ptr), uint64(len(value))) - return s.c.error(r) + rc := res_t(s.c.call("sqlite3_bind_text_go", + stk_t(s.handle), stk_t(param), + stk_t(ptr), stk_t(len(value)))) + return s.c.error(rc) } // BindBlob binds a []byte to the prepared statement. @@ -279,10 +278,10 @@ func (s *Stmt) BindBlob(param int, value []byte) error { return TOOBIG } ptr := s.c.newBytes(value) - r := s.c.call("sqlite3_bind_blob_go", - uint64(s.handle), uint64(param), - uint64(ptr), uint64(len(value))) - return s.c.error(r) + rc := res_t(s.c.call("sqlite3_bind_blob_go", + stk_t(s.handle), stk_t(param), + stk_t(ptr), stk_t(len(value)))) + return s.c.error(rc) } // BindZeroBlob binds a zero-filled, length n BLOB to the prepared statement. @@ -290,9 +289,9 @@ func (s *Stmt) BindBlob(param int, value []byte) error { // // https://sqlite.org/c3ref/bind_blob.html func (s *Stmt) BindZeroBlob(param int, n int64) error { - r := s.c.call("sqlite3_bind_zeroblob64", - uint64(s.handle), uint64(param), uint64(n)) - return s.c.error(r) + rc := res_t(s.c.call("sqlite3_bind_zeroblob64", + stk_t(s.handle), stk_t(param), stk_t(n))) + return s.c.error(rc) } // BindNull binds a NULL to the prepared statement. @@ -300,9 +299,9 @@ func (s *Stmt) BindZeroBlob(param int, n int64) error { // // https://sqlite.org/c3ref/bind_blob.html func (s *Stmt) BindNull(param int) error { - r := s.c.call("sqlite3_bind_null", - uint64(s.handle), uint64(param)) - return s.c.error(r) + rc := res_t(s.c.call("sqlite3_bind_null", + stk_t(s.handle), stk_t(param))) + return s.c.error(rc) } // BindTime binds a [time.Time] to the prepared statement. @@ -316,28 +315,27 @@ func (s *Stmt) BindTime(param int, value time.Time, format TimeFormat) error { } switch v := format.Encode(value).(type) { case string: - s.BindText(param, v) + return s.BindText(param, v) case int64: - s.BindInt64(param, v) + return s.BindInt64(param, v) case float64: - s.BindFloat(param, v) + return s.BindFloat(param, v) default: panic(util.AssertErr()) } - return nil } func (s *Stmt) bindRFC3339Nano(param int, value time.Time) error { - const maxlen = uint64(len(time.RFC3339Nano)) + 5 + const maxlen = int64(len(time.RFC3339Nano)) + 5 ptr := s.c.new(maxlen) buf := util.View(s.c.mod, ptr, maxlen) buf = value.AppendFormat(buf[:0], time.RFC3339Nano) - r := s.c.call("sqlite3_bind_text_go", - uint64(s.handle), uint64(param), - uint64(ptr), uint64(len(buf))) - return s.c.error(r) + rc := res_t(s.c.call("sqlite3_bind_text_go", + stk_t(s.handle), stk_t(param), + stk_t(ptr), stk_t(len(buf)))) + return s.c.error(rc) } // BindPointer binds a NULL to the prepared statement, just like [Stmt.BindNull], @@ -348,9 +346,9 @@ func (s *Stmt) bindRFC3339Nano(param int, value time.Time) error { // https://sqlite.org/c3ref/bind_blob.html func (s *Stmt) BindPointer(param int, ptr any) error { valPtr := util.AddHandle(s.c.ctx, ptr) - r := s.c.call("sqlite3_bind_pointer_go", - uint64(s.handle), uint64(param), uint64(valPtr)) - return s.c.error(r) + rc := res_t(s.c.call("sqlite3_bind_pointer_go", + stk_t(s.handle), stk_t(param), stk_t(valPtr))) + return s.c.error(rc) } // BindJSON binds the JSON encoding of value to the prepared statement. @@ -373,27 +371,27 @@ func (s *Stmt) BindValue(param int, value Value) error { if value.c != s.c { return MISUSE } - r := s.c.call("sqlite3_bind_value", - uint64(s.handle), uint64(param), uint64(value.handle)) - return s.c.error(r) + rc := res_t(s.c.call("sqlite3_bind_value", + stk_t(s.handle), stk_t(param), stk_t(value.handle))) + return s.c.error(rc) } // DataCount resets the number of columns in a result set. // // https://sqlite.org/c3ref/data_count.html func (s *Stmt) DataCount() int { - r := s.c.call("sqlite3_data_count", - uint64(s.handle)) - return int(int32(r)) + n := int32(s.c.call("sqlite3_data_count", + stk_t(s.handle))) + return int(n) } // ColumnCount returns the number of columns in a result set. // // https://sqlite.org/c3ref/column_count.html func (s *Stmt) ColumnCount() int { - r := s.c.call("sqlite3_column_count", - uint64(s.handle)) - return int(int32(r)) + n := int32(s.c.call("sqlite3_column_count", + stk_t(s.handle))) + return int(n) } // ColumnName returns the name of the result column. @@ -401,12 +399,12 @@ func (s *Stmt) ColumnCount() int { // // https://sqlite.org/c3ref/column_name.html func (s *Stmt) ColumnName(col int) string { - r := s.c.call("sqlite3_column_name", - uint64(s.handle), uint64(col)) - if r == 0 { + ptr := ptr_t(s.c.call("sqlite3_column_name", + stk_t(s.handle), stk_t(col))) + if ptr == 0 { panic(util.OOMErr) } - return util.ReadString(s.c.mod, uint32(r), _MAX_NAME) + return util.ReadString(s.c.mod, ptr, _MAX_NAME) } // ColumnType returns the initial [Datatype] of the result column. @@ -414,9 +412,8 @@ func (s *Stmt) ColumnName(col int) string { // // https://sqlite.org/c3ref/column_blob.html func (s *Stmt) ColumnType(col int) Datatype { - r := s.c.call("sqlite3_column_type", - uint64(s.handle), uint64(col)) - return Datatype(r) + return Datatype(s.c.call("sqlite3_column_type", + stk_t(s.handle), stk_t(col))) } // ColumnDeclType returns the declared datatype of the result column. @@ -424,12 +421,12 @@ func (s *Stmt) ColumnType(col int) Datatype { // // https://sqlite.org/c3ref/column_decltype.html func (s *Stmt) ColumnDeclType(col int) string { - r := s.c.call("sqlite3_column_decltype", - uint64(s.handle), uint64(col)) - if r == 0 { + ptr := ptr_t(s.c.call("sqlite3_column_decltype", + stk_t(s.handle), stk_t(col))) + if ptr == 0 { return "" } - return util.ReadString(s.c.mod, uint32(r), _MAX_NAME) + return util.ReadString(s.c.mod, ptr, _MAX_NAME) } // ColumnDatabaseName returns the name of the database @@ -438,12 +435,12 @@ func (s *Stmt) ColumnDeclType(col int) string { // // https://sqlite.org/c3ref/column_database_name.html func (s *Stmt) ColumnDatabaseName(col int) string { - r := s.c.call("sqlite3_column_database_name", - uint64(s.handle), uint64(col)) - if r == 0 { + ptr := ptr_t(s.c.call("sqlite3_column_database_name", + stk_t(s.handle), stk_t(col))) + if ptr == 0 { return "" } - return util.ReadString(s.c.mod, uint32(r), _MAX_NAME) + return util.ReadString(s.c.mod, ptr, _MAX_NAME) } // ColumnTableName returns the name of the table @@ -452,12 +449,12 @@ func (s *Stmt) ColumnDatabaseName(col int) string { // // https://sqlite.org/c3ref/column_database_name.html func (s *Stmt) ColumnTableName(col int) string { - r := s.c.call("sqlite3_column_table_name", - uint64(s.handle), uint64(col)) - if r == 0 { + ptr := ptr_t(s.c.call("sqlite3_column_table_name", + stk_t(s.handle), stk_t(col))) + if ptr == 0 { return "" } - return util.ReadString(s.c.mod, uint32(r), _MAX_NAME) + return util.ReadString(s.c.mod, ptr, _MAX_NAME) } // ColumnOriginName returns the name of the table column @@ -466,12 +463,12 @@ func (s *Stmt) ColumnTableName(col int) string { // // https://sqlite.org/c3ref/column_database_name.html func (s *Stmt) ColumnOriginName(col int) string { - r := s.c.call("sqlite3_column_origin_name", - uint64(s.handle), uint64(col)) - if r == 0 { + ptr := ptr_t(s.c.call("sqlite3_column_origin_name", + stk_t(s.handle), stk_t(col))) + if ptr == 0 { return "" } - return util.ReadString(s.c.mod, uint32(r), _MAX_NAME) + return util.ReadString(s.c.mod, ptr, _MAX_NAME) } // ColumnBool returns the value of the result column as a bool. @@ -498,9 +495,8 @@ func (s *Stmt) ColumnInt(col int) int { // // https://sqlite.org/c3ref/column_blob.html func (s *Stmt) ColumnInt64(col int) int64 { - r := s.c.call("sqlite3_column_int64", - uint64(s.handle), uint64(col)) - return int64(r) + return int64(s.c.call("sqlite3_column_int64", + stk_t(s.handle), stk_t(col))) } // ColumnFloat returns the value of the result column as a float64. @@ -508,9 +504,9 @@ func (s *Stmt) ColumnInt64(col int) int64 { // // https://sqlite.org/c3ref/column_blob.html func (s *Stmt) ColumnFloat(col int) float64 { - r := s.c.call("sqlite3_column_double", - uint64(s.handle), uint64(col)) - return math.Float64frombits(r) + f := uint64(s.c.call("sqlite3_column_double", + stk_t(s.handle), stk_t(col))) + return math.Float64frombits(f) } // ColumnTime returns the value of the result column as a [time.Time]. @@ -562,9 +558,9 @@ func (s *Stmt) ColumnBlob(col int, buf []byte) []byte { // // https://sqlite.org/c3ref/column_blob.html func (s *Stmt) ColumnRawText(col int) []byte { - r := s.c.call("sqlite3_column_text", - uint64(s.handle), uint64(col)) - return s.columnRawBytes(col, uint32(r)) + ptr := ptr_t(s.c.call("sqlite3_column_text", + stk_t(s.handle), stk_t(col))) + return s.columnRawBytes(col, ptr) } // ColumnRawBlob returns the value of the result column as a []byte. @@ -574,23 +570,23 @@ func (s *Stmt) ColumnRawText(col int) []byte { // // https://sqlite.org/c3ref/column_blob.html func (s *Stmt) ColumnRawBlob(col int) []byte { - r := s.c.call("sqlite3_column_blob", - uint64(s.handle), uint64(col)) - return s.columnRawBytes(col, uint32(r)) + ptr := ptr_t(s.c.call("sqlite3_column_blob", + stk_t(s.handle), stk_t(col))) + return s.columnRawBytes(col, ptr) } -func (s *Stmt) columnRawBytes(col int, ptr uint32) []byte { +func (s *Stmt) columnRawBytes(col int, ptr ptr_t) []byte { if ptr == 0 { - r := s.c.call("sqlite3_errcode", uint64(s.c.handle)) - if r != _ROW && r != _DONE { - s.err = s.c.error(r) + rc := res_t(s.c.call("sqlite3_errcode", stk_t(s.c.handle))) + if rc != _ROW && rc != _DONE { + s.err = s.c.error(rc) } return nil } - r := s.c.call("sqlite3_column_bytes", - uint64(s.handle), uint64(col)) - return util.View(s.c.mod, ptr, r) + n := int32(s.c.call("sqlite3_column_bytes", + stk_t(s.handle), stk_t(col))) + return util.View(s.c.mod, ptr, int64(n)) } // ColumnJSON parses the JSON-encoded value of the result column @@ -610,7 +606,7 @@ func (s *Stmt) ColumnJSON(col int, ptr any) error { case INTEGER: data = strconv.AppendInt(nil, s.ColumnInt64(col), 10) case FLOAT: - data = strconv.AppendFloat(nil, s.ColumnFloat(col), 'g', -1, 64) + data = util.AppendNumber(nil, s.ColumnFloat(col)) default: panic(util.AssertErr()) } @@ -622,12 +618,12 @@ func (s *Stmt) ColumnJSON(col int, ptr any) error { // // https://sqlite.org/c3ref/column_blob.html func (s *Stmt) ColumnValue(col int) Value { - r := s.c.call("sqlite3_column_value", - uint64(s.handle), uint64(col)) + ptr := ptr_t(s.c.call("sqlite3_column_value", + stk_t(s.handle), stk_t(col))) return Value{ c: s.c, unprot: true, - handle: uint32(r), + handle: ptr, } } @@ -641,13 +637,13 @@ func (s *Stmt) ColumnValue(col int) Value { // subsequent calls to [Stmt] methods. func (s *Stmt) Columns(dest ...any) error { defer s.c.arena.mark()() - count := uint64(len(dest)) + count := int64(len(dest)) typePtr := s.c.arena.new(count) dataPtr := s.c.arena.new(count * 8) - r := s.c.call("sqlite3_columns_go", - uint64(s.handle), count, uint64(typePtr), uint64(dataPtr)) - if err := s.c.error(r); err != nil { + rc := res_t(s.c.call("sqlite3_columns_go", + stk_t(s.handle), stk_t(count), stk_t(typePtr), stk_t(dataPtr))) + if err := s.c.error(rc); err != nil { return err } @@ -661,19 +657,19 @@ func (s *Stmt) Columns(dest ...any) error { for i := range dest { switch types[i] { case byte(INTEGER): - dest[i] = int64(util.ReadUint64(s.c.mod, dataPtr)) + dest[i] = util.Read64[int64](s.c.mod, dataPtr) case byte(FLOAT): dest[i] = util.ReadFloat64(s.c.mod, dataPtr) case byte(NULL): dest[i] = nil default: - ptr := util.ReadUint32(s.c.mod, dataPtr+0) + ptr := util.Read32[ptr_t](s.c.mod, dataPtr+0) if ptr == 0 { dest[i] = []byte{} continue } - len := util.ReadUint32(s.c.mod, dataPtr+4) - buf := util.View(s.c.mod, ptr, uint64(len)) + len := util.Read32[int32](s.c.mod, dataPtr+4) + buf := util.View(s.c.mod, ptr, int64(len)) if types[i] == byte(TEXT) { dest[i] = string(buf) } else { diff --git a/vendor/github.com/ncruces/go-sqlite3/txn.go b/vendor/github.com/ncruces/go-sqlite3/txn.go index 57ba979aa..b24789f87 100644 --- a/vendor/github.com/ncruces/go-sqlite3/txn.go +++ b/vendor/github.com/ncruces/go-sqlite3/txn.go @@ -229,13 +229,12 @@ func (c *Conn) txnExecInterrupted(sql string) error { // // https://sqlite.org/c3ref/txn_state.html func (c *Conn) TxnState(schema string) TxnState { - var ptr uint32 + var ptr ptr_t if schema != "" { defer c.arena.mark()() ptr = c.arena.string(schema) } - r := c.call("sqlite3_txn_state", uint64(c.handle), uint64(ptr)) - return TxnState(r) + return TxnState(c.call("sqlite3_txn_state", stk_t(c.handle), stk_t(ptr))) } // CommitHook registers a callback function to be invoked @@ -244,11 +243,11 @@ func (c *Conn) TxnState(schema string) TxnState { // // https://sqlite.org/c3ref/commit_hook.html func (c *Conn) CommitHook(cb func() (ok bool)) { - var enable uint64 + var enable int32 if cb != nil { enable = 1 } - c.call("sqlite3_commit_hook_go", uint64(c.handle), enable) + c.call("sqlite3_commit_hook_go", stk_t(c.handle), stk_t(enable)) c.commit = cb } @@ -257,11 +256,11 @@ func (c *Conn) CommitHook(cb func() (ok bool)) { // // https://sqlite.org/c3ref/commit_hook.html func (c *Conn) RollbackHook(cb func()) { - var enable uint64 + var enable int32 if cb != nil { enable = 1 } - c.call("sqlite3_rollback_hook_go", uint64(c.handle), enable) + c.call("sqlite3_rollback_hook_go", stk_t(c.handle), stk_t(enable)) c.rollback = cb } @@ -270,15 +269,15 @@ func (c *Conn) RollbackHook(cb func()) { // // https://sqlite.org/c3ref/update_hook.html func (c *Conn) UpdateHook(cb func(action AuthorizerActionCode, schema, table string, rowid int64)) { - var enable uint64 + var enable int32 if cb != nil { enable = 1 } - c.call("sqlite3_update_hook_go", uint64(c.handle), enable) + c.call("sqlite3_update_hook_go", stk_t(c.handle), stk_t(enable)) c.update = cb } -func commitCallback(ctx context.Context, mod api.Module, pDB uint32) (rollback uint32) { +func commitCallback(ctx context.Context, mod api.Module, pDB ptr_t) (rollback int32) { if c, ok := ctx.Value(connKey{}).(*Conn); ok && c.handle == pDB && c.commit != nil { if !c.commit() { rollback = 1 @@ -287,17 +286,17 @@ func commitCallback(ctx context.Context, mod api.Module, pDB uint32) (rollback u return rollback } -func rollbackCallback(ctx context.Context, mod api.Module, pDB uint32) { +func rollbackCallback(ctx context.Context, mod api.Module, pDB ptr_t) { if c, ok := ctx.Value(connKey{}).(*Conn); ok && c.handle == pDB && c.rollback != nil { c.rollback() } } -func updateCallback(ctx context.Context, mod api.Module, pDB uint32, action AuthorizerActionCode, zSchema, zTabName uint32, rowid uint64) { +func updateCallback(ctx context.Context, mod api.Module, pDB ptr_t, action AuthorizerActionCode, zSchema, zTabName ptr_t, rowid int64) { if c, ok := ctx.Value(connKey{}).(*Conn); ok && c.handle == pDB && c.update != nil { schema := util.ReadString(mod, zSchema, _MAX_NAME) table := util.ReadString(mod, zTabName, _MAX_NAME) - c.update(action, schema, table, int64(rowid)) + c.update(action, schema, table, rowid) } } @@ -305,6 +304,6 @@ func updateCallback(ctx context.Context, mod api.Module, pDB uint32, action Auth // // https://sqlite.org/c3ref/db_cacheflush.html func (c *Conn) CacheFlush() error { - r := c.call("sqlite3_db_cacheflush", uint64(c.handle)) - return c.error(r) + rc := res_t(c.call("sqlite3_db_cacheflush", stk_t(c.handle))) + return c.error(rc) } diff --git a/vendor/github.com/ncruces/go-sqlite3/util/sql3util/parse.go b/vendor/github.com/ncruces/go-sqlite3/util/sql3util/parse.go index f84fc4dd1..7dd76ceb1 100644 --- a/vendor/github.com/ncruces/go-sqlite3/util/sql3util/parse.go +++ b/vendor/github.com/ncruces/go-sqlite3/util/sql3util/parse.go @@ -50,7 +50,7 @@ func ParseTable(sql string) (_ *Table, err error) { copy(buf, sql) } - stack := [...]uint64{sqlp, uint64(len(sql)), errp} + stack := [...]util.Stk_t{sqlp, util.Stk_t(len(sql)), errp} err = mod.ExportedFunction("sql3parse_table").CallWithStack(ctx, stack[:]) if err != nil { return nil, err @@ -96,9 +96,9 @@ func (t *Table) load(mod api.Module, ptr uint32, sql string) { t.IsWithoutRowID = loadBool(mod, ptr+26) t.IsStrict = loadBool(mod, ptr+27) - t.Columns = loadSlice(mod, ptr+28, func(ptr uint32, res *Column) { + t.Columns = loadSlice(mod, ptr+28, func(ptr uint32, ret *Column) { p, _ := mod.Memory().ReadUint32Le(ptr) - res.load(mod, p, sql) + ret.load(mod, p, sql) }) t.Type = loadEnum[StatementType](mod, ptr+44) @@ -166,8 +166,8 @@ type ForeignKey struct { func (f *ForeignKey) load(mod api.Module, ptr uint32, sql string) { f.Table = loadString(mod, ptr+0, sql) - f.Columns = loadSlice(mod, ptr+8, func(ptr uint32, res *string) { - *res = loadString(mod, ptr, sql) + f.Columns = loadSlice(mod, ptr+8, func(ptr uint32, ret *string) { + *ret = loadString(mod, ptr, sql) }) f.OnDelete = loadEnum[FKAction](mod, ptr+16) @@ -191,12 +191,12 @@ func loadSlice[T any](mod api.Module, ptr uint32, fn func(uint32, *T)) []T { return nil } len, _ := mod.Memory().ReadUint32Le(ptr + 0) - res := make([]T, len) - for i := range res { - fn(ref, &res[i]) + ret := make([]T, len) + for i := range ret { + fn(ref, &ret[i]) ref += 4 } - return res + return ret } func loadEnum[T ~uint32](mod api.Module, ptr uint32) T { diff --git a/vendor/github.com/ncruces/go-sqlite3/value.go b/vendor/github.com/ncruces/go-sqlite3/value.go index 86f6689da..a2399fba0 100644 --- a/vendor/github.com/ncruces/go-sqlite3/value.go +++ b/vendor/github.com/ncruces/go-sqlite3/value.go @@ -14,27 +14,27 @@ import ( // https://sqlite.org/c3ref/value.html type Value struct { c *Conn - handle uint32 + handle ptr_t unprot bool copied bool } -func (v Value) protected() uint64 { +func (v Value) protected() stk_t { if v.unprot { panic(util.ValueErr) } - return uint64(v.handle) + return stk_t(v.handle) } // Dup makes a copy of the SQL value and returns a pointer to that copy. // // https://sqlite.org/c3ref/value_dup.html func (v Value) Dup() *Value { - r := v.c.call("sqlite3_value_dup", uint64(v.handle)) + ptr := ptr_t(v.c.call("sqlite3_value_dup", stk_t(v.handle))) return &Value{ c: v.c, copied: true, - handle: uint32(r), + handle: ptr, } } @@ -45,7 +45,7 @@ func (dup *Value) Close() error { if !dup.copied { panic(util.ValueErr) } - dup.c.call("sqlite3_value_free", uint64(dup.handle)) + dup.c.call("sqlite3_value_free", stk_t(dup.handle)) dup.handle = 0 return nil } @@ -54,16 +54,14 @@ func (dup *Value) Close() error { // // https://sqlite.org/c3ref/value_blob.html func (v Value) Type() Datatype { - r := v.c.call("sqlite3_value_type", v.protected()) - return Datatype(r) + return Datatype(v.c.call("sqlite3_value_type", v.protected())) } // Type returns the numeric datatype of the value. // // https://sqlite.org/c3ref/value_blob.html func (v Value) NumericType() Datatype { - r := v.c.call("sqlite3_value_numeric_type", v.protected()) - return Datatype(r) + return Datatype(v.c.call("sqlite3_value_numeric_type", v.protected())) } // Bool returns the value as a bool. @@ -87,16 +85,15 @@ func (v Value) Int() int { // // https://sqlite.org/c3ref/value_blob.html func (v Value) Int64() int64 { - r := v.c.call("sqlite3_value_int64", v.protected()) - return int64(r) + return int64(v.c.call("sqlite3_value_int64", v.protected())) } // Float returns the value as a float64. // // https://sqlite.org/c3ref/value_blob.html func (v Value) Float() float64 { - r := v.c.call("sqlite3_value_double", v.protected()) - return math.Float64frombits(r) + f := uint64(v.c.call("sqlite3_value_double", v.protected())) + return math.Float64frombits(f) } // Time returns the value as a [time.Time]. @@ -141,8 +138,8 @@ func (v Value) Blob(buf []byte) []byte { // // https://sqlite.org/c3ref/value_blob.html func (v Value) RawText() []byte { - r := v.c.call("sqlite3_value_text", v.protected()) - return v.rawBytes(uint32(r)) + ptr := ptr_t(v.c.call("sqlite3_value_text", v.protected())) + return v.rawBytes(ptr) } // RawBlob returns the value as a []byte. @@ -151,24 +148,24 @@ func (v Value) RawText() []byte { // // https://sqlite.org/c3ref/value_blob.html func (v Value) RawBlob() []byte { - r := v.c.call("sqlite3_value_blob", v.protected()) - return v.rawBytes(uint32(r)) + ptr := ptr_t(v.c.call("sqlite3_value_blob", v.protected())) + return v.rawBytes(ptr) } -func (v Value) rawBytes(ptr uint32) []byte { +func (v Value) rawBytes(ptr ptr_t) []byte { if ptr == 0 { return nil } - r := v.c.call("sqlite3_value_bytes", v.protected()) - return util.View(v.c.mod, ptr, r) + n := int32(v.c.call("sqlite3_value_bytes", v.protected())) + return util.View(v.c.mod, ptr, int64(n)) } // Pointer gets the pointer associated with this value, // or nil if it has no associated pointer. func (v Value) Pointer() any { - r := v.c.call("sqlite3_value_pointer_go", v.protected()) - return util.GetHandle(v.c.ctx, uint32(r)) + ptr := ptr_t(v.c.call("sqlite3_value_pointer_go", v.protected())) + return util.GetHandle(v.c.ctx, ptr) } // JSON parses a JSON-encoded value @@ -185,7 +182,7 @@ func (v Value) JSON(ptr any) error { case INTEGER: data = strconv.AppendInt(nil, v.Int64(), 10) case FLOAT: - data = strconv.AppendFloat(nil, v.Float(), 'g', -1, 64) + data = util.AppendNumber(nil, v.Float()) default: panic(util.AssertErr()) } @@ -197,16 +194,16 @@ func (v Value) JSON(ptr any) error { // // https://sqlite.org/c3ref/value_blob.html func (v Value) NoChange() bool { - r := v.c.call("sqlite3_value_nochange", v.protected()) - return r != 0 + b := int32(v.c.call("sqlite3_value_nochange", v.protected())) + return b != 0 } // FromBind returns true if value originated from a bound parameter. // // https://sqlite.org/c3ref/value_blob.html func (v Value) FromBind() bool { - r := v.c.call("sqlite3_value_frombind", v.protected()) - return r != 0 + b := int32(v.c.call("sqlite3_value_frombind", v.protected())) + return b != 0 } // InFirst returns the first element @@ -216,13 +213,13 @@ func (v Value) FromBind() bool { func (v Value) InFirst() (Value, error) { defer v.c.arena.mark()() valPtr := v.c.arena.new(ptrlen) - r := v.c.call("sqlite3_vtab_in_first", uint64(v.handle), uint64(valPtr)) - if err := v.c.error(r); err != nil { + rc := res_t(v.c.call("sqlite3_vtab_in_first", stk_t(v.handle), stk_t(valPtr))) + if err := v.c.error(rc); err != nil { return Value{}, err } return Value{ c: v.c, - handle: util.ReadUint32(v.c.mod, valPtr), + handle: util.Read32[ptr_t](v.c.mod, valPtr), }, nil } @@ -233,12 +230,12 @@ func (v Value) InFirst() (Value, error) { func (v Value) InNext() (Value, error) { defer v.c.arena.mark()() valPtr := v.c.arena.new(ptrlen) - r := v.c.call("sqlite3_vtab_in_next", uint64(v.handle), uint64(valPtr)) - if err := v.c.error(r); err != nil { + rc := res_t(v.c.call("sqlite3_vtab_in_next", stk_t(v.handle), stk_t(valPtr))) + if err := v.c.error(rc); err != nil { return Value{}, err } return Value{ c: v.c, - handle: util.ReadUint32(v.c.mod, valPtr), + handle: util.Read32[ptr_t](v.c.mod, valPtr), }, nil } diff --git a/vendor/github.com/ncruces/go-sqlite3/vfs/api.go b/vendor/github.com/ncruces/go-sqlite3/vfs/api.go index f2531f223..d5bb3a7ae 100644 --- a/vendor/github.com/ncruces/go-sqlite3/vfs/api.go +++ b/vendor/github.com/ncruces/go-sqlite3/vfs/api.go @@ -193,7 +193,7 @@ type FileSharedMemory interface { // SharedMemory is a shared-memory WAL-index implementation. // Use [NewSharedMemory] to create a shared-memory. type SharedMemory interface { - shmMap(context.Context, api.Module, int32, int32, bool) (uint32, _ErrorCode) + shmMap(context.Context, api.Module, int32, int32, bool) (ptr_t, _ErrorCode) shmLock(int32, int32, _ShmFlag) _ErrorCode shmUnmap(bool) shmBarrier() @@ -207,7 +207,7 @@ type blockingSharedMemory interface { type fileControl interface { File - fileControl(ctx context.Context, mod api.Module, op _FcntlOpcode, pArg uint32) _ErrorCode + fileControl(ctx context.Context, mod api.Module, op _FcntlOpcode, pArg ptr_t) _ErrorCode } type filePDB interface { diff --git a/vendor/github.com/ncruces/go-sqlite3/vfs/cksm.go b/vendor/github.com/ncruces/go-sqlite3/vfs/cksm.go index 42d7468f5..39493df99 100644 --- a/vendor/github.com/ncruces/go-sqlite3/vfs/cksm.go +++ b/vendor/github.com/ncruces/go-sqlite3/vfs/cksm.go @@ -102,14 +102,14 @@ func (c cksmFile) Pragma(name string, value string) (string, error) { } func (c cksmFile) DeviceCharacteristics() DeviceCharacteristic { - res := c.File.DeviceCharacteristics() + ret := c.File.DeviceCharacteristics() if c.verifyCksm { - res &^= IOCAP_SUBPAGE_READ + ret &^= IOCAP_SUBPAGE_READ } - return res + return ret } -func (c cksmFile) fileControl(ctx context.Context, mod api.Module, op _FcntlOpcode, pArg uint32) _ErrorCode { +func (c cksmFile) fileControl(ctx context.Context, mod api.Module, op _FcntlOpcode, pArg ptr_t) _ErrorCode { switch op { case _FCNTL_CKPT_START: c.inCkpt = true diff --git a/vendor/github.com/ncruces/go-sqlite3/vfs/const.go b/vendor/github.com/ncruces/go-sqlite3/vfs/const.go index 1c9b77a7a..dc3b0db83 100644 --- a/vendor/github.com/ncruces/go-sqlite3/vfs/const.go +++ b/vendor/github.com/ncruces/go-sqlite3/vfs/const.go @@ -8,7 +8,12 @@ const ( _MAX_PATHNAME = 1024 _DEFAULT_SECTOR_SIZE = 4096 - ptrlen = 4 + ptrlen = util.PtrLen +) + +type ( + stk_t = util.Stk_t + ptr_t = util.Ptr_t ) // https://sqlite.org/rescode.html diff --git a/vendor/github.com/ncruces/go-sqlite3/vfs/file.go b/vendor/github.com/ncruces/go-sqlite3/vfs/file.go index e028a2a55..bc90555e7 100644 --- a/vendor/github.com/ncruces/go-sqlite3/vfs/file.go +++ b/vendor/github.com/ncruces/go-sqlite3/vfs/file.go @@ -186,14 +186,14 @@ func (f *vfsFile) SectorSize() int { } func (f *vfsFile) DeviceCharacteristics() DeviceCharacteristic { - res := IOCAP_SUBPAGE_READ + ret := IOCAP_SUBPAGE_READ if osBatchAtomic(f.File) { - res |= IOCAP_BATCH_ATOMIC + ret |= IOCAP_BATCH_ATOMIC } if f.psow { - res |= IOCAP_POWERSAFE_OVERWRITE + ret |= IOCAP_POWERSAFE_OVERWRITE } - return res + return ret } func (f *vfsFile) SizeHint(size int64) error { diff --git a/vendor/github.com/ncruces/go-sqlite3/vfs/filename.go b/vendor/github.com/ncruces/go-sqlite3/vfs/filename.go index d9a29cd47..965c3b1a6 100644 --- a/vendor/github.com/ncruces/go-sqlite3/vfs/filename.go +++ b/vendor/github.com/ncruces/go-sqlite3/vfs/filename.go @@ -16,13 +16,13 @@ import ( type Filename struct { ctx context.Context mod api.Module - zPath uint32 + zPath ptr_t flags OpenFlag - stack [2]uint64 + stack [2]stk_t } // GetFilename is an internal API users should not call directly. -func GetFilename(ctx context.Context, mod api.Module, id uint32, flags OpenFlag) *Filename { +func GetFilename(ctx context.Context, mod api.Module, id ptr_t, flags OpenFlag) *Filename { if id == 0 { return nil } @@ -71,12 +71,12 @@ func (n *Filename) path(method string) string { return "" } - n.stack[0] = uint64(n.zPath) + n.stack[0] = stk_t(n.zPath) fn := n.mod.ExportedFunction(method) if err := fn.CallWithStack(n.ctx, n.stack[:]); err != nil { panic(err) } - return util.ReadString(n.mod, uint32(n.stack[0]), _MAX_PATHNAME) + return util.ReadString(n.mod, ptr_t(n.stack[0]), _MAX_PATHNAME) } // DatabaseFile returns the main database [File] corresponding to a journal. @@ -90,12 +90,12 @@ func (n *Filename) DatabaseFile() File { return nil } - n.stack[0] = uint64(n.zPath) + n.stack[0] = stk_t(n.zPath) fn := n.mod.ExportedFunction("sqlite3_database_file_object") if err := fn.CallWithStack(n.ctx, n.stack[:]); err != nil { panic(err) } - file, _ := vfsFileGet(n.ctx, n.mod, uint32(n.stack[0])).(File) + file, _ := vfsFileGet(n.ctx, n.mod, ptr_t(n.stack[0])).(File) return file } @@ -108,13 +108,13 @@ func (n *Filename) URIParameter(key string) string { } uriKey := n.mod.ExportedFunction("sqlite3_uri_key") - n.stack[0] = uint64(n.zPath) - n.stack[1] = uint64(0) + n.stack[0] = stk_t(n.zPath) + n.stack[1] = stk_t(0) if err := uriKey.CallWithStack(n.ctx, n.stack[:]); err != nil { panic(err) } - ptr := uint32(n.stack[0]) + ptr := ptr_t(n.stack[0]) if ptr == 0 { return "" } @@ -127,13 +127,13 @@ func (n *Filename) URIParameter(key string) string { if k == "" { return "" } - ptr += uint32(len(k)) + 1 + ptr += ptr_t(len(k)) + 1 v := util.ReadString(n.mod, ptr, _MAX_NAME) if k == key { return v } - ptr += uint32(len(v)) + 1 + ptr += ptr_t(len(v)) + 1 } } @@ -146,13 +146,13 @@ func (n *Filename) URIParameters() url.Values { } uriKey := n.mod.ExportedFunction("sqlite3_uri_key") - n.stack[0] = uint64(n.zPath) - n.stack[1] = uint64(0) + n.stack[0] = stk_t(n.zPath) + n.stack[1] = stk_t(0) if err := uriKey.CallWithStack(n.ctx, n.stack[:]); err != nil { panic(err) } - ptr := uint32(n.stack[0]) + ptr := ptr_t(n.stack[0]) if ptr == 0 { return nil } @@ -167,13 +167,13 @@ func (n *Filename) URIParameters() url.Values { if k == "" { return params } - ptr += uint32(len(k)) + 1 + ptr += ptr_t(len(k)) + 1 v := util.ReadString(n.mod, ptr, _MAX_NAME) if params == nil { params = url.Values{} } params.Add(k, v) - ptr += uint32(len(v)) + 1 + ptr += ptr_t(len(v)) + 1 } } diff --git a/vendor/github.com/ncruces/go-sqlite3/vfs/memdb/memdb.go b/vendor/github.com/ncruces/go-sqlite3/vfs/memdb/memdb.go index 4adb2dde2..419fd1c64 100644 --- a/vendor/github.com/ncruces/go-sqlite3/vfs/memdb/memdb.go +++ b/vendor/github.com/ncruces/go-sqlite3/vfs/memdb/memdb.go @@ -10,9 +10,11 @@ import ( "github.com/ncruces/go-sqlite3/vfs" ) -// Must be a multiple of 64K (the largest page size). const sectorSize = 65536 +// Ensure sectorSize is a multiple of 64K (the largest page size). +var _ [0]struct{} = [sectorSize & 65535]struct{}{} + type memVFS struct{} func (memVFS) Open(name string, flags vfs.OpenFlag) (vfs.File, vfs.OpenFlag, error) { diff --git a/vendor/github.com/ncruces/go-sqlite3/vfs/shm_bsd.go b/vendor/github.com/ncruces/go-sqlite3/vfs/shm_bsd.go index 76e6888e1..11e7bb2fd 100644 --- a/vendor/github.com/ncruces/go-sqlite3/vfs/shm_bsd.go +++ b/vendor/github.com/ncruces/go-sqlite3/vfs/shm_bsd.go @@ -142,7 +142,7 @@ func (s *vfsShm) shmOpen() _ErrorCode { return _OK } -func (s *vfsShm) shmMap(ctx context.Context, mod api.Module, id, size int32, extend bool) (uint32, _ErrorCode) { +func (s *vfsShm) shmMap(ctx context.Context, mod api.Module, id, size int32, extend bool) (ptr_t, _ErrorCode) { // Ensure size is a multiple of the OS page size. if int(size)&(unix.Getpagesize()-1) != 0 { return 0, _IOERR_SHMMAP diff --git a/vendor/github.com/ncruces/go-sqlite3/vfs/shm_dotlk.go b/vendor/github.com/ncruces/go-sqlite3/vfs/shm_dotlk.go index 842bea8f5..cb697a9c8 100644 --- a/vendor/github.com/ncruces/go-sqlite3/vfs/shm_dotlk.go +++ b/vendor/github.com/ncruces/go-sqlite3/vfs/shm_dotlk.go @@ -35,8 +35,8 @@ type vfsShm struct { free api.Function path string shadow [][_WALINDEX_PGSZ]byte - ptrs []uint32 - stack [1]uint64 + ptrs []ptr_t + stack [1]stk_t lock [_SHM_NLOCK]bool } @@ -96,7 +96,7 @@ func (s *vfsShm) shmOpen() _ErrorCode { return _OK } -func (s *vfsShm) shmMap(ctx context.Context, mod api.Module, id, size int32, extend bool) (uint32, _ErrorCode) { +func (s *vfsShm) shmMap(ctx context.Context, mod api.Module, id, size int32, extend bool) (ptr_t, _ErrorCode) { if size != _WALINDEX_PGSZ { return 0, _IOERR_SHMMAP } @@ -128,15 +128,15 @@ func (s *vfsShm) shmMap(ctx context.Context, mod api.Module, id, size int32, ext // Allocate local memory. for int(id) >= len(s.ptrs) { - s.stack[0] = uint64(size) + s.stack[0] = stk_t(size) if err := s.alloc.CallWithStack(ctx, s.stack[:]); err != nil { panic(err) } if s.stack[0] == 0 { panic(util.OOMErr) } - clear(util.View(s.mod, uint32(s.stack[0]), _WALINDEX_PGSZ)) - s.ptrs = append(s.ptrs, uint32(s.stack[0])) + clear(util.View(s.mod, ptr_t(s.stack[0]), _WALINDEX_PGSZ)) + s.ptrs = append(s.ptrs, ptr_t(s.stack[0])) } s.shadow[0][4] = 1 @@ -168,7 +168,7 @@ func (s *vfsShm) shmUnmap(delete bool) { defer s.Unlock() for _, p := range s.ptrs { - s.stack[0] = uint64(p) + s.stack[0] = stk_t(p) if err := s.free.CallWithStack(context.Background(), s.stack[:]); err != nil { panic(err) } diff --git a/vendor/github.com/ncruces/go-sqlite3/vfs/shm_ofd.go b/vendor/github.com/ncruces/go-sqlite3/vfs/shm_ofd.go index dd3611193..b0f50fcb5 100644 --- a/vendor/github.com/ncruces/go-sqlite3/vfs/shm_ofd.go +++ b/vendor/github.com/ncruces/go-sqlite3/vfs/shm_ofd.go @@ -73,7 +73,7 @@ func (s *vfsShm) shmOpen() _ErrorCode { return rc } -func (s *vfsShm) shmMap(ctx context.Context, mod api.Module, id, size int32, extend bool) (uint32, _ErrorCode) { +func (s *vfsShm) shmMap(ctx context.Context, mod api.Module, id, size int32, extend bool) (ptr_t, _ErrorCode) { // Ensure size is a multiple of the OS page size. if int(size)&(unix.Getpagesize()-1) != 0 { return 0, _IOERR_SHMMAP diff --git a/vendor/github.com/ncruces/go-sqlite3/vfs/shm_windows.go b/vendor/github.com/ncruces/go-sqlite3/vfs/shm_windows.go index 1de57640c..ed2e93f8e 100644 --- a/vendor/github.com/ncruces/go-sqlite3/vfs/shm_windows.go +++ b/vendor/github.com/ncruces/go-sqlite3/vfs/shm_windows.go @@ -26,8 +26,8 @@ type vfsShm struct { regions []*util.MappedRegion shared [][]byte shadow [][_WALINDEX_PGSZ]byte - ptrs []uint32 - stack [1]uint64 + ptrs []ptr_t + stack [1]stk_t fileLock bool blocking bool sync.Mutex @@ -72,7 +72,7 @@ func (s *vfsShm) shmOpen() _ErrorCode { return rc } -func (s *vfsShm) shmMap(ctx context.Context, mod api.Module, id, size int32, extend bool) (_ uint32, rc _ErrorCode) { +func (s *vfsShm) shmMap(ctx context.Context, mod api.Module, id, size int32, extend bool) (_ ptr_t, rc _ErrorCode) { // Ensure size is a multiple of the OS page size. if size != _WALINDEX_PGSZ || (windows.Getpagesize()-1)&_WALINDEX_PGSZ != 0 { return 0, _IOERR_SHMMAP @@ -119,15 +119,15 @@ func (s *vfsShm) shmMap(ctx context.Context, mod api.Module, id, size int32, ext // Allocate local memory. for int(id) >= len(s.ptrs) { - s.stack[0] = uint64(size) + s.stack[0] = stk_t(size) if err := s.alloc.CallWithStack(ctx, s.stack[:]); err != nil { panic(err) } if s.stack[0] == 0 { panic(util.OOMErr) } - clear(util.View(s.mod, uint32(s.stack[0]), _WALINDEX_PGSZ)) - s.ptrs = append(s.ptrs, uint32(s.stack[0])) + clear(util.View(s.mod, ptr_t(s.stack[0]), _WALINDEX_PGSZ)) + s.ptrs = append(s.ptrs, ptr_t(s.stack[0])) } s.shadow[0][4] = 1 @@ -168,7 +168,7 @@ func (s *vfsShm) shmUnmap(delete bool) { // Free local memory. for _, p := range s.ptrs { - s.stack[0] = uint64(p) + s.stack[0] = stk_t(p) if err := s.free.CallWithStack(context.Background(), s.stack[:]); err != nil { panic(err) } diff --git a/vendor/github.com/ncruces/go-sqlite3/vfs/vfs.go b/vendor/github.com/ncruces/go-sqlite3/vfs/vfs.go index d8816e409..ca105fff6 100644 --- a/vendor/github.com/ncruces/go-sqlite3/vfs/vfs.go +++ b/vendor/github.com/ncruces/go-sqlite3/vfs/vfs.go @@ -49,7 +49,7 @@ func ExportHostFunctions(env wazero.HostModuleBuilder) wazero.HostModuleBuilder return env } -func vfsFind(ctx context.Context, mod api.Module, zVfsName uint32) uint32 { +func vfsFind(ctx context.Context, mod api.Module, zVfsName ptr_t) uint32 { name := util.ReadString(mod, zVfsName, _MAX_NAME) if vfs := Find(name); vfs != nil && vfs != (vfsOS{}) { return 1 @@ -57,46 +57,46 @@ func vfsFind(ctx context.Context, mod api.Module, zVfsName uint32) uint32 { return 0 } -func vfsLocaltime(ctx context.Context, mod api.Module, pTm uint32, t int64) _ErrorCode { +func vfsLocaltime(ctx context.Context, mod api.Module, pTm ptr_t, t int64) _ErrorCode { tm := time.Unix(t, 0) - var isdst int + var isdst int32 if tm.IsDST() { isdst = 1 } const size = 32 / 8 // https://pubs.opengroup.org/onlinepubs/7908799/xsh/time.h.html - util.WriteUint32(mod, pTm+0*size, uint32(tm.Second())) - util.WriteUint32(mod, pTm+1*size, uint32(tm.Minute())) - util.WriteUint32(mod, pTm+2*size, uint32(tm.Hour())) - util.WriteUint32(mod, pTm+3*size, uint32(tm.Day())) - util.WriteUint32(mod, pTm+4*size, uint32(tm.Month()-time.January)) - util.WriteUint32(mod, pTm+5*size, uint32(tm.Year()-1900)) - util.WriteUint32(mod, pTm+6*size, uint32(tm.Weekday()-time.Sunday)) - util.WriteUint32(mod, pTm+7*size, uint32(tm.YearDay()-1)) - util.WriteUint32(mod, pTm+8*size, uint32(isdst)) + util.Write32(mod, pTm+0*size, int32(tm.Second())) + util.Write32(mod, pTm+1*size, int32(tm.Minute())) + util.Write32(mod, pTm+2*size, int32(tm.Hour())) + util.Write32(mod, pTm+3*size, int32(tm.Day())) + util.Write32(mod, pTm+4*size, int32(tm.Month()-time.January)) + util.Write32(mod, pTm+5*size, int32(tm.Year()-1900)) + util.Write32(mod, pTm+6*size, int32(tm.Weekday()-time.Sunday)) + util.Write32(mod, pTm+7*size, int32(tm.YearDay()-1)) + util.Write32(mod, pTm+8*size, isdst) return _OK } -func vfsRandomness(ctx context.Context, mod api.Module, pVfs uint32, nByte int32, zByte uint32) uint32 { - mem := util.View(mod, zByte, uint64(nByte)) +func vfsRandomness(ctx context.Context, mod api.Module, pVfs ptr_t, nByte int32, zByte ptr_t) uint32 { + mem := util.View(mod, zByte, int64(nByte)) n, _ := rand.Reader.Read(mem) return uint32(n) } -func vfsSleep(ctx context.Context, mod api.Module, pVfs uint32, nMicro int32) _ErrorCode { +func vfsSleep(ctx context.Context, mod api.Module, pVfs ptr_t, nMicro int32) _ErrorCode { time.Sleep(time.Duration(nMicro) * time.Microsecond) return _OK } -func vfsCurrentTime64(ctx context.Context, mod api.Module, pVfs, piNow uint32) _ErrorCode { +func vfsCurrentTime64(ctx context.Context, mod api.Module, pVfs, piNow ptr_t) _ErrorCode { day, nsec := julianday.Date(time.Now()) msec := day*86_400_000 + nsec/1_000_000 - util.WriteUint64(mod, piNow, uint64(msec)) + util.Write64(mod, piNow, msec) return _OK } -func vfsFullPathname(ctx context.Context, mod api.Module, pVfs, zRelative uint32, nFull int32, zFull uint32) _ErrorCode { +func vfsFullPathname(ctx context.Context, mod api.Module, pVfs, zRelative ptr_t, nFull int32, zFull ptr_t) _ErrorCode { vfs := vfsGet(mod, pVfs) path := util.ReadString(mod, zRelative, _MAX_PATHNAME) @@ -110,7 +110,7 @@ func vfsFullPathname(ctx context.Context, mod api.Module, pVfs, zRelative uint32 return vfsErrorCode(err, _CANTOPEN_FULLPATH) } -func vfsDelete(ctx context.Context, mod api.Module, pVfs, zPath, syncDir uint32) _ErrorCode { +func vfsDelete(ctx context.Context, mod api.Module, pVfs, zPath ptr_t, syncDir int32) _ErrorCode { vfs := vfsGet(mod, pVfs) path := util.ReadString(mod, zPath, _MAX_PATHNAME) @@ -118,21 +118,20 @@ func vfsDelete(ctx context.Context, mod api.Module, pVfs, zPath, syncDir uint32) return vfsErrorCode(err, _IOERR_DELETE) } -func vfsAccess(ctx context.Context, mod api.Module, pVfs, zPath uint32, flags AccessFlag, pResOut uint32) _ErrorCode { +func vfsAccess(ctx context.Context, mod api.Module, pVfs, zPath ptr_t, flags AccessFlag, pResOut ptr_t) _ErrorCode { vfs := vfsGet(mod, pVfs) path := util.ReadString(mod, zPath, _MAX_PATHNAME) ok, err := vfs.Access(path, flags) - var res uint32 + var res int32 if ok { res = 1 } - - util.WriteUint32(mod, pResOut, res) + util.Write32(mod, pResOut, res) return vfsErrorCode(err, _IOERR_ACCESS) } -func vfsOpen(ctx context.Context, mod api.Module, pVfs, zPath, pFile uint32, flags OpenFlag, pOutFlags, pOutVFS uint32) _ErrorCode { +func vfsOpen(ctx context.Context, mod api.Module, pVfs, zPath, pFile ptr_t, flags OpenFlag, pOutFlags, pOutVFS ptr_t) _ErrorCode { vfs := vfsGet(mod, pVfs) name := GetFilename(ctx, mod, zPath, flags) @@ -154,24 +153,24 @@ func vfsOpen(ctx context.Context, mod api.Module, pVfs, zPath, pFile uint32, fla } if file, ok := file.(FileSharedMemory); ok && pOutVFS != 0 && file.SharedMemory() != nil { - util.WriteUint32(mod, pOutVFS, 1) + util.Write32(mod, pOutVFS, int32(1)) } if pOutFlags != 0 { - util.WriteUint32(mod, pOutFlags, uint32(flags)) + util.Write32(mod, pOutFlags, flags) } file = cksmWrapFile(name, flags, file) vfsFileRegister(ctx, mod, pFile, file) return _OK } -func vfsClose(ctx context.Context, mod api.Module, pFile uint32) _ErrorCode { +func vfsClose(ctx context.Context, mod api.Module, pFile ptr_t) _ErrorCode { err := vfsFileClose(ctx, mod, pFile) return vfsErrorCode(err, _IOERR_CLOSE) } -func vfsRead(ctx context.Context, mod api.Module, pFile, zBuf uint32, iAmt int32, iOfst int64) _ErrorCode { +func vfsRead(ctx context.Context, mod api.Module, pFile, zBuf ptr_t, iAmt int32, iOfst int64) _ErrorCode { file := vfsFileGet(ctx, mod, pFile).(File) - buf := util.View(mod, zBuf, uint64(iAmt)) + buf := util.View(mod, zBuf, int64(iAmt)) n, err := file.ReadAt(buf, iOfst) if n == int(iAmt) { @@ -184,59 +183,58 @@ func vfsRead(ctx context.Context, mod api.Module, pFile, zBuf uint32, iAmt int32 return _IOERR_SHORT_READ } -func vfsWrite(ctx context.Context, mod api.Module, pFile, zBuf uint32, iAmt int32, iOfst int64) _ErrorCode { +func vfsWrite(ctx context.Context, mod api.Module, pFile, zBuf ptr_t, iAmt int32, iOfst int64) _ErrorCode { file := vfsFileGet(ctx, mod, pFile).(File) - buf := util.View(mod, zBuf, uint64(iAmt)) + buf := util.View(mod, zBuf, int64(iAmt)) _, err := file.WriteAt(buf, iOfst) return vfsErrorCode(err, _IOERR_WRITE) } -func vfsTruncate(ctx context.Context, mod api.Module, pFile uint32, nByte int64) _ErrorCode { +func vfsTruncate(ctx context.Context, mod api.Module, pFile ptr_t, nByte int64) _ErrorCode { file := vfsFileGet(ctx, mod, pFile).(File) err := file.Truncate(nByte) return vfsErrorCode(err, _IOERR_TRUNCATE) } -func vfsSync(ctx context.Context, mod api.Module, pFile uint32, flags SyncFlag) _ErrorCode { +func vfsSync(ctx context.Context, mod api.Module, pFile ptr_t, flags SyncFlag) _ErrorCode { file := vfsFileGet(ctx, mod, pFile).(File) err := file.Sync(flags) return vfsErrorCode(err, _IOERR_FSYNC) } -func vfsFileSize(ctx context.Context, mod api.Module, pFile, pSize uint32) _ErrorCode { +func vfsFileSize(ctx context.Context, mod api.Module, pFile, pSize ptr_t) _ErrorCode { file := vfsFileGet(ctx, mod, pFile).(File) size, err := file.Size() - util.WriteUint64(mod, pSize, uint64(size)) + util.Write64(mod, pSize, size) return vfsErrorCode(err, _IOERR_SEEK) } -func vfsLock(ctx context.Context, mod api.Module, pFile uint32, eLock LockLevel) _ErrorCode { +func vfsLock(ctx context.Context, mod api.Module, pFile ptr_t, eLock LockLevel) _ErrorCode { file := vfsFileGet(ctx, mod, pFile).(File) err := file.Lock(eLock) return vfsErrorCode(err, _IOERR_LOCK) } -func vfsUnlock(ctx context.Context, mod api.Module, pFile uint32, eLock LockLevel) _ErrorCode { +func vfsUnlock(ctx context.Context, mod api.Module, pFile ptr_t, eLock LockLevel) _ErrorCode { file := vfsFileGet(ctx, mod, pFile).(File) err := file.Unlock(eLock) return vfsErrorCode(err, _IOERR_UNLOCK) } -func vfsCheckReservedLock(ctx context.Context, mod api.Module, pFile, pResOut uint32) _ErrorCode { +func vfsCheckReservedLock(ctx context.Context, mod api.Module, pFile, pResOut ptr_t) _ErrorCode { file := vfsFileGet(ctx, mod, pFile).(File) locked, err := file.CheckReservedLock() - var res uint32 + var res int32 if locked { res = 1 } - - util.WriteUint32(mod, pResOut, res) + util.Write32(mod, pResOut, res) return vfsErrorCode(err, _IOERR_CHECKRESERVEDLOCK) } -func vfsFileControl(ctx context.Context, mod api.Module, pFile uint32, op _FcntlOpcode, pArg uint32) _ErrorCode { +func vfsFileControl(ctx context.Context, mod api.Module, pFile ptr_t, op _FcntlOpcode, pArg ptr_t) _ErrorCode { file := vfsFileGet(ctx, mod, pFile).(File) if file, ok := file.(fileControl); ok { return file.fileControl(ctx, mod, op, pArg) @@ -244,62 +242,62 @@ func vfsFileControl(ctx context.Context, mod api.Module, pFile uint32, op _Fcntl return vfsFileControlImpl(ctx, mod, file, op, pArg) } -func vfsFileControlImpl(ctx context.Context, mod api.Module, file File, op _FcntlOpcode, pArg uint32) _ErrorCode { +func vfsFileControlImpl(ctx context.Context, mod api.Module, file File, op _FcntlOpcode, pArg ptr_t) _ErrorCode { switch op { case _FCNTL_LOCKSTATE: if file, ok := file.(FileLockState); ok { if lk := file.LockState(); lk <= LOCK_EXCLUSIVE { - util.WriteUint32(mod, pArg, uint32(lk)) + util.Write32(mod, pArg, lk) return _OK } } case _FCNTL_PERSIST_WAL: if file, ok := file.(FilePersistWAL); ok { - if i := util.ReadUint32(mod, pArg); int32(i) >= 0 { + if i := util.Read32[int32](mod, pArg); i >= 0 { file.SetPersistWAL(i != 0) } else if file.PersistWAL() { - util.WriteUint32(mod, pArg, 1) + util.Write32(mod, pArg, int32(1)) } else { - util.WriteUint32(mod, pArg, 0) + util.Write32(mod, pArg, int32(0)) } return _OK } case _FCNTL_POWERSAFE_OVERWRITE: if file, ok := file.(FilePowersafeOverwrite); ok { - if i := util.ReadUint32(mod, pArg); int32(i) >= 0 { + if i := util.Read32[int32](mod, pArg); i >= 0 { file.SetPowersafeOverwrite(i != 0) } else if file.PowersafeOverwrite() { - util.WriteUint32(mod, pArg, 1) + util.Write32(mod, pArg, int32(1)) } else { - util.WriteUint32(mod, pArg, 0) + util.Write32(mod, pArg, int32(0)) } return _OK } case _FCNTL_CHUNK_SIZE: if file, ok := file.(FileChunkSize); ok { - size := util.ReadUint32(mod, pArg) + size := util.Read32[int32](mod, pArg) file.ChunkSize(int(size)) return _OK } case _FCNTL_SIZE_HINT: if file, ok := file.(FileSizeHint); ok { - size := util.ReadUint64(mod, pArg) - err := file.SizeHint(int64(size)) + size := util.Read64[int64](mod, pArg) + err := file.SizeHint(size) return vfsErrorCode(err, _IOERR_TRUNCATE) } case _FCNTL_HAS_MOVED: if file, ok := file.(FileHasMoved); ok { moved, err := file.HasMoved() - var res uint32 + var val uint32 if moved { - res = 1 + val = 1 } - util.WriteUint32(mod, pArg, res) + util.Write32(mod, pArg, val) return vfsErrorCode(err, _IOERR_FSTAT) } @@ -354,10 +352,10 @@ func vfsFileControlImpl(ctx context.Context, mod api.Module, file File, op _Fcnt case _FCNTL_PRAGMA: if file, ok := file.(FilePragma); ok { - ptr := util.ReadUint32(mod, pArg+1*ptrlen) + ptr := util.Read32[ptr_t](mod, pArg+1*ptrlen) name := util.ReadString(mod, ptr, _MAX_SQL_LENGTH) var value string - if ptr := util.ReadUint32(mod, pArg+2*ptrlen); ptr != 0 { + if ptr := util.Read32[ptr_t](mod, pArg+2*ptrlen); ptr != 0 { value = util.ReadString(mod, ptr, _MAX_SQL_LENGTH) } @@ -369,22 +367,22 @@ func vfsFileControlImpl(ctx context.Context, mod api.Module, file File, op _Fcnt } if out != "" { fn := mod.ExportedFunction("sqlite3_malloc64") - stack := [...]uint64{uint64(len(out) + 1)} + stack := [...]stk_t{stk_t(len(out) + 1)} if err := fn.CallWithStack(ctx, stack[:]); err != nil { panic(err) } - util.WriteUint32(mod, pArg, uint32(stack[0])) - util.WriteString(mod, uint32(stack[0]), out) + util.Write32(mod, pArg, ptr_t(stack[0])) + util.WriteString(mod, ptr_t(stack[0]), out) } return ret } case _FCNTL_BUSYHANDLER: if file, ok := file.(FileBusyHandler); ok { - arg := util.ReadUint64(mod, pArg) + arg := util.Read64[stk_t](mod, pArg) fn := mod.ExportedFunction("sqlite3_invoke_busy_handler_go") file.BusyHandler(func() bool { - stack := [...]uint64{arg} + stack := [...]stk_t{arg} if err := fn.CallWithStack(ctx, stack[:]); err != nil { panic(err) } @@ -396,7 +394,7 @@ func vfsFileControlImpl(ctx context.Context, mod api.Module, file File, op _Fcnt case _FCNTL_LOCK_TIMEOUT: if file, ok := file.(FileSharedMemory); ok { if shm, ok := file.SharedMemory().(blockingSharedMemory); ok { - shm.shmEnableBlocking(util.ReadUint32(mod, pArg) != 0) + shm.shmEnableBlocking(util.Read32[uint32](mod, pArg) != 0) return _OK } } @@ -411,44 +409,45 @@ func vfsFileControlImpl(ctx context.Context, mod api.Module, file File, op _Fcnt return _NOTFOUND } -func vfsSectorSize(ctx context.Context, mod api.Module, pFile uint32) uint32 { +func vfsSectorSize(ctx context.Context, mod api.Module, pFile ptr_t) uint32 { file := vfsFileGet(ctx, mod, pFile).(File) return uint32(file.SectorSize()) } -func vfsDeviceCharacteristics(ctx context.Context, mod api.Module, pFile uint32) DeviceCharacteristic { +func vfsDeviceCharacteristics(ctx context.Context, mod api.Module, pFile ptr_t) DeviceCharacteristic { file := vfsFileGet(ctx, mod, pFile).(File) return file.DeviceCharacteristics() } -func vfsShmBarrier(ctx context.Context, mod api.Module, pFile uint32) { +func vfsShmBarrier(ctx context.Context, mod api.Module, pFile ptr_t) { shm := vfsFileGet(ctx, mod, pFile).(FileSharedMemory).SharedMemory() shm.shmBarrier() } -func vfsShmMap(ctx context.Context, mod api.Module, pFile uint32, iRegion, szRegion int32, bExtend, pp uint32) _ErrorCode { +func vfsShmMap(ctx context.Context, mod api.Module, pFile ptr_t, iRegion, szRegion, bExtend int32, pp ptr_t) _ErrorCode { shm := vfsFileGet(ctx, mod, pFile).(FileSharedMemory).SharedMemory() p, rc := shm.shmMap(ctx, mod, iRegion, szRegion, bExtend != 0) - util.WriteUint32(mod, pp, p) + util.Write32(mod, pp, p) return rc } -func vfsShmLock(ctx context.Context, mod api.Module, pFile uint32, offset, n int32, flags _ShmFlag) _ErrorCode { +func vfsShmLock(ctx context.Context, mod api.Module, pFile ptr_t, offset, n int32, flags _ShmFlag) _ErrorCode { shm := vfsFileGet(ctx, mod, pFile).(FileSharedMemory).SharedMemory() return shm.shmLock(offset, n, flags) } -func vfsShmUnmap(ctx context.Context, mod api.Module, pFile, bDelete uint32) _ErrorCode { +func vfsShmUnmap(ctx context.Context, mod api.Module, pFile ptr_t, bDelete int32) _ErrorCode { shm := vfsFileGet(ctx, mod, pFile).(FileSharedMemory).SharedMemory() shm.shmUnmap(bDelete != 0) return _OK } -func vfsGet(mod api.Module, pVfs uint32) VFS { +func vfsGet(mod api.Module, pVfs ptr_t) VFS { var name string if pVfs != 0 { const zNameOffset = 16 - name = util.ReadString(mod, util.ReadUint32(mod, pVfs+zNameOffset), _MAX_NAME) + ptr := util.Read32[ptr_t](mod, pVfs+zNameOffset) + name = util.ReadString(mod, ptr, _MAX_NAME) } if vfs := Find(name); vfs != nil { return vfs @@ -456,21 +455,21 @@ func vfsGet(mod api.Module, pVfs uint32) VFS { panic(util.NoVFSErr + util.ErrorString(name)) } -func vfsFileRegister(ctx context.Context, mod api.Module, pFile uint32, file File) { +func vfsFileRegister(ctx context.Context, mod api.Module, pFile ptr_t, file File) { const fileHandleOffset = 4 id := util.AddHandle(ctx, file) - util.WriteUint32(mod, pFile+fileHandleOffset, id) + util.Write32(mod, pFile+fileHandleOffset, id) } -func vfsFileGet(ctx context.Context, mod api.Module, pFile uint32) any { +func vfsFileGet(ctx context.Context, mod api.Module, pFile ptr_t) any { const fileHandleOffset = 4 - id := util.ReadUint32(mod, pFile+fileHandleOffset) + id := util.Read32[ptr_t](mod, pFile+fileHandleOffset) return util.GetHandle(ctx, id) } -func vfsFileClose(ctx context.Context, mod api.Module, pFile uint32) error { +func vfsFileClose(ctx context.Context, mod api.Module, pFile ptr_t) error { const fileHandleOffset = 4 - id := util.ReadUint32(mod, pFile+fileHandleOffset) + id := util.Read32[ptr_t](mod, pFile+fileHandleOffset) return util.DelHandle(ctx, id) } diff --git a/vendor/github.com/ncruces/go-sqlite3/vtab.go b/vendor/github.com/ncruces/go-sqlite3/vtab.go index 1998a5281..278195e92 100644 --- a/vendor/github.com/ncruces/go-sqlite3/vtab.go +++ b/vendor/github.com/ncruces/go-sqlite3/vtab.go @@ -2,6 +2,7 @@ package sqlite3 import ( "context" + "errors" "reflect" "github.com/tetratelabs/wazero/api" @@ -58,15 +59,15 @@ func CreateModule[T VTab](db *Conn, name string, create, connect VTabConstructor flags |= VTAB_SHADOWTABS } - var modulePtr uint32 + var modulePtr ptr_t defer db.arena.mark()() namePtr := db.arena.string(name) if connect != nil { modulePtr = util.AddHandle(db.ctx, module[T]{create, connect}) } - r := db.call("sqlite3_create_module_go", uint64(db.handle), - uint64(namePtr), uint64(flags), uint64(modulePtr)) - return db.error(r) + rc := res_t(db.call("sqlite3_create_module_go", stk_t(db.handle), + stk_t(namePtr), stk_t(flags), stk_t(modulePtr))) + return db.error(rc) } func implements[T any](typ reflect.Type) bool { @@ -80,8 +81,8 @@ func implements[T any](typ reflect.Type) bool { func (c *Conn) DeclareVTab(sql string) error { defer c.arena.mark()() sqlPtr := c.arena.string(sql) - r := c.call("sqlite3_declare_vtab", uint64(c.handle), uint64(sqlPtr)) - return c.error(r) + rc := res_t(c.call("sqlite3_declare_vtab", stk_t(c.handle), stk_t(sqlPtr))) + return c.error(rc) } // VTabConflictMode is a virtual table conflict resolution mode. @@ -101,8 +102,7 @@ const ( // // https://sqlite.org/c3ref/vtab_on_conflict.html func (c *Conn) VTabOnConflict() VTabConflictMode { - r := c.call("sqlite3_vtab_on_conflict", uint64(c.handle)) - return VTabConflictMode(r) + return VTabConflictMode(c.call("sqlite3_vtab_on_conflict", stk_t(c.handle))) } // VTabConfigOption is a virtual table configuration option. @@ -121,14 +121,14 @@ const ( // // https://sqlite.org/c3ref/vtab_config.html func (c *Conn) VTabConfig(op VTabConfigOption, args ...any) error { - var i uint64 + var i int32 if op == VTAB_CONSTRAINT_SUPPORT && len(args) > 0 { if b, ok := args[0].(bool); ok && b { i = 1 } } - r := c.call("sqlite3_vtab_config_go", uint64(c.handle), uint64(op), i) - return c.error(r) + rc := res_t(c.call("sqlite3_vtab_config_go", stk_t(c.handle), stk_t(op), stk_t(i))) + return c.error(rc) } // VTabConstructor is a virtual table constructor function. @@ -263,7 +263,7 @@ type IndexInfo struct { // Inputs Constraint []IndexConstraint OrderBy []IndexOrderBy - ColumnsUsed int64 + ColumnsUsed uint64 // Outputs ConstraintUsage []IndexConstraintUsage IdxNum int @@ -274,7 +274,7 @@ type IndexInfo struct { EstimatedRows int64 // Internal c *Conn - handle uint32 + handle ptr_t } // An IndexConstraint describes virtual table indexing constraint information. @@ -309,14 +309,14 @@ type IndexConstraintUsage struct { func (idx *IndexInfo) RHSValue(column int) (Value, error) { defer idx.c.arena.mark()() valPtr := idx.c.arena.new(ptrlen) - r := idx.c.call("sqlite3_vtab_rhs_value", uint64(idx.handle), - uint64(column), uint64(valPtr)) - if err := idx.c.error(r); err != nil { + rc := res_t(idx.c.call("sqlite3_vtab_rhs_value", stk_t(idx.handle), + stk_t(column), stk_t(valPtr))) + if err := idx.c.error(rc); err != nil { return Value{}, err } return Value{ c: idx.c, - handle: util.ReadUint32(idx.c.mod, valPtr), + handle: util.Read32[ptr_t](idx.c.mod, valPtr), }, nil } @@ -324,26 +324,26 @@ func (idx *IndexInfo) RHSValue(column int) (Value, error) { // // https://sqlite.org/c3ref/vtab_collation.html func (idx *IndexInfo) Collation(column int) string { - r := idx.c.call("sqlite3_vtab_collation", uint64(idx.handle), - uint64(column)) - return util.ReadString(idx.c.mod, uint32(r), _MAX_NAME) + ptr := ptr_t(idx.c.call("sqlite3_vtab_collation", stk_t(idx.handle), + stk_t(column))) + return util.ReadString(idx.c.mod, ptr, _MAX_NAME) } // Distinct determines if a virtual table query is DISTINCT. // // https://sqlite.org/c3ref/vtab_distinct.html func (idx *IndexInfo) Distinct() int { - r := idx.c.call("sqlite3_vtab_distinct", uint64(idx.handle)) - return int(r) + i := int32(idx.c.call("sqlite3_vtab_distinct", stk_t(idx.handle))) + return int(i) } // In identifies and handles IN constraints. // // https://sqlite.org/c3ref/vtab_in.html func (idx *IndexInfo) In(column, handle int) bool { - r := idx.c.call("sqlite3_vtab_in", uint64(idx.handle), - uint64(column), uint64(handle)) - return r != 0 + b := int32(idx.c.call("sqlite3_vtab_in", stk_t(idx.handle), + stk_t(column), stk_t(handle))) + return b != 0 } func (idx *IndexInfo) load() { @@ -351,34 +351,35 @@ func (idx *IndexInfo) load() { mod := idx.c.mod ptr := idx.handle - idx.Constraint = make([]IndexConstraint, util.ReadUint32(mod, ptr+0)) - idx.ConstraintUsage = make([]IndexConstraintUsage, util.ReadUint32(mod, ptr+0)) - idx.OrderBy = make([]IndexOrderBy, util.ReadUint32(mod, ptr+8)) + nConstraint := util.Read32[int32](mod, ptr+0) + idx.Constraint = make([]IndexConstraint, nConstraint) + idx.ConstraintUsage = make([]IndexConstraintUsage, nConstraint) + idx.OrderBy = make([]IndexOrderBy, util.Read32[int32](mod, ptr+8)) - constraintPtr := util.ReadUint32(mod, ptr+4) + constraintPtr := util.Read32[ptr_t](mod, ptr+4) constraint := idx.Constraint for i := range idx.Constraint { constraint[i] = IndexConstraint{ - Column: int(int32(util.ReadUint32(mod, constraintPtr+0))), - Op: IndexConstraintOp(util.ReadUint8(mod, constraintPtr+4)), - Usable: util.ReadUint8(mod, constraintPtr+5) != 0, + Column: int(util.Read32[int32](mod, constraintPtr+0)), + Op: util.Read[IndexConstraintOp](mod, constraintPtr+4), + Usable: util.Read[byte](mod, constraintPtr+5) != 0, } constraintPtr += 12 } - orderByPtr := util.ReadUint32(mod, ptr+12) + orderByPtr := util.Read32[ptr_t](mod, ptr+12) orderBy := idx.OrderBy for i := range orderBy { orderBy[i] = IndexOrderBy{ - Column: int(int32(util.ReadUint32(mod, orderByPtr+0))), - Desc: util.ReadUint8(mod, orderByPtr+4) != 0, + Column: int(util.Read32[int32](mod, orderByPtr+0)), + Desc: util.Read[byte](mod, orderByPtr+4) != 0, } orderByPtr += 8 } idx.EstimatedCost = util.ReadFloat64(mod, ptr+40) - idx.EstimatedRows = int64(util.ReadUint64(mod, ptr+48)) - idx.ColumnsUsed = int64(util.ReadUint64(mod, ptr+64)) + idx.EstimatedRows = util.Read64[int64](mod, ptr+48) + idx.ColumnsUsed = util.Read64[uint64](mod, ptr+64) } func (idx *IndexInfo) save() { @@ -386,26 +387,26 @@ func (idx *IndexInfo) save() { mod := idx.c.mod ptr := idx.handle - usagePtr := util.ReadUint32(mod, ptr+16) + usagePtr := util.Read32[ptr_t](mod, ptr+16) for _, usage := range idx.ConstraintUsage { - util.WriteUint32(mod, usagePtr+0, uint32(usage.ArgvIndex)) + util.Write32(mod, usagePtr+0, int32(usage.ArgvIndex)) if usage.Omit { - util.WriteUint8(mod, usagePtr+4, 1) + util.Write(mod, usagePtr+4, int8(1)) } usagePtr += 8 } - util.WriteUint32(mod, ptr+20, uint32(idx.IdxNum)) + util.Write32(mod, ptr+20, int32(idx.IdxNum)) if idx.IdxStr != "" { - util.WriteUint32(mod, ptr+24, idx.c.newString(idx.IdxStr)) - util.WriteUint32(mod, ptr+28, 1) // needToFreeIdxStr + util.Write32(mod, ptr+24, idx.c.newString(idx.IdxStr)) + util.Write32(mod, ptr+28, int32(1)) // needToFreeIdxStr } if idx.OrderByConsumed { - util.WriteUint32(mod, ptr+32, 1) + util.Write32(mod, ptr+32, int32(1)) } util.WriteFloat64(mod, ptr+40, idx.EstimatedCost) - util.WriteUint64(mod, ptr+48, uint64(idx.EstimatedRows)) - util.WriteUint32(mod, ptr+56, uint32(idx.IdxFlags)) + util.Write64(mod, ptr+48, idx.EstimatedRows) + util.Write32(mod, ptr+56, idx.IdxFlags) } // IndexConstraintOp is a virtual table constraint operator code. @@ -442,42 +443,39 @@ const ( INDEX_SCAN_UNIQUE IndexScanFlag = 1 ) -func vtabModuleCallback(i vtabConstructor) func(_ context.Context, _ api.Module, _, _, _, _, _ uint32) uint32 { - return func(ctx context.Context, mod api.Module, pMod, nArg, pArg, ppVTab, pzErr uint32) uint32 { +func vtabModuleCallback(i vtabConstructor) func(_ context.Context, _ api.Module, _ ptr_t, _ int32, _, _, _ ptr_t) res_t { + return func(ctx context.Context, mod api.Module, pMod ptr_t, nArg int32, pArg, ppVTab, pzErr ptr_t) res_t { arg := make([]reflect.Value, 1+nArg) arg[0] = reflect.ValueOf(ctx.Value(connKey{})) - for i := uint32(0); i < nArg; i++ { - ptr := util.ReadUint32(mod, pArg+i*ptrlen) + for i := range nArg { + ptr := util.Read32[ptr_t](mod, pArg+ptr_t(i)*ptrlen) arg[i+1] = reflect.ValueOf(util.ReadString(mod, ptr, _MAX_SQL_LENGTH)) } module := vtabGetHandle(ctx, mod, pMod) - res := reflect.ValueOf(module).Index(int(i)).Call(arg) - err, _ := res[1].Interface().(error) + val := reflect.ValueOf(module).Index(int(i)).Call(arg) + err, _ := val[1].Interface().(error) if err == nil { - vtabPutHandle(ctx, mod, ppVTab, res[0].Interface()) + vtabPutHandle(ctx, mod, ppVTab, val[0].Interface()) } return vtabError(ctx, mod, pzErr, _PTR_ERROR, err) } } -func vtabDisconnectCallback(ctx context.Context, mod api.Module, pVTab uint32) uint32 { +func vtabDisconnectCallback(ctx context.Context, mod api.Module, pVTab ptr_t) res_t { err := vtabDelHandle(ctx, mod, pVTab) return vtabError(ctx, mod, 0, _PTR_ERROR, err) } -func vtabDestroyCallback(ctx context.Context, mod api.Module, pVTab uint32) uint32 { +func vtabDestroyCallback(ctx context.Context, mod api.Module, pVTab ptr_t) res_t { vtab := vtabGetHandle(ctx, mod, pVTab).(VTabDestroyer) - err := vtab.Destroy() - if cerr := vtabDelHandle(ctx, mod, pVTab); err == nil { - err = cerr - } + err := errors.Join(vtab.Destroy(), vtabDelHandle(ctx, mod, pVTab)) return vtabError(ctx, mod, 0, _PTR_ERROR, err) } -func vtabBestIndexCallback(ctx context.Context, mod api.Module, pVTab, pIdxInfo uint32) uint32 { +func vtabBestIndexCallback(ctx context.Context, mod api.Module, pVTab, pIdxInfo ptr_t) res_t { var info IndexInfo info.handle = pIdxInfo info.c = ctx.Value(connKey{}).(*Conn) @@ -490,7 +488,7 @@ func vtabBestIndexCallback(ctx context.Context, mod api.Module, pVTab, pIdxInfo return vtabError(ctx, mod, pVTab, _VTAB_ERROR, err) } -func vtabUpdateCallback(ctx context.Context, mod api.Module, pVTab, nArg, pArg, pRowID uint32) uint32 { +func vtabUpdateCallback(ctx context.Context, mod api.Module, pVTab ptr_t, nArg int32, pArg, pRowID ptr_t) res_t { vtab := vtabGetHandle(ctx, mod, pVTab).(VTabUpdater) db := ctx.Value(connKey{}).(*Conn) @@ -498,33 +496,33 @@ func vtabUpdateCallback(ctx context.Context, mod api.Module, pVTab, nArg, pArg, callbackArgs(db, args, pArg) rowID, err := vtab.Update(args...) if err == nil { - util.WriteUint64(mod, pRowID, uint64(rowID)) + util.Write64(mod, pRowID, rowID) } return vtabError(ctx, mod, pVTab, _VTAB_ERROR, err) } -func vtabRenameCallback(ctx context.Context, mod api.Module, pVTab, zNew uint32) uint32 { +func vtabRenameCallback(ctx context.Context, mod api.Module, pVTab, zNew ptr_t) res_t { vtab := vtabGetHandle(ctx, mod, pVTab).(VTabRenamer) err := vtab.Rename(util.ReadString(mod, zNew, _MAX_NAME)) return vtabError(ctx, mod, pVTab, _VTAB_ERROR, err) } -func vtabFindFuncCallback(ctx context.Context, mod api.Module, pVTab uint32, nArg int32, zName, pxFunc uint32) uint32 { +func vtabFindFuncCallback(ctx context.Context, mod api.Module, pVTab ptr_t, nArg int32, zName, pxFunc ptr_t) int32 { vtab := vtabGetHandle(ctx, mod, pVTab).(VTabOverloader) f, op := vtab.FindFunction(int(nArg), util.ReadString(mod, zName, _MAX_NAME)) if op != 0 { - var wrapper uint32 + var wrapper ptr_t wrapper = util.AddHandle(ctx, func(c Context, arg ...Value) { defer util.DelHandle(ctx, wrapper) f(c, arg...) }) - util.WriteUint32(mod, pxFunc, wrapper) + util.Write32(mod, pxFunc, wrapper) } - return uint32(op) + return int32(op) } -func vtabIntegrityCallback(ctx context.Context, mod api.Module, pVTab, zSchema, zTabName, mFlags, pzErr uint32) uint32 { +func vtabIntegrityCallback(ctx context.Context, mod api.Module, pVTab, zSchema, zTabName ptr_t, mFlags uint32, pzErr ptr_t) res_t { vtab := vtabGetHandle(ctx, mod, pVTab).(VTabChecker) schema := util.ReadString(mod, zSchema, _MAX_NAME) table := util.ReadString(mod, zTabName, _MAX_NAME) @@ -536,49 +534,49 @@ func vtabIntegrityCallback(ctx context.Context, mod api.Module, pVTab, zSchema, return code } -func vtabBeginCallback(ctx context.Context, mod api.Module, pVTab uint32) uint32 { +func vtabBeginCallback(ctx context.Context, mod api.Module, pVTab ptr_t) res_t { vtab := vtabGetHandle(ctx, mod, pVTab).(VTabTxn) err := vtab.Begin() return vtabError(ctx, mod, pVTab, _VTAB_ERROR, err) } -func vtabSyncCallback(ctx context.Context, mod api.Module, pVTab uint32) uint32 { +func vtabSyncCallback(ctx context.Context, mod api.Module, pVTab ptr_t) res_t { vtab := vtabGetHandle(ctx, mod, pVTab).(VTabTxn) err := vtab.Sync() return vtabError(ctx, mod, pVTab, _VTAB_ERROR, err) } -func vtabCommitCallback(ctx context.Context, mod api.Module, pVTab uint32) uint32 { +func vtabCommitCallback(ctx context.Context, mod api.Module, pVTab ptr_t) res_t { vtab := vtabGetHandle(ctx, mod, pVTab).(VTabTxn) err := vtab.Commit() return vtabError(ctx, mod, pVTab, _VTAB_ERROR, err) } -func vtabRollbackCallback(ctx context.Context, mod api.Module, pVTab uint32) uint32 { +func vtabRollbackCallback(ctx context.Context, mod api.Module, pVTab ptr_t) res_t { vtab := vtabGetHandle(ctx, mod, pVTab).(VTabTxn) err := vtab.Rollback() return vtabError(ctx, mod, pVTab, _VTAB_ERROR, err) } -func vtabSavepointCallback(ctx context.Context, mod api.Module, pVTab uint32, id int32) uint32 { +func vtabSavepointCallback(ctx context.Context, mod api.Module, pVTab ptr_t, id int32) res_t { vtab := vtabGetHandle(ctx, mod, pVTab).(VTabSavepointer) err := vtab.Savepoint(int(id)) return vtabError(ctx, mod, pVTab, _VTAB_ERROR, err) } -func vtabReleaseCallback(ctx context.Context, mod api.Module, pVTab uint32, id int32) uint32 { +func vtabReleaseCallback(ctx context.Context, mod api.Module, pVTab ptr_t, id int32) res_t { vtab := vtabGetHandle(ctx, mod, pVTab).(VTabSavepointer) err := vtab.Release(int(id)) return vtabError(ctx, mod, pVTab, _VTAB_ERROR, err) } -func vtabRollbackToCallback(ctx context.Context, mod api.Module, pVTab uint32, id int32) uint32 { +func vtabRollbackToCallback(ctx context.Context, mod api.Module, pVTab ptr_t, id int32) res_t { vtab := vtabGetHandle(ctx, mod, pVTab).(VTabSavepointer) err := vtab.RollbackTo(int(id)) return vtabError(ctx, mod, pVTab, _VTAB_ERROR, err) } -func cursorOpenCallback(ctx context.Context, mod api.Module, pVTab, ppCur uint32) uint32 { +func cursorOpenCallback(ctx context.Context, mod api.Module, pVTab, ppCur ptr_t) res_t { vtab := vtabGetHandle(ctx, mod, pVTab).(VTab) cursor, err := vtab.Open() @@ -589,12 +587,12 @@ func cursorOpenCallback(ctx context.Context, mod api.Module, pVTab, ppCur uint32 return vtabError(ctx, mod, pVTab, _VTAB_ERROR, err) } -func cursorCloseCallback(ctx context.Context, mod api.Module, pCur uint32) uint32 { +func cursorCloseCallback(ctx context.Context, mod api.Module, pCur ptr_t) res_t { err := vtabDelHandle(ctx, mod, pCur) return vtabError(ctx, mod, 0, _VTAB_ERROR, err) } -func cursorFilterCallback(ctx context.Context, mod api.Module, pCur uint32, idxNum int32, idxStr, nArg, pArg uint32) uint32 { +func cursorFilterCallback(ctx context.Context, mod api.Module, pCur ptr_t, idxNum int32, idxStr ptr_t, nArg int32, pArg ptr_t) res_t { cursor := vtabGetHandle(ctx, mod, pCur).(VTabCursor) db := ctx.Value(connKey{}).(*Conn) args := make([]Value, nArg) @@ -607,7 +605,7 @@ func cursorFilterCallback(ctx context.Context, mod api.Module, pCur uint32, idxN return vtabError(ctx, mod, pCur, _CURSOR_ERROR, err) } -func cursorEOFCallback(ctx context.Context, mod api.Module, pCur uint32) uint32 { +func cursorEOFCallback(ctx context.Context, mod api.Module, pCur ptr_t) int32 { cursor := vtabGetHandle(ctx, mod, pCur).(VTabCursor) if cursor.EOF() { return 1 @@ -615,25 +613,25 @@ func cursorEOFCallback(ctx context.Context, mod api.Module, pCur uint32) uint32 return 0 } -func cursorNextCallback(ctx context.Context, mod api.Module, pCur uint32) uint32 { +func cursorNextCallback(ctx context.Context, mod api.Module, pCur ptr_t) res_t { cursor := vtabGetHandle(ctx, mod, pCur).(VTabCursor) err := cursor.Next() return vtabError(ctx, mod, pCur, _CURSOR_ERROR, err) } -func cursorColumnCallback(ctx context.Context, mod api.Module, pCur, pCtx uint32, n int32) uint32 { +func cursorColumnCallback(ctx context.Context, mod api.Module, pCur, pCtx ptr_t, n int32) res_t { cursor := vtabGetHandle(ctx, mod, pCur).(VTabCursor) db := ctx.Value(connKey{}).(*Conn) err := cursor.Column(Context{db, pCtx}, int(n)) return vtabError(ctx, mod, pCur, _CURSOR_ERROR, err) } -func cursorRowIDCallback(ctx context.Context, mod api.Module, pCur, pRowID uint32) uint32 { +func cursorRowIDCallback(ctx context.Context, mod api.Module, pCur, pRowID ptr_t) res_t { cursor := vtabGetHandle(ctx, mod, pCur).(VTabCursor) rowID, err := cursor.RowID() if err == nil { - util.WriteUint64(mod, pRowID, uint64(rowID)) + util.Write64(mod, pRowID, rowID) } return vtabError(ctx, mod, pCur, _CURSOR_ERROR, err) @@ -645,7 +643,7 @@ const ( _CURSOR_ERROR ) -func vtabError(ctx context.Context, mod api.Module, ptr, kind uint32, err error) uint32 { +func vtabError(ctx context.Context, mod api.Module, ptr ptr_t, kind uint32, err error) res_t { const zErrMsgOffset = 8 msg, code := errorCode(err, ERROR) if msg != "" && ptr != 0 { @@ -653,32 +651,32 @@ func vtabError(ctx context.Context, mod api.Module, ptr, kind uint32, err error) case _VTAB_ERROR: ptr = ptr + zErrMsgOffset // zErrMsg case _CURSOR_ERROR: - ptr = util.ReadUint32(mod, ptr) + zErrMsgOffset // pVTab->zErrMsg + ptr = util.Read32[ptr_t](mod, ptr) + zErrMsgOffset // pVTab->zErrMsg } db := ctx.Value(connKey{}).(*Conn) - if ptr := util.ReadUint32(mod, ptr); ptr != 0 { + if ptr := util.Read32[ptr_t](mod, ptr); ptr != 0 { db.free(ptr) } - util.WriteUint32(mod, ptr, db.newString(msg)) + util.Write32(mod, ptr, db.newString(msg)) } return code } -func vtabGetHandle(ctx context.Context, mod api.Module, ptr uint32) any { +func vtabGetHandle(ctx context.Context, mod api.Module, ptr ptr_t) any { const handleOffset = 4 - handle := util.ReadUint32(mod, ptr-handleOffset) + handle := util.Read32[ptr_t](mod, ptr-handleOffset) return util.GetHandle(ctx, handle) } -func vtabDelHandle(ctx context.Context, mod api.Module, ptr uint32) error { +func vtabDelHandle(ctx context.Context, mod api.Module, ptr ptr_t) error { const handleOffset = 4 - handle := util.ReadUint32(mod, ptr-handleOffset) + handle := util.Read32[ptr_t](mod, ptr-handleOffset) return util.DelHandle(ctx, handle) } -func vtabPutHandle(ctx context.Context, mod api.Module, pptr uint32, val any) { +func vtabPutHandle(ctx context.Context, mod api.Module, pptr ptr_t, val any) { const handleOffset = 4 handle := util.AddHandle(ctx, val) - ptr := util.ReadUint32(mod, pptr) - util.WriteUint32(mod, ptr-handleOffset, handle) + ptr := util.Read32[ptr_t](mod, pptr) + util.Write32(mod, ptr-handleOffset, handle) } diff --git a/vendor/modules.txt b/vendor/modules.txt index 04314f34f..25a7c7682 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -412,8 +412,6 @@ github.com/jackc/puddle/v2/internal/genstack # github.com/jessevdk/go-flags v1.5.0 ## explicit; go 1.15 github.com/jessevdk/go-flags -# github.com/jimsmart/grobotstxt v1.0.3 -## explicit; go 1.14 # github.com/jinzhu/inflection v1.0.0 ## explicit github.com/jinzhu/inflection @@ -503,8 +501,8 @@ github.com/modern-go/reflect2 # github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 ## explicit github.com/munnerz/goautoneg -# github.com/ncruces/go-sqlite3 v0.22.0 -## explicit; go 1.21 +# github.com/ncruces/go-sqlite3 v0.23.0 +## explicit; go 1.22 github.com/ncruces/go-sqlite3 github.com/ncruces/go-sqlite3/driver github.com/ncruces/go-sqlite3/embed