mirror of
				https://github.com/superseriousbusiness/gotosocial.git
				synced 2025-10-31 02:32:25 -05:00 
			
		
		
		
	update go-sqlite3 => v0.20.0 (#3483)
This commit is contained in:
		
					parent
					
						
							
								d8a83860bc
							
						
					
				
			
			
				commit
				
					
						51cb6cae16
					
				
			
		
					 41 changed files with 841 additions and 263 deletions
				
			
		
							
								
								
									
										2
									
								
								go.mod
									
										
									
									
									
								
							
							
						
						
									
										2
									
								
								go.mod
									
										
									
									
									
								
							|  | @ -44,7 +44,7 @@ require ( | ||||||
| 	github.com/miekg/dns v1.1.62 | 	github.com/miekg/dns v1.1.62 | ||||||
| 	github.com/minio/minio-go/v7 v7.0.78 | 	github.com/minio/minio-go/v7 v7.0.78 | ||||||
| 	github.com/mitchellh/mapstructure v1.5.0 | 	github.com/mitchellh/mapstructure v1.5.0 | ||||||
| 	github.com/ncruces/go-sqlite3 v0.19.0 | 	github.com/ncruces/go-sqlite3 v0.20.0 | ||||||
| 	github.com/oklog/ulid v1.3.1 | 	github.com/oklog/ulid v1.3.1 | ||||||
| 	github.com/prometheus/client_golang v1.20.5 | 	github.com/prometheus/client_golang v1.20.5 | ||||||
| 	github.com/spf13/cobra v1.8.1 | 	github.com/spf13/cobra v1.8.1 | ||||||
|  |  | ||||||
							
								
								
									
										4
									
								
								go.sum
									
										
									
										generated
									
									
									
								
							
							
						
						
									
										4
									
								
								go.sum
									
										
									
										generated
									
									
									
								
							|  | @ -434,8 +434,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/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 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= | ||||||
| github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= | github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= | ||||||
| github.com/ncruces/go-sqlite3 v0.19.0 h1:yebbD/cP8Gf+7nKoUin2ATjnqJK2VvyS30d3xsjRp5k= | github.com/ncruces/go-sqlite3 v0.20.0 h1:/nBLvYxj7sk9S6y57nmMFvoQ/KJtGo0pNi8J80s8oJU= | ||||||
| github.com/ncruces/go-sqlite3 v0.19.0/go.mod h1:yL4ZNWGsr1/8pcLfpPW1RT1WFdvyeHonrgIwwi4rvkg= | github.com/ncruces/go-sqlite3 v0.20.0/go.mod h1:yL4ZNWGsr1/8pcLfpPW1RT1WFdvyeHonrgIwwi4rvkg= | ||||||
| github.com/ncruces/go-strftime v0.1.9 h1:bY0MQC28UADQmHmaF5dgpLmImcShSi2kHU9XLdhx/f4= | 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/go-strftime v0.1.9/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJmn9CehxcKcls= | ||||||
| github.com/ncruces/julianday v1.0.0 h1:fH0OKwa7NWvniGQtxdJRxAgkBMolni2BjDHaWTxqt7M= | github.com/ncruces/julianday v1.0.0 h1:fH0OKwa7NWvniGQtxdJRxAgkBMolni2BjDHaWTxqt7M= | ||||||
|  |  | ||||||
							
								
								
									
										45
									
								
								vendor/github.com/ncruces/go-sqlite3/README.md
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										45
									
								
								vendor/github.com/ncruces/go-sqlite3/README.md
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -1,4 +1,4 @@ | ||||||
| # Go bindings to SQLite using Wazero | # Go bindings to SQLite using wazero | ||||||
| 
 | 
 | ||||||
| [](https://pkg.go.dev/github.com/ncruces/go-sqlite3) | [](https://pkg.go.dev/github.com/ncruces/go-sqlite3) | ||||||
| [](https://goreportcard.com/report/github.com/ncruces/go-sqlite3) | [](https://goreportcard.com/report/github.com/ncruces/go-sqlite3) | ||||||
|  | @ -41,45 +41,6 @@ db.QueryRow(`SELECT sqlite_version()`).Scan(&version) | ||||||
| - [`github.com/ncruces/go-sqlite3/gormlite`](https://pkg.go.dev/github.com/ncruces/go-sqlite3/gormlite) | - [`github.com/ncruces/go-sqlite3/gormlite`](https://pkg.go.dev/github.com/ncruces/go-sqlite3/gormlite) | ||||||
|   provides a [GORM](https://gorm.io) driver. |   provides a [GORM](https://gorm.io) driver. | ||||||
| 
 | 
 | ||||||
| ### Extensions |  | ||||||
| 
 |  | ||||||
| - [`github.com/ncruces/go-sqlite3/ext/array`](https://pkg.go.dev/github.com/ncruces/go-sqlite3/ext/array) |  | ||||||
|   provides the [`array`](https://sqlite.org/carray.html) table-valued function. |  | ||||||
| - [`github.com/ncruces/go-sqlite3/ext/blobio`](https://pkg.go.dev/github.com/ncruces/go-sqlite3/ext/blobio) |  | ||||||
|   simplifies [incremental BLOB I/O](https://sqlite.org/c3ref/blob_open.html). |  | ||||||
| - [`github.com/ncruces/go-sqlite3/ext/bloom`](https://pkg.go.dev/github.com/ncruces/go-sqlite3/ext/bloom) |  | ||||||
|   provides a [Bloom filter](https://github.com/nalgeon/sqlean/issues/27#issuecomment-1002267134) virtual table. |  | ||||||
| - [`github.com/ncruces/go-sqlite3/ext/closure`](https://pkg.go.dev/github.com/ncruces/go-sqlite3/ext/closure) |  | ||||||
|   provides a transitive closure virtual table. |  | ||||||
| - [`github.com/ncruces/go-sqlite3/ext/csv`](https://pkg.go.dev/github.com/ncruces/go-sqlite3/ext/csv) |  | ||||||
|   reads [comma-separated values](https://sqlite.org/csv.html). |  | ||||||
| - [`github.com/ncruces/go-sqlite3/ext/fileio`](https://pkg.go.dev/github.com/ncruces/go-sqlite3/ext/fileio) |  | ||||||
|   reads, writes and lists files. |  | ||||||
| - [`github.com/ncruces/go-sqlite3/ext/hash`](https://pkg.go.dev/github.com/ncruces/go-sqlite3/ext/hash) |  | ||||||
|   provides cryptographic hash functions. |  | ||||||
| - [`github.com/ncruces/go-sqlite3/ext/lines`](https://pkg.go.dev/github.com/ncruces/go-sqlite3/ext/lines) |  | ||||||
|   reads data [line-by-line](https://github.com/asg017/sqlite-lines). |  | ||||||
| - [`github.com/ncruces/go-sqlite3/ext/pivot`](https://pkg.go.dev/github.com/ncruces/go-sqlite3/ext/pivot) |  | ||||||
|   creates [pivot tables](https://github.com/jakethaw/pivot_vtab). |  | ||||||
| - [`github.com/ncruces/go-sqlite3/ext/regexp`](https://pkg.go.dev/github.com/ncruces/go-sqlite3/ext/regexp) |  | ||||||
|   provides regular expression functions. |  | ||||||
| - [`github.com/ncruces/go-sqlite3/ext/statement`](https://pkg.go.dev/github.com/ncruces/go-sqlite3/ext/statement) |  | ||||||
|   creates [parameterized views](https://github.com/0x09/sqlite-statement-vtab). |  | ||||||
| - [`github.com/ncruces/go-sqlite3/ext/stats`](https://pkg.go.dev/github.com/ncruces/go-sqlite3/ext/stats) |  | ||||||
|   provides [statistics](https://www.oreilly.com/library/view/sql-in-a/9780596155322/ch04s02.html) functions. |  | ||||||
| - [`github.com/ncruces/go-sqlite3/ext/unicode`](https://pkg.go.dev/github.com/ncruces/go-sqlite3/ext/unicode) |  | ||||||
|   provides [Unicode aware](https://sqlite.org/src/dir/ext/icu) functions. |  | ||||||
| - [`github.com/ncruces/go-sqlite3/ext/uuid`](https://pkg.go.dev/github.com/ncruces/go-sqlite3/ext/uuid) |  | ||||||
|   generates [UUIDs](https://en.wikipedia.org/wiki/Universally_unique_identifier). |  | ||||||
| - [`github.com/ncruces/go-sqlite3/ext/zorder`](https://pkg.go.dev/github.com/ncruces/go-sqlite3/ext/zorder) |  | ||||||
|   maps multidimensional data to one dimension. |  | ||||||
| - [`github.com/ncruces/go-sqlite3/vfs/adiantum`](https://pkg.go.dev/github.com/ncruces/go-sqlite3/vfs/adiantum) |  | ||||||
|   wraps a VFS to offer encryption at rest. |  | ||||||
| - [`github.com/ncruces/go-sqlite3/vfs/memdb`](https://pkg.go.dev/github.com/ncruces/go-sqlite3/vfs/memdb) |  | ||||||
|   implements an in-memory VFS. |  | ||||||
| - [`github.com/ncruces/go-sqlite3/vfs/readervfs`](https://pkg.go.dev/github.com/ncruces/go-sqlite3/vfs/readervfs) |  | ||||||
|   implements a VFS for immutable databases. |  | ||||||
| 
 |  | ||||||
| ### Advanced features | ### Advanced features | ||||||
| 
 | 
 | ||||||
| - [incremental BLOB I/O](https://sqlite.org/c3ref/blob_open.html) | - [incremental BLOB I/O](https://sqlite.org/c3ref/blob_open.html) | ||||||
|  | @ -92,7 +53,11 @@ db.QueryRow(`SELECT sqlite_version()`).Scan(&version) | ||||||
| - [math functions](https://sqlite.org/lang_mathfunc.html) | - [math functions](https://sqlite.org/lang_mathfunc.html) | ||||||
| - [full-text search](https://sqlite.org/fts5.html) | - [full-text search](https://sqlite.org/fts5.html) | ||||||
| - [geospatial search](https://sqlite.org/geopoly.html) | - [geospatial search](https://sqlite.org/geopoly.html) | ||||||
|  | - [Unicode support](https://pkg.go.dev/github.com/ncruces/go-sqlite3/ext/unicode) | ||||||
|  | - [statistics functions](https://pkg.go.dev/github.com/ncruces/go-sqlite3/ext/stats) | ||||||
| - [encryption at rest](vfs/adiantum/README.md) | - [encryption at rest](vfs/adiantum/README.md) | ||||||
|  | - [many extensions](ext/README.md) | ||||||
|  | - [custom VFSes](vfs/README.md#custom-vfses) | ||||||
| - [and more…](embed/README.md) | - [and more…](embed/README.md) | ||||||
| 
 | 
 | ||||||
| ### Caveats | ### Caveats | ||||||
|  |  | ||||||
							
								
								
									
										1
									
								
								vendor/github.com/ncruces/go-sqlite3/blob.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								vendor/github.com/ncruces/go-sqlite3/blob.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -253,6 +253,7 @@ func (b *Blob) Seek(offset int64, whence int) (int64, error) { | ||||||
| // | // | ||||||
| // https://sqlite.org/c3ref/blob_reopen.html | // https://sqlite.org/c3ref/blob_reopen.html | ||||||
| func (b *Blob) Reopen(row int64) error { | 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))) | 	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))) | 	b.bytes = int64(b.c.call("sqlite3_blob_bytes", uint64(b.handle))) | ||||||
| 	b.offset = 0 | 	b.offset = 0 | ||||||
|  |  | ||||||
							
								
								
									
										124
									
								
								vendor/github.com/ncruces/go-sqlite3/config.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										124
									
								
								vendor/github.com/ncruces/go-sqlite3/config.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -2,10 +2,12 @@ package sqlite3 | ||||||
| 
 | 
 | ||||||
| import ( | import ( | ||||||
| 	"context" | 	"context" | ||||||
|  | 	"strconv" | ||||||
|  | 
 | ||||||
|  | 	"github.com/tetratelabs/wazero/api" | ||||||
| 
 | 
 | ||||||
| 	"github.com/ncruces/go-sqlite3/internal/util" | 	"github.com/ncruces/go-sqlite3/internal/util" | ||||||
| 	"github.com/ncruces/go-sqlite3/vfs" | 	"github.com/ncruces/go-sqlite3/vfs" | ||||||
| 	"github.com/tetratelabs/wazero/api" |  | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| // Config makes configuration changes to a database connection. | // Config makes configuration changes to a database connection. | ||||||
|  | @ -15,8 +17,19 @@ import ( | ||||||
| // | // | ||||||
| // https://sqlite.org/c3ref/db_config.html | // https://sqlite.org/c3ref/db_config.html | ||||||
| func (c *Conn) Config(op DBConfig, arg ...bool) (bool, error) { | func (c *Conn) Config(op DBConfig, arg ...bool) (bool, error) { | ||||||
|  | 	if op < DBCONFIG_ENABLE_FKEY || op > DBCONFIG_REVERSE_SCANORDER { | ||||||
|  | 		return false, MISUSE | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// We need to call sqlite3_db_config, a variadic function. | ||||||
|  | 	// We only support the `int int*` variants. | ||||||
|  | 	// The int is a three-valued bool: -1 queries, 0/1 sets false/true. | ||||||
|  | 	// The int* points to where new state will be written to. | ||||||
|  | 	// The vararg is a pointer to an array containing these arguments: | ||||||
|  | 	// an int and an int* pointing to that int. | ||||||
|  | 
 | ||||||
| 	defer c.arena.mark()() | 	defer c.arena.mark()() | ||||||
| 	argsPtr := c.arena.new(2 * ptrlen) | 	argsPtr := c.arena.new(intlen + ptrlen) | ||||||
| 
 | 
 | ||||||
| 	var flag int | 	var flag int | ||||||
| 	switch { | 	switch { | ||||||
|  | @ -63,18 +76,23 @@ func logCallback(ctx context.Context, mod api.Module, _, iCode, zMsg uint32) { | ||||||
| // https://sqlite.org/c3ref/file_control.html | // https://sqlite.org/c3ref/file_control.html | ||||||
| func (c *Conn) FileControl(schema string, op FcntlOpcode, arg ...any) (any, error) { | func (c *Conn) FileControl(schema string, op FcntlOpcode, arg ...any) (any, error) { | ||||||
| 	defer c.arena.mark()() | 	defer c.arena.mark()() | ||||||
|  | 	ptr := c.arena.new(max(ptrlen, intlen)) | ||||||
| 
 | 
 | ||||||
| 	var schemaPtr uint32 | 	var schemaPtr uint32 | ||||||
| 	if schema != "" { | 	if schema != "" { | ||||||
| 		schemaPtr = c.arena.string(schema) | 		schemaPtr = c.arena.string(schema) | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	var rc uint64 | ||||||
|  | 	var res any | ||||||
| 	switch op { | 	switch op { | ||||||
|  | 	default: | ||||||
|  | 		return nil, MISUSE | ||||||
|  | 
 | ||||||
| 	case FCNTL_RESET_CACHE: | 	case FCNTL_RESET_CACHE: | ||||||
| 		r := c.call("sqlite3_file_control", | 		rc = c.call("sqlite3_file_control", | ||||||
| 			uint64(c.handle), uint64(schemaPtr), | 			uint64(c.handle), uint64(schemaPtr), | ||||||
| 			uint64(op), 0) | 			uint64(op), 0) | ||||||
| 		return nil, c.error(r) |  | ||||||
| 
 | 
 | ||||||
| 	case FCNTL_PERSIST_WAL, FCNTL_POWERSAFE_OVERWRITE: | 	case FCNTL_PERSIST_WAL, FCNTL_POWERSAFE_OVERWRITE: | ||||||
| 		var flag int | 		var flag int | ||||||
|  | @ -84,70 +102,69 @@ func (c *Conn) FileControl(schema string, op FcntlOpcode, arg ...any) (any, erro | ||||||
| 		case arg[0]: | 		case arg[0]: | ||||||
| 			flag = 1 | 			flag = 1 | ||||||
| 		} | 		} | ||||||
| 		ptr := c.arena.new(4) |  | ||||||
| 		util.WriteUint32(c.mod, ptr, uint32(flag)) | 		util.WriteUint32(c.mod, ptr, uint32(flag)) | ||||||
| 		r := c.call("sqlite3_file_control", | 		rc = c.call("sqlite3_file_control", | ||||||
| 			uint64(c.handle), uint64(schemaPtr), | 			uint64(c.handle), uint64(schemaPtr), | ||||||
| 			uint64(op), uint64(ptr)) | 			uint64(op), uint64(ptr)) | ||||||
| 		return util.ReadUint32(c.mod, ptr) != 0, c.error(r) | 		res = util.ReadUint32(c.mod, ptr) != 0 | ||||||
| 
 | 
 | ||||||
| 	case FCNTL_CHUNK_SIZE: | 	case FCNTL_CHUNK_SIZE: | ||||||
| 		ptr := c.arena.new(4) |  | ||||||
| 		util.WriteUint32(c.mod, ptr, uint32(arg[0].(int))) | 		util.WriteUint32(c.mod, ptr, uint32(arg[0].(int))) | ||||||
| 		r := c.call("sqlite3_file_control", | 		rc = c.call("sqlite3_file_control", | ||||||
| 			uint64(c.handle), uint64(schemaPtr), | 			uint64(c.handle), uint64(schemaPtr), | ||||||
| 			uint64(op), uint64(ptr)) | 			uint64(op), uint64(ptr)) | ||||||
| 		return nil, c.error(r) |  | ||||||
| 
 | 
 | ||||||
| 	case FCNTL_RESERVE_BYTES: | 	case FCNTL_RESERVE_BYTES: | ||||||
| 		bytes := -1 | 		bytes := -1 | ||||||
| 		if len(arg) > 0 { | 		if len(arg) > 0 { | ||||||
| 			bytes = arg[0].(int) | 			bytes = arg[0].(int) | ||||||
| 		} | 		} | ||||||
| 		ptr := c.arena.new(4) |  | ||||||
| 		util.WriteUint32(c.mod, ptr, uint32(bytes)) | 		util.WriteUint32(c.mod, ptr, uint32(bytes)) | ||||||
| 		r := c.call("sqlite3_file_control", | 		rc = c.call("sqlite3_file_control", | ||||||
| 			uint64(c.handle), uint64(schemaPtr), | 			uint64(c.handle), uint64(schemaPtr), | ||||||
| 			uint64(op), uint64(ptr)) | 			uint64(op), uint64(ptr)) | ||||||
| 		return int(util.ReadUint32(c.mod, ptr)), c.error(r) | 		res = int(util.ReadUint32(c.mod, ptr)) | ||||||
| 
 | 
 | ||||||
| 	case FCNTL_DATA_VERSION: | 	case FCNTL_DATA_VERSION: | ||||||
| 		ptr := c.arena.new(4) | 		rc = c.call("sqlite3_file_control", | ||||||
| 		r := c.call("sqlite3_file_control", |  | ||||||
| 			uint64(c.handle), uint64(schemaPtr), | 			uint64(c.handle), uint64(schemaPtr), | ||||||
| 			uint64(op), uint64(ptr)) | 			uint64(op), uint64(ptr)) | ||||||
| 		return util.ReadUint32(c.mod, ptr), c.error(r) | 		res = util.ReadUint32(c.mod, ptr) | ||||||
| 
 | 
 | ||||||
| 	case FCNTL_LOCKSTATE: | 	case FCNTL_LOCKSTATE: | ||||||
| 		ptr := c.arena.new(4) | 		rc = c.call("sqlite3_file_control", | ||||||
| 		r := c.call("sqlite3_file_control", |  | ||||||
| 			uint64(c.handle), uint64(schemaPtr), | 			uint64(c.handle), uint64(schemaPtr), | ||||||
| 			uint64(op), uint64(ptr)) | 			uint64(op), uint64(ptr)) | ||||||
| 		return vfs.LockLevel(util.ReadUint32(c.mod, ptr)), c.error(r) | 		res = vfs.LockLevel(util.ReadUint32(c.mod, ptr)) | ||||||
| 
 | 
 | ||||||
| 	case FCNTL_VFS_POINTER: | 	case FCNTL_VFS_POINTER: | ||||||
| 		ptr := c.arena.new(4) | 		rc = c.call("sqlite3_file_control", | ||||||
| 		r := c.call("sqlite3_file_control", |  | ||||||
| 			uint64(c.handle), uint64(schemaPtr), | 			uint64(c.handle), uint64(schemaPtr), | ||||||
| 			uint64(op), uint64(ptr)) | 			uint64(op), uint64(ptr)) | ||||||
|  | 		if rc == _OK { | ||||||
| 			const zNameOffset = 16 | 			const zNameOffset = 16 | ||||||
| 			ptr = util.ReadUint32(c.mod, ptr) | 			ptr = util.ReadUint32(c.mod, ptr) | ||||||
| 			ptr = util.ReadUint32(c.mod, ptr+zNameOffset) | 			ptr = util.ReadUint32(c.mod, ptr+zNameOffset) | ||||||
| 			name := util.ReadString(c.mod, ptr, _MAX_NAME) | 			name := util.ReadString(c.mod, ptr, _MAX_NAME) | ||||||
| 		return vfs.Find(name), c.error(r) | 			res = vfs.Find(name) | ||||||
|  | 		} | ||||||
| 
 | 
 | ||||||
| 	case FCNTL_FILE_POINTER, FCNTL_JOURNAL_POINTER: | 	case FCNTL_FILE_POINTER, FCNTL_JOURNAL_POINTER: | ||||||
| 		ptr := c.arena.new(4) | 		rc = c.call("sqlite3_file_control", | ||||||
| 		r := c.call("sqlite3_file_control", |  | ||||||
| 			uint64(c.handle), uint64(schemaPtr), | 			uint64(c.handle), uint64(schemaPtr), | ||||||
| 			uint64(op), uint64(ptr)) | 			uint64(op), uint64(ptr)) | ||||||
|  | 		if rc == _OK { | ||||||
| 			const fileHandleOffset = 4 | 			const fileHandleOffset = 4 | ||||||
| 			ptr = util.ReadUint32(c.mod, ptr) | 			ptr = util.ReadUint32(c.mod, ptr) | ||||||
| 			ptr = util.ReadUint32(c.mod, ptr+fileHandleOffset) | 			ptr = util.ReadUint32(c.mod, ptr+fileHandleOffset) | ||||||
| 		return util.GetHandle(c.ctx, ptr), c.error(r) | 			res = util.GetHandle(c.ctx, ptr) | ||||||
|  | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	return nil, MISUSE | 	if err := c.error(rc); err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	return res, nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // Limit allows the size of various constructs to be | // Limit allows the size of various constructs to be | ||||||
|  | @ -234,10 +251,10 @@ func traceCallback(ctx context.Context, mod api.Module, evt TraceEvent, pDB, pAr | ||||||
| 	return rc | 	return rc | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // WalCheckpoint checkpoints a WAL database. | // WALCheckpoint checkpoints a WAL database. | ||||||
| // | // | ||||||
| // https://sqlite.org/c3ref/wal_checkpoint_v2.html | // https://sqlite.org/c3ref/wal_checkpoint_v2.html | ||||||
| func (c *Conn) WalCheckpoint(schema string, mode CheckpointMode) (nLog, nCkpt int, err error) { | func (c *Conn) WALCheckpoint(schema string, mode CheckpointMode) (nLog, nCkpt int, err error) { | ||||||
| 	defer c.arena.mark()() | 	defer c.arena.mark()() | ||||||
| 	nLogPtr := c.arena.new(ptrlen) | 	nLogPtr := c.arena.new(ptrlen) | ||||||
| 	nCkptPtr := c.arena.new(ptrlen) | 	nCkptPtr := c.arena.new(ptrlen) | ||||||
|  | @ -250,19 +267,19 @@ func (c *Conn) WalCheckpoint(schema string, mode CheckpointMode) (nLog, nCkpt in | ||||||
| 	return nLog, nCkpt, c.error(r) | 	return nLog, nCkpt, c.error(r) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // WalAutoCheckpoint configures WAL auto-checkpoints. | // WALAutoCheckpoint configures WAL auto-checkpoints. | ||||||
| // | // | ||||||
| // https://sqlite.org/c3ref/wal_autocheckpoint.html | // https://sqlite.org/c3ref/wal_autocheckpoint.html | ||||||
| func (c *Conn) WalAutoCheckpoint(pages int) error { | func (c *Conn) WALAutoCheckpoint(pages int) error { | ||||||
| 	r := c.call("sqlite3_wal_autocheckpoint", uint64(c.handle), uint64(pages)) | 	r := c.call("sqlite3_wal_autocheckpoint", uint64(c.handle), uint64(pages)) | ||||||
| 	return c.error(r) | 	return c.error(r) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // WalHook registers a callback function to be invoked | // WALHook registers a callback function to be invoked | ||||||
| // each time data is committed to a database in WAL mode. | // each time data is committed to a database in WAL mode. | ||||||
| // | // | ||||||
| // https://sqlite.org/c3ref/wal_hook.html | // https://sqlite.org/c3ref/wal_hook.html | ||||||
| func (c *Conn) WalHook(cb func(db *Conn, schema string, pages int) error) { | func (c *Conn) WALHook(cb func(db *Conn, schema string, pages int) error) { | ||||||
| 	var enable uint64 | 	var enable uint64 | ||||||
| 	if cb != nil { | 	if cb != nil { | ||||||
| 		enable = 1 | 		enable = 1 | ||||||
|  | @ -311,3 +328,46 @@ func (c *Conn) SoftHeapLimit(n int64) int64 { | ||||||
| func (c *Conn) HardHeapLimit(n int64) int64 { | 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", uint64(n))) | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | // EnableChecksums enables checksums on a database. | ||||||
|  | // | ||||||
|  | // https://sqlite.org/cksumvfs.html | ||||||
|  | func (c *Conn) EnableChecksums(schema string) error { | ||||||
|  | 	r, err := c.FileControl(schema, FCNTL_RESERVE_BYTES) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	if r == 8 { | ||||||
|  | 		// Correct value, enabled. | ||||||
|  | 		return nil | ||||||
|  | 	} | ||||||
|  | 	if r == 0 { | ||||||
|  | 		// Default value, enable. | ||||||
|  | 		_, err = c.FileControl(schema, FCNTL_RESERVE_BYTES, 8) | ||||||
|  | 		if err != nil { | ||||||
|  | 			return err | ||||||
|  | 		} | ||||||
|  | 		r, err = c.FileControl(schema, FCNTL_RESERVE_BYTES) | ||||||
|  | 		if err != nil { | ||||||
|  | 			return err | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	if r != 8 { | ||||||
|  | 		// Invalid value. | ||||||
|  | 		return util.ErrorString("sqlite3: reserve bytes must be 8, is: " + strconv.Itoa(r.(int))) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// VACUUM the database. | ||||||
|  | 	if schema != "" { | ||||||
|  | 		err = c.Exec(`VACUUM ` + QuoteIdentifier(schema)) | ||||||
|  | 	} else { | ||||||
|  | 		err = c.Exec(`VACUUM`) | ||||||
|  | 	} | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// Checkpoint the WAL. | ||||||
|  | 	_, _, err = c.WALCheckpoint(schema, CHECKPOINT_RESTART) | ||||||
|  | 	return err | ||||||
|  | } | ||||||
|  |  | ||||||
							
								
								
									
										17
									
								
								vendor/github.com/ncruces/go-sqlite3/conn.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										17
									
								
								vendor/github.com/ncruces/go-sqlite3/conn.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -8,9 +8,10 @@ import ( | ||||||
| 	"strings" | 	"strings" | ||||||
| 	"time" | 	"time" | ||||||
| 
 | 
 | ||||||
|  | 	"github.com/tetratelabs/wazero/api" | ||||||
|  | 
 | ||||||
| 	"github.com/ncruces/go-sqlite3/internal/util" | 	"github.com/ncruces/go-sqlite3/internal/util" | ||||||
| 	"github.com/ncruces/go-sqlite3/vfs" | 	"github.com/ncruces/go-sqlite3/vfs" | ||||||
| 	"github.com/tetratelabs/wazero/api" |  | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| // Conn is a database connection handle. | // Conn is a database connection handle. | ||||||
|  | @ -204,6 +205,7 @@ func (c *Conn) PrepareFlags(sql string, flags PrepareFlag) (stmt *Stmt, tail str | ||||||
| 	tailPtr := c.arena.new(ptrlen) | 	tailPtr := c.arena.new(ptrlen) | ||||||
| 	sqlPtr := c.arena.string(sql) | 	sqlPtr := c.arena.string(sql) | ||||||
| 
 | 
 | ||||||
|  | 	c.checkInterrupt(c.handle) | ||||||
| 	r := c.call("sqlite3_prepare_v3", uint64(c.handle), | 	r := c.call("sqlite3_prepare_v3", uint64(c.handle), | ||||||
| 		uint64(sqlPtr), uint64(len(sql)+1), uint64(flags), | 		uint64(sqlPtr), uint64(len(sql)+1), uint64(flags), | ||||||
| 		uint64(stmtPtr), uint64(tailPtr)) | 		uint64(stmtPtr), uint64(tailPtr)) | ||||||
|  | @ -457,8 +459,8 @@ func busyCallback(ctx context.Context, mod api.Module, pDB uint32, count int32) | ||||||
| // https://sqlite.org/c3ref/db_status.html | // https://sqlite.org/c3ref/db_status.html | ||||||
| func (c *Conn) Status(op DBStatus, reset bool) (current, highwater int, err error) { | func (c *Conn) Status(op DBStatus, reset bool) (current, highwater int, err error) { | ||||||
| 	defer c.arena.mark()() | 	defer c.arena.mark()() | ||||||
| 	hiPtr := c.arena.new(4) | 	hiPtr := c.arena.new(intlen) | ||||||
| 	curPtr := c.arena.new(4) | 	curPtr := c.arena.new(intlen) | ||||||
| 
 | 
 | ||||||
| 	var i uint64 | 	var i uint64 | ||||||
| 	if reset { | 	if reset { | ||||||
|  | @ -484,8 +486,8 @@ func (c *Conn) TableColumnMetadata(schema, table, column string) (declType, coll | ||||||
| 	declTypePtr := c.arena.new(ptrlen) | 	declTypePtr := c.arena.new(ptrlen) | ||||||
| 	collSeqPtr := c.arena.new(ptrlen) | 	collSeqPtr := c.arena.new(ptrlen) | ||||||
| 	notNullPtr := c.arena.new(ptrlen) | 	notNullPtr := c.arena.new(ptrlen) | ||||||
| 	primaryKeyPtr := c.arena.new(ptrlen) |  | ||||||
| 	autoIncPtr := c.arena.new(ptrlen) | 	autoIncPtr := c.arena.new(ptrlen) | ||||||
|  | 	primaryKeyPtr := c.arena.new(ptrlen) | ||||||
| 	if schema != "" { | 	if schema != "" { | ||||||
| 		schemaPtr = c.arena.string(schema) | 		schemaPtr = c.arena.string(schema) | ||||||
| 	} | 	} | ||||||
|  | @ -519,10 +521,3 @@ func (c *Conn) stmtsIter(yield func(*Stmt) bool) { | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 |  | ||||||
| // DriverConn is implemented by the SQLite [database/sql] driver connection. |  | ||||||
| // |  | ||||||
| // Deprecated: use [github.com/ncruces/go-sqlite3/driver.Conn] instead. |  | ||||||
| type DriverConn interface { |  | ||||||
| 	Raw() *Conn |  | ||||||
| } |  | ||||||
|  |  | ||||||
							
								
								
									
										3
									
								
								vendor/github.com/ncruces/go-sqlite3/const.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								vendor/github.com/ncruces/go-sqlite3/const.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -13,6 +13,7 @@ const ( | ||||||
| 	_MAX_FUNCTION_ARG = 100 | 	_MAX_FUNCTION_ARG = 100 | ||||||
| 
 | 
 | ||||||
| 	ptrlen = 4 | 	ptrlen = 4 | ||||||
|  | 	intlen = 4 | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| // ErrorCode is a result code that [Error.Code] might return. | // ErrorCode is a result code that [Error.Code] might return. | ||||||
|  | @ -177,6 +178,7 @@ const ( | ||||||
| 	DETERMINISTIC FunctionFlag = 0x000000800 | 	DETERMINISTIC FunctionFlag = 0x000000800 | ||||||
| 	DIRECTONLY    FunctionFlag = 0x000080000 | 	DIRECTONLY    FunctionFlag = 0x000080000 | ||||||
| 	INNOCUOUS     FunctionFlag = 0x000200000 | 	INNOCUOUS     FunctionFlag = 0x000200000 | ||||||
|  | 	SELFORDER1    FunctionFlag = 0x002000000 | ||||||
| 	// SUBTYPE        FunctionFlag = 0x000100000 | 	// SUBTYPE        FunctionFlag = 0x000100000 | ||||||
| 	// RESULT_SUBTYPE FunctionFlag = 0x001000000 | 	// RESULT_SUBTYPE FunctionFlag = 0x001000000 | ||||||
| ) | ) | ||||||
|  | @ -245,6 +247,7 @@ const ( | ||||||
| 	DBCONFIG_TRUSTED_SCHEMA        DBConfig = 1017 | 	DBCONFIG_TRUSTED_SCHEMA        DBConfig = 1017 | ||||||
| 	DBCONFIG_STMT_SCANSTATUS       DBConfig = 1018 | 	DBCONFIG_STMT_SCANSTATUS       DBConfig = 1018 | ||||||
| 	DBCONFIG_REVERSE_SCANORDER     DBConfig = 1019 | 	DBCONFIG_REVERSE_SCANORDER     DBConfig = 1019 | ||||||
|  | 	// DBCONFIG_MAX                DBConfig = 1019 | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| // FcntlOpcode are the available opcodes for [Conn.FileControl]. | // FcntlOpcode are the available opcodes for [Conn.FileControl]. | ||||||
|  |  | ||||||
							
								
								
									
										4
									
								
								vendor/github.com/ncruces/go-sqlite3/embed/README.md
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								vendor/github.com/ncruces/go-sqlite3/embed/README.md
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -1,6 +1,6 @@ | ||||||
| # Embeddable Wasm build of SQLite | # Embeddable Wasm build of SQLite | ||||||
| 
 | 
 | ||||||
| This folder includes an embeddable Wasm build of SQLite 3.46.1 for use with | This folder includes an embeddable Wasm build of SQLite 3.47.0 for use with | ||||||
| [`github.com/ncruces/go-sqlite3`](https://pkg.go.dev/github.com/ncruces/go-sqlite3). | [`github.com/ncruces/go-sqlite3`](https://pkg.go.dev/github.com/ncruces/go-sqlite3). | ||||||
| 
 | 
 | ||||||
| The following optional features are compiled in: | The following optional features are compiled in: | ||||||
|  | @ -36,6 +36,6 @@ You can use your own custom build of SQLite. | ||||||
| Examples of custom builds of SQLite are: | Examples of custom builds of SQLite are: | ||||||
| - [`github.com/ncruces/go-sqlite3/embed/bcw2`](https://github.com/ncruces/go-sqlite3/tree/main/embed/bcw2) | - [`github.com/ncruces/go-sqlite3/embed/bcw2`](https://github.com/ncruces/go-sqlite3/tree/main/embed/bcw2) | ||||||
|   built from a branch supporting [`BEGIN CONCURRENT`](https://sqlite.org/src/doc/begin-concurrent/doc/begin_concurrent.md) |   built from a branch supporting [`BEGIN CONCURRENT`](https://sqlite.org/src/doc/begin-concurrent/doc/begin_concurrent.md) | ||||||
|   and [Wal2](https://www.sqlite.org/cgi/src/doc/wal2/doc/wal2.md). |   and [Wal2](https://sqlite.org/cgi/src/doc/wal2/doc/wal2.md). | ||||||
| - [`github.com/asg017/sqlite-vec-go-bindings/ncruces`](https://github.com/asg017/sqlite-vec-go-bindings) | - [`github.com/asg017/sqlite-vec-go-bindings/ncruces`](https://github.com/asg017/sqlite-vec-go-bindings) | ||||||
|   which includes the [`sqlite-vec`](https://github.com/asg017/sqlite-vec) vector search extension. |   which includes the [`sqlite-vec`](https://github.com/asg017/sqlite-vec) vector search extension. | ||||||
							
								
								
									
										
											BIN
										
									
								
								vendor/github.com/ncruces/go-sqlite3/embed/sqlite3.wasm
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										
											BIN
										
									
								
								vendor/github.com/ncruces/go-sqlite3/embed/sqlite3.wasm
									
										
									
										generated
									
									
										vendored
									
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										3
									
								
								vendor/github.com/ncruces/go-sqlite3/func.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								vendor/github.com/ncruces/go-sqlite3/func.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -4,8 +4,9 @@ import ( | ||||||
| 	"context" | 	"context" | ||||||
| 	"sync" | 	"sync" | ||||||
| 
 | 
 | ||||||
| 	"github.com/ncruces/go-sqlite3/internal/util" |  | ||||||
| 	"github.com/tetratelabs/wazero/api" | 	"github.com/tetratelabs/wazero/api" | ||||||
|  | 
 | ||||||
|  | 	"github.com/ncruces/go-sqlite3/internal/util" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| // CollationNeeded registers a callback to be invoked | // CollationNeeded registers a callback to be invoked | ||||||
|  |  | ||||||
							
								
								
									
										19
									
								
								vendor/github.com/ncruces/go-sqlite3/internal/alloc/alloc_other.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										19
									
								
								vendor/github.com/ncruces/go-sqlite3/internal/alloc/alloc_other.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -4,6 +4,21 @@ package alloc | ||||||
| 
 | 
 | ||||||
| import "github.com/tetratelabs/wazero/experimental" | import "github.com/tetratelabs/wazero/experimental" | ||||||
| 
 | 
 | ||||||
| func Virtual(cap, max uint64) experimental.LinearMemory { | func NewMemory(cap, max uint64) experimental.LinearMemory { | ||||||
| 	return Slice(cap, max) | 	return &sliceMemory{make([]byte, 0, cap)} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type sliceMemory struct { | ||||||
|  | 	buf []byte | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (b *sliceMemory) Free() {} | ||||||
|  | 
 | ||||||
|  | func (b *sliceMemory) Reallocate(size uint64) []byte { | ||||||
|  | 	if cap := uint64(cap(b.buf)); size > cap { | ||||||
|  | 		b.buf = append(b.buf[:cap], make([]byte, size-cap)...) | ||||||
|  | 	} else { | ||||||
|  | 		b.buf = b.buf[:size] | ||||||
|  | 	} | ||||||
|  | 	return b.buf | ||||||
| } | } | ||||||
|  |  | ||||||
							
								
								
									
										24
									
								
								vendor/github.com/ncruces/go-sqlite3/internal/alloc/alloc_slice.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										24
									
								
								vendor/github.com/ncruces/go-sqlite3/internal/alloc/alloc_slice.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -1,24 +0,0 @@ | ||||||
| //go:build !(darwin || linux) || !(amd64 || arm64 || riscv64 || ppc64le) || sqlite3_noshm || sqlite3_nosys |  | ||||||
| 
 |  | ||||||
| package alloc |  | ||||||
| 
 |  | ||||||
| import "github.com/tetratelabs/wazero/experimental" |  | ||||||
| 
 |  | ||||||
| func Slice(cap, _ uint64) experimental.LinearMemory { |  | ||||||
| 	return &sliceMemory{make([]byte, 0, cap)} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| type sliceMemory struct { |  | ||||||
| 	buf []byte |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func (b *sliceMemory) Free() {} |  | ||||||
| 
 |  | ||||||
| func (b *sliceMemory) Reallocate(size uint64) []byte { |  | ||||||
| 	if cap := uint64(cap(b.buf)); size > cap { |  | ||||||
| 		b.buf = append(b.buf[:cap], make([]byte, size-cap)...) |  | ||||||
| 	} else { |  | ||||||
| 		b.buf = b.buf[:size] |  | ||||||
| 	} |  | ||||||
| 	return b.buf |  | ||||||
| } |  | ||||||
							
								
								
									
										2
									
								
								vendor/github.com/ncruces/go-sqlite3/internal/alloc/alloc_unix.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/ncruces/go-sqlite3/internal/alloc/alloc_unix.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -9,7 +9,7 @@ import ( | ||||||
| 	"golang.org/x/sys/unix" | 	"golang.org/x/sys/unix" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| func Virtual(_, max uint64) experimental.LinearMemory { | func NewMemory(_, max uint64) experimental.LinearMemory { | ||||||
| 	// Round up to the page size. | 	// Round up to the page size. | ||||||
| 	rnd := uint64(unix.Getpagesize() - 1) | 	rnd := uint64(unix.Getpagesize() - 1) | ||||||
| 	max = (max + rnd) &^ rnd | 	max = (max + rnd) &^ rnd | ||||||
|  |  | ||||||
							
								
								
									
										2
									
								
								vendor/github.com/ncruces/go-sqlite3/internal/alloc/alloc_windows.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/ncruces/go-sqlite3/internal/alloc/alloc_windows.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -11,7 +11,7 @@ import ( | ||||||
| 	"golang.org/x/sys/windows" | 	"golang.org/x/sys/windows" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| func Virtual(_, max uint64) experimental.LinearMemory { | func NewMemory(_, max uint64) experimental.LinearMemory { | ||||||
| 	// Round up to the page size. | 	// Round up to the page size. | ||||||
| 	rnd := uint64(windows.Getpagesize() - 1) | 	rnd := uint64(windows.Getpagesize() - 1) | ||||||
| 	max = (max + rnd) &^ rnd | 	max = (max + rnd) &^ rnd | ||||||
|  |  | ||||||
							
								
								
									
										22
									
								
								vendor/github.com/ncruces/go-sqlite3/internal/util/bool.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										22
									
								
								vendor/github.com/ncruces/go-sqlite3/internal/util/bool.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -1,22 +0,0 @@ | ||||||
| package util |  | ||||||
| 
 |  | ||||||
| import "strings" |  | ||||||
| 
 |  | ||||||
| func ParseBool(s string) (b, ok bool) { |  | ||||||
| 	if len(s) == 0 { |  | ||||||
| 		return false, false |  | ||||||
| 	} |  | ||||||
| 	if s[0] == '0' { |  | ||||||
| 		return false, true |  | ||||||
| 	} |  | ||||||
| 	if '1' <= s[0] && s[0] <= '9' { |  | ||||||
| 		return true, true |  | ||||||
| 	} |  | ||||||
| 	switch strings.ToLower(s) { |  | ||||||
| 	case "true", "yes", "on": |  | ||||||
| 		return true, true |  | ||||||
| 	case "false", "no", "off": |  | ||||||
| 		return false, true |  | ||||||
| 	} |  | ||||||
| 	return false, false |  | ||||||
| } |  | ||||||
							
								
								
									
										29
									
								
								vendor/github.com/ncruces/go-sqlite3/internal/util/math.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								vendor/github.com/ncruces/go-sqlite3/internal/util/math.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,29 @@ | ||||||
|  | package util | ||||||
|  | 
 | ||||||
|  | import "math" | ||||||
|  | 
 | ||||||
|  | func abs(n int) int { | ||||||
|  | 	if n < 0 { | ||||||
|  | 		return -n | ||||||
|  | 	} | ||||||
|  | 	return n | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func GCD(m, n int) int { | ||||||
|  | 	for n != 0 { | ||||||
|  | 		m, n = n, m%n | ||||||
|  | 	} | ||||||
|  | 	return abs(m) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func LCM(m, n int) int { | ||||||
|  | 	if n == 0 { | ||||||
|  | 		return 0 | ||||||
|  | 	} | ||||||
|  | 	return abs(n) * (abs(m) / GCD(m, n)) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // https://developer.nvidia.com/blog/lerp-faster-cuda/ | ||||||
|  | func Lerp(v0, v1, t float64) float64 { | ||||||
|  | 	return math.FMA(t, v1, math.FMA(-t, v0, v0)) | ||||||
|  | } | ||||||
							
								
								
									
										9
									
								
								vendor/github.com/ncruces/go-sqlite3/internal/util/mmap.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										9
									
								
								vendor/github.com/ncruces/go-sqlite3/internal/util/mmap.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -1,4 +1,4 @@ | ||||||
| //go:build unix && (amd64 || arm64 || riscv64 || ppc64le) && !(sqlite3_noshm || sqlite3_nosys) | //go:build unix && (386 || arm || amd64 || arm64 || riscv64 || ppc64le) && !(sqlite3_noshm || sqlite3_nosys) | ||||||
| 
 | 
 | ||||||
| package util | package util | ||||||
| 
 | 
 | ||||||
|  | @ -7,17 +7,10 @@ import ( | ||||||
| 	"os" | 	"os" | ||||||
| 	"unsafe" | 	"unsafe" | ||||||
| 
 | 
 | ||||||
| 	"github.com/ncruces/go-sqlite3/internal/alloc" |  | ||||||
| 	"github.com/tetratelabs/wazero/api" | 	"github.com/tetratelabs/wazero/api" | ||||||
| 	"github.com/tetratelabs/wazero/experimental" |  | ||||||
| 	"golang.org/x/sys/unix" | 	"golang.org/x/sys/unix" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| func withAllocator(ctx context.Context) context.Context { |  | ||||||
| 	return experimental.WithMemoryAllocator(ctx, |  | ||||||
| 		experimental.MemoryAllocatorFunc(alloc.Virtual)) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| type mmapState struct { | type mmapState struct { | ||||||
| 	regions []*MappedRegion | 	regions []*MappedRegion | ||||||
| } | } | ||||||
|  |  | ||||||
							
								
								
									
										19
									
								
								vendor/github.com/ncruces/go-sqlite3/internal/util/mmap_other.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										19
									
								
								vendor/github.com/ncruces/go-sqlite3/internal/util/mmap_other.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -1,22 +1,5 @@ | ||||||
| //go:build !unix || !(amd64 || arm64 || riscv64 || ppc64le) || sqlite3_noshm || sqlite3_nosys | //go:build !unix || !(386 || arm || amd64 || arm64 || riscv64 || ppc64le) || sqlite3_noshm || sqlite3_nosys | ||||||
| 
 | 
 | ||||||
| package util | package util | ||||||
| 
 | 
 | ||||||
| import ( |  | ||||||
| 	"context" |  | ||||||
| 
 |  | ||||||
| 	"github.com/ncruces/go-sqlite3/internal/alloc" |  | ||||||
| 	"github.com/tetratelabs/wazero/experimental" |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| type mmapState struct{} | type mmapState struct{} | ||||||
| 
 |  | ||||||
| func withAllocator(ctx context.Context) context.Context { |  | ||||||
| 	return experimental.WithMemoryAllocator(ctx, |  | ||||||
| 		experimental.MemoryAllocatorFunc(func(cap, max uint64) experimental.LinearMemory { |  | ||||||
| 			if cap == max { |  | ||||||
| 				return alloc.Virtual(cap, max) |  | ||||||
| 			} |  | ||||||
| 			return alloc.Slice(cap, max) |  | ||||||
| 		})) |  | ||||||
| } |  | ||||||
|  |  | ||||||
							
								
								
									
										4
									
								
								vendor/github.com/ncruces/go-sqlite3/internal/util/module.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								vendor/github.com/ncruces/go-sqlite3/internal/util/module.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -4,6 +4,8 @@ import ( | ||||||
| 	"context" | 	"context" | ||||||
| 
 | 
 | ||||||
| 	"github.com/tetratelabs/wazero/experimental" | 	"github.com/tetratelabs/wazero/experimental" | ||||||
|  | 
 | ||||||
|  | 	"github.com/ncruces/go-sqlite3/internal/alloc" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| type moduleKey struct{} | type moduleKey struct{} | ||||||
|  | @ -14,7 +16,7 @@ type moduleState struct { | ||||||
| 
 | 
 | ||||||
| func NewContext(ctx context.Context) context.Context { | func NewContext(ctx context.Context) context.Context { | ||||||
| 	state := new(moduleState) | 	state := new(moduleState) | ||||||
| 	ctx = withAllocator(ctx) | 	ctx = experimental.WithMemoryAllocator(ctx, experimental.MemoryAllocatorFunc(alloc.NewMemory)) | ||||||
| 	ctx = experimental.WithCloseNotifier(ctx, state) | 	ctx = experimental.WithCloseNotifier(ctx, state) | ||||||
| 	ctx = context.WithValue(ctx, moduleKey{}, state) | 	ctx = context.WithValue(ctx, moduleKey{}, state) | ||||||
| 	return ctx | 	return ctx | ||||||
|  |  | ||||||
							
								
								
									
										14
									
								
								vendor/github.com/ncruces/go-sqlite3/sqlite.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										14
									
								
								vendor/github.com/ncruces/go-sqlite3/sqlite.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -9,11 +9,12 @@ import ( | ||||||
| 	"sync" | 	"sync" | ||||||
| 	"unsafe" | 	"unsafe" | ||||||
| 
 | 
 | ||||||
| 	"github.com/ncruces/go-sqlite3/internal/util" |  | ||||||
| 	"github.com/ncruces/go-sqlite3/vfs" |  | ||||||
| 	"github.com/tetratelabs/wazero" | 	"github.com/tetratelabs/wazero" | ||||||
| 	"github.com/tetratelabs/wazero/api" | 	"github.com/tetratelabs/wazero/api" | ||||||
| 	"github.com/tetratelabs/wazero/experimental" | 	"github.com/tetratelabs/wazero/experimental" | ||||||
|  | 
 | ||||||
|  | 	"github.com/ncruces/go-sqlite3/internal/util" | ||||||
|  | 	"github.com/ncruces/go-sqlite3/vfs" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| // Configure SQLite Wasm. | // Configure SQLite Wasm. | ||||||
|  | @ -49,10 +50,15 @@ func compileSQLite() { | ||||||
| 	cfg := RuntimeConfig | 	cfg := RuntimeConfig | ||||||
| 	if cfg == nil { | 	if cfg == nil { | ||||||
| 		cfg = wazero.NewRuntimeConfig() | 		cfg = wazero.NewRuntimeConfig() | ||||||
|  | 		if bits.UintSize >= 64 { | ||||||
|  | 			cfg = cfg.WithMemoryLimitPages(4096) // 256MB | ||||||
|  | 		} else { | ||||||
|  | 			cfg = cfg.WithMemoryLimitPages(512) // 32MB | ||||||
| 		} | 		} | ||||||
|  | 	} | ||||||
|  | 	cfg = cfg.WithCoreFeatures(api.CoreFeaturesV2 | experimental.CoreFeaturesThreads) | ||||||
| 
 | 
 | ||||||
| 	instance.runtime = wazero.NewRuntimeWithConfig(ctx, | 	instance.runtime = wazero.NewRuntimeWithConfig(ctx, cfg) | ||||||
| 		cfg.WithCoreFeatures(api.CoreFeaturesV2|experimental.CoreFeaturesThreads)) |  | ||||||
| 
 | 
 | ||||||
| 	env := instance.runtime.NewHostModuleBuilder("env") | 	env := instance.runtime.NewHostModuleBuilder("env") | ||||||
| 	env = vfs.ExportHostFunctions(env) | 	env = vfs.ExportHostFunctions(env) | ||||||
|  |  | ||||||
							
								
								
									
										12
									
								
								vendor/github.com/ncruces/go-sqlite3/txn.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										12
									
								
								vendor/github.com/ncruces/go-sqlite3/txn.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -8,8 +8,9 @@ import ( | ||||||
| 	"strconv" | 	"strconv" | ||||||
| 	"strings" | 	"strings" | ||||||
| 
 | 
 | ||||||
| 	"github.com/ncruces/go-sqlite3/internal/util" |  | ||||||
| 	"github.com/tetratelabs/wazero/api" | 	"github.com/tetratelabs/wazero/api" | ||||||
|  | 
 | ||||||
|  | 	"github.com/ncruces/go-sqlite3/internal/util" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| // Txn is an in-progress database transaction. | // Txn is an in-progress database transaction. | ||||||
|  | @ -142,7 +143,7 @@ func (c *Conn) Savepoint() Savepoint { | ||||||
| 	// Names can be reused, but this makes catching bugs more likely. | 	// Names can be reused, but this makes catching bugs more likely. | ||||||
| 	name = QuoteIdentifier(name + "_" + strconv.Itoa(int(rand.Int31()))) | 	name = QuoteIdentifier(name + "_" + strconv.Itoa(int(rand.Int31()))) | ||||||
| 
 | 
 | ||||||
| 	err := c.txnExecInterrupted("SAVEPOINT " + name) | 	err := c.txnExecInterrupted(`SAVEPOINT ` + name) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		panic(err) | 		panic(err) | ||||||
| 	} | 	} | ||||||
|  | @ -186,7 +187,7 @@ func (s Savepoint) Release(errp *error) { | ||||||
| 		if s.c.GetAutocommit() { // There is nothing to commit. | 		if s.c.GetAutocommit() { // There is nothing to commit. | ||||||
| 			return | 			return | ||||||
| 		} | 		} | ||||||
| 		*errp = s.c.Exec("RELEASE " + s.name) | 		*errp = s.c.Exec(`RELEASE ` + s.name) | ||||||
| 		if *errp == nil { | 		if *errp == nil { | ||||||
| 			return | 			return | ||||||
| 		} | 		} | ||||||
|  | @ -198,8 +199,7 @@ func (s Savepoint) Release(errp *error) { | ||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
| 	// ROLLBACK and RELEASE even if interrupted. | 	// ROLLBACK and RELEASE even if interrupted. | ||||||
| 	err := s.c.txnExecInterrupted("ROLLBACK TO " + | 	err := s.c.txnExecInterrupted(`ROLLBACK TO ` + s.name + `; RELEASE ` + s.name) | ||||||
| 		s.name + "; RELEASE " + s.name) |  | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		panic(err) | 		panic(err) | ||||||
| 	} | 	} | ||||||
|  | @ -212,7 +212,7 @@ func (s Savepoint) Release(errp *error) { | ||||||
| // https://sqlite.org/lang_transaction.html | // https://sqlite.org/lang_transaction.html | ||||||
| func (s Savepoint) Rollback() error { | func (s Savepoint) Rollback() error { | ||||||
| 	// ROLLBACK even if interrupted. | 	// ROLLBACK even if interrupted. | ||||||
| 	return s.c.txnExecInterrupted("ROLLBACK TO " + s.name) | 	return s.c.txnExecInterrupted(`ROLLBACK TO ` + s.name) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (c *Conn) txnExecInterrupted(sql string) error { | func (c *Conn) txnExecInterrupted(sql string) error { | ||||||
|  |  | ||||||
							
								
								
									
										2
									
								
								vendor/github.com/ncruces/go-sqlite3/util/osutil/osutil.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/ncruces/go-sqlite3/util/osutil/osutil.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -1,2 +1,2 @@ | ||||||
| // Package osutil implements operating system utility functions. | // Package osutil implements operating system utilities. | ||||||
| package osutil | package osutil | ||||||
|  |  | ||||||
							
								
								
									
										9
									
								
								vendor/github.com/ncruces/go-sqlite3/util/sql3util/README.md
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								vendor/github.com/ncruces/go-sqlite3/util/sql3util/README.md
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,9 @@ | ||||||
|  | # SQLite utility functions  | ||||||
|  | 
 | ||||||
|  | This package implements assorted SQLite utilities | ||||||
|  | useful to extension writers. | ||||||
|  | 
 | ||||||
|  | It also wraps a [parser](https://github.com/marcobambini/sqlite-createtable-parser) | ||||||
|  | for the [`CREATE`](https://sqlite.org/lang_createtable.html) and | ||||||
|  | [`ALTER TABLE`](https://sqlite.org/lang_altertable.html) commands, | ||||||
|  | created by [Marco Bambini](https://github.com/marcobambini). | ||||||
							
								
								
									
										65
									
								
								vendor/github.com/ncruces/go-sqlite3/util/sql3util/arg.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										65
									
								
								vendor/github.com/ncruces/go-sqlite3/util/sql3util/arg.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,65 @@ | ||||||
|  | package sql3util | ||||||
|  | 
 | ||||||
|  | import "strings" | ||||||
|  | 
 | ||||||
|  | // NamedArg splits an named arg into a key and value, | ||||||
|  | // around an equals sign. | ||||||
|  | // Spaces are trimmed around both key and value. | ||||||
|  | func NamedArg(arg string) (key, val string) { | ||||||
|  | 	key, val, _ = strings.Cut(arg, "=") | ||||||
|  | 	key = strings.TrimSpace(key) | ||||||
|  | 	val = strings.TrimSpace(val) | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Unquote unquotes a string. | ||||||
|  | // | ||||||
|  | // https://sqlite.org/lang_keywords.html | ||||||
|  | func Unquote(val string) string { | ||||||
|  | 	if len(val) < 2 { | ||||||
|  | 		return val | ||||||
|  | 	} | ||||||
|  | 	fst := val[0] | ||||||
|  | 	lst := val[len(val)-1] | ||||||
|  | 	rst := val[1 : len(val)-1] | ||||||
|  | 	if fst == '[' && lst == ']' { | ||||||
|  | 		return rst | ||||||
|  | 	} | ||||||
|  | 	if fst != lst { | ||||||
|  | 		return val | ||||||
|  | 	} | ||||||
|  | 	var old, new string | ||||||
|  | 	switch fst { | ||||||
|  | 	default: | ||||||
|  | 		return val | ||||||
|  | 	case '`': | ||||||
|  | 		old, new = "``", "`" | ||||||
|  | 	case '"': | ||||||
|  | 		old, new = `""`, `"` | ||||||
|  | 	case '\'': | ||||||
|  | 		old, new = `''`, `'` | ||||||
|  | 	} | ||||||
|  | 	return strings.ReplaceAll(rst, old, new) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // ParseBool parses a boolean. | ||||||
|  | // | ||||||
|  | // https://sqlite.org/pragma.html#syntax | ||||||
|  | func ParseBool(s string) (b, ok bool) { | ||||||
|  | 	if len(s) == 0 { | ||||||
|  | 		return false, false | ||||||
|  | 	} | ||||||
|  | 	if s[0] == '0' { | ||||||
|  | 		return false, true | ||||||
|  | 	} | ||||||
|  | 	if '1' <= s[0] && s[0] <= '9' { | ||||||
|  | 		return true, true | ||||||
|  | 	} | ||||||
|  | 	switch strings.ToLower(s) { | ||||||
|  | 	case "true", "yes", "on": | ||||||
|  | 		return true, true | ||||||
|  | 	case "false", "no", "off": | ||||||
|  | 		return false, true | ||||||
|  | 	} | ||||||
|  | 	return false, false | ||||||
|  | } | ||||||
							
								
								
									
										61
									
								
								vendor/github.com/ncruces/go-sqlite3/util/sql3util/const.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										61
									
								
								vendor/github.com/ncruces/go-sqlite3/util/sql3util/const.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,61 @@ | ||||||
|  | package sql3util | ||||||
|  | 
 | ||||||
|  | const ( | ||||||
|  | 	_NONE = iota | ||||||
|  | 	_MEMORY | ||||||
|  | 	_SYNTAX | ||||||
|  | 	_UNSUPPORTEDSQL | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | type ConflictClause uint32 | ||||||
|  | 
 | ||||||
|  | const ( | ||||||
|  | 	CONFLICT_NONE ConflictClause = iota | ||||||
|  | 	CONFLICT_ROLLBACK | ||||||
|  | 	CONFLICT_ABORT | ||||||
|  | 	CONFLICT_FAIL | ||||||
|  | 	CONFLICT_IGNORE | ||||||
|  | 	CONFLICT_REPLACE | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | type OrderClause uint32 | ||||||
|  | 
 | ||||||
|  | const ( | ||||||
|  | 	ORDER_NONE OrderClause = iota | ||||||
|  | 	ORDER_ASC | ||||||
|  | 	ORDER_DESC | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | type FKAction uint32 | ||||||
|  | 
 | ||||||
|  | const ( | ||||||
|  | 	FKACTION_NONE FKAction = iota | ||||||
|  | 	FKACTION_SETNULL | ||||||
|  | 	FKACTION_SETDEFAULT | ||||||
|  | 	FKACTION_CASCADE | ||||||
|  | 	FKACTION_RESTRICT | ||||||
|  | 	FKACTION_NOACTION | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | type FKDefType uint32 | ||||||
|  | 
 | ||||||
|  | const ( | ||||||
|  | 	DEFTYPE_NONE FKDefType = iota | ||||||
|  | 	DEFTYPE_DEFERRABLE | ||||||
|  | 	DEFTYPE_DEFERRABLE_INITIALLY_DEFERRED | ||||||
|  | 	DEFTYPE_DEFERRABLE_INITIALLY_IMMEDIATE | ||||||
|  | 	DEFTYPE_NOTDEFERRABLE | ||||||
|  | 	DEFTYPE_NOTDEFERRABLE_INITIALLY_DEFERRED | ||||||
|  | 	DEFTYPE_NOTDEFERRABLE_INITIALLY_IMMEDIATE | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | type StatementType uint32 | ||||||
|  | 
 | ||||||
|  | const ( | ||||||
|  | 	CREATE_UNKNOWN StatementType = iota | ||||||
|  | 	CREATE_TABLE | ||||||
|  | 	ALTER_RENAME_TABLE | ||||||
|  | 	ALTER_RENAME_COLUMN | ||||||
|  | 	ALTER_ADD_COLUMN | ||||||
|  | 	ALTER_DROP_COLUMN | ||||||
|  | ) | ||||||
							
								
								
									
										210
									
								
								vendor/github.com/ncruces/go-sqlite3/util/sql3util/parse.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										210
									
								
								vendor/github.com/ncruces/go-sqlite3/util/sql3util/parse.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,210 @@ | ||||||
|  | package sql3util | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"context" | ||||||
|  | 	_ "embed" | ||||||
|  | 	"sync" | ||||||
|  | 
 | ||||||
|  | 	"github.com/tetratelabs/wazero" | ||||||
|  | 	"github.com/tetratelabs/wazero/api" | ||||||
|  | 
 | ||||||
|  | 	"github.com/ncruces/go-sqlite3/internal/util" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | const ( | ||||||
|  | 	errp = 4 | ||||||
|  | 	sqlp = 8 | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | var ( | ||||||
|  | 	//go:embed parse/sql3parse_table.wasm | ||||||
|  | 	binary   []byte | ||||||
|  | 	once     sync.Once | ||||||
|  | 	runtime  wazero.Runtime | ||||||
|  | 	compiled wazero.CompiledModule | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | // ParseTable parses a [CREATE] or [ALTER TABLE] command. | ||||||
|  | // | ||||||
|  | // [CREATE]: https://sqlite.org/lang_createtable.html | ||||||
|  | // [ALTER TABLE]: https://sqlite.org/lang_altertable.html | ||||||
|  | func ParseTable(sql string) (_ *Table, err error) { | ||||||
|  | 	once.Do(func() { | ||||||
|  | 		ctx := context.Background() | ||||||
|  | 		cfg := wazero.NewRuntimeConfigInterpreter() | ||||||
|  | 		runtime = wazero.NewRuntimeWithConfig(ctx, cfg) | ||||||
|  | 		compiled, err = runtime.CompileModule(ctx, binary) | ||||||
|  | 	}) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	ctx := context.Background() | ||||||
|  | 	mod, err := runtime.InstantiateModule(ctx, compiled, wazero.NewModuleConfig().WithName("")) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	defer mod.Close(ctx) | ||||||
|  | 
 | ||||||
|  | 	if buf, ok := mod.Memory().Read(sqlp, uint32(len(sql))); ok { | ||||||
|  | 		copy(buf, sql) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	stack := [...]uint64{sqlp, uint64(len(sql)), errp} | ||||||
|  | 	err = mod.ExportedFunction("sql3parse_table").CallWithStack(ctx, stack[:]) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	c, _ := mod.Memory().ReadUint32Le(errp) | ||||||
|  | 	switch c { | ||||||
|  | 	case _MEMORY: | ||||||
|  | 		panic(util.OOMErr) | ||||||
|  | 	case _SYNTAX: | ||||||
|  | 		return nil, util.ErrorString("sql3parse: invalid syntax") | ||||||
|  | 	case _UNSUPPORTEDSQL: | ||||||
|  | 		return nil, util.ErrorString("sql3parse: unsupported SQL") | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	var tab Table | ||||||
|  | 	tab.load(mod, uint32(stack[0]), sql) | ||||||
|  | 	return &tab, nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Table holds metadata about a table. | ||||||
|  | type Table struct { | ||||||
|  | 	Name           string | ||||||
|  | 	Schema         string | ||||||
|  | 	Comment        string | ||||||
|  | 	IsTemporary    bool | ||||||
|  | 	IsIfNotExists  bool | ||||||
|  | 	IsWithoutRowID bool | ||||||
|  | 	IsStrict       bool | ||||||
|  | 	Columns        []Column | ||||||
|  | 	Type           StatementType | ||||||
|  | 	CurrentName    string | ||||||
|  | 	NewName        string | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (t *Table) load(mod api.Module, ptr uint32, sql string) { | ||||||
|  | 	t.Name = loadString(mod, ptr+0, sql) | ||||||
|  | 	t.Schema = loadString(mod, ptr+8, sql) | ||||||
|  | 	t.Comment = loadString(mod, ptr+16, sql) | ||||||
|  | 
 | ||||||
|  | 	t.IsTemporary = loadBool(mod, ptr+24) | ||||||
|  | 	t.IsIfNotExists = loadBool(mod, ptr+25) | ||||||
|  | 	t.IsWithoutRowID = loadBool(mod, ptr+26) | ||||||
|  | 	t.IsStrict = loadBool(mod, ptr+27) | ||||||
|  | 
 | ||||||
|  | 	t.Columns = loadSlice(mod, ptr+28, func(ptr uint32, res *Column) { | ||||||
|  | 		p, _ := mod.Memory().ReadUint32Le(ptr) | ||||||
|  | 		res.load(mod, p, sql) | ||||||
|  | 	}) | ||||||
|  | 
 | ||||||
|  | 	t.Type = loadEnum[StatementType](mod, ptr+44) | ||||||
|  | 	t.CurrentName = loadString(mod, ptr+48, sql) | ||||||
|  | 	t.NewName = loadString(mod, ptr+56, sql) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Column holds metadata about a column. | ||||||
|  | type Column struct { | ||||||
|  | 	Name                  string | ||||||
|  | 	Type                  string | ||||||
|  | 	Length                string | ||||||
|  | 	ConstraintName        string | ||||||
|  | 	Comment               string | ||||||
|  | 	IsPrimaryKey          bool | ||||||
|  | 	IsAutoIncrement       bool | ||||||
|  | 	IsNotNull             bool | ||||||
|  | 	IsUnique              bool | ||||||
|  | 	PKOrder               OrderClause | ||||||
|  | 	PKConflictClause      ConflictClause | ||||||
|  | 	NotNullConflictClause ConflictClause | ||||||
|  | 	UniqueConflictClause  ConflictClause | ||||||
|  | 	CheckExpr             string | ||||||
|  | 	DefaultExpr           string | ||||||
|  | 	CollateName           string | ||||||
|  | 	ForeignKeyClause      *ForeignKey | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (c *Column) load(mod api.Module, ptr uint32, sql string) { | ||||||
|  | 	c.Name = loadString(mod, ptr+0, sql) | ||||||
|  | 	c.Type = loadString(mod, ptr+8, sql) | ||||||
|  | 	c.Length = loadString(mod, ptr+16, sql) | ||||||
|  | 	c.ConstraintName = loadString(mod, ptr+24, sql) | ||||||
|  | 	c.Comment = loadString(mod, ptr+32, sql) | ||||||
|  | 
 | ||||||
|  | 	c.IsPrimaryKey = loadBool(mod, ptr+40) | ||||||
|  | 	c.IsAutoIncrement = loadBool(mod, ptr+41) | ||||||
|  | 	c.IsNotNull = loadBool(mod, ptr+42) | ||||||
|  | 	c.IsUnique = loadBool(mod, ptr+43) | ||||||
|  | 
 | ||||||
|  | 	c.PKOrder = loadEnum[OrderClause](mod, ptr+44) | ||||||
|  | 	c.PKConflictClause = loadEnum[ConflictClause](mod, ptr+48) | ||||||
|  | 	c.NotNullConflictClause = loadEnum[ConflictClause](mod, ptr+52) | ||||||
|  | 	c.UniqueConflictClause = loadEnum[ConflictClause](mod, ptr+56) | ||||||
|  | 
 | ||||||
|  | 	c.CheckExpr = loadString(mod, ptr+60, sql) | ||||||
|  | 	c.DefaultExpr = loadString(mod, ptr+68, sql) | ||||||
|  | 	c.CollateName = loadString(mod, ptr+76, sql) | ||||||
|  | 
 | ||||||
|  | 	if ptr, _ := mod.Memory().ReadUint32Le(ptr + 84); ptr != 0 { | ||||||
|  | 		c.ForeignKeyClause = &ForeignKey{} | ||||||
|  | 		c.ForeignKeyClause.load(mod, ptr, sql) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type ForeignKey struct { | ||||||
|  | 	Table      string | ||||||
|  | 	Columns    []string | ||||||
|  | 	OnDelete   FKAction | ||||||
|  | 	OnUpdate   FKAction | ||||||
|  | 	Match      string | ||||||
|  | 	Deferrable FKDefType | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 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.OnDelete = loadEnum[FKAction](mod, ptr+16) | ||||||
|  | 	f.OnUpdate = loadEnum[FKAction](mod, ptr+20) | ||||||
|  | 	f.Match = loadString(mod, ptr+24, sql) | ||||||
|  | 	f.Deferrable = loadEnum[FKDefType](mod, ptr+32) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func loadString(mod api.Module, ptr uint32, sql string) string { | ||||||
|  | 	off, _ := mod.Memory().ReadUint32Le(ptr + 0) | ||||||
|  | 	if off == 0 { | ||||||
|  | 		return "" | ||||||
|  | 	} | ||||||
|  | 	len, _ := mod.Memory().ReadUint32Le(ptr + 4) | ||||||
|  | 	return sql[off-sqlp : off+len-sqlp] | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func loadSlice[T any](mod api.Module, ptr uint32, fn func(uint32, *T)) []T { | ||||||
|  | 	ref, _ := mod.Memory().ReadUint32Le(ptr + 4) | ||||||
|  | 	if ref == 0 { | ||||||
|  | 		return nil | ||||||
|  | 	} | ||||||
|  | 	len, _ := mod.Memory().ReadUint32Le(ptr + 0) | ||||||
|  | 	res := make([]T, len) | ||||||
|  | 	for i := range res { | ||||||
|  | 		fn(ref, &res[i]) | ||||||
|  | 		ref += 4 | ||||||
|  | 	} | ||||||
|  | 	return res | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func loadEnum[T ~uint32](mod api.Module, ptr uint32) T { | ||||||
|  | 	val, _ := mod.Memory().ReadUint32Le(ptr) | ||||||
|  | 	return T(val) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func loadBool(mod api.Module, ptr uint32) bool { | ||||||
|  | 	val, _ := mod.Memory().ReadByte(ptr) | ||||||
|  | 	return val != 0 | ||||||
|  | } | ||||||
							
								
								
									
										
											BIN
										
									
								
								vendor/github.com/ncruces/go-sqlite3/util/sql3util/parse/sql3parse_table.wasm
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								vendor/github.com/ncruces/go-sqlite3/util/sql3util/parse/sql3parse_table.wasm
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										9
									
								
								vendor/github.com/ncruces/go-sqlite3/util/sql3util/sql3util.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								vendor/github.com/ncruces/go-sqlite3/util/sql3util/sql3util.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,9 @@ | ||||||
|  | // Package sql3util implements SQLite utilities. | ||||||
|  | package sql3util | ||||||
|  | 
 | ||||||
|  | // ValidPageSize returns true if s is a valid page size. | ||||||
|  | // | ||||||
|  | // https://sqlite.org/fileformat.html#pages | ||||||
|  | func ValidPageSize(s int) bool { | ||||||
|  | 	return 512 <= s && s <= 65536 && s&(s-1) == 0 | ||||||
|  | } | ||||||
							
								
								
									
										42
									
								
								vendor/github.com/ncruces/go-sqlite3/vfs/README.md
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										42
									
								
								vendor/github.com/ncruces/go-sqlite3/vfs/README.md
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -4,7 +4,7 @@ This package implements the SQLite [OS Interface](https://sqlite.org/vfs.html) ( | ||||||
| 
 | 
 | ||||||
| It replaces the default SQLite VFS with a **pure Go** implementation, | It replaces the default SQLite VFS with a **pure Go** implementation, | ||||||
| and exposes [interfaces](https://pkg.go.dev/github.com/ncruces/go-sqlite3/vfs#VFS) | and exposes [interfaces](https://pkg.go.dev/github.com/ncruces/go-sqlite3/vfs#VFS) | ||||||
| that should allow you to implement your own custom VFSes. | that should allow you to implement your own [custom VFSes](#custom-vfses). | ||||||
| 
 | 
 | ||||||
| Since it is a from scratch reimplementation, | Since it is a from scratch reimplementation, | ||||||
| there are naturally some ways it deviates from the original. | there are naturally some ways it deviates from the original. | ||||||
|  | @ -16,12 +16,12 @@ The main differences are [file locking](#file-locking) and [WAL mode](#write-ahe | ||||||
| POSIX advisory locks, which SQLite uses on Unix, are | POSIX advisory locks, which SQLite uses on Unix, are | ||||||
| [broken by design](https://github.com/sqlite/sqlite/blob/b74eb0/src/os_unix.c#L1073-L1161). | [broken by design](https://github.com/sqlite/sqlite/blob/b74eb0/src/os_unix.c#L1073-L1161). | ||||||
| 
 | 
 | ||||||
| On Linux and macOS, this module uses | On Linux and macOS, this package uses | ||||||
| [OFD locks](https://www.gnu.org/software/libc/manual/html_node/Open-File-Description-Locks.html) | [OFD locks](https://www.gnu.org/software/libc/manual/html_node/Open-File-Description-Locks.html) | ||||||
| to synchronize access to database files. | to synchronize access to database files. | ||||||
| OFD locks are fully compatible with POSIX advisory locks. | OFD locks are fully compatible with POSIX advisory locks. | ||||||
| 
 | 
 | ||||||
| This module can also use | This package can also use | ||||||
| [BSD locks](https://man.freebsd.org/cgi/man.cgi?query=flock&sektion=2), | [BSD locks](https://man.freebsd.org/cgi/man.cgi?query=flock&sektion=2), | ||||||
| albeit with reduced concurrency (`BEGIN IMMEDIATE` behaves like `BEGIN EXCLUSIVE`). | albeit with reduced concurrency (`BEGIN IMMEDIATE` behaves like `BEGIN EXCLUSIVE`). | ||||||
| On BSD, macOS, and illumos, BSD locks are fully compatible with POSIX advisory locks; | On BSD, macOS, and illumos, BSD locks are fully compatible with POSIX advisory locks; | ||||||
|  | @ -30,7 +30,7 @@ elsewhere, they are very likely broken. | ||||||
| BSD locks are the default on BSD and illumos, | BSD locks are the default on BSD and illumos, | ||||||
| but you can opt into them with the `sqlite3_flock` build tag. | but you can opt into them with the `sqlite3_flock` build tag. | ||||||
| 
 | 
 | ||||||
| On Windows, this module uses `LockFileEx` and `UnlockFileEx`, | On Windows, this package uses `LockFileEx` and `UnlockFileEx`, | ||||||
| like SQLite. | like SQLite. | ||||||
| 
 | 
 | ||||||
| Otherwise, file locking is not supported, and you must use | Otherwise, file locking is not supported, and you must use | ||||||
|  | @ -46,18 +46,14 @@ to check if your build supports file locking. | ||||||
| 
 | 
 | ||||||
| ### Write-Ahead Logging | ### Write-Ahead Logging | ||||||
| 
 | 
 | ||||||
| On 64-bit little-endian Unix, this module uses `mmap` to implement | On little-endian Unix, this package uses `mmap` to implement | ||||||
| [shared-memory for the WAL-index](https://sqlite.org/wal.html#implementation_of_shared_memory_for_the_wal_index), | [shared-memory for the WAL-index](https://sqlite.org/wal.html#implementation_of_shared_memory_for_the_wal_index), | ||||||
| like SQLite. | like SQLite. | ||||||
| 
 | 
 | ||||||
| To allow `mmap` to work, each connection needs to reserve up to 4GB of address space. |  | ||||||
| To limit the address space each connection reserves, |  | ||||||
| use [`WithMemoryLimitPages`](../tests/testcfg/testcfg.go). |  | ||||||
| 
 |  | ||||||
| With [BSD locks](https://man.freebsd.org/cgi/man.cgi?query=flock&sektion=2) | With [BSD locks](https://man.freebsd.org/cgi/man.cgi?query=flock&sektion=2) | ||||||
| a WAL database can only be accessed by a single proccess. | a WAL database can only be accessed by a single proccess. | ||||||
| Other processes that attempt to access a database locked with BSD locks, | Other processes that attempt to access a database locked with BSD locks, | ||||||
| will fail with the `SQLITE_PROTOCOL` error code. | will fail with the [`SQLITE_PROTOCOL`](https://sqlite.org/rescode.html#protocol) error code. | ||||||
| 
 | 
 | ||||||
| Otherwise, [WAL support is limited](https://sqlite.org/wal.html#noshm), | Otherwise, [WAL support is limited](https://sqlite.org/wal.html#noshm), | ||||||
| and `EXCLUSIVE` locking mode must be set to create, read, and write WAL databases. | and `EXCLUSIVE` locking mode must be set to create, read, and write WAL databases. | ||||||
|  | @ -71,9 +67,22 @@ to check if your build supports shared memory. | ||||||
| 
 | 
 | ||||||
| ### Batch-Atomic Write | ### Batch-Atomic Write | ||||||
| 
 | 
 | ||||||
| On 64-bit Linux, this module supports [batch-atomic writes](https://sqlite.org/cgi/src/technote/714) | On 64-bit Linux, this package supports | ||||||
|  | [batch-atomic writes](https://sqlite.org/cgi/src/technote/714) | ||||||
| on the F2FS filesystem. | on the F2FS filesystem. | ||||||
| 
 | 
 | ||||||
|  | ### Checksums | ||||||
|  | 
 | ||||||
|  | This package can be [configured](https://pkg.go.dev/github.com/ncruces/go-sqlite3#Conn.EnableChecksums) | ||||||
|  | to add an 8-byte checksum to the end of every page in an SQLite database. | ||||||
|  | The checksum is added as each page is written | ||||||
|  | and verified as each page is read.\ | ||||||
|  | The checksum is intended to help detect database corruption | ||||||
|  | caused by random bit-flips in the mass storage device. | ||||||
|  | 
 | ||||||
|  | The implementation is compatible with SQLite's | ||||||
|  | [Checksum VFS Shim](https://sqlite.org/cksumvfs.html). | ||||||
|  | 
 | ||||||
| ### Build Tags | ### Build Tags | ||||||
| 
 | 
 | ||||||
| The VFS can be customized with a few build tags: | The VFS can be customized with a few build tags: | ||||||
|  | @ -90,3 +99,14 @@ The VFS can be customized with a few build tags: | ||||||
| > [`unix-flock` VFS](https://sqlite.org/compile.html#enable_locking_style). | > [`unix-flock` VFS](https://sqlite.org/compile.html#enable_locking_style). | ||||||
| > If incompatible file locking is used, accessing databases concurrently with | > If incompatible file locking is used, accessing databases concurrently with | ||||||
| > _other_ SQLite libraries will eventually corrupt data. | > _other_ SQLite libraries will eventually corrupt data. | ||||||
|  | 
 | ||||||
|  | ### Custom VFSes | ||||||
|  | 
 | ||||||
|  | - [`github.com/ncruces/go-sqlite3/vfs/adiantum`](https://pkg.go.dev/github.com/ncruces/go-sqlite3/vfs/adiantum) | ||||||
|  |   wraps a VFS to offer encryption at rest. | ||||||
|  | - [`github.com/ncruces/go-sqlite3/vfs/memdb`](https://pkg.go.dev/github.com/ncruces/go-sqlite3/vfs/memdb) | ||||||
|  |   implements an in-memory VFS. | ||||||
|  | - [`github.com/ncruces/go-sqlite3/vfs/readervfs`](https://pkg.go.dev/github.com/ncruces/go-sqlite3/vfs/readervfs) | ||||||
|  |   implements a VFS for immutable databases. | ||||||
|  | - [`github.com/ncruces/go-sqlite3/vfs/xts`](https://pkg.go.dev/github.com/ncruces/go-sqlite3/vfs/xts) | ||||||
|  |   wraps a VFS to offer encryption at rest. | ||||||
							
								
								
									
										80
									
								
								vendor/github.com/ncruces/go-sqlite3/vfs/api.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										80
									
								
								vendor/github.com/ncruces/go-sqlite3/vfs/api.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -49,6 +49,13 @@ type File interface { | ||||||
| 	DeviceCharacteristics() DeviceCharacteristic | 	DeviceCharacteristics() DeviceCharacteristic | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // FileUnwrap should be implemented by a File | ||||||
|  | // that wraps another File implementation. | ||||||
|  | type FileUnwrap interface { | ||||||
|  | 	File | ||||||
|  | 	Unwrap() File | ||||||
|  | } | ||||||
|  | 
 | ||||||
| // FileLockState extends File to implement the | // FileLockState extends File to implement the | ||||||
| // SQLITE_FCNTL_LOCKSTATE file control opcode. | // SQLITE_FCNTL_LOCKSTATE file control opcode. | ||||||
| // | // | ||||||
|  | @ -58,6 +65,26 @@ type FileLockState interface { | ||||||
| 	LockState() LockLevel | 	LockState() LockLevel | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // FilePersistentWAL extends File to implement the | ||||||
|  | // SQLITE_FCNTL_PERSIST_WAL file control opcode. | ||||||
|  | // | ||||||
|  | // https://sqlite.org/c3ref/c_fcntl_begin_atomic_write.html#sqlitefcntlpersistwal | ||||||
|  | type FilePersistentWAL interface { | ||||||
|  | 	File | ||||||
|  | 	PersistentWAL() bool | ||||||
|  | 	SetPersistentWAL(bool) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // FilePowersafeOverwrite extends File to implement the | ||||||
|  | // SQLITE_FCNTL_POWERSAFE_OVERWRITE file control opcode. | ||||||
|  | // | ||||||
|  | // https://sqlite.org/c3ref/c_fcntl_begin_atomic_write.html#sqlitefcntlpowersafeoverwrite | ||||||
|  | type FilePowersafeOverwrite interface { | ||||||
|  | 	File | ||||||
|  | 	PowersafeOverwrite() bool | ||||||
|  | 	SetPowersafeOverwrite(bool) | ||||||
|  | } | ||||||
|  | 
 | ||||||
| // FileChunkSize extends File to implement the | // FileChunkSize extends File to implement the | ||||||
| // SQLITE_FCNTL_CHUNK_SIZE file control opcode. | // SQLITE_FCNTL_CHUNK_SIZE file control opcode. | ||||||
| // | // | ||||||
|  | @ -94,26 +121,6 @@ type FileOverwrite interface { | ||||||
| 	Overwrite() error | 	Overwrite() error | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // FilePersistentWAL extends File to implement the |  | ||||||
| // SQLITE_FCNTL_PERSIST_WAL file control opcode. |  | ||||||
| // |  | ||||||
| // https://sqlite.org/c3ref/c_fcntl_begin_atomic_write.html#sqlitefcntlpersistwal |  | ||||||
| type FilePersistentWAL interface { |  | ||||||
| 	File |  | ||||||
| 	PersistentWAL() bool |  | ||||||
| 	SetPersistentWAL(bool) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // FilePowersafeOverwrite extends File to implement the |  | ||||||
| // SQLITE_FCNTL_POWERSAFE_OVERWRITE file control opcode. |  | ||||||
| // |  | ||||||
| // https://sqlite.org/c3ref/c_fcntl_begin_atomic_write.html#sqlitefcntlpowersafeoverwrite |  | ||||||
| type FilePowersafeOverwrite interface { |  | ||||||
| 	File |  | ||||||
| 	PowersafeOverwrite() bool |  | ||||||
| 	SetPowersafeOverwrite(bool) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // FileCommitPhaseTwo extends File to implement the | // FileCommitPhaseTwo extends File to implement the | ||||||
| // SQLITE_FCNTL_COMMIT_PHASETWO file control opcode. | // SQLITE_FCNTL_COMMIT_PHASETWO file control opcode. | ||||||
| // | // | ||||||
|  | @ -135,15 +142,6 @@ type FileBatchAtomicWrite interface { | ||||||
| 	RollbackAtomicWrite() error | 	RollbackAtomicWrite() error | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // FilePragma extends File to implement the |  | ||||||
| // SQLITE_FCNTL_PRAGMA file control opcode. |  | ||||||
| // |  | ||||||
| // https://sqlite.org/c3ref/c_fcntl_begin_atomic_write.html#sqlitefcntlpragma |  | ||||||
| type FilePragma interface { |  | ||||||
| 	File |  | ||||||
| 	Pragma(name, value string) (string, error) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // FileCheckpoint extends File to implement the | // FileCheckpoint extends File to implement the | ||||||
| // SQLITE_FCNTL_CKPT_START and SQLITE_FCNTL_CKPT_DONE | // SQLITE_FCNTL_CKPT_START and SQLITE_FCNTL_CKPT_DONE | ||||||
| // file control opcodes. | // file control opcodes. | ||||||
|  | @ -151,8 +149,17 @@ type FilePragma interface { | ||||||
| // https://sqlite.org/c3ref/c_fcntl_begin_atomic_write.html#sqlitefcntlckptstart | // https://sqlite.org/c3ref/c_fcntl_begin_atomic_write.html#sqlitefcntlckptstart | ||||||
| type FileCheckpoint interface { | type FileCheckpoint interface { | ||||||
| 	File | 	File | ||||||
| 	CheckpointDone() error | 	CheckpointStart() | ||||||
| 	CheckpointStart() error | 	CheckpointDone() | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // FilePragma extends File to implement the | ||||||
|  | // SQLITE_FCNTL_PRAGMA file control opcode. | ||||||
|  | // | ||||||
|  | // https://sqlite.org/c3ref/c_fcntl_begin_atomic_write.html#sqlitefcntlpragma | ||||||
|  | type FilePragma interface { | ||||||
|  | 	File | ||||||
|  | 	Pragma(name, value string) (string, error) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // FileSharedMemory extends File to possibly implement | // FileSharedMemory extends File to possibly implement | ||||||
|  | @ -171,5 +178,16 @@ type SharedMemory interface { | ||||||
| 	shmMap(context.Context, api.Module, int32, int32, bool) (uint32, _ErrorCode) | 	shmMap(context.Context, api.Module, int32, int32, bool) (uint32, _ErrorCode) | ||||||
| 	shmLock(int32, int32, _ShmFlag) _ErrorCode | 	shmLock(int32, int32, _ShmFlag) _ErrorCode | ||||||
| 	shmUnmap(bool) | 	shmUnmap(bool) | ||||||
|  | 	shmBarrier() | ||||||
| 	io.Closer | 	io.Closer | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | type blockingSharedMemory interface { | ||||||
|  | 	SharedMemory | ||||||
|  | 	shmEnableBlocking(block bool) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type fileControl interface { | ||||||
|  | 	File | ||||||
|  | 	fileControl(ctx context.Context, mod api.Module, op _FcntlOpcode, pArg uint32) _ErrorCode | ||||||
|  | } | ||||||
|  |  | ||||||
							
								
								
									
										149
									
								
								vendor/github.com/ncruces/go-sqlite3/vfs/cksm.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										149
									
								
								vendor/github.com/ncruces/go-sqlite3/vfs/cksm.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,149 @@ | ||||||
|  | package vfs | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"bytes" | ||||||
|  | 	"context" | ||||||
|  | 	_ "embed" | ||||||
|  | 	"encoding/binary" | ||||||
|  | 	"strconv" | ||||||
|  | 
 | ||||||
|  | 	"github.com/tetratelabs/wazero/api" | ||||||
|  | 
 | ||||||
|  | 	"github.com/ncruces/go-sqlite3/internal/util" | ||||||
|  | 	"github.com/ncruces/go-sqlite3/util/sql3util" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | func cksmWrapFile(name *Filename, flags OpenFlag, file File) File { | ||||||
|  | 	// Checksum only main databases and WALs. | ||||||
|  | 	if flags&(OPEN_MAIN_DB|OPEN_WAL) == 0 { | ||||||
|  | 		return file | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	cksm := cksmFile{File: file} | ||||||
|  | 
 | ||||||
|  | 	if flags&OPEN_WAL != 0 { | ||||||
|  | 		main, _ := name.DatabaseFile().(cksmFile) | ||||||
|  | 		cksm.cksmFlags = main.cksmFlags | ||||||
|  | 	} else { | ||||||
|  | 		cksm.cksmFlags = new(cksmFlags) | ||||||
|  | 		cksm.isDB = true | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return cksm | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type cksmFile struct { | ||||||
|  | 	File | ||||||
|  | 	*cksmFlags | ||||||
|  | 	isDB bool | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type cksmFlags struct { | ||||||
|  | 	computeCksm bool | ||||||
|  | 	verifyCksm  bool | ||||||
|  | 	inCkpt      bool | ||||||
|  | 	pageSize    int | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (c cksmFile) ReadAt(p []byte, off int64) (n int, err error) { | ||||||
|  | 	n, err = c.File.ReadAt(p, off) | ||||||
|  | 
 | ||||||
|  | 	// SQLite is reading the header of a database file. | ||||||
|  | 	if c.isDB && off == 0 && len(p) >= 100 && | ||||||
|  | 		bytes.HasPrefix(p, []byte("SQLite format 3\000")) { | ||||||
|  | 		c.init(p) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// Verify checksums. | ||||||
|  | 	if c.verifyCksm && !c.inCkpt && len(p) == c.pageSize { | ||||||
|  | 		cksm1 := cksmCompute(p[:len(p)-8]) | ||||||
|  | 		cksm2 := *(*[8]byte)(p[len(p)-8:]) | ||||||
|  | 		if cksm1 != cksm2 { | ||||||
|  | 			return 0, _IOERR_DATA | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return n, err | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (c cksmFile) WriteAt(p []byte, off int64) (n int, err error) { | ||||||
|  | 	// SQLite is writing the first page of a database file. | ||||||
|  | 	if c.isDB && off == 0 && len(p) >= 100 && | ||||||
|  | 		bytes.HasPrefix(p, []byte("SQLite format 3\000")) { | ||||||
|  | 		c.init(p) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// Compute checksums. | ||||||
|  | 	if c.computeCksm && !c.inCkpt && len(p) == c.pageSize { | ||||||
|  | 		*(*[8]byte)(p[len(p)-8:]) = cksmCompute(p[:len(p)-8]) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return c.File.WriteAt(p, off) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (c cksmFile) Pragma(name string, value string) (string, error) { | ||||||
|  | 	switch name { | ||||||
|  | 	case "checksum_verification": | ||||||
|  | 		b, ok := sql3util.ParseBool(value) | ||||||
|  | 		if ok { | ||||||
|  | 			c.verifyCksm = b && c.computeCksm | ||||||
|  | 		} | ||||||
|  | 		if !c.verifyCksm { | ||||||
|  | 			return "0", nil | ||||||
|  | 		} | ||||||
|  | 		return "1", nil | ||||||
|  | 
 | ||||||
|  | 	case "page_size": | ||||||
|  | 		if c.computeCksm { | ||||||
|  | 			// Do not allow page size changes on a checksum database. | ||||||
|  | 			return strconv.Itoa(c.pageSize), nil | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return "", _NOTFOUND | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (c cksmFile) fileControl(ctx context.Context, mod api.Module, op _FcntlOpcode, pArg uint32) _ErrorCode { | ||||||
|  | 	switch op { | ||||||
|  | 	case _FCNTL_CKPT_START: | ||||||
|  | 		c.inCkpt = true | ||||||
|  | 	case _FCNTL_CKPT_DONE: | ||||||
|  | 		c.inCkpt = false | ||||||
|  | 	} | ||||||
|  | 	if rc := vfsFileControlImpl(ctx, mod, c, op, pArg); rc != _NOTFOUND { | ||||||
|  | 		return rc | ||||||
|  | 	} | ||||||
|  | 	return vfsFileControlImpl(ctx, mod, c.File, op, pArg) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (f *cksmFlags) init(header []byte) { | ||||||
|  | 	f.pageSize = 256 * int(binary.LittleEndian.Uint16(header[16:18])) | ||||||
|  | 	if r := header[20] == 8; r != f.computeCksm { | ||||||
|  | 		f.computeCksm = r | ||||||
|  | 		f.verifyCksm = r | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func cksmCompute(a []byte) (cksm [8]byte) { | ||||||
|  | 	var s1, s2 uint32 | ||||||
|  | 	for len(a) >= 8 { | ||||||
|  | 		s1 += binary.LittleEndian.Uint32(a[0:4]) + s2 | ||||||
|  | 		s2 += binary.LittleEndian.Uint32(a[4:8]) + s1 | ||||||
|  | 		a = a[8:] | ||||||
|  | 	} | ||||||
|  | 	if len(a) != 0 { | ||||||
|  | 		panic(util.AssertErr()) | ||||||
|  | 	} | ||||||
|  | 	binary.LittleEndian.PutUint32(cksm[0:4], s1) | ||||||
|  | 	binary.LittleEndian.PutUint32(cksm[4:8], s2) | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (c cksmFile) SharedMemory() SharedMemory { | ||||||
|  | 	if f, ok := c.File.(FileSharedMemory); ok { | ||||||
|  | 		return f.SharedMemory() | ||||||
|  | 	} | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (c cksmFile) Unwrap() File { | ||||||
|  | 	return c.File | ||||||
|  | } | ||||||
							
								
								
									
										1
									
								
								vendor/github.com/ncruces/go-sqlite3/vfs/const.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								vendor/github.com/ncruces/go-sqlite3/vfs/const.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -51,6 +51,7 @@ const ( | ||||||
| 	_IOERR_BEGIN_ATOMIC      _ErrorCode = util.IOERR_BEGIN_ATOMIC | 	_IOERR_BEGIN_ATOMIC      _ErrorCode = util.IOERR_BEGIN_ATOMIC | ||||||
| 	_IOERR_COMMIT_ATOMIC     _ErrorCode = util.IOERR_COMMIT_ATOMIC | 	_IOERR_COMMIT_ATOMIC     _ErrorCode = util.IOERR_COMMIT_ATOMIC | ||||||
| 	_IOERR_ROLLBACK_ATOMIC   _ErrorCode = util.IOERR_ROLLBACK_ATOMIC | 	_IOERR_ROLLBACK_ATOMIC   _ErrorCode = util.IOERR_ROLLBACK_ATOMIC | ||||||
|  | 	_IOERR_DATA              _ErrorCode = util.IOERR_DATA | ||||||
| 	_BUSY_SNAPSHOT           _ErrorCode = util.BUSY_SNAPSHOT | 	_BUSY_SNAPSHOT           _ErrorCode = util.BUSY_SNAPSHOT | ||||||
| 	_CANTOPEN_FULLPATH       _ErrorCode = util.CANTOPEN_FULLPATH | 	_CANTOPEN_FULLPATH       _ErrorCode = util.CANTOPEN_FULLPATH | ||||||
| 	_CANTOPEN_ISDIR          _ErrorCode = util.CANTOPEN_ISDIR | 	_CANTOPEN_ISDIR          _ErrorCode = util.CANTOPEN_ISDIR | ||||||
|  |  | ||||||
							
								
								
									
										3
									
								
								vendor/github.com/ncruces/go-sqlite3/vfs/filename.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								vendor/github.com/ncruces/go-sqlite3/vfs/filename.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -4,8 +4,9 @@ import ( | ||||||
| 	"context" | 	"context" | ||||||
| 	"net/url" | 	"net/url" | ||||||
| 
 | 
 | ||||||
| 	"github.com/ncruces/go-sqlite3/internal/util" |  | ||||||
| 	"github.com/tetratelabs/wazero/api" | 	"github.com/tetratelabs/wazero/api" | ||||||
|  | 
 | ||||||
|  | 	"github.com/ncruces/go-sqlite3/internal/util" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| // Filename is used by SQLite to pass filenames | // Filename is used by SQLite to pass filenames | ||||||
|  |  | ||||||
							
								
								
									
										4
									
								
								vendor/github.com/ncruces/go-sqlite3/vfs/os_f2fs_linux.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								vendor/github.com/ncruces/go-sqlite3/vfs/os_f2fs_linux.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -1,4 +1,4 @@ | ||||||
| //go:build (amd64 || arm64 || riscv64 || ppc64le) && !sqlite3_nosys | //go:build (amd64 || arm64 || riscv64) && !sqlite3_nosys | ||||||
| 
 | 
 | ||||||
| package vfs | package vfs | ||||||
| 
 | 
 | ||||||
|  | @ -13,7 +13,7 @@ const ( | ||||||
| 	_F2FS_IOC_START_ATOMIC_WRITE  = 62721 | 	_F2FS_IOC_START_ATOMIC_WRITE  = 62721 | ||||||
| 	_F2FS_IOC_COMMIT_ATOMIC_WRITE = 62722 | 	_F2FS_IOC_COMMIT_ATOMIC_WRITE = 62722 | ||||||
| 	_F2FS_IOC_ABORT_ATOMIC_WRITE  = 62725 | 	_F2FS_IOC_ABORT_ATOMIC_WRITE  = 62725 | ||||||
| 	_F2FS_IOC_GET_FEATURES        = 2147808524 | 	_F2FS_IOC_GET_FEATURES        = 2147808524 // -2147158772 | ||||||
| 	_F2FS_FEATURE_ATOMIC_WRITE    = 4 | 	_F2FS_FEATURE_ATOMIC_WRITE    = 4 | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
							
								
								
									
										2
									
								
								vendor/github.com/ncruces/go-sqlite3/vfs/os_std_atomic.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/ncruces/go-sqlite3/vfs/os_std_atomic.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -1,4 +1,4 @@ | ||||||
| //go:build !linux || !(amd64 || arm64 || riscv64 || ppc64le) || sqlite3_nosys | //go:build !linux || !(amd64 || arm64 || riscv64) || sqlite3_nosys | ||||||
| 
 | 
 | ||||||
| package vfs | package vfs | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
							
								
								
									
										15
									
								
								vendor/github.com/ncruces/go-sqlite3/vfs/shm.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										15
									
								
								vendor/github.com/ncruces/go-sqlite3/vfs/shm.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -1,4 +1,4 @@ | ||||||
| //go:build (darwin || linux) && (amd64 || arm64 || riscv64 || ppc64le) && !(sqlite3_flock || sqlite3_noshm || sqlite3_nosys) | //go:build (darwin || linux) && (386 || arm || amd64 || arm64 || riscv64 || ppc64le) && !(sqlite3_flock || sqlite3_noshm || sqlite3_nosys) | ||||||
| 
 | 
 | ||||||
| package vfs | package vfs | ||||||
| 
 | 
 | ||||||
|  | @ -6,11 +6,13 @@ import ( | ||||||
| 	"context" | 	"context" | ||||||
| 	"io" | 	"io" | ||||||
| 	"os" | 	"os" | ||||||
|  | 	"sync" | ||||||
| 	"time" | 	"time" | ||||||
| 
 | 
 | ||||||
| 	"github.com/ncruces/go-sqlite3/internal/util" |  | ||||||
| 	"github.com/tetratelabs/wazero/api" | 	"github.com/tetratelabs/wazero/api" | ||||||
| 	"golang.org/x/sys/unix" | 	"golang.org/x/sys/unix" | ||||||
|  | 
 | ||||||
|  | 	"github.com/ncruces/go-sqlite3/internal/util" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| // SupportsSharedMemory is false on platforms that do not support shared memory. | // SupportsSharedMemory is false on platforms that do not support shared memory. | ||||||
|  | @ -45,12 +47,15 @@ func NewSharedMemory(path string, flags OpenFlag) SharedMemory { | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | var _ blockingSharedMemory = &vfsShm{} | ||||||
|  | 
 | ||||||
| type vfsShm struct { | type vfsShm struct { | ||||||
| 	*os.File | 	*os.File | ||||||
| 	path     string | 	path     string | ||||||
| 	regions  []*util.MappedRegion | 	regions  []*util.MappedRegion | ||||||
| 	readOnly bool | 	readOnly bool | ||||||
| 	blocking bool | 	blocking bool | ||||||
|  | 	sync.Mutex | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (s *vfsShm) shmOpen() _ErrorCode { | func (s *vfsShm) shmOpen() _ErrorCode { | ||||||
|  | @ -196,6 +201,12 @@ func (s *vfsShm) shmUnmap(delete bool) { | ||||||
| 	s.File = nil | 	s.File = nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | func (s *vfsShm) shmBarrier() { | ||||||
|  | 	s.Lock() | ||||||
|  | 	//lint:ignore SA2001 memory barrier. | ||||||
|  | 	s.Unlock() | ||||||
|  | } | ||||||
|  | 
 | ||||||
| func (s *vfsShm) shmEnableBlocking(block bool) { | func (s *vfsShm) shmEnableBlocking(block bool) { | ||||||
| 	s.blocking = block | 	s.blocking = block | ||||||
| } | } | ||||||
|  |  | ||||||
							
								
								
									
										11
									
								
								vendor/github.com/ncruces/go-sqlite3/vfs/shm_bsd.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										11
									
								
								vendor/github.com/ncruces/go-sqlite3/vfs/shm_bsd.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -1,4 +1,4 @@ | ||||||
| //go:build (freebsd || openbsd || netbsd || dragonfly || illumos || sqlite3_flock) && (amd64 || arm64 || riscv64 || ppc64le) && !(sqlite3_noshm || sqlite3_nosys) | //go:build (freebsd || openbsd || netbsd || dragonfly || illumos || sqlite3_flock) && (386 || arm || amd64 || arm64 || riscv64 || ppc64le) && !(sqlite3_noshm || sqlite3_nosys) | ||||||
| 
 | 
 | ||||||
| package vfs | package vfs | ||||||
| 
 | 
 | ||||||
|  | @ -8,9 +8,10 @@ import ( | ||||||
| 	"os" | 	"os" | ||||||
| 	"sync" | 	"sync" | ||||||
| 
 | 
 | ||||||
| 	"github.com/ncruces/go-sqlite3/internal/util" |  | ||||||
| 	"github.com/tetratelabs/wazero/api" | 	"github.com/tetratelabs/wazero/api" | ||||||
| 	"golang.org/x/sys/unix" | 	"golang.org/x/sys/unix" | ||||||
|  | 
 | ||||||
|  | 	"github.com/ncruces/go-sqlite3/internal/util" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| // SupportsSharedMemory is false on platforms that do not support shared memory. | // SupportsSharedMemory is false on platforms that do not support shared memory. | ||||||
|  | @ -269,3 +270,9 @@ func (s *vfsShm) shmUnmap(delete bool) { | ||||||
| 	} | 	} | ||||||
| 	s.Close() | 	s.Close() | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | func (s *vfsShm) shmBarrier() { | ||||||
|  | 	s.lockMtx.Lock() | ||||||
|  | 	//lint:ignore SA2001 memory barrier. | ||||||
|  | 	s.lockMtx.Unlock() | ||||||
|  | } | ||||||
|  |  | ||||||
							
								
								
									
										2
									
								
								vendor/github.com/ncruces/go-sqlite3/vfs/shm_other.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/ncruces/go-sqlite3/vfs/shm_other.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -1,4 +1,4 @@ | ||||||
| //go:build !(darwin || linux || freebsd || openbsd || netbsd || dragonfly || illumos || sqlite3_flock) || !(amd64 || arm64 || riscv64 || ppc64le) || sqlite3_noshm || sqlite3_nosys | //go:build !(darwin || linux || freebsd || openbsd || netbsd || dragonfly || illumos || sqlite3_flock) || !(386 || arm || amd64 || arm64 || riscv64 || ppc64le) || sqlite3_noshm || sqlite3_nosys | ||||||
| 
 | 
 | ||||||
| package vfs | package vfs | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
							
								
								
									
										58
									
								
								vendor/github.com/ncruces/go-sqlite3/vfs/vfs.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										58
									
								
								vendor/github.com/ncruces/go-sqlite3/vfs/vfs.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -5,13 +5,15 @@ import ( | ||||||
| 	"crypto/rand" | 	"crypto/rand" | ||||||
| 	"io" | 	"io" | ||||||
| 	"reflect" | 	"reflect" | ||||||
| 	"sync" | 	"strings" | ||||||
| 	"time" | 	"time" | ||||||
| 
 | 
 | ||||||
| 	"github.com/ncruces/go-sqlite3/internal/util" |  | ||||||
| 	"github.com/ncruces/julianday" |  | ||||||
| 	"github.com/tetratelabs/wazero" | 	"github.com/tetratelabs/wazero" | ||||||
| 	"github.com/tetratelabs/wazero/api" | 	"github.com/tetratelabs/wazero/api" | ||||||
|  | 
 | ||||||
|  | 	"github.com/ncruces/go-sqlite3/internal/util" | ||||||
|  | 	"github.com/ncruces/go-sqlite3/util/sql3util" | ||||||
|  | 	"github.com/ncruces/julianday" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| // ExportHostFunctions is an internal API users need not call directly. | // ExportHostFunctions is an internal API users need not call directly. | ||||||
|  | @ -146,7 +148,7 @@ func vfsOpen(ctx context.Context, mod api.Module, pVfs, zPath, pFile uint32, fla | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if file, ok := file.(FilePowersafeOverwrite); ok { | 	if file, ok := file.(FilePowersafeOverwrite); ok { | ||||||
| 		if b, ok := util.ParseBool(name.URIParameter("psow")); ok { | 		if b, ok := sql3util.ParseBool(name.URIParameter("psow")); ok { | ||||||
| 			file.SetPowersafeOverwrite(b) | 			file.SetPowersafeOverwrite(b) | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  | @ -157,6 +159,7 @@ func vfsOpen(ctx context.Context, mod api.Module, pVfs, zPath, pFile uint32, fla | ||||||
| 	if pOutFlags != 0 { | 	if pOutFlags != 0 { | ||||||
| 		util.WriteUint32(mod, pOutFlags, uint32(flags)) | 		util.WriteUint32(mod, pOutFlags, uint32(flags)) | ||||||
| 	} | 	} | ||||||
|  | 	file = cksmWrapFile(name, flags, file) | ||||||
| 	vfsFileRegister(ctx, mod, pFile, file) | 	vfsFileRegister(ctx, mod, pFile, file) | ||||||
| 	return _OK | 	return _OK | ||||||
| } | } | ||||||
|  | @ -235,21 +238,20 @@ func vfsCheckReservedLock(ctx context.Context, mod api.Module, pFile, pResOut ui | ||||||
| 
 | 
 | ||||||
| func vfsFileControl(ctx context.Context, mod api.Module, pFile uint32, op _FcntlOpcode, pArg uint32) _ErrorCode { | func vfsFileControl(ctx context.Context, mod api.Module, pFile uint32, op _FcntlOpcode, pArg uint32) _ErrorCode { | ||||||
| 	file := vfsFileGet(ctx, mod, pFile).(File) | 	file := vfsFileGet(ctx, mod, pFile).(File) | ||||||
|  | 	if file, ok := file.(fileControl); ok { | ||||||
|  | 		return file.fileControl(ctx, mod, op, pArg) | ||||||
|  | 	} | ||||||
|  | 	return vfsFileControlImpl(ctx, mod, file, op, pArg) | ||||||
|  | } | ||||||
| 
 | 
 | ||||||
|  | func vfsFileControlImpl(ctx context.Context, mod api.Module, file File, op _FcntlOpcode, pArg uint32) _ErrorCode { | ||||||
| 	switch op { | 	switch op { | ||||||
| 	case _FCNTL_LOCKSTATE: | 	case _FCNTL_LOCKSTATE: | ||||||
| 		if file, ok := file.(FileLockState); ok { | 		if file, ok := file.(FileLockState); ok { | ||||||
| 			util.WriteUint32(mod, pArg, uint32(file.LockState())) | 			if lk := file.LockState(); lk <= LOCK_EXCLUSIVE { | ||||||
|  | 				util.WriteUint32(mod, pArg, uint32(lk)) | ||||||
| 				return _OK | 				return _OK | ||||||
| 			} | 			} | ||||||
| 
 |  | ||||||
| 	case _FCNTL_LOCK_TIMEOUT: |  | ||||||
| 		if file, ok := file.(FileSharedMemory); ok { |  | ||||||
| 			if iface, ok := file.SharedMemory().(interface{ shmEnableBlocking(bool) }); ok { |  | ||||||
| 				if i := util.ReadUint32(mod, pArg); i == 0 || i == 1 { |  | ||||||
| 					iface.shmEnableBlocking(i != 0) |  | ||||||
| 				} |  | ||||||
| 			} |  | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 	case _FCNTL_PERSIST_WAL: | 	case _FCNTL_PERSIST_WAL: | ||||||
|  | @ -329,15 +331,15 @@ func vfsFileControl(ctx context.Context, mod api.Module, pFile uint32, op _Fcntl | ||||||
| 			return vfsErrorCode(err, _IOERR_ROLLBACK_ATOMIC) | 			return vfsErrorCode(err, _IOERR_ROLLBACK_ATOMIC) | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 	case _FCNTL_CKPT_DONE: |  | ||||||
| 		if file, ok := file.(FileCheckpoint); ok { |  | ||||||
| 			err := file.CheckpointDone() |  | ||||||
| 			return vfsErrorCode(err, _IOERR) |  | ||||||
| 		} |  | ||||||
| 	case _FCNTL_CKPT_START: | 	case _FCNTL_CKPT_START: | ||||||
| 		if file, ok := file.(FileCheckpoint); ok { | 		if file, ok := file.(FileCheckpoint); ok { | ||||||
| 			err := file.CheckpointStart() | 			file.CheckpointStart() | ||||||
| 			return vfsErrorCode(err, _IOERR) | 			return _OK | ||||||
|  | 		} | ||||||
|  | 	case _FCNTL_CKPT_DONE: | ||||||
|  | 		if file, ok := file.(FileCheckpoint); ok { | ||||||
|  | 			file.CheckpointDone() | ||||||
|  | 			return _OK | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 	case _FCNTL_PRAGMA: | 	case _FCNTL_PRAGMA: | ||||||
|  | @ -349,7 +351,7 @@ func vfsFileControl(ctx context.Context, mod api.Module, pFile uint32, op _Fcntl | ||||||
| 				value = util.ReadString(mod, ptr, _MAX_SQL_LENGTH) | 				value = util.ReadString(mod, ptr, _MAX_SQL_LENGTH) | ||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
| 			out, err := file.Pragma(name, value) | 			out, err := file.Pragma(strings.ToLower(name), value) | ||||||
| 
 | 
 | ||||||
| 			ret := vfsErrorCode(err, _ERROR) | 			ret := vfsErrorCode(err, _ERROR) | ||||||
| 			if ret == _ERROR { | 			if ret == _ERROR { | ||||||
|  | @ -366,6 +368,14 @@ func vfsFileControl(ctx context.Context, mod api.Module, pFile uint32, op _Fcntl | ||||||
| 			} | 			} | ||||||
| 			return ret | 			return ret | ||||||
| 		} | 		} | ||||||
|  | 
 | ||||||
|  | 	case _FCNTL_LOCK_TIMEOUT: | ||||||
|  | 		if file, ok := file.(FileSharedMemory); ok { | ||||||
|  | 			if shm, ok := file.SharedMemory().(blockingSharedMemory); ok { | ||||||
|  | 				shm.shmEnableBlocking(util.ReadUint32(mod, pArg) != 0) | ||||||
|  | 				return _OK | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	// Consider also implementing these opcodes (in use by SQLite): | 	// Consider also implementing these opcodes (in use by SQLite): | ||||||
|  | @ -385,11 +395,9 @@ func vfsDeviceCharacteristics(ctx context.Context, mod api.Module, pFile uint32) | ||||||
| 	return file.DeviceCharacteristics() | 	return file.DeviceCharacteristics() | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| var shmBarrier sync.Mutex |  | ||||||
| 
 |  | ||||||
| func vfsShmBarrier(ctx context.Context, mod api.Module, pFile uint32) { | func vfsShmBarrier(ctx context.Context, mod api.Module, pFile uint32) { | ||||||
| 	shmBarrier.Lock() | 	shm := vfsFileGet(ctx, mod, pFile).(FileSharedMemory).SharedMemory() | ||||||
| 	defer shmBarrier.Unlock() | 	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 uint32, iRegion, szRegion int32, bExtend, pp uint32) _ErrorCode { | ||||||
|  |  | ||||||
							
								
								
									
										3
									
								
								vendor/github.com/ncruces/go-sqlite3/vtab.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								vendor/github.com/ncruces/go-sqlite3/vtab.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -4,8 +4,9 @@ import ( | ||||||
| 	"context" | 	"context" | ||||||
| 	"reflect" | 	"reflect" | ||||||
| 
 | 
 | ||||||
| 	"github.com/ncruces/go-sqlite3/internal/util" |  | ||||||
| 	"github.com/tetratelabs/wazero/api" | 	"github.com/tetratelabs/wazero/api" | ||||||
|  | 
 | ||||||
|  | 	"github.com/ncruces/go-sqlite3/internal/util" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| // CreateModule registers a new virtual table module name. | // CreateModule registers a new virtual table module name. | ||||||
|  |  | ||||||
							
								
								
									
										3
									
								
								vendor/modules.txt
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								vendor/modules.txt
									
										
									
									
										vendored
									
									
								
							|  | @ -518,7 +518,7 @@ github.com/modern-go/reflect2 | ||||||
| # github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 | # github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 | ||||||
| ## explicit | ## explicit | ||||||
| github.com/munnerz/goautoneg | github.com/munnerz/goautoneg | ||||||
| # github.com/ncruces/go-sqlite3 v0.19.0 | # github.com/ncruces/go-sqlite3 v0.20.0 | ||||||
| ## explicit; go 1.21 | ## explicit; go 1.21 | ||||||
| github.com/ncruces/go-sqlite3 | github.com/ncruces/go-sqlite3 | ||||||
| github.com/ncruces/go-sqlite3/driver | github.com/ncruces/go-sqlite3/driver | ||||||
|  | @ -526,6 +526,7 @@ github.com/ncruces/go-sqlite3/embed | ||||||
| github.com/ncruces/go-sqlite3/internal/alloc | github.com/ncruces/go-sqlite3/internal/alloc | ||||||
| github.com/ncruces/go-sqlite3/internal/util | github.com/ncruces/go-sqlite3/internal/util | ||||||
| github.com/ncruces/go-sqlite3/util/osutil | github.com/ncruces/go-sqlite3/util/osutil | ||||||
|  | github.com/ncruces/go-sqlite3/util/sql3util | ||||||
| github.com/ncruces/go-sqlite3/vfs | github.com/ncruces/go-sqlite3/vfs | ||||||
| github.com/ncruces/go-sqlite3/vfs/memdb | github.com/ncruces/go-sqlite3/vfs/memdb | ||||||
| # github.com/ncruces/go-strftime v0.1.9 | # github.com/ncruces/go-strftime v0.1.9 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue