aboutsummaryrefslogtreecommitdiff
path: root/ext/wasm/api/sqlite3-wasm.c
diff options
context:
space:
mode:
authorstephan <stephan@noemail.net>2022-08-22 13:34:13 +0000
committerstephan <stephan@noemail.net>2022-08-22 13:34:13 +0000
commite3cd67603dc30d00e998bc9fb3183d49f43b830b (patch)
tree801653805886fe47c165b8f8ad83cf5b58cbbfc5 /ext/wasm/api/sqlite3-wasm.c
parent64d04a8d9fc15496ebab111972f4b3ae1578148a (diff)
downloadsqlite-e3cd67603dc30d00e998bc9fb3183d49f43b830b.tar.gz
sqlite-e3cd67603dc30d00e998bc9fb3183d49f43b830b.zip
Refactor JS API amalgamation such that the bootstrapping/configuration is deferred until the whole amalgamation is available, to facilitate providing clients with a way to initialize the API with their own config (noting that we're still one small level of refactoring away from being able to actually do that).
FossilOrigin-Name: 9dbe9a6aecec43b51057375ef1d2d632db0d17eac8b7552c20cc91fc2f1a55d1
Diffstat (limited to 'ext/wasm/api/sqlite3-wasm.c')
-rw-r--r--ext/wasm/api/sqlite3-wasm.c23
1 files changed, 16 insertions, 7 deletions
diff --git a/ext/wasm/api/sqlite3-wasm.c b/ext/wasm/api/sqlite3-wasm.c
index 487baecf1..070282b8e 100644
--- a/ext/wasm/api/sqlite3-wasm.c
+++ b/ext/wasm/api/sqlite3-wasm.c
@@ -435,7 +435,8 @@ int sqlite3_wasm_vfs_unlink(const char * zName){
#include <emscripten/console.h>
/*
** This function is NOT part of the sqlite3 public API. It is strictly
-** for use by the sqlite project's own JS/WASM bindings.
+** for use by the sqlite project's own JS/WASM bindings, specifically
+** only when building with Emscripten's WASMFS support.
**
** This function should only be called if the JS side detects the
** existence of the Origin-Private FileSystem (OPFS) APIs in the
@@ -443,14 +444,19 @@ int sqlite3_wasm_vfs_unlink(const char * zName){
** WASMFS backend impl for OPFS. On success, subsequent calls are
** no-ops.
**
+** This function may be passed a "mount point" name, which must have a
+** leading "/" and is currently restricted to a single path component,
+** e.g. "/foo" is legal but "/foo/" and "/foo/bar" are not. If it is
+** NULL or empty, it defaults to "/persistent".
+**
** Returns 0 on success, SQLITE_NOMEM if instantiation of the backend
-** object fails, SQLITE_IOERR if mkdir() of the "/persistent" dir in
+** object fails, SQLITE_IOERR if mkdir() of the zMountPoint 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){
+int sqlite3_wasm_init_opfs(const char *zMountPoint){
static backend_t pOpfs = 0;
- static const char * zDir = "/persistent";
+ if( !zMountPoint || !*zMountPoint ) zMountPoint = "/persistent";
if( !pOpfs ){
pOpfs = wasmfs_create_opfs_backend();
if( pOpfs ){
@@ -459,12 +465,15 @@ int sqlite3_wasm_init_opfs(void){
}
/** 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) ){
+ if( pOpfs && 0!=access(zMountPoint, 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.");
+ /* Note that this check and is not robust but it will
+ hypothetically suffice for the transient wasm-based virtual
+ filesystem we're currently running in. */
+ const int rc = wasmfs_create_directory(zMountPoint, 0777, pOpfs);
+ emscripten_console_logf("OPFS mkdir rc=%d", rc);
if(rc) return SQLITE_IOERR;
}
return pOpfs ? 0 : SQLITE_NOMEM;