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 @@ // 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 @@ _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 @@ // 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 @@ type rows struct { ) 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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 Q)%9v*s+(9iqJi`O0hT`qr~m)} delta 180396 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 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 @@ // // 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 @@ funcPtr = util.AddHandle(c.ctx, fn) // // 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 @@ funcPtr = util.AddHandle(c.ctx, 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 @@ "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 @@ 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 @@ "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 @@ 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 @@ funcs 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 @@ // 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 @@ _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 @@ 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 @@ "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 @@ 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 @@ func (c *Conn) DeclareVTab(sql string) error { // // 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 @@ func (c *Conn) VTabOnConflict() VTabConflictMode { // // 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 @@ func (idx *IndexInfo) save() { 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 @@ func cursorRowIDCallback(ctx context.Context, mod api.Module, pCur, pRowID uint3 _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