aboutsummaryrefslogtreecommitdiff
path: root/ext/wasm/kvvfs1.js
diff options
context:
space:
mode:
Diffstat (limited to 'ext/wasm/kvvfs1.js')
-rw-r--r--ext/wasm/kvvfs1.js112
1 files changed, 75 insertions, 37 deletions
diff --git a/ext/wasm/kvvfs1.js b/ext/wasm/kvvfs1.js
index f56f4874e..57f990f16 100644
--- a/ext/wasm/kvvfs1.js
+++ b/ext/wasm/kvvfs1.js
@@ -19,12 +19,25 @@
const toss = function(...args){throw new Error(args.join(' '))};
const debug = console.debug.bind(console);
const eOutput = document.querySelector('#test-output');
- const log = console.log.bind(console)
- const logHtml = function(...args){
- log.apply(this, args);
+ const logC = console.log.bind(console)
+ const logE = function(domElement){
+ eOutput.append(domElement);
+ };
+ const logHtml = function(cssClass,...args){
const ln = document.createElement('div');
+ if(cssClass) ln.classList.add(cssClass);
ln.append(document.createTextNode(args.join(' ')));
- eOutput.append(ln);
+ logE(ln);
+ }
+ const log = function(...args){
+ logC(...args);
+ logHtml('',...args);
+ };
+ const warn = function(...args){
+ logHtml('warning',...args);
+ };
+ const error = function(...args){
+ logHtml('error',...args);
};
const runTests = function(Module){
@@ -34,46 +47,71 @@
oo = sqlite3.oo1,
wasm = capi.wasm;
log("Loaded module:",capi.sqlite3_libversion(), capi.sqlite3_sourceid());
- log("Build options:",wasm.compileOptionUsed());
- self.S = sqlite3;
- T.assert(0 === capi.sqlite3_vfs_find(null));
- S.capi.sqlite3_initialize();
- T.assert( Number.isFinite( capi.sqlite3_vfs_find(null) ) );
- const stores = {
- local: localStorage,
- session: sessionStorage
- };
- const cleanupStore = function(n){
- const s = stores[n];
- const isKv = (key)=>key.startsWith('kvvfs-'+n);
- let i, k, toRemove = [];
- for( i = 0; (k = s.key(i)); ++i) {
- if(isKv(k)) toRemove.push(k);
- }
- toRemove.forEach((k)=>s.removeItem(k));
- };
+ T.assert( 0 !== capi.sqlite3_vfs_find(null) );
+ if(!capi.sqlite3_vfs_find('kvvfs')){
+ warn("This build is not kvvfs-capable.");
+ return;
+ }
+
const dbStorage = 1 ? 'session' : 'local';
- const db = new oo.DB(dbStorage);
- try {
- db.exec("create table if not exists t(a)");
- if(undefined===db.selectValue("select a from t limit 1")){
- log("New db. Populating..");
- db.exec("insert into t(a) values(1),(2),(3)");
- }else{
- log("Found existing table data:");
+ const theStore = 's'===dbStorage[0] ? sessionStorage : localStorage;
+ /**
+ The names ':sessionStorage:' and ':localStorage:' are handled
+ via the DB class constructor, not the C level. In the C API,
+ the names "local" and "session" are the current (2022-09-12)
+ names for those keys, but that is subject to change.
+ */
+ const db = new oo.DB( dbStorage, 'c', 'kvvfs' );
+
+ document.querySelector('#btn-clear-storage').addEventListener('click',function(){
+ const sz = capi.sqlite3_web_kvvfs_clear();
+ log("kvvfs localStorage and sessionStorage cleared:",sz,"entries.");
+ });
+ document.querySelector('#btn-clear-log').addEventListener('click',function(){
+ eOutput.innerText = '';
+ });
+ document.querySelector('#btn-init-db').addEventListener('click',function(){
+ try{
+ const saveSql = [];
+ db.exec({
+ sql: ["drop table if exists t;",
+ "create table if not exists t(a);",
+ "insert into t(a) values(?),(?),(?)"],
+ bind: [performance.now() >> 0,
+ (performance.now() * 2) >> 0,
+ (performance.now() / 2) >> 0],
+ saveSql
+ });
+ console.log("saveSql =",saveSql,theStore);
+ log("DB (re)initialized.");
+ }catch(e){
+ error(e.message);
+ }
+ });
+ const btnSelect = document.querySelector('#btn-select1');
+ btnSelect.addEventListener('click',function(){
+ log("DB rows:");
+ try{
db.exec({
sql: "select * from t order by a",
rowMode: 0,
- callback: function(v){log(v)}
+ callback: (v)=>log(v)
});
+ }catch(e){
+ error(e.message);
}
- }finally{
- const n = db.filename;
- db.close();
- //cleanupStore(n);
+ });
+ document.querySelector('#btn-storage-size').addEventListener('click',function(){
+ log("sqlite3_web_kvvfs_size(",dbStorage,") says", capi.sqlite3_web_kvvfs_size(dbStorage),
+ "bytes");
+ });
+ log("Storage backend:",db.filename);
+ if(0===db.selectValue('select count(*) from sqlite_master')){
+ log("DB is empty. Use the init button to populate it.");
+ }else{
+ log("DB contains data from a previous session. Use the Clear Ctorage button to delete it.");
+ btnSelect.click();
}
-
- log("Init done. Proceed from the dev console.");
};
sqlite3InitModule(self.sqlite3TestModule).then(function(theModule){