]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Initial prototype impls of write/delete-key ops for the pending kvvfs which use sessi...
authorstephan <stephan@noemail.net>
Sun, 11 Sep 2022 02:43:08 +0000 (02:43 +0000)
committerstephan <stephan@noemail.net>
Sun, 11 Sep 2022 02:43:08 +0000 (02:43 +0000)
FossilOrigin-Name: a4bd96f5348e607d0fcb627b751f9d86a188173a4b3bfb2c95f92913a78bd31e

ext/wasm/GNUmakefile
ext/wasm/api/EXPORTED_FUNCTIONS.sqlite3-api
ext/wasm/api/sqlite3-api-prologue.js
ext/wasm/api/sqlite3-wasm.c
manifest
manifest.uuid

index 576b8d320fe47fcbd3274e0f54614f8a24dca39a..bcc23feee7ad93e62a8ed6f453b3ca6261fdc872 100644 (file)
@@ -193,7 +193,8 @@ emcc.jsflags += -sSTRICT_JS
 emcc.jsflags += -sDYNAMIC_EXECUTION=0
 emcc.jsflags += -sNO_POLYFILL
 emcc.jsflags += -sEXPORTED_FUNCTIONS=@$(dir.wasm)/EXPORTED_FUNCTIONS.api
-emcc.jsflags += -sEXPORTED_RUNTIME_METHODS=FS,wasmMemory # wasmMemory==>for -sIMPORTED_MEMORY
+emcc.jsflags += -sEXPORTED_RUNTIME_METHODS=FS,wasmMemory
+                # wasmMemory ==> required by our code for use with -sIMPORTED_MEMORY
 emcc.jsflags += -sUSE_CLOSURE_COMPILER=0
 emcc.jsflags += -sIMPORTED_MEMORY
 emcc.environment := -sENVIRONMENT=web
index 4a6b71b8ea23f9626e1aef55b2d414b414313bcb..814f17fd9302cddd362e9f97a69c3e7814b2490f 100644 (file)
@@ -70,5 +70,7 @@ _sqlite3_wasm_db_error
 _sqlite3_wasm_enum_json
 _sqlite3_wasm_init_opfs
 _sqlite3_wasm_vfs_unlink
+_sqlite3_wasm__emjs_test
+_sqlite3_wasm__kvvfsMakeKey
 _malloc
 _free
index 5217cfcde3f0d0839bffda08c2d66ee19b7a4916..2d377f270179a3c6bc97e52fa7bbaf85e6235962 100644 (file)
@@ -650,7 +650,8 @@ self.sqlite3ApiBootstrap = function sqlite3ApiBootstrap(
     ["sqlite3_value_type", "int", "*"],
     ["sqlite3_vfs_find", "*", "string"],
     ["sqlite3_vfs_register", "int", "*", "int"],
-    ["sqlite3_wasm_vfs_unlink", "int", "string"]
+    ["sqlite3_wasm_vfs_unlink", "int", "string"],
+    ["sqlite3_wasm__emjs_test", undefined, "int"]
   ]/*capi.wasm.bindingSignatures*/;
 
   if(false && capi.wasm.compileOptionUsed('SQLITE_ENABLE_NORMALIZE')){
index cea6dffa1fe6e0acc3658be725dd09ac89019477..b0e51d068c56c54a8c4a96096e6cd235575a7b8b 100644 (file)
@@ -483,3 +483,147 @@ int sqlite3_wasm_init_opfs(void){
   return SQLITE_NOTFOUND;
 }
 #endif /* __EMSCRIPTEN__ && SQLITE_WASM_OPFS */
+
+#if defined(__EMSCRIPTEN__) // && defined(SQLITE_OS_KV)
+#include "emscripten.h"
+
+#ifndef KVSTORAGE_KEY_SZ
+/* We can remove this once kvvfs and this bit is merged. */
+#  define KVSTORAGE_KEY_SZ 32
+static void kvstorageMakeKey(
+  const char *zClass,
+  const char *zKeyIn,
+  char *zKeyOut
+){
+  sqlite3_snprintf(KVSTORAGE_KEY_SZ, zKeyOut, "kvvfs-%s-%s", zClass, zKeyIn);
+}
+#endif
+
+/*
+** An internal level of indirection for accessing the static
+** kvstorageMakeKey() from EM_JS()-generated functions. This must be
+** made available for export via Emscripten but is not intended to be
+** used from client code. If called with a NULL zClass it is a no-op.
+** It returns KVSTORAGE_KEY_SZ, so JS code (which cannot see that
+** constant) may call it with NULL arguments to get the size of the
+** allocation they'll need for a kvvfs key.
+**
+** Maintenance reminder: Emscripten will install this in the Module
+** init scope and will prefix its name with "_".
+*/
+int sqlite3_wasm__kvvfsMakeKey(const char *zClass,
+                                  const char *zKeyIn,
+                                  char *zKeyOut){
+  if(zClass) kvstorageMakeKey(zClass, zKeyIn, zKeyOut);
+  return KVSTORAGE_KEY_SZ;
+}
+
+#if 0
+/*
+** Alternately, we can implement kvstorageMakeKey() in JS in such a
+** way that it's visible to kvstorageWrite/Delete/Read() but not the
+** rest of the world. This impl is considerably more verbose than
+** the C impl because writing directly to memory requires more code in
+** JS.
+*/
+EM_JS(void, kvstorageMakeKeyJS,
+      (const char *zClass, const char *zKeyIn, char *zKeyOut),{
+  const max = 32;
+  if(!arguments.length) return max;
+  let n = 0, i = 0, ch = 0;
+  // Write key prefix to dest...
+  if(0){
+    const prefix = "kvvfs-";
+    for(i in prefix) setValue(zKeyOut+(n++), prefix.charCodeAt(i));
+  }else{
+    // slightly optimized but less readable...
+    setValue(zKeyOut + (n++), 107/*'k'*/);
+    setValue(zKeyOut + (n++), 118/*'v'*/);
+    setValue(zKeyOut + (n++), 118/*'v'*/);
+    setValue(zKeyOut + (n++), 102/*'f'*/);
+    setValue(zKeyOut + (n++), 115/*'s'*/);
+    setValue(zKeyOut + (n++),  45/*'-'*/);
+  }
+  // Write zClass to dest...
+  for(i = 0; n < max && (ch = getValue(zClass+i)); ++n, ++i){
+    setValue(zKeyOut + n, ch);
+  }
+  // Write "-" separator to dest...
+  if(n<max) setValue(zKeyOut + (n++), 45/* == '-'*/);
+  // Write zKeyIn to dest...
+  for(i = 0; n < max && (ch = getValue(zKeyIn+i)); ++n, ++i){
+    setValue(zKeyOut + n, ch);
+  }
+  // NUL terminate...
+  if(n<max) setValue(zKeyOut + n, 0);
+});
+#endif
+
+EM_JS(int, kvstorageWrite,
+      (const char *zClass, const char *zKey, const char *zData),{
+  const stack = stackSave();
+  try {
+    //const zXKey = stackAlloc(kvstorageMakeKeyJS());
+    //kvstorageMakeKeyJS(zClass, zKey, zXKey);
+    const zXKey = stackAlloc(_sqlite3_wasm__kvvfsMakeKey(0,0,0));
+    _sqlite3_wasm__kvvfsMakeKey(zClass, zKey, zXKey);
+    const jKey = UTF8ToString(zXKey);
+    /**
+       We could simplify this function and eliminate the
+       kvstorageMakeKey() symbol acrobatics if we'd simply hard-code
+       the key algo into the 3 functions which need it:
+
+       const jKey = "kvvfs-"+UTF8ToString(zClass)+"-"+UTF8ToString(zKey);
+    */
+    ((115/*=='s'*/===getValue(zClass))
+     ? sessionStorage : localStorage).setItem(jKey, UTF8ToString(zData));
+  }catch(e){
+    console.error("kvstorageWrite()",e);
+    return 1; // Can't access SQLITE_xxx from here
+  }finally{
+    stackRestore(stack);
+  }
+  return 0;
+});
+
+EM_JS(int, kvstorageDelete,
+      (const char *zClass, const char *zKey),{
+  const stack = stackSave();
+  try {
+    const zXKey = stackAlloc(_sqlite3_wasm__kvvfsMakeKey(0,0,0));
+    _sqlite3_wasm__kvvfsMakeKey(zClass, zKey, zXKey);
+    const jKey = UTF8ToString(zXKey);
+    ((115/*=='s'*/===getValue(zClass))
+     ? sessionStorage : localStorage).removeItem(jKey);
+  }catch(e){
+    console.error("kvstorageDelete()",e);
+    return 1;
+  }finally{
+    stackRestore(stack);
+  }
+  return 0;
+});
+
+/*
+** This function exists for (1) WASM testing purposes and (2) as a
+** hook to get Emscripten to export several EM_JS()-generated
+** functions. It is not part of the public API and its signature
+** and semantics may change at any time.
+*/
+void sqlite3_wasm__emjs_test(int whichOp){
+  const char * zClass = "session";
+  const char * zKey = "hello";
+  switch( whichOp ){
+    case 1:
+      kvstorageWrite(zClass, zKey, "world");
+      break;
+    case 2:
+      kvstorageDelete(zClass, zKey);
+      break;
+  default:
+    //kvstorageMakeKeyJS(0,0,0) /* force Emscripten to include this */;
+    break;
+  }
+}
+
+#endif /* ifdef __EMSCRIPTEN__ */
index 4b4df74808d5c1b94c25ad9f89c00208656f2057..2144f4800de015d5169a257037f58521c88986b0 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Remove\sa\sreference\sto\sa\scompleted\sTODO.
-D 2022-09-09T05:39:36.904
+C Initial\sprototype\simpls\sof\swrite/delete-key\sops\sfor\sthe\spending\skvvfs\swhich\suse\ssessionStorage\sor\slocalStorage\sfor\sdb\spage\sstorage.\sread-key\sop\sis\spending.
+D 2022-09-11T02:43:08.758
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
 F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -474,9 +474,9 @@ F ext/userauth/user-auth.txt e6641021a9210364665fe625d067617d03f27b04
 F ext/userauth/userauth.c 7f00cded7dcaa5d47f54539b290a43d2e59f4b1eb5f447545fa865f002fc80cb
 F ext/wasm/EXPORTED_FUNCTIONS.fiddle db7a4602f043cf4a5e4135be3609a487f9f1c83f05778bfbdf93766be4541b96
 F ext/wasm/EXPORTED_RUNTIME_METHODS.fiddle a004bd5eeeda6d3b28d16779b7f1a80305bfe009dfc7f0721b042967f0d39d02
-F ext/wasm/GNUmakefile 04e1df08665a81b8815415571cc874176001295a889e649f6ecfea2f6091cfea
+F ext/wasm/GNUmakefile e8dcbf6de96196158bbc583d5a990f542a7ab33ad3858ca6563388d04d22d38b
 F ext/wasm/README.md e1ee1e7c321c6a250bf78a84ca6f5882890a237a450ba5a0649c7a8399194c52
-F ext/wasm/api/EXPORTED_FUNCTIONS.sqlite3-api 77ef4bcf37e362b9ad61f9c175dfc0f1b3e571563fb311b96581cf422ee6a8ec
+F ext/wasm/api/EXPORTED_FUNCTIONS.sqlite3-api d6396db6405ecfc4d25ebee8c1fab29d4522c852fcf9011df8bbcd54da00c14a
 F ext/wasm/api/EXPORTED_RUNTIME_METHODS.sqlite3-api 1ec3c73e7d66e95529c3c64ac3de2470b0e9e7fbf7a5b41261c367cf4f1b7287
 F ext/wasm/api/README.md d876597edd2b9542b6ea031adaaff1c042076fde7b670b1dc6d8a87b28a6631b
 F ext/wasm/api/post-js-footer.js b64319261d920211b8700004d08b956a6c285f3b0bba81456260a713ed04900c
@@ -485,10 +485,10 @@ F ext/wasm/api/sqlite3-api-cleanup.js 1a12e64060c2cb0defd34656a76a9b1d7ed58459c2
 F ext/wasm/api/sqlite3-api-glue.js 67ca83974410961953eeaa1dfed3518530d68381729ed1d27f95122f5baeabd3
 F ext/wasm/api/sqlite3-api-oo1.js b06a1ac982c7d433396b8304550ce1493a63671a3bf653c3b5646a9075e0ca41
 F ext/wasm/api/sqlite3-api-opfs.js 011799db398157cbd254264b6ebae00d7234b93d0e9e810345f213a5774993c0
-F ext/wasm/api/sqlite3-api-prologue.js 2d5c5d3355f55eefe51922cec5bfedbec0f8300db98a17685ab7a34a03953c7a
+F ext/wasm/api/sqlite3-api-prologue.js 3cd4343698a8f9a9b9d62486c06a03d220b88588a08666964f378ae858622b54
 F ext/wasm/api/sqlite3-api-worker1.js 73579555563b789785ae83724014eaf31811073aad9be6596c8336ffb51edd71
 F ext/wasm/api/sqlite3-wasi.h 25356084cfe0d40458a902afb465df8c21fc4152c1d0a59b563a3fba59a068f9
-F ext/wasm/api/sqlite3-wasm.c 19c3797edc35821e362a8b60ce45d1adfe6d24fca7cd1f55f89d2086ef33870e
+F ext/wasm/api/sqlite3-wasm.c c9a1cbe67b7684d41a4235aa3b05aba9a6389ff4d4adfc4e35d73b7f797142a3
 F ext/wasm/batch-runner.html 23209ade7981acce7ecd79d6eff9f4c5a4e8b14ae867ac27cd89b230be640fa6
 F ext/wasm/batch-runner.js a727cbbffe63fd17fb5a590dc679f0b13bd51880e8f84b461d7df246417689e8
 F ext/wasm/common/SqliteTestUtil.js 529161a624265ba84271a52db58da022649832fa1c71309fb1e02cc037327a2b
@@ -2019,8 +2019,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
 F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
 F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P 02709ee2beab36d144b807fd9ffaee639e3c1bdd1908a34e05f3fd23dad2ef66
-R bd063a67330eab4c443bec97e40e0753
+P 757ad69607201a26802a304839b8454b1634712458539d6aa8cf999ab2447e59
+R 97007ca8c1155bdfa1827179882900c6
 U stephan
-Z bd537cef11d41fe7e8fbc4a9611dc217
+Z 611b03bde2a6634a4d1d6b501abe44cc
 # Remove this line to create a well-formed Fossil manifest.
index fb7f9156f4062463a7ad6aec0e51b4af1c3e1ca0..6830cb8f1a8f8a8855b1e1a80148d175d45c05ce 100644 (file)
@@ -1 +1 @@
-757ad69607201a26802a304839b8454b1634712458539d6aa8cf999ab2447e59
\ No newline at end of file
+a4bd96f5348e607d0fcb627b751f9d86a188173a4b3bfb2c95f92913a78bd31e
\ No newline at end of file