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__ */
-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
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
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
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.