/* 2022-09-17 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. *********************************************************************** A testing ground for the OPFS VFS. */ 'use strict'; const tryOpfsVfs = async function(sqlite3){ const toss = function(...args){throw new Error(args.join(' '))}; const logPrefix = "OPFS tester:"; const log = (...args)=>console.log(logPrefix,...args); const warn = (...args)=>console.warn(logPrefix,...args); const error = (...args)=>console.error(logPrefix,...args); const opfs = sqlite3.opfs; log("tryOpfsVfs()"); if(!sqlite3.opfs){ const e = toss("OPFS is not available."); error(e); throw e; } const capi = sqlite3.capi; const pVfs = capi.sqlite3_vfs_find("opfs") || toss("Missing 'opfs' VFS."); const oVfs = capi.sqlite3_vfs.instanceForPointer(pVfs) || toss("Unexpected instanceForPointer() result.");; log("OPFS VFS:",pVfs, oVfs); const wait = async (ms)=>{ return new Promise((resolve)=>setTimeout(resolve, ms)); }; const urlArgs = new URL(self.location.href).searchParams; const dbFile = "my-persistent.db"; if(urlArgs.has('delete')) sqlite3.opfs.unlink(dbFile); const db = new opfs.OpfsDb(dbFile,'ct'); log("db file:",db.filename); try{ if(opfs.entryExists(dbFile)){ let n = db.selectValue("select count(*) from sqlite_schema"); log("Persistent data found. sqlite_schema entry count =",n); } db.transaction((db)=>{ db.exec({ sql:[ "create table if not exists t(a);", "insert into t(a) values(?),(?),(?);", ], bind: [performance.now() | 0, (performance.now() |0) / 2, (performance.now() |0) / 4] }); }); log("count(*) from t =",db.selectValue("select count(*) from t")); // Some sanity checks of the opfs utility functions... const testDir = '/sqlite3-opfs-'+opfs.randomFilename(12); const aDir = testDir+'/test/dir'; await opfs.mkdir(aDir) || toss("mkdir failed"); await opfs.mkdir(aDir) || toss("mkdir must pass if the dir exists"); await opfs.unlink(testDir+'/test') && toss("delete 1 should have failed (dir not empty)"); //await opfs.entryExists(testDir) await opfs.unlink(testDir+'/test/dir') || toss("delete 2 failed"); await opfs.unlink(testDir+'/test/dir') && toss("delete 2b should have failed (dir already deleted)"); await opfs.unlink(testDir, true) || toss("delete 3 failed"); await opfs.entryExists(testDir) && toss("entryExists(",testDir,") should have failed"); }finally{ db.close(); } log("Done!"); }/*tryOpfsVfs()*/; importScripts('jswasm/sqlite3.js'); self.sqlite3InitModule() .then((sqlite3)=>tryOpfsVfs(sqlite3)) .catch((e)=>{ console.error("Error initializing module:",e); });