diff --git a/sqlite3/main.c b/sqlite3/main.c index 9830701..cda7656 100644 --- a/sqlite3/main.c +++ b/sqlite3/main.c @@ -33,6 +33,7 @@ int go_write(sqlite3_file *, const void *, int iAmt, sqlite3_int64 iOfst); int go_truncate(sqlite3_file *, sqlite3_int64 size); int go_sync(sqlite3_file *, int flags); int go_file_size(sqlite3_file *, sqlite3_int64 *pSize); +int go_file_control(sqlite3_file *pFile, int op, void *pArg); int go_lock(sqlite3_file *pFile, int eLock); int go_unlock(sqlite3_file *pFile, int eLock); diff --git a/vfs.go b/vfs.go index 6d5d647..78369a5 100644 --- a/vfs.go +++ b/vfs.go @@ -45,6 +45,7 @@ func vfsInstantiate(ctx context.Context, r wazero.Runtime) (err error) { env.NewFunctionBuilder().WithFunc(vfsLock).Export("go_lock") env.NewFunctionBuilder().WithFunc(vfsUnlock).Export("go_unlock") env.NewFunctionBuilder().WithFunc(vfsCheckReservedLock).Export("go_check_reserved_lock") + env.NewFunctionBuilder().WithFunc(vfsFileControl).Export("go_file_control") _, err = env.Instantiate(ctx) return err } @@ -304,3 +305,15 @@ func vfsFileSize(ctx context.Context, mod api.Module, pFile, pSize uint32) uint3 memory{mod}.writeUint64(pSize, uint64(off)) return _OK } + +func vfsFileControl(ctx context.Context, pFile, op, pArg uint32) uint32 { + // SQLite calls vfsFileControl with these opcodes: + // SQLITE_FCNTL_SIZE_HINT + // SQLITE_FCNTL_PRAGMA + // SQLITE_FCNTL_BUSYHANDLER + // SQLITE_FCNTL_HAS_MOVED + // SQLITE_FCNTL_SYNC + // SQLITE_FCNTL_COMMIT_PHASETWO + // SQLITE_FCNTL_PDB + return uint32(NOTFOUND) +}