diff --git a/Cargo.toml b/Cargo.toml index 38cd0bb..730cdaa 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -65,5 +65,6 @@ include = [ ] [patch.crates-io] +rsqlite-vfs = { path = "./crates/rsqlite-vfs" } sqlite-wasm-rs = { path = "./" } sqlite-wasm-vfs = { path = "./crates/sqlite-wasm-vfs" } diff --git a/crates/rsqlite-vfs/src/ffi.rs b/crates/rsqlite-vfs/src/ffi.rs index 1c64206..8408a9e 100644 --- a/crates/rsqlite-vfs/src/ffi.rs +++ b/crates/rsqlite-vfs/src/ffi.rs @@ -2,17 +2,520 @@ pub type sqlite3_int64 = ::core::ffi::c_longlong; pub type sqlite3_filename = *const ::core::ffi::c_char; pub type sqlite3_syscall_ptr = ::core::option::Option; -pub const SQLITE_CANTOPEN: i32 = 14; +pub const SQLITE_OK: i32 = 0; pub const SQLITE_ERROR: i32 = 1; +pub const SQLITE_INTERNAL: i32 = 2; +pub const SQLITE_PERM: i32 = 3; +pub const SQLITE_ABORT: i32 = 4; +pub const SQLITE_BUSY: i32 = 5; +pub const SQLITE_LOCKED: i32 = 6; +pub const SQLITE_NOMEM: i32 = 7; +pub const SQLITE_READONLY: i32 = 8; +pub const SQLITE_INTERRUPT: i32 = 9; pub const SQLITE_IOERR: i32 = 10; +pub const SQLITE_CORRUPT: i32 = 11; +pub const SQLITE_NOTFOUND: i32 = 12; +pub const SQLITE_FULL: i32 = 13; +pub const SQLITE_CANTOPEN: i32 = 14; +pub const SQLITE_PROTOCOL: i32 = 15; +pub const SQLITE_EMPTY: i32 = 16; +pub const SQLITE_SCHEMA: i32 = 17; +pub const SQLITE_TOOBIG: i32 = 18; +pub const SQLITE_CONSTRAINT: i32 = 19; +pub const SQLITE_MISMATCH: i32 = 20; +pub const SQLITE_MISUSE: i32 = 21; +pub const SQLITE_NOLFS: i32 = 22; +pub const SQLITE_AUTH: i32 = 23; +pub const SQLITE_FORMAT: i32 = 24; +pub const SQLITE_RANGE: i32 = 25; +pub const SQLITE_NOTADB: i32 = 26; +pub const SQLITE_NOTICE: i32 = 27; +pub const SQLITE_WARNING: i32 = 28; +pub const SQLITE_ROW: i32 = 100; +pub const SQLITE_DONE: i32 = 101; +pub const SQLITE_ERROR_MISSING_COLLSEQ: i32 = 257; +pub const SQLITE_ERROR_RETRY: i32 = 513; +pub const SQLITE_ERROR_SNAPSHOT: i32 = 769; +pub const SQLITE_ERROR_RESERVESIZE: i32 = 1025; +pub const SQLITE_ERROR_KEY: i32 = 1281; +pub const SQLITE_ERROR_UNABLE: i32 = 1537; +pub const SQLITE_IOERR_READ: i32 = 266; pub const SQLITE_IOERR_SHORT_READ: i32 = 522; +pub const SQLITE_IOERR_WRITE: i32 = 778; +pub const SQLITE_IOERR_FSYNC: i32 = 1034; +pub const SQLITE_IOERR_DIR_FSYNC: i32 = 1290; +pub const SQLITE_IOERR_TRUNCATE: i32 = 1546; +pub const SQLITE_IOERR_FSTAT: i32 = 1802; +pub const SQLITE_IOERR_UNLOCK: i32 = 2058; +pub const SQLITE_IOERR_RDLOCK: i32 = 2314; pub const SQLITE_IOERR_DELETE: i32 = 2570; -pub const SQLITE_OK: i32 = 0; -pub const SQLITE_OPEN_DELETEONCLOSE: i32 = 8; -pub const SQLITE_OPEN_MAIN_DB: i32 = 256; +pub const SQLITE_IOERR_BLOCKED: i32 = 2826; +pub const SQLITE_IOERR_NOMEM: i32 = 3082; +pub const SQLITE_IOERR_ACCESS: i32 = 3338; +pub const SQLITE_IOERR_CHECKRESERVEDLOCK: i32 = 3594; +pub const SQLITE_IOERR_LOCK: i32 = 3850; +pub const SQLITE_IOERR_CLOSE: i32 = 4106; +pub const SQLITE_IOERR_DIR_CLOSE: i32 = 4362; +pub const SQLITE_IOERR_SHMOPEN: i32 = 4618; +pub const SQLITE_IOERR_SHMSIZE: i32 = 4874; +pub const SQLITE_IOERR_SHMLOCK: i32 = 5130; +pub const SQLITE_IOERR_SHMMAP: i32 = 5386; +pub const SQLITE_IOERR_SEEK: i32 = 5642; +pub const SQLITE_IOERR_DELETE_NOENT: i32 = 5898; +pub const SQLITE_IOERR_MMAP: i32 = 6154; +pub const SQLITE_IOERR_GETTEMPPATH: i32 = 6410; +pub const SQLITE_IOERR_CONVPATH: i32 = 6666; +pub const SQLITE_IOERR_VNODE: i32 = 6922; +pub const SQLITE_IOERR_AUTH: i32 = 7178; +pub const SQLITE_IOERR_BEGIN_ATOMIC: i32 = 7434; +pub const SQLITE_IOERR_COMMIT_ATOMIC: i32 = 7690; +pub const SQLITE_IOERR_ROLLBACK_ATOMIC: i32 = 7946; +pub const SQLITE_IOERR_DATA: i32 = 8202; +pub const SQLITE_IOERR_CORRUPTFS: i32 = 8458; +pub const SQLITE_IOERR_IN_PAGE: i32 = 8714; +pub const SQLITE_IOERR_BADKEY: i32 = 8970; +pub const SQLITE_IOERR_CODEC: i32 = 9226; +pub const SQLITE_LOCKED_SHAREDCACHE: i32 = 262; +pub const SQLITE_LOCKED_VTAB: i32 = 518; +pub const SQLITE_BUSY_RECOVERY: i32 = 261; +pub const SQLITE_BUSY_SNAPSHOT: i32 = 517; +pub const SQLITE_BUSY_TIMEOUT: i32 = 773; +pub const SQLITE_CANTOPEN_NOTEMPDIR: i32 = 270; +pub const SQLITE_CANTOPEN_ISDIR: i32 = 526; +pub const SQLITE_CANTOPEN_FULLPATH: i32 = 782; +pub const SQLITE_CANTOPEN_CONVPATH: i32 = 1038; +pub const SQLITE_CANTOPEN_DIRTYWAL: i32 = 1294; +pub const SQLITE_CANTOPEN_SYMLINK: i32 = 1550; +pub const SQLITE_CORRUPT_VTAB: i32 = 267; +pub const SQLITE_CORRUPT_SEQUENCE: i32 = 523; +pub const SQLITE_CORRUPT_INDEX: i32 = 779; +pub const SQLITE_READONLY_RECOVERY: i32 = 264; +pub const SQLITE_READONLY_CANTLOCK: i32 = 520; +pub const SQLITE_READONLY_ROLLBACK: i32 = 776; +pub const SQLITE_READONLY_DBMOVED: i32 = 1032; +pub const SQLITE_READONLY_CANTINIT: i32 = 1288; +pub const SQLITE_READONLY_DIRECTORY: i32 = 1544; +pub const SQLITE_ABORT_ROLLBACK: i32 = 516; +pub const SQLITE_CONSTRAINT_CHECK: i32 = 275; +pub const SQLITE_CONSTRAINT_COMMITHOOK: i32 = 531; +pub const SQLITE_CONSTRAINT_FOREIGNKEY: i32 = 787; +pub const SQLITE_CONSTRAINT_FUNCTION: i32 = 1043; +pub const SQLITE_CONSTRAINT_NOTNULL: i32 = 1299; +pub const SQLITE_CONSTRAINT_PRIMARYKEY: i32 = 1555; +pub const SQLITE_CONSTRAINT_TRIGGER: i32 = 1811; +pub const SQLITE_CONSTRAINT_UNIQUE: i32 = 2067; +pub const SQLITE_CONSTRAINT_VTAB: i32 = 2323; +pub const SQLITE_CONSTRAINT_ROWID: i32 = 2579; +pub const SQLITE_CONSTRAINT_PINNED: i32 = 2835; +pub const SQLITE_CONSTRAINT_DATATYPE: i32 = 3091; +pub const SQLITE_NOTICE_RECOVER_WAL: i32 = 283; +pub const SQLITE_NOTICE_RECOVER_ROLLBACK: i32 = 539; +pub const SQLITE_NOTICE_RBU: i32 = 795; +pub const SQLITE_WARNING_AUTOINDEX: i32 = 284; +pub const SQLITE_AUTH_USER: i32 = 279; +pub const SQLITE_OK_LOAD_PERMANENTLY: i32 = 256; +pub const SQLITE_OK_SYMLINK: i32 = 512; +pub const SQLITE_OPEN_READONLY: i32 = 1; pub const SQLITE_OPEN_READWRITE: i32 = 2; pub const SQLITE_OPEN_CREATE: i32 = 4; -pub const SQLITE_NOTFOUND: i32 = 12; +pub const SQLITE_OPEN_DELETEONCLOSE: i32 = 8; +pub const SQLITE_OPEN_EXCLUSIVE: i32 = 16; +pub const SQLITE_OPEN_AUTOPROXY: i32 = 32; +pub const SQLITE_OPEN_URI: i32 = 64; +pub const SQLITE_OPEN_MEMORY: i32 = 128; +pub const SQLITE_OPEN_MAIN_DB: i32 = 256; +pub const SQLITE_OPEN_TEMP_DB: i32 = 512; +pub const SQLITE_OPEN_TRANSIENT_DB: i32 = 1024; +pub const SQLITE_OPEN_MAIN_JOURNAL: i32 = 2048; +pub const SQLITE_OPEN_TEMP_JOURNAL: i32 = 4096; +pub const SQLITE_OPEN_SUBJOURNAL: i32 = 8192; +pub const SQLITE_OPEN_SUPER_JOURNAL: i32 = 16384; +pub const SQLITE_OPEN_NOMUTEX: i32 = 32768; +pub const SQLITE_OPEN_FULLMUTEX: i32 = 65536; +pub const SQLITE_OPEN_SHAREDCACHE: i32 = 131072; +pub const SQLITE_OPEN_PRIVATECACHE: i32 = 262144; +pub const SQLITE_OPEN_WAL: i32 = 524288; +pub const SQLITE_OPEN_NOFOLLOW: i32 = 16777216; +pub const SQLITE_OPEN_EXRESCODE: i32 = 33554432; +pub const SQLITE_OPEN_MASTER_JOURNAL: i32 = 16384; +pub const SQLITE_IOCAP_ATOMIC: i32 = 1; +pub const SQLITE_IOCAP_ATOMIC512: i32 = 2; +pub const SQLITE_IOCAP_ATOMIC1K: i32 = 4; +pub const SQLITE_IOCAP_ATOMIC2K: i32 = 8; +pub const SQLITE_IOCAP_ATOMIC4K: i32 = 16; +pub const SQLITE_IOCAP_ATOMIC8K: i32 = 32; +pub const SQLITE_IOCAP_ATOMIC16K: i32 = 64; +pub const SQLITE_IOCAP_ATOMIC32K: i32 = 128; +pub const SQLITE_IOCAP_ATOMIC64K: i32 = 256; +pub const SQLITE_IOCAP_SAFE_APPEND: i32 = 512; +pub const SQLITE_IOCAP_SEQUENTIAL: i32 = 1024; +pub const SQLITE_IOCAP_UNDELETABLE_WHEN_OPEN: i32 = 2048; +pub const SQLITE_IOCAP_POWERSAFE_OVERWRITE: i32 = 4096; +pub const SQLITE_IOCAP_IMMUTABLE: i32 = 8192; +pub const SQLITE_IOCAP_BATCH_ATOMIC: i32 = 16384; +pub const SQLITE_IOCAP_SUBPAGE_READ: i32 = 32768; +pub const SQLITE_LOCK_NONE: i32 = 0; +pub const SQLITE_LOCK_SHARED: i32 = 1; +pub const SQLITE_LOCK_RESERVED: i32 = 2; +pub const SQLITE_LOCK_PENDING: i32 = 3; +pub const SQLITE_LOCK_EXCLUSIVE: i32 = 4; +pub const SQLITE_SYNC_NORMAL: i32 = 2; +pub const SQLITE_SYNC_FULL: i32 = 3; +pub const SQLITE_SYNC_DATAONLY: i32 = 16; +pub const SQLITE_FCNTL_LOCKSTATE: i32 = 1; +pub const SQLITE_FCNTL_GET_LOCKPROXYFILE: i32 = 2; +pub const SQLITE_FCNTL_SET_LOCKPROXYFILE: i32 = 3; +pub const SQLITE_FCNTL_LAST_ERRNO: i32 = 4; +pub const SQLITE_FCNTL_SIZE_HINT: i32 = 5; +pub const SQLITE_FCNTL_CHUNK_SIZE: i32 = 6; +pub const SQLITE_FCNTL_FILE_POINTER: i32 = 7; +pub const SQLITE_FCNTL_SYNC_OMITTED: i32 = 8; +pub const SQLITE_FCNTL_WIN32_AV_RETRY: i32 = 9; +pub const SQLITE_FCNTL_PERSIST_WAL: i32 = 10; +pub const SQLITE_FCNTL_OVERWRITE: i32 = 11; +pub const SQLITE_FCNTL_VFSNAME: i32 = 12; +pub const SQLITE_FCNTL_POWERSAFE_OVERWRITE: i32 = 13; +pub const SQLITE_FCNTL_PRAGMA: i32 = 14; +pub const SQLITE_FCNTL_BUSYHANDLER: i32 = 15; +pub const SQLITE_FCNTL_TEMPFILENAME: i32 = 16; +pub const SQLITE_FCNTL_MMAP_SIZE: i32 = 18; +pub const SQLITE_FCNTL_TRACE: i32 = 19; +pub const SQLITE_FCNTL_HAS_MOVED: i32 = 20; +pub const SQLITE_FCNTL_SYNC: i32 = 21; +pub const SQLITE_FCNTL_COMMIT_PHASETWO: i32 = 22; +pub const SQLITE_FCNTL_WIN32_SET_HANDLE: i32 = 23; +pub const SQLITE_FCNTL_WAL_BLOCK: i32 = 24; +pub const SQLITE_FCNTL_ZIPVFS: i32 = 25; +pub const SQLITE_FCNTL_RBU: i32 = 26; +pub const SQLITE_FCNTL_VFS_POINTER: i32 = 27; +pub const SQLITE_FCNTL_JOURNAL_POINTER: i32 = 28; +pub const SQLITE_FCNTL_WIN32_GET_HANDLE: i32 = 29; +pub const SQLITE_FCNTL_PDB: i32 = 30; +pub const SQLITE_FCNTL_BEGIN_ATOMIC_WRITE: i32 = 31; +pub const SQLITE_FCNTL_COMMIT_ATOMIC_WRITE: i32 = 32; +pub const SQLITE_FCNTL_ROLLBACK_ATOMIC_WRITE: i32 = 33; +pub const SQLITE_FCNTL_LOCK_TIMEOUT: i32 = 34; +pub const SQLITE_FCNTL_DATA_VERSION: i32 = 35; +pub const SQLITE_FCNTL_SIZE_LIMIT: i32 = 36; +pub const SQLITE_FCNTL_CKPT_DONE: i32 = 37; +pub const SQLITE_FCNTL_RESERVE_BYTES: i32 = 38; +pub const SQLITE_FCNTL_CKPT_START: i32 = 39; +pub const SQLITE_FCNTL_EXTERNAL_READER: i32 = 40; +pub const SQLITE_FCNTL_CKSM_FILE: i32 = 41; +pub const SQLITE_FCNTL_RESET_CACHE: i32 = 42; +pub const SQLITE_FCNTL_NULL_IO: i32 = 43; +pub const SQLITE_FCNTL_BLOCK_ON_CONNECT: i32 = 44; +pub const SQLITE_FCNTL_FILESTAT: i32 = 45; +pub const SQLITE_GET_LOCKPROXYFILE: i32 = 2; +pub const SQLITE_SET_LOCKPROXYFILE: i32 = 3; +pub const SQLITE_LAST_ERRNO: i32 = 4; +pub const SQLITE_ACCESS_EXISTS: i32 = 0; +pub const SQLITE_ACCESS_READWRITE: i32 = 1; +pub const SQLITE_ACCESS_READ: i32 = 2; +pub const SQLITE_SHM_UNLOCK: i32 = 1; +pub const SQLITE_SHM_LOCK: i32 = 2; +pub const SQLITE_SHM_SHARED: i32 = 4; +pub const SQLITE_SHM_EXCLUSIVE: i32 = 8; +pub const SQLITE_SHM_NLOCK: i32 = 8; +pub const SQLITE_CONFIG_SINGLETHREAD: i32 = 1; +pub const SQLITE_CONFIG_MULTITHREAD: i32 = 2; +pub const SQLITE_CONFIG_SERIALIZED: i32 = 3; +pub const SQLITE_CONFIG_MALLOC: i32 = 4; +pub const SQLITE_CONFIG_GETMALLOC: i32 = 5; +pub const SQLITE_CONFIG_SCRATCH: i32 = 6; +pub const SQLITE_CONFIG_PAGECACHE: i32 = 7; +pub const SQLITE_CONFIG_HEAP: i32 = 8; +pub const SQLITE_CONFIG_MEMSTATUS: i32 = 9; +pub const SQLITE_CONFIG_MUTEX: i32 = 10; +pub const SQLITE_CONFIG_GETMUTEX: i32 = 11; +pub const SQLITE_CONFIG_LOOKASIDE: i32 = 13; +pub const SQLITE_CONFIG_PCACHE: i32 = 14; +pub const SQLITE_CONFIG_GETPCACHE: i32 = 15; +pub const SQLITE_CONFIG_LOG: i32 = 16; +pub const SQLITE_CONFIG_URI: i32 = 17; +pub const SQLITE_CONFIG_PCACHE2: i32 = 18; +pub const SQLITE_CONFIG_GETPCACHE2: i32 = 19; +pub const SQLITE_CONFIG_COVERING_INDEX_SCAN: i32 = 20; +pub const SQLITE_CONFIG_SQLLOG: i32 = 21; +pub const SQLITE_CONFIG_MMAP_SIZE: i32 = 22; +pub const SQLITE_CONFIG_WIN32_HEAPSIZE: i32 = 23; +pub const SQLITE_CONFIG_PCACHE_HDRSZ: i32 = 24; +pub const SQLITE_CONFIG_PMASZ: i32 = 25; +pub const SQLITE_CONFIG_STMTJRNL_SPILL: i32 = 26; +pub const SQLITE_CONFIG_SMALL_MALLOC: i32 = 27; +pub const SQLITE_CONFIG_SORTERREF_SIZE: i32 = 28; +pub const SQLITE_CONFIG_MEMDB_MAXSIZE: i32 = 29; +pub const SQLITE_CONFIG_ROWID_IN_VIEW: i32 = 30; +pub const SQLITE_DBCONFIG_MAINDBNAME: i32 = 1000; +pub const SQLITE_DBCONFIG_LOOKASIDE: i32 = 1001; +pub const SQLITE_DBCONFIG_ENABLE_FKEY: i32 = 1002; +pub const SQLITE_DBCONFIG_ENABLE_TRIGGER: i32 = 1003; +pub const SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER: i32 = 1004; +pub const SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION: i32 = 1005; +pub const SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE: i32 = 1006; +pub const SQLITE_DBCONFIG_ENABLE_QPSG: i32 = 1007; +pub const SQLITE_DBCONFIG_TRIGGER_EQP: i32 = 1008; +pub const SQLITE_DBCONFIG_RESET_DATABASE: i32 = 1009; +pub const SQLITE_DBCONFIG_DEFENSIVE: i32 = 1010; +pub const SQLITE_DBCONFIG_WRITABLE_SCHEMA: i32 = 1011; +pub const SQLITE_DBCONFIG_LEGACY_ALTER_TABLE: i32 = 1012; +pub const SQLITE_DBCONFIG_DQS_DML: i32 = 1013; +pub const SQLITE_DBCONFIG_DQS_DDL: i32 = 1014; +pub const SQLITE_DBCONFIG_ENABLE_VIEW: i32 = 1015; +pub const SQLITE_DBCONFIG_LEGACY_FILE_FORMAT: i32 = 1016; +pub const SQLITE_DBCONFIG_TRUSTED_SCHEMA: i32 = 1017; +pub const SQLITE_DBCONFIG_STMT_SCANSTATUS: i32 = 1018; +pub const SQLITE_DBCONFIG_REVERSE_SCANORDER: i32 = 1019; +pub const SQLITE_DBCONFIG_ENABLE_ATTACH_CREATE: i32 = 1020; +pub const SQLITE_DBCONFIG_ENABLE_ATTACH_WRITE: i32 = 1021; +pub const SQLITE_DBCONFIG_ENABLE_COMMENTS: i32 = 1022; +pub const SQLITE_DBCONFIG_MAX: i32 = 1022; +pub const SQLITE_SETLK_BLOCK_ON_CONNECT: i32 = 1; +pub const SQLITE_DENY: i32 = 1; +pub const SQLITE_IGNORE: i32 = 2; +pub const SQLITE_CREATE_INDEX: i32 = 1; +pub const SQLITE_CREATE_TABLE: i32 = 2; +pub const SQLITE_CREATE_TEMP_INDEX: i32 = 3; +pub const SQLITE_CREATE_TEMP_TABLE: i32 = 4; +pub const SQLITE_CREATE_TEMP_TRIGGER: i32 = 5; +pub const SQLITE_CREATE_TEMP_VIEW: i32 = 6; +pub const SQLITE_CREATE_TRIGGER: i32 = 7; +pub const SQLITE_CREATE_VIEW: i32 = 8; +pub const SQLITE_DELETE: i32 = 9; +pub const SQLITE_DROP_INDEX: i32 = 10; +pub const SQLITE_DROP_TABLE: i32 = 11; +pub const SQLITE_DROP_TEMP_INDEX: i32 = 12; +pub const SQLITE_DROP_TEMP_TABLE: i32 = 13; +pub const SQLITE_DROP_TEMP_TRIGGER: i32 = 14; +pub const SQLITE_DROP_TEMP_VIEW: i32 = 15; +pub const SQLITE_DROP_TRIGGER: i32 = 16; +pub const SQLITE_DROP_VIEW: i32 = 17; +pub const SQLITE_INSERT: i32 = 18; +pub const SQLITE_PRAGMA: i32 = 19; +pub const SQLITE_READ: i32 = 20; +pub const SQLITE_SELECT: i32 = 21; +pub const SQLITE_TRANSACTION: i32 = 22; +pub const SQLITE_UPDATE: i32 = 23; +pub const SQLITE_ATTACH: i32 = 24; +pub const SQLITE_DETACH: i32 = 25; +pub const SQLITE_ALTER_TABLE: i32 = 26; +pub const SQLITE_REINDEX: i32 = 27; +pub const SQLITE_ANALYZE: i32 = 28; +pub const SQLITE_CREATE_VTABLE: i32 = 29; +pub const SQLITE_DROP_VTABLE: i32 = 30; +pub const SQLITE_FUNCTION: i32 = 31; +pub const SQLITE_SAVEPOINT: i32 = 32; +pub const SQLITE_COPY: i32 = 0; +pub const SQLITE_RECURSIVE: i32 = 33; +pub const SQLITE_TRACE_STMT: ::core::ffi::c_uint = 1; +pub const SQLITE_TRACE_PROFILE: ::core::ffi::c_uint = 2; +pub const SQLITE_TRACE_ROW: ::core::ffi::c_uint = 4; +pub const SQLITE_TRACE_CLOSE: ::core::ffi::c_uint = 8; +pub const SQLITE_LIMIT_LENGTH: i32 = 0; +pub const SQLITE_LIMIT_SQL_LENGTH: i32 = 1; +pub const SQLITE_LIMIT_COLUMN: i32 = 2; +pub const SQLITE_LIMIT_EXPR_DEPTH: i32 = 3; +pub const SQLITE_LIMIT_COMPOUND_SELECT: i32 = 4; +pub const SQLITE_LIMIT_VDBE_OP: i32 = 5; +pub const SQLITE_LIMIT_FUNCTION_ARG: i32 = 6; +pub const SQLITE_LIMIT_ATTACHED: i32 = 7; +pub const SQLITE_LIMIT_LIKE_PATTERN_LENGTH: i32 = 8; +pub const SQLITE_LIMIT_VARIABLE_NUMBER: i32 = 9; +pub const SQLITE_LIMIT_TRIGGER_DEPTH: i32 = 10; +pub const SQLITE_LIMIT_WORKER_THREADS: i32 = 11; +pub const SQLITE_PREPARE_PERSISTENT: ::core::ffi::c_uint = 1; +pub const SQLITE_PREPARE_NORMALIZE: ::core::ffi::c_uint = 2; +pub const SQLITE_PREPARE_NO_VTAB: ::core::ffi::c_uint = 4; +pub const SQLITE_PREPARE_DONT_LOG: ::core::ffi::c_uint = 16; +pub const SQLITE_INTEGER: i32 = 1; +pub const SQLITE_FLOAT: i32 = 2; +pub const SQLITE_BLOB: i32 = 4; +pub const SQLITE_NULL: i32 = 5; +pub const SQLITE_TEXT: i32 = 3; +pub const SQLITE3_TEXT: i32 = 3; +pub const SQLITE_UTF8: i32 = 1; +pub const SQLITE_UTF16LE: i32 = 2; +pub const SQLITE_UTF16BE: i32 = 3; +pub const SQLITE_UTF16: i32 = 4; +pub const SQLITE_ANY: i32 = 5; +pub const SQLITE_UTF16_ALIGNED: i32 = 8; +pub const SQLITE_DETERMINISTIC: i32 = 2048; +pub const SQLITE_DIRECTONLY: i32 = 524288; +pub const SQLITE_SUBTYPE: i32 = 1048576; +pub const SQLITE_INNOCUOUS: i32 = 2097152; +pub const SQLITE_RESULT_SUBTYPE: i32 = 16777216; +pub const SQLITE_SELFORDER1: i32 = 33554432; +pub const SQLITE_WIN32_DATA_DIRECTORY_TYPE: i32 = 1; +pub const SQLITE_WIN32_TEMP_DIRECTORY_TYPE: i32 = 2; +pub const SQLITE_TXN_NONE: i32 = 0; +pub const SQLITE_TXN_READ: i32 = 1; +pub const SQLITE_TXN_WRITE: i32 = 2; +pub const SQLITE_INDEX_SCAN_UNIQUE: i32 = 1; +pub const SQLITE_INDEX_SCAN_HEX: i32 = 2; +pub const SQLITE_INDEX_CONSTRAINT_EQ: i32 = 2; +pub const SQLITE_INDEX_CONSTRAINT_GT: i32 = 4; +pub const SQLITE_INDEX_CONSTRAINT_LE: i32 = 8; +pub const SQLITE_INDEX_CONSTRAINT_LT: i32 = 16; +pub const SQLITE_INDEX_CONSTRAINT_GE: i32 = 32; +pub const SQLITE_INDEX_CONSTRAINT_MATCH: i32 = 64; +pub const SQLITE_INDEX_CONSTRAINT_LIKE: i32 = 65; +pub const SQLITE_INDEX_CONSTRAINT_GLOB: i32 = 66; +pub const SQLITE_INDEX_CONSTRAINT_REGEXP: i32 = 67; +pub const SQLITE_INDEX_CONSTRAINT_NE: i32 = 68; +pub const SQLITE_INDEX_CONSTRAINT_ISNOT: i32 = 69; +pub const SQLITE_INDEX_CONSTRAINT_ISNOTNULL: i32 = 70; +pub const SQLITE_INDEX_CONSTRAINT_ISNULL: i32 = 71; +pub const SQLITE_INDEX_CONSTRAINT_IS: i32 = 72; +pub const SQLITE_INDEX_CONSTRAINT_LIMIT: i32 = 73; +pub const SQLITE_INDEX_CONSTRAINT_OFFSET: i32 = 74; +pub const SQLITE_INDEX_CONSTRAINT_FUNCTION: i32 = 150; +pub const SQLITE_MUTEX_FAST: i32 = 0; +pub const SQLITE_MUTEX_RECURSIVE: i32 = 1; +pub const SQLITE_MUTEX_STATIC_MAIN: i32 = 2; +pub const SQLITE_MUTEX_STATIC_MEM: i32 = 3; +pub const SQLITE_MUTEX_STATIC_MEM2: i32 = 4; +pub const SQLITE_MUTEX_STATIC_OPEN: i32 = 4; +pub const SQLITE_MUTEX_STATIC_PRNG: i32 = 5; +pub const SQLITE_MUTEX_STATIC_LRU: i32 = 6; +pub const SQLITE_MUTEX_STATIC_LRU2: i32 = 7; +pub const SQLITE_MUTEX_STATIC_PMEM: i32 = 7; +pub const SQLITE_MUTEX_STATIC_APP1: i32 = 8; +pub const SQLITE_MUTEX_STATIC_APP2: i32 = 9; +pub const SQLITE_MUTEX_STATIC_APP3: i32 = 10; +pub const SQLITE_MUTEX_STATIC_VFS1: i32 = 11; +pub const SQLITE_MUTEX_STATIC_VFS2: i32 = 12; +pub const SQLITE_MUTEX_STATIC_VFS3: i32 = 13; +pub const SQLITE_MUTEX_STATIC_MASTER: i32 = 2; +pub const SQLITE_TESTCTRL_FIRST: i32 = 5; +pub const SQLITE_TESTCTRL_PRNG_SAVE: i32 = 5; +pub const SQLITE_TESTCTRL_PRNG_RESTORE: i32 = 6; +pub const SQLITE_TESTCTRL_PRNG_RESET: i32 = 7; +pub const SQLITE_TESTCTRL_FK_NO_ACTION: i32 = 7; +pub const SQLITE_TESTCTRL_BITVEC_TEST: i32 = 8; +pub const SQLITE_TESTCTRL_FAULT_INSTALL: i32 = 9; +pub const SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS: i32 = 10; +pub const SQLITE_TESTCTRL_PENDING_BYTE: i32 = 11; +pub const SQLITE_TESTCTRL_ASSERT: i32 = 12; +pub const SQLITE_TESTCTRL_ALWAYS: i32 = 13; +pub const SQLITE_TESTCTRL_RESERVE: i32 = 14; +pub const SQLITE_TESTCTRL_JSON_SELFCHECK: i32 = 14; +pub const SQLITE_TESTCTRL_OPTIMIZATIONS: i32 = 15; +pub const SQLITE_TESTCTRL_ISKEYWORD: i32 = 16; +pub const SQLITE_TESTCTRL_GETOPT: i32 = 16; +pub const SQLITE_TESTCTRL_SCRATCHMALLOC: i32 = 17; +pub const SQLITE_TESTCTRL_INTERNAL_FUNCTIONS: i32 = 17; +pub const SQLITE_TESTCTRL_LOCALTIME_FAULT: i32 = 18; +pub const SQLITE_TESTCTRL_EXPLAIN_STMT: i32 = 19; +pub const SQLITE_TESTCTRL_ONCE_RESET_THRESHOLD: i32 = 19; +pub const SQLITE_TESTCTRL_NEVER_CORRUPT: i32 = 20; +pub const SQLITE_TESTCTRL_VDBE_COVERAGE: i32 = 21; +pub const SQLITE_TESTCTRL_BYTEORDER: i32 = 22; +pub const SQLITE_TESTCTRL_ISINIT: i32 = 23; +pub const SQLITE_TESTCTRL_SORTER_MMAP: i32 = 24; +pub const SQLITE_TESTCTRL_IMPOSTER: i32 = 25; +pub const SQLITE_TESTCTRL_PARSER_COVERAGE: i32 = 26; +pub const SQLITE_TESTCTRL_RESULT_INTREAL: i32 = 27; +pub const SQLITE_TESTCTRL_PRNG_SEED: i32 = 28; +pub const SQLITE_TESTCTRL_EXTRA_SCHEMA_CHECKS: i32 = 29; +pub const SQLITE_TESTCTRL_SEEK_COUNT: i32 = 30; +pub const SQLITE_TESTCTRL_TRACEFLAGS: i32 = 31; +pub const SQLITE_TESTCTRL_TUNE: i32 = 32; +pub const SQLITE_TESTCTRL_LOGEST: i32 = 33; +pub const SQLITE_TESTCTRL_USELONGDOUBLE: i32 = 34; +pub const SQLITE_TESTCTRL_LAST: i32 = 34; +pub const SQLITE_STATUS_MEMORY_USED: i32 = 0; +pub const SQLITE_STATUS_PAGECACHE_USED: i32 = 1; +pub const SQLITE_STATUS_PAGECACHE_OVERFLOW: i32 = 2; +pub const SQLITE_STATUS_SCRATCH_USED: i32 = 3; +pub const SQLITE_STATUS_SCRATCH_OVERFLOW: i32 = 4; +pub const SQLITE_STATUS_MALLOC_SIZE: i32 = 5; +pub const SQLITE_STATUS_PARSER_STACK: i32 = 6; +pub const SQLITE_STATUS_PAGECACHE_SIZE: i32 = 7; +pub const SQLITE_STATUS_SCRATCH_SIZE: i32 = 8; +pub const SQLITE_STATUS_MALLOC_COUNT: i32 = 9; +pub const SQLITE_DBSTATUS_LOOKASIDE_USED: i32 = 0; +pub const SQLITE_DBSTATUS_CACHE_USED: i32 = 1; +pub const SQLITE_DBSTATUS_SCHEMA_USED: i32 = 2; +pub const SQLITE_DBSTATUS_STMT_USED: i32 = 3; +pub const SQLITE_DBSTATUS_LOOKASIDE_HIT: i32 = 4; +pub const SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE: i32 = 5; +pub const SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL: i32 = 6; +pub const SQLITE_DBSTATUS_CACHE_HIT: i32 = 7; +pub const SQLITE_DBSTATUS_CACHE_MISS: i32 = 8; +pub const SQLITE_DBSTATUS_CACHE_WRITE: i32 = 9; +pub const SQLITE_DBSTATUS_DEFERRED_FKS: i32 = 10; +pub const SQLITE_DBSTATUS_CACHE_USED_SHARED: i32 = 11; +pub const SQLITE_DBSTATUS_CACHE_SPILL: i32 = 12; +pub const SQLITE_DBSTATUS_TEMPBUF_SPILL: i32 = 13; +pub const SQLITE_DBSTATUS_MAX: i32 = 13; +pub const SQLITE_STMTSTATUS_FULLSCAN_STEP: i32 = 1; +pub const SQLITE_STMTSTATUS_SORT: i32 = 2; +pub const SQLITE_STMTSTATUS_AUTOINDEX: i32 = 3; +pub const SQLITE_STMTSTATUS_VM_STEP: i32 = 4; +pub const SQLITE_STMTSTATUS_REPREPARE: i32 = 5; +pub const SQLITE_STMTSTATUS_RUN: i32 = 6; +pub const SQLITE_STMTSTATUS_FILTER_MISS: i32 = 7; +pub const SQLITE_STMTSTATUS_FILTER_HIT: i32 = 8; +pub const SQLITE_STMTSTATUS_MEMUSED: i32 = 99; +pub const SQLITE_CHECKPOINT_NOOP: i32 = -1; +pub const SQLITE_CHECKPOINT_PASSIVE: i32 = 0; +pub const SQLITE_CHECKPOINT_FULL: i32 = 1; +pub const SQLITE_CHECKPOINT_RESTART: i32 = 2; +pub const SQLITE_CHECKPOINT_TRUNCATE: i32 = 3; +pub const SQLITE_VTAB_CONSTRAINT_SUPPORT: i32 = 1; +pub const SQLITE_VTAB_INNOCUOUS: i32 = 2; +pub const SQLITE_VTAB_DIRECTONLY: i32 = 3; +pub const SQLITE_VTAB_USES_ALL_SCHEMAS: i32 = 4; +pub const SQLITE_ROLLBACK: i32 = 1; +pub const SQLITE_FAIL: i32 = 3; +pub const SQLITE_REPLACE: i32 = 5; +pub const SQLITE_SCANSTAT_NLOOP: i32 = 0; +pub const SQLITE_SCANSTAT_NVISIT: i32 = 1; +pub const SQLITE_SCANSTAT_EST: i32 = 2; +pub const SQLITE_SCANSTAT_NAME: i32 = 3; +pub const SQLITE_SCANSTAT_EXPLAIN: i32 = 4; +pub const SQLITE_SCANSTAT_SELECTID: i32 = 5; +pub const SQLITE_SCANSTAT_PARENTID: i32 = 6; +pub const SQLITE_SCANSTAT_NCYCLE: i32 = 7; +pub const SQLITE_SCANSTAT_COMPLEX: i32 = 1; +pub const SQLITE_SERIALIZE_NOCOPY: ::core::ffi::c_uint = 1; +pub const SQLITE_DESERIALIZE_FREEONCLOSE: ::core::ffi::c_uint = 1; +pub const SQLITE_DESERIALIZE_RESIZEABLE: ::core::ffi::c_uint = 2; +pub const SQLITE_DESERIALIZE_READONLY: ::core::ffi::c_uint = 4; +pub const SQLITE_CARRAY_INT32: i32 = 0; +pub const SQLITE_CARRAY_INT64: i32 = 1; +pub const SQLITE_CARRAY_DOUBLE: i32 = 2; +pub const SQLITE_CARRAY_TEXT: i32 = 3; +pub const SQLITE_CARRAY_BLOB: i32 = 4; +pub const CARRAY_INT32: i32 = 0; +pub const CARRAY_INT64: i32 = 1; +pub const CARRAY_DOUBLE: i32 = 2; +pub const CARRAY_TEXT: i32 = 3; +pub const CARRAY_BLOB: i32 = 4; +pub const NOT_WITHIN: i32 = 0; +pub const PARTLY_WITHIN: i32 = 1; +pub const FULLY_WITHIN: i32 = 2; +pub const SQLITE_SESSION_OBJCONFIG_SIZE: i32 = 1; +pub const SQLITE_SESSION_OBJCONFIG_ROWID: i32 = 2; +pub const SQLITE_CHANGESETSTART_INVERT: i32 = 2; +pub const SQLITE_CHANGESETAPPLY_NOSAVEPOINT: i32 = 1; +pub const SQLITE_CHANGESETAPPLY_INVERT: i32 = 2; +pub const SQLITE_CHANGESETAPPLY_IGNORENOOP: i32 = 4; +pub const SQLITE_CHANGESETAPPLY_FKNOACTION: i32 = 8; +pub const SQLITE_CHANGESET_DATA: i32 = 1; +pub const SQLITE_CHANGESET_NOTFOUND: i32 = 2; +pub const SQLITE_CHANGESET_CONFLICT: i32 = 3; +pub const SQLITE_CHANGESET_CONSTRAINT: i32 = 4; +pub const SQLITE_CHANGESET_FOREIGN_KEY: i32 = 5; +pub const SQLITE_CHANGESET_OMIT: i32 = 0; +pub const SQLITE_CHANGESET_REPLACE: i32 = 1; +pub const SQLITE_CHANGESET_ABORT: i32 = 2; +pub const SQLITE_SESSION_CONFIG_STRMSIZE: i32 = 1; +pub const FTS5_TOKENIZE_QUERY: i32 = 1; +pub const FTS5_TOKENIZE_PREFIX: i32 = 2; +pub const FTS5_TOKENIZE_DOCUMENT: i32 = 4; +pub const FTS5_TOKENIZE_AUX: i32 = 8; +pub const FTS5_TOKEN_COLOCATED: i32 = 1; #[repr(C)] #[derive(Debug, Copy, Clone)] diff --git a/crates/sqlite-wasm-vfs/Cargo.toml b/crates/sqlite-wasm-vfs/Cargo.toml index 46ecfd6..4072b7f 100644 --- a/crates/sqlite-wasm-vfs/Cargo.toml +++ b/crates/sqlite-wasm-vfs/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sqlite-wasm-vfs" -version = "0.1.1" +version = "0.2.0" edition = "2021" authors = ["Spxg "] readme = "README.md" @@ -11,7 +11,7 @@ categories = ["development-tools::ffi", "wasm", "database"] keywords = ["sqlite", "sqlite-wasm", "wasm", "webassembly", "javascript"] [dependencies] -sqlite-wasm-rs = { version = "0.5.1", default-features = false } +rsqlite-vfs = "0.1" wasm-bindgen = "0.2.104" js-sys = "0.3.81" @@ -33,6 +33,7 @@ indexed_db_futures = "0.6.4" [dev-dependencies] wasm-bindgen-test = "0.3.54" +sqlite-wasm-rs = { version = "0.5.1", default-features = false } [package.metadata.docs.rs] targets = ["wasm32-unknown-unknown"] diff --git a/crates/sqlite-wasm-vfs/src/relaxed_idb.rs b/crates/sqlite-wasm-vfs/src/relaxed_idb.rs index 5655654..3f3f50f 100644 --- a/crates/sqlite-wasm-vfs/src/relaxed_idb.rs +++ b/crates/sqlite-wasm-vfs/src/relaxed_idb.rs @@ -9,7 +9,7 @@ //! //! async fn open_db() { //! // install relaxed-idb persistent vfs and set as default vfs -//! install_idb_vfs(&RelaxedIdbCfg::default(), true) +//! install_idb_vfs::(&RelaxedIdbCfg::default(), true) //! .await //! .unwrap(); //! @@ -44,19 +44,18 @@ //! It is particularly important to note that using it on multiple pages may cause DB corruption. //! It is recommended to use it in SharedWorker. -use sqlite_wasm_rs::{ - utils::{ - bail, check_db_and_page_size, check_import_db, check_option, check_result, register_vfs, - registered_vfs, sqlite3_file, sqlite3_vfs, ImportDbError, MemChunksFile, OsCallback, - RegisterVfsError, SQLiteIoMethods, SQLiteVfs, SQLiteVfsFile, VfsAppData, VfsError, VfsFile, - VfsResult, VfsStore, +use rsqlite_vfs::{ + bail, check_db_and_page_size, check_import_db, check_option, check_result, + ffi::{ + sqlite3_file, sqlite3_vfs, SQLITE_ERROR, SQLITE_FCNTL_COMMIT_PHASETWO, SQLITE_FCNTL_PRAGMA, + SQLITE_FCNTL_SYNC, SQLITE_IOERR, SQLITE_IOERR_DELETE, SQLITE_NOTFOUND, SQLITE_OK, + SQLITE_OPEN_MAIN_DB, }, - WasmOsCallback, SQLITE_ERROR, SQLITE_FCNTL_COMMIT_PHASETWO, SQLITE_FCNTL_PRAGMA, - SQLITE_FCNTL_SYNC, SQLITE_IOERR, SQLITE_IOERR_DELETE, SQLITE_NOTFOUND, SQLITE_OK, - SQLITE_OPEN_MAIN_DB, + register_vfs, registered_vfs, ImportDbError, MemChunksFile, OsCallback, RegisterVfsError, + SQLiteIoMethods, SQLiteVfs, SQLiteVfsFile, VfsAppData, VfsError, VfsFile, VfsResult, VfsStore, }; -use std::cell::RefCell; use std::time::Duration; +use std::{cell::RefCell, marker::PhantomData}; use indexed_db_futures::database::Database; use indexed_db_futures::prelude::*; @@ -717,21 +716,24 @@ impl SQLiteIoMethods for RelaxedIdbIoMethods { } } -struct RelaxedIdbVfs; +struct RelaxedIdbVfs(PhantomData); -impl SQLiteVfs for RelaxedIdbVfs { +impl SQLiteVfs for RelaxedIdbVfs +where + C: OsCallback, +{ const VERSION: ::std::os::raw::c_int = 1; fn sleep(dur: Duration) { - WasmOsCallback::sleep(dur); + C::sleep(dur); } fn random(buf: &mut [u8]) { - WasmOsCallback::random(buf); + C::random(buf); } fn epoch_timestamp_in_ms() -> i64 { - WasmOsCallback::epoch_timestamp_in_ms() + C::epoch_timestamp_in_ms() } } @@ -907,7 +909,10 @@ impl RelaxedIdbUtil { /// /// If the vfs corresponding to `options.vfs_name` has been registered, /// only return a management tool without register. -pub async fn install(options: &RelaxedIdbCfg, default_vfs: bool) -> Result { +pub async fn install( + options: &RelaxedIdbCfg, + default_vfs: bool, +) -> Result { static REGISTER_GUARD: tokio::sync::Mutex<()> = tokio::sync::Mutex::const_new(()); let _guard = REGISTER_GUARD.lock().await; @@ -916,7 +921,7 @@ pub async fn install(options: &RelaxedIdbCfg, default_vfs: bool) -> Result( + let vfs = register_vfs::>( &options.vfs_name, pool, default_vfs, @@ -933,7 +938,7 @@ pub async fn install(options: &RelaxedIdbCfg, default_vfs: bool) -> Result(&OpfsSAHPoolCfg::default(), true) //! .await //! .unwrap(); //! @@ -32,20 +32,23 @@ //! [`opfs-explorer`](https://chromewebstore.google.com/detail/opfs-explorer/acndjpgkpaclldomagafnognkcgjignd) //! plugin to browse files. -use sqlite_wasm_rs::{ - utils::{ - check_import_db, register_vfs, registered_vfs, sqlite3_file, sqlite3_filename, sqlite3_vfs, - sqlite3_vfs_register, sqlite3_vfs_unregister, ImportDbError, OsCallback, RegisterVfsError, - SQLiteIoMethods, SQLiteVfs, SQLiteVfsFile, VfsAppData, VfsError, VfsFile, VfsResult, - VfsStore, +use rsqlite_vfs::{ + check_import_db, + ffi::{ + sqlite3_file, sqlite3_filename, sqlite3_vfs, sqlite3_vfs_register, sqlite3_vfs_unregister, + SQLITE_CANTOPEN, SQLITE_ERROR, SQLITE_IOCAP_UNDELETABLE_WHEN_OPEN, SQLITE_IOERR, + SQLITE_IOERR_DELETE, SQLITE_OK, SQLITE_OPEN_DELETEONCLOSE, SQLITE_OPEN_MAIN_DB, + SQLITE_OPEN_MAIN_JOURNAL, SQLITE_OPEN_SUPER_JOURNAL, SQLITE_OPEN_WAL, }, - WasmOsCallback, SQLITE_CANTOPEN, SQLITE_ERROR, SQLITE_IOCAP_UNDELETABLE_WHEN_OPEN, - SQLITE_IOERR, SQLITE_IOERR_DELETE, SQLITE_OK, SQLITE_OPEN_DELETEONCLOSE, SQLITE_OPEN_MAIN_DB, - SQLITE_OPEN_MAIN_JOURNAL, SQLITE_OPEN_SUPER_JOURNAL, SQLITE_OPEN_WAL, + register_vfs, registered_vfs, ImportDbError, OsCallback, RegisterVfsError, SQLiteIoMethods, + SQLiteVfs, SQLiteVfsFile, VfsAppData, VfsError, VfsFile, VfsResult, VfsStore, }; -use std::cell::{Cell, RefCell}; use std::collections::{HashMap, HashSet}; use std::time::Duration; +use std::{ + cell::{Cell, RefCell}, + marker::PhantomData, +}; use js_sys::{Array, DataView, IteratorNext, Reflect, Uint8Array}; use wasm_bindgen::{JsCast, JsValue}; @@ -97,10 +100,11 @@ struct OpfsSAHPool { open_files: RefCell>, /// A tuple holding the raw pointer to the `sqlite3_vfs` struct and whether it was registered as the default. vfs: Cell<(*mut sqlite3_vfs, bool)>, + random: fn(&mut [u8]), } impl OpfsSAHPool { - async fn new(options: &OpfsSAHPoolCfg) -> Result { + async fn new(options: &OpfsSAHPoolCfg) -> Result { const OPAQUE_DIR_NAME: &str = ".opaque"; let vfs_dir = &options.directory; @@ -154,6 +158,7 @@ impl OpfsSAHPool { is_paused: Cell::new(false), open_files: RefCell::new(HashSet::new()), vfs: Cell::new((std::ptr::null_mut(), false)), + random: C::random, }; pool.acquire_access_handles(clear_files).await?; @@ -164,7 +169,7 @@ impl OpfsSAHPool { async fn add_capacity(&self, n: u32) -> Result { for _ in 0..n { - let opaque = sqlite_wasm_rs::utils::random_name(WasmOsCallback::random); + let opaque = rsqlite_vfs::random_name(self.random); let handle: FileSystemFileHandle = JsFuture::from(self.dh_opaque.get_file_handle_with_options(&opaque, &{ let options = FileSystemGetFileOptions::new(); @@ -670,9 +675,12 @@ impl SQLiteIoMethods for SyncAccessHandleIoMethods { } } -struct SyncAccessHandleVfs; +struct SyncAccessHandleVfs(PhantomData); -impl SQLiteVfs for SyncAccessHandleVfs { +impl SQLiteVfs for SyncAccessHandleVfs +where + C: OsCallback, +{ const VERSION: ::std::os::raw::c_int = 2; const MAX_PATH_SIZE: ::std::os::raw::c_int = HEADER_MAX_FILENAME_SIZE as _; @@ -698,15 +706,15 @@ impl SQLiteVfs for SyncAccessHandleVfs { } fn sleep(dur: Duration) { - WasmOsCallback::sleep(dur); + C::sleep(dur); } fn random(buf: &mut [u8]) { - WasmOsCallback::random(buf); + C::random(buf); } fn epoch_timestamp_in_ms() -> i64 { - WasmOsCallback::epoch_timestamp_in_ms() + C::epoch_timestamp_in_ms() } } @@ -946,15 +954,18 @@ impl OpfsSAHPoolUtil { /// /// If the vfs corresponding to `options.vfs_name` has been registered, /// only return a management tool without register. -pub async fn install(options: &OpfsSAHPoolCfg, default_vfs: bool) -> Result { +pub async fn install( + options: &OpfsSAHPoolCfg, + default_vfs: bool, +) -> Result { static REGISTER_GUARD: tokio::sync::Mutex<()> = tokio::sync::Mutex::const_new(()); let _guard = REGISTER_GUARD.lock().await; let vfs = match registered_vfs(&options.vfs_name)? { Some(vfs) => vfs, - None => register_vfs::( + None => register_vfs::>( &options.vfs_name, - OpfsSAHPool::new(options).await?, + OpfsSAHPool::new::(options).await?, default_vfs, )?, }; @@ -971,12 +982,12 @@ mod tests { OpfsSAHPool, OpfsSAHPoolCfgBuilder, SyncAccessFile, SyncAccessHandleAppData, SyncAccessHandleStore, }; - use sqlite_wasm_rs::utils::{test_suite::test_vfs_store, VfsAppData}; + use rsqlite_vfs::{test_suite::test_vfs_store, VfsAppData}; use wasm_bindgen_test::wasm_bindgen_test; #[wasm_bindgen_test] async fn test_opfs_vfs_store() { - let data = OpfsSAHPool::new( + let data = OpfsSAHPool::new::( &OpfsSAHPoolCfgBuilder::new() .directory("test_opfs_suite") .build(), diff --git a/examples/implement-a-vfs/src/lib.rs b/examples/implement-a-vfs/src/lib.rs index f37235d..9bb5c90 100644 --- a/examples/implement-a-vfs/src/lib.rs +++ b/examples/implement-a-vfs/src/lib.rs @@ -5,10 +5,10 @@ use sqlite_wasm_rs::{ sqlite3_close, sqlite3_exec, sqlite3_open_v2, utils::{ - register_vfs, sqlite3_file, sqlite3_vfs, OsCallback, SQLiteIoMethods, SQLiteVfs, - SQLiteVfsFile, VfsFile, VfsResult, VfsStore, + ffi::{sqlite3_file, sqlite3_vfs, SQLITE_OK, SQLITE_OPEN_CREATE, SQLITE_OPEN_READWRITE}, + register_vfs, OsCallback, SQLiteIoMethods, SQLiteVfs, SQLiteVfsFile, VfsFile, VfsResult, + VfsStore, }, - SQLITE_OK, SQLITE_OPEN_CREATE, SQLITE_OPEN_READWRITE, }; use std::time::Duration; use std::{cell::RefCell, collections::HashMap}; diff --git a/src/lib.rs b/src/lib.rs index 17bebc4..674dcca 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -16,7 +16,7 @@ pub mod utils { VfsStore, SQLITE3_HEADER, }; - pub use rsqlite_vfs::ffi::*; + pub use rsqlite_vfs::ffi; #[doc(hidden)] pub use rsqlite_vfs::test_suite; @@ -28,6 +28,7 @@ pub use self::utils::{bail, check_option, check_result}; /// Raw C-style bindings to the underlying `libsqlite3` library. pub use wsqlite3_sys::*; +/// Wasm platform implementation pub use self::shim::WasmOsCallback; /// In-memory VFS implementation. pub use rsqlite_vfs::memvfs::{MemVfsError, MemVfsUtil}; diff --git a/tests/Cargo.toml b/tests/Cargo.toml index b39ccf1..047b1ea 100644 --- a/tests/Cargo.toml +++ b/tests/Cargo.toml @@ -5,7 +5,7 @@ edition = "2021" publish = false [dependencies] -sqlite-wasm-vfs = "0.1.0" +sqlite-wasm-vfs = "0.2.0" sqlite-wasm-rs = "0.5.0" wasm-bindgen-test = "0.3.54" diff --git a/tests/tests/full/sqlite3mc.rs b/tests/tests/full/sqlite3mc.rs index 38d7653..0c534f0 100644 --- a/tests/tests/full/sqlite3mc.rs +++ b/tests/tests/full/sqlite3mc.rs @@ -72,7 +72,7 @@ unsafe fn test_memvfs_cipher(cipher: &str) { } async unsafe fn test_relaxed_idb_vfs_cipher(cipher: &str) { - let util = sqlite_wasm_vfs::relaxed_idb::install( + let util = sqlite_wasm_vfs::relaxed_idb::install::( &sqlite_wasm_vfs::relaxed_idb::RelaxedIdbCfgBuilder::new() .vfs_name("relaxed-db-cipher") .clear_on_init(true) @@ -126,7 +126,7 @@ async unsafe fn test_relaxed_idb_vfs_cipher(cipher: &str) { } async unsafe fn test_opfs_sah_vfs_cipher(cipher: &str) { - let util = sqlite_wasm_vfs::sahpool::install( + let util = sqlite_wasm_vfs::sahpool::install::( &OpfsSAHPoolCfgBuilder::new() .vfs_name("sah-cipher") .directory("sah-cipher") diff --git a/tests/tests/full/vfs/relaxed_idb.rs b/tests/tests/full/vfs/relaxed_idb.rs index a5dca66..963e2af 100644 --- a/tests/tests/full/vfs/relaxed_idb.rs +++ b/tests/tests/full/vfs/relaxed_idb.rs @@ -1,11 +1,18 @@ use sqlite_wasm_rs::*; use sqlite_wasm_vfs::relaxed_idb::{ - install as install_idb_vfs, Preload, RelaxedIdbCfg, RelaxedIdbCfgBuilder, + install, Preload, RelaxedIdbCfg, RelaxedIdbCfgBuilder, RelaxedIdbError, RelaxedIdbUtil, }; use wasm_bindgen_test::wasm_bindgen_test; use crate::full::{check_persistent, prepare_simple_db}; +pub async fn install_idb_vfs( + options: &RelaxedIdbCfg, + default_vfs: bool, +) -> Result { + install::(options, default_vfs).await +} + #[wasm_bindgen_test] async fn test_idb_vfs_default() { install_idb_vfs(&RelaxedIdbCfg::default(), true) diff --git a/tests/tests/full/vfs/sahpool.rs b/tests/tests/full/vfs/sahpool.rs index edf88d1..715b4bb 100644 --- a/tests/tests/full/vfs/sahpool.rs +++ b/tests/tests/full/vfs/sahpool.rs @@ -1,7 +1,16 @@ use sqlite_wasm_rs::*; -use sqlite_wasm_vfs::sahpool::{install as install_opfs_sahpool, *}; +use sqlite_wasm_vfs::sahpool::{ + install, OpfsSAHError, OpfsSAHPoolCfg, OpfsSAHPoolCfgBuilder, OpfsSAHPoolUtil, +}; use wasm_bindgen_test::wasm_bindgen_test; +pub async fn install_opfs_sahpool( + options: &OpfsSAHPoolCfg, + default_vfs: bool, +) -> Result { + install::(options, default_vfs).await +} + use crate::full::{check_persistent, prepare_simple_db}; #[wasm_bindgen_test]