diff options
author | stephan <stephan@noemail.net> | 2022-08-13 17:13:16 +0000 |
---|---|---|
committer | stephan <stephan@noemail.net> | 2022-08-13 17:13:16 +0000 |
commit | 0761780bc48753ed85c7d3513535496b36a015a9 (patch) | |
tree | 6fce36f12f300422a04b01f2ac36a55f5b60dc1e /ext/wasm/api/scratchpad-opfs-worker.js | |
parent | a7234901b22f95f6079249f0acdce97646760a28 (diff) | |
download | sqlite-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.js | 86 |
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); +})(); |