aboutsummaryrefslogtreecommitdiff
path: root/ext/wasm/api/scratchpad-opfs-worker.js
diff options
context:
space:
mode:
authorstephan <stephan@noemail.net>2022-08-13 17:13:16 +0000
committerstephan <stephan@noemail.net>2022-08-13 17:13:16 +0000
commit0761780bc48753ed85c7d3513535496b36a015a9 (patch)
tree6fce36f12f300422a04b01f2ac36a55f5b60dc1e /ext/wasm/api/scratchpad-opfs-worker.js
parenta7234901b22f95f6079249f0acdce97646760a28 (diff)
downloadsqlite-0761780bc48753ed85c7d3513535496b36a015a9.tar.gz
sqlite-0761780bc48753ed85c7d3513535496b36a015a9.zip
Add worker-style variant of the tests added in [ae24ac0f7dd9], but building this with wasmfs causes them to throw inexplicable exceptions from the Emscripten glue (without wasmfs it builds and runs fine, but storage is not persistent).
FossilOrigin-Name: 6401595e59179c5c0f6e51c5362cf4391787e7a55b9c6ca655746e30d3251f2b
Diffstat (limited to 'ext/wasm/api/scratchpad-opfs-worker.js')
-rw-r--r--ext/wasm/api/scratchpad-opfs-worker.js86
1 files changed, 86 insertions, 0 deletions
diff --git a/ext/wasm/api/scratchpad-opfs-worker.js b/ext/wasm/api/scratchpad-opfs-worker.js
new file mode 100644
index 000000000..5bc63c796
--- /dev/null
+++ b/ext/wasm/api/scratchpad-opfs-worker.js
@@ -0,0 +1,86 @@
+/*
+ 2022-05-22
+
+ The author disclaims copyright to this source code. In place of a
+ legal notice, here is a blessing:
+
+ * May you do good and not evil.
+ * May you find forgiveness for yourself and forgive others.
+ * May you share freely, never taking more than you give.
+
+ ***********************************************************************
+
+ An experiment for wasmfs/opfs. This file MUST be in the same dir as
+ the sqlite3.js emscripten module or that module won't be able to
+ resolve the relative URIs (importScript()'s relative URI handling
+ is, quite frankly, broken).
+*/
+'use strict';
+(function(){
+ const toss = function(...args){throw new Error(args.join(' '))};
+ importScripts('sqlite3.js');
+
+ /**
+ Posts a message in the form {type,data} unless passed more than 2
+ args, in which case it posts {type, data:[arg1...argN]}.
+ */
+ const wMsg = function(type,data){
+ postMessage({
+ type,
+ data: arguments.length<3
+ ? data
+ : Array.prototype.slice.call(arguments,1)
+ });
+ };
+
+ const stdout = console.log.bind(console);
+ const stderr = function(...args){wMsg('stderr', args);};
+
+ const test1 = function(db){
+ db.execMulti("create table if not exists t(a);")
+ .callInTransaction(function(db){
+ db.prepare("insert into t(a) values(?)")
+ .bind(new Date().getTime())
+ .stepFinalize();
+ stdout("Number of values in table t:",
+ db.selectValue("select count(*) from t"));
+ });
+ };
+
+ const runTests = function(Module){
+ //stdout("Module",Module);
+ self._MODULE = Module /* this is only to facilitate testing from the console */;
+ const sqlite3 = Module.sqlite3,
+ capi = sqlite3.capi,
+ oo = sqlite3.oo1,
+ wasm = capi.wasm;
+ stdout("Loaded sqlite3:",capi.sqlite3_libversion(), capi.sqlite3_sourceid());
+ const persistentDir = capi.sqlite3_web_persistent_dir();
+ if(persistentDir){
+ stderr("Persistent storage dir:",persistentDir);
+ }else{
+ stderr("No persistent storage available.");
+ }
+ const startTime = performance.now();
+ let db;
+ try {
+ db = new oo.DB(persistentDir+'/foo.db');
+ stdout("DB filename:",db.filename,db.fileName());
+ const banner1 = '>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>',
+ banner2 = '<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<';
+ [
+ test1
+ ].forEach((f)=>{
+ const n = performance.now();
+ stdout(banner1,"Running",f.name+"()...");
+ f(db, sqlite3, Module);
+ stdout(banner2,f.name+"() took ",(performance.now() - n),"ms");
+ });
+ }finally{
+ if(db) db.close();
+ }
+ stdout("Total test time:",(performance.now() - startTime),"ms");
+ };
+
+ sqlite3InitModule(self.sqlite3TestModule).then(runTests);
+})();