]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Merge kv-vfs branch into fiddle-opfs and add speedtest1-kvvfs.html test app (which...
authorstephan <stephan@noemail.net>
Mon, 12 Sep 2022 20:18:28 +0000 (20:18 +0000)
committerstephan <stephan@noemail.net>
Mon, 12 Sep 2022 20:18:28 +0000 (20:18 +0000)
FossilOrigin-Name: 8b1608a9a37131121cb3a0cb1e8dbad5e39dc1fc2a341d056f09537f179b2e7a

1  2 
ext/wasm/GNUmakefile
ext/wasm/index.html
ext/wasm/kvvfs.make
ext/wasm/speedtest1-kvvfs.html
manifest
manifest.uuid
src/os_kv.c

index fd95b013ca655fddade1555f77f0de1ae89b123a,3133d1230bfd3930adf8f52d65e480f06005d9a2..0cf365b912a0022978ee8ea5c90b0016286b7eef
@@@ -310,77 -262,7 +310,75 @@@ wasm: $(sqlite3.js
  # End main Emscripten-based module build
  ########################################################################
  
 -include kvvfs.make
 +########################################################################
 +# batch-runner.js...
 +dir.sql := sql
 +speedtest1 := ../../speedtest1
 +speedtest1.c := ../../test/speedtest1.c
 +speedtest1.sql := $(dir.sql)/speedtest1.sql
 +$(speedtest1):
 +      $(MAKE) -C ../.. speedtest1
 +$(speedtest1.sql): $(speedtest1)
 +      $(speedtest1) --script $@
 +batch-runner.list: $(MAKEFILE) $(speedtest1.sql) $(dir.sql)/000-mandelbrot.sql
 +      bash split-speedtest1-script.sh $(dir.sql)/speedtest1.sql
 +      ls -1 $(dir.sql)/*.sql | grep -v speedtest1.sql | sort > $@
 +clean-batch:
 +      rm -f batch-runner.list $(dir.sql)/speedtest1*.sql
 +# ^^^ we don't do this along with 'clean' because we clean/rebuild on
 +# a regular basis with different -Ox flags and rebuilding the batch
 +# pieces each time is an unnecessary time sink.
 +batch: batch-runner.list
 +all: batch
 +# end batch-runner.js
 +########################################################################
 +# speedtest1.js...
 +emcc.speedtest1-flags := -g $(emcc_opt)
 +ifneq (0,$(ENABLE_WASMFS))
 +  emcc.speedtest1-flags += -pthread -sWASMFS -sPTHREAD_POOL_SIZE=2
 +  emcc.speedtest1-flags += -DSQLITE_WASM_OPFS
 +endif
 +emcc.speedtest1-flags += -sINVOKE_RUN=0
 +#emcc.speedtest1-flags += --no-entry
 +emcc.speedtest1-flags += -flto
 +emcc.speedtest1-flags += -sABORTING_MALLOC
 +emcc.speedtest1-flags += -sINITIAL_MEMORY=128450560
 +emcc.speedtest1-flags += -sSTRICT_JS
 +emcc.speedtest1-flags += $(emcc.environment)
 +emcc.speedtest1-flags += -sMODULARIZE
 +emcc.speedtest1-flags += -sEXPORT_NAME=sqlite3Speedtest1InitModule
 +emcc.speedtest1-flags += -Wno-limited-postlink-optimizations
 +emcc.speedtest1-flags += -sEXPORTED_FUNCTIONS=_main,_malloc,_free,_sqlite3_wasm_vfs_unlink,_sqlite3_wasm_init_opfs
 +emcc.speedtest1-flags += -sDYNAMIC_EXECUTION=0
 +emcc.speedtest1-flags += --minify 0
 +
 +speedtest1.js := speedtest1.js
 +speedtest1.wasm := $(subst .js,.wasm,$(speedtest1.js))
++speedtest1.cflags := \
++  -I. -I$(dir.top) \
++  -DSQLITE_SPEEDTEST1_WASM
++
 +$(speedtest1.js): emcc.cflags+=
 +# speedtest1 notes re. sqlite3-wasm.o vs sqlite3-wasm.c: building against
 +# the latter (predictably) results in a slightly faster binary, but we're
 +# close enough to the target speed requirements that the 500ms makes a
 +# difference.
- $(speedtest1.js): $(speedtest1.c) $(sqlite3-wasm.c) $(MAKEFILE)
++$(speedtest1.js): $(speedtest1.c) $(sqlite3-wasm.c) $(MAKEFILE) $(sqlite3.c)
 +      $(emcc.bin) \
-         $(emcc.speedtest1-flags) \
-         -I. -I$(dir.top) \
-         -DSQLITE_THREADSAFE=0 \
-         -DSQLITE_TEMP_STORE=3 \
-         -DSQLITE_OMIT_UTF16 \
-         -DSQLITE_OMIT_DEPRECATED \
-         -DSQLITE_OMIT_SHARED_CACHE \
++        $(emcc.speedtest1-flags) $(speedtest1.cflags) \
++        $(SQLITE_OPT) \
 +        '-DSQLITE_DEFAULT_UNIX_VFS="unix-none"' \
-         -DSQLITE_SPEEDTEST1_WASM \
 +        -o $@ $(speedtest1.c) $(sqlite3-wasm.c) -lm
 +ifneq (,$(wasm-strip))
 +      $(wasm-strip) $(speedtest1.wasm)
 +endif
 +      ls -la $@ $(speedtest1.wasm)
 +
 +speedtest1: $(speedtest1.js)
- all: $(speedtest1.js)
++all: speedtest1
 +CLEAN_FILES += $(speedtest1.js) $(speedtest1.wasm)
 +# end speedtest1.js
 +########################################################################
  
  ########################################################################
  # fiddle_remote is the remote destination for the fiddle app. It
index 435040434ff0386db7c245d045d646520507a881,0000000000000000000000000000000000000000..da5ad1a3e9d62d0d85425ad1a98b77ed21364639
mode 100644,000000..100644
--- /dev/null
@@@ -1,56 -1,0 +1,57 @@@
-         <li><a href='demo-oo1.html'>demo-oo1</a>: demonstration of the OO API #1.</li>
 +<!doctype html>
 +<html lang="en-us">
 +  <head>
 +    <meta charset="utf-8">
 +    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
 +    <link rel="shortcut icon" href="data:image/x-icon;," type="image/x-icon">
 +    <link rel="stylesheet" href="common/testing.css"/>
 +    <title>sqlite3 WASM Testing Page Index</title>
 +  </head>
 +  <body>
 +    <header id='titlebar'><span>sqlite3 WASM test pages</span></header>
 +    <hr>
 +    <div>Below is the list of test pages for the sqlite3 WASM
 +      builds. All of them require that this directory have been
 +      "make"d first. The intent is that <em>this</em> page be run
 +      using:</div>
 +    <blockquote><pre>althttpd -page index.html</pre></blockquote>
 +    <div>and the individual tests be started in their own tab.</div>
 +    <div>Warnings and Caveats:
 +      <ul class='warning'>
 +        <li>Some of these pages require that
 +          the web server emit the so-called COOP and COEP headers. The
 +          default build of althttpd <em>does not</em>.
 +        </li>
 +        <li>Whether or not WASMFS/OPFS support is enabled on any given
 +          page may depend on build-time options which are <em>off by
 +          default</em> because they currently (as of 2022-09-08) break
 +          with Worker-based pages.
 +        </li>
 +      </ul>
 +    </div>
 +    <div>The tests...
 +      <ul id='test-list'>
 +        <li><a href='testing1.html'>testing1</a>: sanity tests of the core APIs and surrounding utility code.</li>
 +        <li><a href='testing2.html'>testing2</a>: Worker-based test of OO API #1.</li>
 +        <li><a href='testing-worker1-promiser.html'>testing-worker1-promiser</a>:
 +          tests for the Promise-based wrapper of the Worker-based API.</li>
++        <li><a href='demo-oo1.html'>demo-oo1</a>: demonstration of the OO API #1.</li>
 +        <li><a href='batch-runner.html'>batch-runner</a>: runs batches of SQL exported from speedtest1.</li>
 +        <li><a href='speedtest1.html'>speedtest1</a>: a main-thread WASM build of speedtest1.</li>
 +        <li><a href='speedtest1-worker.html'>speedtest1-worker</a>: an interactive Worker-thread variant of speedtest1.</li>
++        <li><a href='speedtest1-kvvfs.html'>speedtest1-kvvfs</a>: a variant of speedtest1 built solely for the kv-vfs feature.</li>
 +        <li><a href='kvvfs1.html'>kvvfs1</a>: very basic demo of using the key-value vfs for storing
 +          a persistent db in JS localStorage or sessionStorage.</li>
 +        <!--li><a href='x.html'></a></li-->
 +      </ul>
 +    </div>
 +    <style>
 +      #test-list { font-size: 120%; }
 +    </style>
 +    <script>//Assign a distinct target tab name for each test page...
 +      document.querySelectorAll('a').forEach(function(e){
 +          e.target = e.href;
 +      });
 +    </script>
 +  </body>
 +</html>
index a65f2faf2650234e41dcb0fb12981fcb1d1993ec,83a2691370e5336f7a43e61ae367388b68939f63..cfe0af652ca60c08f5149e24373fecac17413921
@@@ -70,10 -69,10 +70,12 @@@ ifneq (0,$(enable_bigint)
  kvvfs.jsflags += -sWASM_BIGINT
  endif
  
--$(kvvfs.js): $(MAKEFILE) $(MAKEFILE.kvvfs) $(kvvfs.wasm.c) \
++$(kvvfs.js): $(MAKEFILE) $(MAKEFILE.kvvfs) $(kvvfs.wasm.c) $(sqlite3.c) \
      EXPORTED_FUNCTIONS.api \
      $(post-js.js)
--      $(emcc.bin) -o $@ $(emcc_opt) $(emcc.flags) $(kvvfs.cflags) $(kvvfs.jsflags) $(kvvfs.wasm.c)
++      $(emcc.bin) -o $@ $(emcc_opt) $(emcc.flags) \
++  $(SQLITE_OPT) \
++  $(kvvfs.cflags) $(kvvfs.jsflags) $(kvvfs.wasm.c)
        chmod -x $(kvvfs.wasm)
  ifneq (,$(wasm-strip))
        $(wasm-strip) $(kvvfs.wasm)
@@@ -81,4 -80,3 +83,23 @@@ endi
        @ls -la $@ $(kvvfs.wasm)
  
  kvvfs: $(kvvfs.js)
 +all: kvvfs
++
++########################################################################
++# speedtest1-kvvfs
++speedtest1-kvvfs.js := speedtest1-kvvfs.js
++speedtest1-kvvfs.wasm := speedtest1-kvvfs.wasm
++CLEAN_FILES += $(speedtest1-kvvfs.js) $(speedtest1-kvvfs.wasm)
++$(speedtest1-kvvfs.js): $(speedtest1.c) $(sqlite3-wasm.c) $(sqlite3.c) $(MAKEFILE.kvvfs)
++      $(emcc.bin) \
++        $(emcc.speedtest1-flags) $(speedtest1.cflags) \
++        $(SQLITE_OPT) \
++        -sEXIT_RUNTIME=1 \
++        $(kvvfs.cflags) \
++        -o $@ $(speedtest1.c) $(sqlite3-wasm.c) -lm
++ifneq (,$(wasm-strip))
++      $(wasm-strip) $(speedtest1-kvvfs.wasm)
++endif
++      ls -la $@ $(speedtest1-kvvfs.wasm)
++
++speedtest1: $(speedtest1-kvvfs.js)
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..778790722f6309c5bb5aa5d1abdfb29b077b36c6
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,135 @@@
++<!doctype html>
++<html lang="en-us">
++  <head>
++    <meta charset="utf-8">
++    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
++    <link rel="shortcut icon" href="data:image/x-icon;," type="image/x-icon">
++    <link rel="stylesheet" href="common/emscripten.css"/>
++    <link rel="stylesheet" href="common/testing.css"/>
++    <title>speedtest1.wasm</title>
++  </head>
++  <body>
++    <header id='titlebar'><span>speedtest1.wasm</span></header>
++    <div>See also: <a href='speedtest1-worker.html'>A Worker-thread variant of this page.</a></div>
++    <!-- emscripten bits -->
++    <figure id="module-spinner">
++      <div class="spinner"></div>
++      <div class='center'><strong>Initializing app...</strong></div>
++      <div class='center'>
++        On a slow internet connection this may take a moment.  If this
++        message displays for "a long time", intialization may have
++        failed and the JavaScript console may contain clues as to why.
++      </div>
++    </figure>
++    <div class="emscripten" id="module-status">Downloading...</div>
++    <div class="emscripten">
++      <progress value="0" max="100" id="module-progress" hidden='1'></progress>  
++    </div><!-- /emscripten bits -->
++    <div class='warning'>This page starts running the main exe when it loads, which will
++      block the UI until it finishes! Adding UI controls to manually configure and start it
++      are TODO.</div>
++    </div>
++    <div class='warning'>Achtung: running it with the dev tools open may
++      <em>drastically</em> slow it down. For faster results, keep the dev
++      tools closed when running it!
++    </div>
++    <div>Output is delayed/buffered because we cannot update the UI while the
++      speedtest is running. Output will appear below when ready...
++    <div id='test-output'></div>
++    <script src="common/whwasmutil.js"></script>
++    <script src="common/SqliteTestUtil.js"></script>
++    <script src="speedtest1-kvvfs.js"></script>
++    <script>(function(){
++        const eOut = document.querySelector('#test-output');
++        const log2 = function(cssClass,...args){
++          const ln = document.createElement('div');
++          if(cssClass) ln.classList.add(cssClass);
++          ln.append(document.createTextNode(args.join(' ')));
++          eOut.append(ln);
++        };
++        const logList = [
++        ] /* We can't update DOM while speedtest and kvvfs only works
++             in the main thread, so we queue up main()-time output
++             into logList. */;
++        const dumpLogList = function(){
++          logList.forEach((v)=>log2('',v));
++          logList.length = 0;
++        };
++        const log = (...args)=>{
++          console.log(...args);
++          logList.push(args.join(' '));
++        };
++        const logErr = function(...args){
++          console.error(...args);
++          logList.push('ERROR: '+args.join(' '));
++        };
++        const clearStorage = function(){
++            sessionStorage.clear();
++            localStorage.clear();
++        };
++        const runTests = function(EmscriptenModule){
++            console.log("Module inited.",EmscriptenModule);
++            
++          const wasm = {
++            exports: EmscriptenModule.asm,
++            alloc: (n)=>EmscriptenModule._malloc(n),
++            dealloc: (m)=>EmscriptenModule._free(m),
++            memory: EmscriptenModule.asm.memory || EmscriptenModule.wasmMemory
++          };
++          log2('warning',"Clearing session/local storage before test starts.");
++          clearStorage();
++          //console.debug('wasm =',wasm);
++          self.WhWasmUtilInstaller(wasm);
++          const scope = wasm.scopedAllocPush();
++          const dbFile = 0 ? "session" : "local";
++          const urlArgs = self.SqliteTestUtil.processUrlArgs();
++          const argv = ["speedtest1", "--size", "1"];
++          if(urlArgs.flags){
++            // transform flags=a,b,c to ["--a", "--b", "--c"]
++            argv.push(...(urlArgs.flags.split(',').map((v)=>'--'+v)));
++          }else{
++            argv.push(
++              "--singlethread",
++              "--nomutex",
++              "--nosync",
++              "--nomemstat"
++            );
++            //argv.push("--memdb" /* note that memdb trumps the filename arg */);
++            argv.push("--big-transactions"/*important for tests 410 and 510!*/,
++                      dbFile);
++          }
++          console.log("argv =",argv);
++          // These log messages are not emitted to the UI until after main() returns. Fixing that
++          // requires moving the main() call and related cleanup into a timeout handler.
++          log2('',"Starting native app:\n ",argv.join(' '));
++          log2('',"This will take a while and the browser might warn about the runaway JS.",
++               "Give it time...");
++          logList.length = 0;
++          new Promise(function(resolve,reject){
++            setTimeout(function(){
++              try {
++                wasm.xCall('__main_argc_argv', argv.length,
++                           wasm.scopedAllocMainArgv(argv));
++              }catch(e){
++                reject(e);
++              }
++              resolve();
++            }, 50);
++          }).finally(function(){
++            wasm.scopedAllocPop(scope);
++            logList.unshift("Done running native main(). Output:");
++            dumpLogList();
++            log2('warning',"Clearing session/local storage.");
++            clearStorage();
++          });
++        }/*runTests()*/;
++
++        self.sqlite3TestModule.print = log;
++        self.sqlite3TestModule.printErr = logErr;
++        sqlite3Speedtest1InitModule(self.sqlite3TestModule).then(function(M){
++          setTimeout(()=>runTests(M), 100);
++        });
++      })();
++    </script>
++  </body>
++</html>
diff --cc manifest
index f11a02ef2a08891c44cf10df0a91772c16e5dcf2,69204b63ea5be75c1800425aca44a8a817e16dcf..75b3e09950674fc4a06b75f9787ef657b5936da1
+++ b/manifest
@@@ -1,5 -1,5 +1,5 @@@
- C Add\ssqlite3.oo1.DB.clearKvvfsStorage().\sAdd\scontrols\sto\skvvfs1.js\sdemo\sto\sreset\sand\squery\sthe\sdb\swithout\srequiring\sthe\sdev\sconsole.
- D 2022-09-12T17:59:04.237
 -C Fix\sthe\s&lt;sys/time.h&gt;\sinclude\sin\sos_kv.c.
 -D 2022-09-12T19:33:20.055
++C Merge\skv-vfs\sbranch\sinto\sfiddle-opfs\sand\sadd\sspeedtest1-kvvfs.html\stest\sapp\s(which\scurrently\sfails\searly\son).
++D 2022-09-12T20:18:28.723
  F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
  F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
  F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@@ -472,62 -472,43 +472,63 @@@ F ext/session/test_session.c f433f68a8a
  F ext/userauth/sqlite3userauth.h 7f3ea8c4686db8e40b0a0e7a8e0b00fac13aa7a3
  F ext/userauth/user-auth.txt e6641021a9210364665fe625d067617d03f27b04
  F ext/userauth/userauth.c 7f00cded7dcaa5d47f54539b290a43d2e59f4b1eb5f447545fa865f002fc80cb
 -F ext/wasm/EXPORTED_FUNCTIONS.fiddle 7fb73f7150ab79d83bb45a67d257553c905c78cd3d693101699243f36c5ae6c3
 +F ext/wasm/EXPORTED_FUNCTIONS.fiddle db7a4602f043cf4a5e4135be3609a487f9f1c83f05778bfbdf93766be4541b96
  F ext/wasm/EXPORTED_RUNTIME_METHODS.fiddle a004bd5eeeda6d3b28d16779b7f1a80305bfe009dfc7f0721b042967f0d39d02
- F ext/wasm/GNUmakefile 6e642a0dc7ac43d9287e8f31c80ead469ddc7475a6d4ab7ac3b1feefcd4f7279
 -F ext/wasm/GNUmakefile 12a672ab9125dc860457c2853f7651b98517e424d7a0e9714c89b28c5ff73800
 -F ext/wasm/README.md 4b00ae7c7d93c4591251245f0996a319e2651361013c98d2efb0b026771b7331
 -F ext/wasm/api/EXPORTED_FUNCTIONS.sqlite3-api c5eaceabb9e759aaae7d3101a4a3e542f96ab2c99d89a80ce20ec18c23115f33
++F ext/wasm/GNUmakefile 0434268aa7e042ec265c13e85a82cc3a760be02851ba428aa996a36d4ba77dfd
 +F ext/wasm/README.md e1ee1e7c321c6a250bf78a84ca6f5882890a237a450ba5a0649c7a8399194c52
 +F ext/wasm/api/EXPORTED_FUNCTIONS.sqlite3-api 1dfd067b3cbd9a49cb204097367cf2f8fe71b5a3b245d9d82a24779fd4ac2394
  F ext/wasm/api/EXPORTED_RUNTIME_METHODS.sqlite3-api 1ec3c73e7d66e95529c3c64ac3de2470b0e9e7fbf7a5b41261c367cf4f1b7287
 -F ext/wasm/api/README.md b6d0fb64bfdf7bf9ce6938ea4104228f6f5bbef600f5d910b2f8c8694195988c
 +F ext/wasm/api/README.md d876597edd2b9542b6ea031adaaff1c042076fde7b670b1dc6d8a87b28a6631b
  F ext/wasm/api/post-js-footer.js b64319261d920211b8700004d08b956a6c285f3b0bba81456260a713ed04900c
  F ext/wasm/api/post-js-header.js 0e853b78db83cb1c06b01663549e0e8b4f377f12f5a2d9a4a06cb776c003880b
 -F ext/wasm/api/sqlite3-api-cleanup.js 149fd63a0400cd1d69548887ffde2ed89c13283384a63c2e9fcfc695e38a9e11
 -F ext/wasm/api/sqlite3-api-glue.js 82c09f49c69984009ba5af2b628e67cc26c5dd203d383cd3091d40dab4e6514b
 -F ext/wasm/api/sqlite3-api-oo1.js e9612cb704c0563c5d71ed2a8dccd95bf6394fa4de3115d1b978dc269c49ab02
 -F ext/wasm/api/sqlite3-api-opfs.js c93cdd14f81a26b3a64990515ee05c7e29827fbc8fba4e4c2fef3a37a984db89
 -F ext/wasm/api/sqlite3-api-prologue.js 0fb0703d2d8ac89fa2d4dd8f9726b0ea226b8708ac34e5b482df046e147de0eb
 -F ext/wasm/api/sqlite3-api-worker.js 1124f404ecdf3c14d9f829425cef778cd683911a9883f0809a463c3c7773c9fd
 +F ext/wasm/api/sqlite3-api-cleanup.js 101919ec261644e2f6f0a59952fd9612127b69ea99b493277b2789ea478f9b6b
 +F ext/wasm/api/sqlite3-api-glue.js 2bf536a38cde324cf352bc2c575f8e22c6d204d667c0eda5a254ba45318914bc
 +F ext/wasm/api/sqlite3-api-oo1.js b498662748918c132aa59433ea2bd2ebb7e026549fd68506a1ae1ea94736f4f6
 +F ext/wasm/api/sqlite3-api-opfs.js 011799db398157cbd254264b6ebae00d7234b93d0e9e810345f213a5774993c0
 +F ext/wasm/api/sqlite3-api-prologue.js 9e37ce4dfd74926d0df80dd7e72e33085db4bcee48e2c21236039be416a7dff2
 +F ext/wasm/api/sqlite3-api-worker1.js d33062afa045fd4be01ba4abc266801807472558b862b30056211b00c9c347b4
  F ext/wasm/api/sqlite3-wasi.h 25356084cfe0d40458a902afb465df8c21fc4152c1d0a59b563a3fba59a068f9
 -F ext/wasm/api/sqlite3-wasm.c 8585793ca8311c7a0618b7e00ed2b3729799c20664a51f196258576e3d475c9e
 -F ext/wasm/api/sqlite3-worker.js 1325ca8d40129a82531902a3a077b795db2eeaee81746e5a0c811a04b415fa7f
 -F ext/wasm/common/SqliteTestUtil.js e41a1406f18da9224523fad0c48885caf995b56956a5b9852909c0989e687e90
 +F ext/wasm/api/sqlite3-wasm.c bf4637cf28463cada4b25f09651943c7ece004b253ef39b7ab68eaa60662aa09
 +F ext/wasm/batch-runner.html 23209ade7981acce7ecd79d6eff9f4c5a4e8b14ae867ac27cd89b230be640fa6
 +F ext/wasm/batch-runner.js 2abd146d3e3a66128ac0a2cc39bfd01e9811c9511fa10ec927d6649795f1ee50
 +F ext/wasm/common/SqliteTestUtil.js 529161a624265ba84271a52db58da022649832fa1c71309fb1e02cc037327a2b
  F ext/wasm/common/emscripten.css 3d253a6fdb8983a2ac983855bfbdd4b6fa1ff267c28d69513dd6ef1f289ada3f
 -F ext/wasm/common/testing.css 572cf1ffae0b6eb7ca63684d3392bf350217a07b90e7a896e4fa850700c989b0
 -F ext/wasm/common/whwasmutil.js 3d9deda1be718e2b10e2b6b474ba6ba857d905be314201ae5b3df5eef79f66aa
 +F ext/wasm/common/testing.css 3a5143699c2b73a85b962271e1a9b3241b30d90e30d895e4f55665e648572962
 +F ext/wasm/common/whwasmutil.js f7282ef36c9625330d4e6e82d1beec6678cd101e95e7108cd85db587a788c145
 +F ext/wasm/demo-oo1.html 75646855b38405d82781246fd08c852a2b3bee05dd9f0fe10ab655a8cffb79aa
 +F ext/wasm/demo-oo1.js 477f230cce3455e701431436d892d8c6bfea2bdf1ddcdd32a273e2f4bb339801
  F ext/wasm/fiddle/emscripten.css 3d253a6fdb8983a2ac983855bfbdd4b6fa1ff267c28d69513dd6ef1f289ada3f
 -F ext/wasm/fiddle/fiddle-worker.js 88bc2193a6cb6a3f04d8911bed50a4401fe6f277de7a71ba833865ab64a1b4ae
 +F ext/wasm/fiddle/fiddle-worker.js bccf46045be8824752876f3eec01c223be0616ccac184bffd0024cfe7a3262b8
  F ext/wasm/fiddle/fiddle.html 550c5aafce40bd218de9bf26192749f69f9b10bc379423ecd2e162bcef885c08
 -F ext/wasm/fiddle/fiddle.js 812f9954cc7c4b191884ad171f36fcf2d0112d0a7ecfdf6087896833a0c079a8
 -F ext/wasm/jaccwabyt/jaccwabyt.js 99b424b4d467d4544e82615b58e2fe07532a898540bf9de2a985f3c21e7082b2
 +F ext/wasm/fiddle/fiddle.js 4ffcfc9a235beebaddec689a549e9e0dfad6dca5c1f0b41f03468d7e76480686
- F ext/wasm/index.html 5876ae0442bef5b37fec9a45ee0722798e47ef727723ada742d33554845afa6a
++F ext/wasm/index.html f4b04f866ac420e7037b3818e9cb73ccc059675e0f24482932a2f7a121b814e3
 +F ext/wasm/jaccwabyt/jaccwabyt.js 0d7f32817456a0f3937fcfd934afeb32154ca33580ab264dab6c285e6dbbd215
  F ext/wasm/jaccwabyt/jaccwabyt.md 447cc02b598f7792edaa8ae6853a7847b8178a18ed356afacbdbf312b2588106
  F ext/wasm/jaccwabyt/jaccwabyt_test.c 39e4b865a33548f943e2eb9dd0dc8d619a80de05d5300668e9960fff30d0d36f
  F ext/wasm/jaccwabyt/jaccwabyt_test.exports 5ff001ef975c426ffe88d7d8a6e96ec725e568d2c2307c416902059339c06f19
- F ext/wasm/kvvfs.make dba616578bf91a76370a46494dd68a09c6dff5beb6d5561e2db65a27216e9630
 -F ext/wasm/kvvfs.make 7cc9cf10e744c3ba523c3eaf5c4af47028f3a5bb76db304ea8044a9b2a9d496f
 -F ext/wasm/kvvfs1.html 2acb241a6110a4ec581adbf07a23d5fc2ef9c7142aa9d60856732a102abc5016
 -F ext/wasm/kvvfs1.js 46afaf4faba041bf938355627bc529854295e561f49db3a240c914e75a529338
 -F ext/wasm/testing1.html 0bf3ff224628c1f1e3ed22a2dc1837c6c73722ad8c0ad9c8e6fb9e6047667231
 -F ext/wasm/testing1.js cba7134901a965743fa9289d82447ab71de4690b1ee5d06f6cb83e8b569d7943
 -F ext/wasm/testing2.html 73e5048e666fd6fb28b6e635677a9810e1e139c599ddcf28d687c982134b92b8
 -F ext/wasm/testing2.js d37433c601f88ed275712c1cfc92d3fb36c7c22e1ed8c7396fb2359e42238ebc
++F ext/wasm/kvvfs.make 1858354b02ebdccc459fb2d235552f8951d6ce28340083da9bb230bcf2533789
 +F ext/wasm/kvvfs1.html 83bac238d1e93ed102a461672fc58fe74e611e426708e9a5c66002c01eadb942
 +F ext/wasm/kvvfs1.js 53721a42e0ec45f6978cc723e5de47f882517867d0fcff4c6ff05f4c422e27c4
 +F ext/wasm/scratchpad-opfs-main.html 4565cf194e66188190d35f70e82553e2e2d72b9809b73c94ab67b8cfd14d2e0c
 +F ext/wasm/scratchpad-opfs-main.js 69e960e9161f6412fd0c30f355d4112f1894d6609eb431e2d16d207d1380518e
 +F ext/wasm/scratchpad-opfs-worker.html 66c1d15d678f3bd306373d76b61c6c8aef988f61f4a8dd40185d452f9c6d2bf5
 +F ext/wasm/scratchpad-opfs-worker.js 3ec2868c669713145c76eb5877c64a1b20741f741817b87c907a154b676283a9
 +F ext/wasm/scratchpad-opfs-worker2.js 5f2237427ac537b8580b1c659ff14ad2621d1694043eaaf41ae18dbfef2e48c0
++F ext/wasm/speedtest1-kvvfs.html fe7d314343b275f8b241af83267ca56274ea995535c6abca4d6e568a98fa31e3
 +F ext/wasm/speedtest1-worker.html 6b5fda04d0b69e8c2651689356cb0c28fd33aa1a82b03dcbc8b0d68fbd7ed57f
 +F ext/wasm/speedtest1-worker.js 356b9953add4449acf199793db9b76b11ee016021918d8daffd19f08ec68d305
 +F ext/wasm/speedtest1.html 8f61cbe68300acca25dd9fa74dce79b774786e2b4feeb9bcbc46e1cefbfa6262
 +F ext/wasm/split-speedtest1-script.sh a3e271938d4d14ee49105eb05567c6a69ba4c1f1293583ad5af0cd3a3779e205 x
 +F ext/wasm/sql/000-mandelbrot.sql 775337a4b80938ac8146aedf88808282f04d02d983d82675bd63d9c2d97a15f0
 +F ext/wasm/sql/001-sudoku.sql 35b7cb7239ba5d5f193bc05ec379bcf66891bce6f2a5b3879f2f78d0917299b5
 +F ext/wasm/sqlite3-worker1-promiser.js 92b8da5f38439ffec459a8215775d30fa498bc0f1ab929ff341fc3dd479660b9
 +F ext/wasm/sqlite3-worker1.js 0c1e7626304543969c3846573e080c082bf43bcaa47e87d416458af84f340a9e
 +F ext/wasm/testing-worker1-promiser.html 6eaec6e04a56cf24cf4fa8ef49d78ce8905dde1354235c9125dca6885f7ce893
 +F ext/wasm/testing-worker1-promiser.js c62b5879339eef0b21aebd9d75bc125c86530edc17470afff18077f931cb704a
 +F ext/wasm/testing1.html 528001c7e32ee567abc195aa071fd9820cc3c8ffc9c8a39a75e680db05f0c409
 +F ext/wasm/testing1.js 2def7a86c52ff28b145cb86188d5c7a49d5993f9b78c50d140e1c31551220955
 +F ext/wasm/testing2.html a66951c38137ff1d687df79466351f3c734fa9c6d9cce71d3cf97c291b2167e3
 +F ext/wasm/testing2.js 25584bcc30f19673ce13a6f301f89f8820a59dfe044e0c4f2913941f4097fe3c
  F install-sh 9d4de14ab9fb0facae2f48780b874848cbf2f895 x
  F ltmain.sh 3ff0879076df340d2e23ae905484d8c15d5fdea8
  F magic.txt 8273bf49ba3b0c8559cb2774495390c31fd61c60
@@@ -593,10 -574,10 +594,10 @@@ F src/notify.c 89a97dc854c3aa62ad5f384e
  F src/os.c 0eb831ba3575af5277e47f4edd14fdfc90025c67eb25ce5cda634518d308d4e9
  F src/os.h 1ff5ae51d339d0e30d8a9d814f4b8f8e448169304d83a7ed9db66a65732f3e63
  F src/os_common.h b2f4707a603e36811d9b1a13278bffd757857b85
- F src/os_kv.c a188e92dac693b1c1b512d93b0c4dc85c1baad11e322b01121f87057996e4d11
 -F src/os_kv.c 395b3ab831e0d2b172e6dccf6bae3e21b141f3b6d8b3aa828630634edac2604d
++F src/os_kv.c f3c5f46f62ed495c7d17c752f58f250c04b944c9cf34060518511e4e7537658c
  F src/os_setup.h 0711dbc4678f3ac52d7fe736951b6384a0615387c4ba5135a4764e4e31f4b6a6
- F src/os_unix.c d6322b78130d995160bb9cfb7850678ad6838b08c1d13915461b33326a406c04
+ F src/os_unix.c 0fa91925f0b8831fc0156a9c04d39d86f85baf9eef66c98712395e1715cb75cc
 -F src/os_win.c e9454cb141908e8eef2102180bad353a36480612d5b736e4c2bd5777d9b25a34
 +F src/os_win.c 8d129ae3e59e0fa900e20d0ad789e96f2e08177f0b00b53cdda65c40331e0902
  F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a
  F src/pager.c 6176d9752eb580419e8fef4592dc417a6b00ddfd43ee22f818819bf8840ceee8
  F src/pager.h f82e9844166e1585f5786837ddc7709966138ced17f568c16af7ccf946c2baa3
@@@ -2023,8 -2004,8 +2024,8 @@@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a9
  F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
  F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
  F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
- P a7d8b26acd3c1ae344369e4d70804c0cab45272c0983cfd32d616a0a7b28acb9
- R 984d02350bb7056e7ff7dbf797b44085
 -P e393ed650ef124143f84e9d787fb996e308dd7af6b8f50df72a6f085b67bf9c3
 -R 7d043d1f24831e04bac4a09dedf809ea
 -U drh
 -Z f4bc361a8f5540cb46c54b92ebd31edc
++P d845c6c22bd5d3fffc66e0566df346d690dd8bd1fc1688e312161b1a1edcfd79 878cc93e779c3857adc711f212520f007256274fcd3f6f3d72c754a937fcd198
++R af6be1e15f44117c1188e0c623230580
 +U stephan
- Z f41406c18c315f5b1f10f4c607ad1f16
++Z 1b00f3836ac4e8ae817bece731c1dd12
  # Remove this line to create a well-formed Fossil manifest.
diff --cc manifest.uuid
index c3f74348266504a7af5328e8cd4def98285b7c9e,f40ca1a77009ff5de572ae3b625cfd481f950f7b..e78c4a139f562923f232318513cc12c4a70da791
@@@ -1,1 -1,1 +1,1 @@@
- d845c6c22bd5d3fffc66e0566df346d690dd8bd1fc1688e312161b1a1edcfd79
 -878cc93e779c3857adc711f212520f007256274fcd3f6f3d72c754a937fcd198
++8b1608a9a37131121cb3a0cb1e8dbad5e39dc1fc2a341d056f09537f179b2e7a
diff --cc src/os_kv.c
index a14dc5c543603053d8c83505344e5395197a0359,eebbcd17cd9eea05ed960e11bac99b7dcc2c5c49..4651400b155c23364d867b23f564de7e3107797b
@@@ -284,7 -284,7 +284,6 @@@ EM_JS(int, kvstorageDelete
    try {
      const zXKey = kvstorageMakeKeyOnJSStack(zClass,zKey);
      if(!zXKey) return 1/*OOM*/;
--    _sqlite3_wasm__kvvfsMakeKey(zClass, zKey, zXKey);
      const jKey = UTF8ToString(zXKey);
      ((115/*=='s'*/===getValue(zClass))
       ? sessionStorage : localStorage).removeItem(jKey);