diff options
Diffstat (limited to 'ext/wasm/api')
-rw-r--r-- | ext/wasm/api/sqlite3-api-prologue.js | 49 | ||||
-rw-r--r-- | ext/wasm/api/sqlite3-wasm.c | 27 |
2 files changed, 71 insertions, 5 deletions
diff --git a/ext/wasm/api/sqlite3-api-prologue.js b/ext/wasm/api/sqlite3-api-prologue.js index 60ed61477..08e3ebf6e 100644 --- a/ext/wasm/api/sqlite3-api-prologue.js +++ b/ext/wasm/api/sqlite3-api-prologue.js @@ -576,6 +576,55 @@ self.sqlite3ApiBootstrap = function(config){ ["sqlite3_total_changes64", "i64", ["sqlite3*"]] ]; + /** State for sqlite3_web_persistent_dir(). */ + let __persistentDir; + /** + An experiment. Do not use. + + If the wasm environment has a persistent storage directory, + its path is returned by this function. If it does not then + it returns one of: + + - `undefined` if initIfNeeded is false and this function has + never been called before. + + - `""` if no persistent storage is available. + + Note that in both cases the return value is falsy. + */ + capi.sqlite3_web_persistent_dir = function(initIfNeeded=true){ + if(undefined !== __persistentDir) return __persistentDir; + else if(!initIfNeeded) return; + // If we have no OPFS, there is no persistent dir + if(!self.FileSystemHandle || !self.FileSystemDirectoryHandle + || !self.FileSystemFileHandle){ + return __persistentDir = ""; + } + try{ + if(0===this.wasm.xCall('sqlite3_wasm_init_opfs')){ + /** OPFS does not support locking and will trigger errors if + we try to lock. We don't _really_ want to + _unconditionally_ install a non-locking sqlite3 VFS as the + default, but we do so here for simplicy's sake for the + time being. That said: locking is a no-op on all of the + current WASM storage, so this isn't (currently) as bad as + it may initially seem. */ + const pVfs = this.sqlite3_vfs_find("unix-none"); + if(pVfs){ + this.sqlite3_vfs_register(pVfs,1); + //warn("Installed 'unix-none' as the default sqlite3 VFS."); + } + return __persistentDir = + "/persistent" /* name is hard-coded in sqlite3_wasm_init_opfs()!*/; + }else{ + return __persistentDir = ""; + } + }catch(e){ + // sqlite3_wasm_init_opfs() is not available + return __persistentDir = ""; + } + }.bind(capi); + /* The remainder of the API will be set up in later steps. */ return { capi, diff --git a/ext/wasm/api/sqlite3-wasm.c b/ext/wasm/api/sqlite3-wasm.c index 30a9dafeb..487baecf1 100644 --- a/ext/wasm/api/sqlite3-wasm.c +++ b/ext/wasm/api/sqlite3-wasm.c @@ -430,7 +430,7 @@ int sqlite3_wasm_vfs_unlink(const char * zName){ return rc; } -#ifdef __EMSCRIPTEN__ +#if defined(__EMSCRIPTEN__) && defined(SQLITE_WASM_OPFS) #include <emscripten/wasmfs.h> #include <emscripten/console.h> /* @@ -443,17 +443,34 @@ int sqlite3_wasm_vfs_unlink(const char * zName){ ** WASMFS backend impl for OPFS. On success, subsequent calls are ** no-ops. ** -** Returns 0 on success, SQLITE_NOMEM if intantiation of the backend -** object fails. +** Returns 0 on success, SQLITE_NOMEM if instantiation of the backend +** object fails, SQLITE_IOERR if mkdir() of the "/persistent" dir in +** the virtual FS fails. In builds compiled without SQLITE_WASM_OPFS +** defined, SQLITE_NOTFOUND is returned without side effects. */ int sqlite3_wasm_init_opfs(void){ static backend_t pOpfs = 0; + static const char * zDir = "/persistent"; if( !pOpfs ){ pOpfs = wasmfs_create_opfs_backend(); if( pOpfs ){ - emscripten_console_log("Created OPFS WASMFS backend."); + emscripten_console_log("Created WASMFS OPFS backend."); } } + /** It's not enough to instantiate the backend. We have to create a + mountpoint in the VFS and attach the backend to it. */ + if( pOpfs && 0!=access(zDir, F_OK) ){ + /* mkdir() simply hangs when called from fiddle app. Cause is + not yet determined but the hypothesis is an init-order + issue. */ + const int rc = wasmfs_create_directory(zDir, 0777, pOpfs); + emscripten_console_log(rc ? "OPFS mkdir failed." : "OPFS mkdir ok."); + if(rc) return SQLITE_IOERR; + } return pOpfs ? 0 : SQLITE_NOMEM; } -#endif /* __EMSCRIPTEN__ */ +#else +int sqlite3_wasm_init_opfs(void){ + return SQLITE_NOTFOUND; +} +#endif /* __EMSCRIPTEN__ && SQLITE_WASM_OPFS */ |