aboutsummaryrefslogtreecommitdiff
path: root/ext/wasm/tester1.c-pp.js
diff options
context:
space:
mode:
Diffstat (limited to 'ext/wasm/tester1.c-pp.js')
-rw-r--r--ext/wasm/tester1.c-pp.js374
1 files changed, 178 insertions, 196 deletions
diff --git a/ext/wasm/tester1.c-pp.js b/ext/wasm/tester1.c-pp.js
index c8225568d..e57f1c002 100644
--- a/ext/wasm/tester1.c-pp.js
+++ b/ext/wasm/tester1.c-pp.js
@@ -1676,7 +1676,7 @@ self.sqlite3InitModule = sqlite3InitModule;
predicate: ()=>!!capi.sqlite3_index_info,
test: function(sqlite3){
warn("The vtab/module JS bindings are experimental and subject to change.");
- const vth = sqlite3.VtabHelper;
+ const VT = sqlite3.vtab;
const tmplCols = Object.assign(Object.create(null),{
A: 0, B: 1
});
@@ -1684,195 +1684,178 @@ self.sqlite3InitModule = sqlite3InitModule;
The vtab demonstrated here is a JS-ification of
ext/misc/templatevtab.c.
*/
- const tmplMethods = {
- xConnect: function(pDb, pAux, argc, argv, ppVtab, pzErr){
- try{
- const args = wasm.cArgvToJs(argc, argv);
- T.assert(args.length>=3)
- .assert(args[0] === 'testvtab')
- .assert(args[1] === 'main')
- .assert(args[2] === 'testvtab');
- console.debug("xConnect() args =",args);
- const rc = capi.sqlite3_declare_vtab(
- pDb, "CREATE TABLE ignored(a,b)"
- );
- if(0===rc){
- const t = vth.xVtab.create(ppVtab);
- T.assert(t === vth.xVtab.get(wasm.getPtrValue(ppVtab)));
+ const tmplMod = (new sqlite3.capi.sqlite3_module()).setupModule({
+ catchExceptions: false,
+ methods: {
+ xConnect: function(pDb, pAux, argc, argv, ppVtab, pzErr){
+ try{
+ const args = wasm.cArgvToJs(argc, argv);
+ T.assert(args.length>=3)
+ .assert(args[0] === 'testvtab')
+ .assert(args[1] === 'main')
+ .assert(args[2] === 'testvtab');
+ console.debug("xConnect() args =",args);
+ const rc = capi.sqlite3_declare_vtab(
+ pDb, "CREATE TABLE ignored(a,b)"
+ );
+ if(0===rc){
+ const t = VT.xVtab.create(ppVtab);
+ T.assert(t === VT.xVtab.get(wasm.getPtrValue(ppVtab)));
+ }
+ return rc;
+ }catch(e){
+ if(!(e instanceof sqlite3.WasmAllocError)){
+ wasm.dealloc(wasm.getPtrValue, pzErr);
+ wasm.setPtrValue(pzErr, wasm.allocCString(e.message));
+ }
+ return VT.xError('xConnect',e);
}
- return rc;
- }catch(e){
- if(!(e instanceof sqlite3.WasmAllocError)){
- wasm.dealloc(wasm.getPtrValue, pzErr);
- wasm.setPtrValue(pzErr, wasm.allocCString(e.message));
+ },
+ xCreate: true /* just for testing. Will be removed afterwards. */,
+ xDisconnect: function(pVtab){
+ try {
+ VT.xVtab.unget(pVtab).dispose();
+ return 0;
+ }catch(e){
+ return VT.xError('xDisconnect',e);
}
- return vth.xError('xConnect',e);
- }
- },
- xDisconnect: function(pVtab){
- try {
- vth.xVtab.unget(pVtab).dispose();
- return 0;
- }catch(e){
- return vth.xError('xDisconnect',e);
- }
- },
- xOpen: function(pVtab, ppCursor){
- try{
- const t = vth.xVtab.get(pVtab),
- c = vth.xCursor.create(ppCursor);
- T.assert(t instanceof capi.sqlite3_vtab)
- .assert(c instanceof capi.sqlite3_vtab_cursor);
- c._rowId = 0;
- return 0;
- }catch(e){
- return vth.xError('xOpen',e);
- }
- },
- xClose: function(pCursor){
- try{
- const c = vth.xCursor.unget(pCursor);
- T.assert(c instanceof capi.sqlite3_vtab_cursor)
- .assert(!vth.xCursor.get(pCursor));
- c.dispose();
- return 0;
- }catch(e){
- return vth.xError('xClose',e);
- }
- },
- xNext: function(pCursor){
- try{
- const c = vth.xCursor.get(pCursor);
- ++c._rowId;
- return 0;
- }catch(e){
- return vth.xError('xNext',e);
- }
- },
- xColumn: function(pCursor, pCtx, iCol){
- try{
- const c = vth.xCursor.get(pCursor);
- switch(iCol){
- case tmplCols.A:
- capi.sqlite3_result_int(pCtx, 1000 + c._rowId);
- break;
- case tmplCols.B:
- capi.sqlite3_result_int(pCtx, 2000 + c._rowId);
- break;
- default: sqlite3.SQLite3Error.toss("Invalid column id",iCol);
+ },
+ xOpen: function(pVtab, ppCursor){
+ try{
+ const t = VT.xVtab.get(pVtab),
+ c = VT.xCursor.create(ppCursor);
+ T.assert(t instanceof capi.sqlite3_vtab)
+ .assert(c instanceof capi.sqlite3_vtab_cursor);
+ c._rowId = 0;
+ return 0;
+ }catch(e){
+ return VT.xError('xOpen',e);
}
- return 0;
- }catch(e){
- return vth.xError('xColumn',e);
- }
- },
- xRowid: function(pCursor, ppRowid64){
- try{
- const c = vth.xCursor.get(pCursor);
- vth.xRowid(ppRowid64, c._rowId);
- return 0;
- }catch(e){
- return vth.xError('xRowid',e);
- }
- },
- xEof: function(pCursor){
- const c = vth.xCursor.get(pCursor),
- rc = c._rowId>=10;
- c.dispose();
- return rc;
- },
- xFilter: function(pCursor, idxNum, idxCStr,
- argc, argv/* [sqlite3_value* ...] */){
- try{
- const c = vth.xCursor.get(pCursor);
- c._rowId = 0;
- const list = vth.sqlite3ValuesToJs(argc, argv);
- T.assert(argc === list.length);
- //log(argc,"xFilter value(s):",list);
- c.dispose();
- return 0;
- }catch(e){
- return vth.xError('xFilter',e);
- }
- },
- xBestIndex: function(pVtab, pIdxInfo){
- try{
- //const t = vth.xVtab.get(pVtab);
- const sii = capi.sqlite3_index_info;
- const pii = new sii(pIdxInfo);
- pii.$estimatedRows = 10;
- pii.$estimatedCost = 10.0;
- //log("xBestIndex $nConstraint =",pii.$nConstraint);
- if(pii.$nConstraint>0){
- // Validate nthConstraint() and nthConstraintUsage()
- const max = pii.$nConstraint;
- for(let i=0; i < max; ++i ){
- let v = pii.nthConstraint(i,true);
- T.assert(wasm.isPtr(v));
- v = pii.nthConstraint(i);
- T.assert(v instanceof sii.sqlite3_index_constraint)
- .assert(v.pointer >= pii.$aConstraint);
- v.dispose();
- v = pii.nthConstraintUsage(i,true);
- T.assert(wasm.isPtr(v));
- v = pii.nthConstraintUsage(i);
- T.assert(v instanceof sii.sqlite3_index_constraint_usage)
- .assert(v.pointer >= pii.$aConstraintUsage);
- v.$argvIndex = i;//just to get some values into xFilter
- v.dispose();
+ },
+ xClose: function(pCursor){
+ try{
+ const c = VT.xCursor.unget(pCursor);
+ T.assert(c instanceof capi.sqlite3_vtab_cursor)
+ .assert(!VT.xCursor.get(pCursor));
+ c.dispose();
+ return 0;
+ }catch(e){
+ return VT.xError('xClose',e);
+ }
+ },
+ xNext: function(pCursor){
+ try{
+ const c = VT.xCursor.get(pCursor);
+ ++c._rowId;
+ return 0;
+ }catch(e){
+ return VT.xError('xNext',e);
+ }
+ },
+ xColumn: function(pCursor, pCtx, iCol){
+ try{
+ const c = VT.xCursor.get(pCursor);
+ switch(iCol){
+ case tmplCols.A:
+ capi.sqlite3_result_int(pCtx, 1000 + c._rowId);
+ break;
+ case tmplCols.B:
+ capi.sqlite3_result_int(pCtx, 2000 + c._rowId);
+ break;
+ default: sqlite3.SQLite3Error.toss("Invalid column id",iCol);
}
+ return 0;
+ }catch(e){
+ return VT.xError('xColumn',e);
}
- //log("xBestIndex $nOrderBy =",pii.$nOrderBy);
- if(pii.$nOrderBy>0){
- // Validate nthOrderBy()
- const max = pii.$nOrderBy;
- for(let i=0; i < max; ++i ){
- let v = pii.nthOrderBy(i,true);
- T.assert(wasm.isPtr(v));
- v = pii.nthOrderBy(i);
- T.assert(v instanceof sii.sqlite3_index_orderby)
- .assert(v.pointer >= pii.$aOrderBy);
- v.dispose();
+ },
+ xRowid: function(pCursor, ppRowid64){
+ try{
+ const c = VT.xCursor.get(pCursor);
+ VT.xRowid(ppRowid64, c._rowId);
+ return 0;
+ }catch(e){
+ return VT.xError('xRowid',e);
+ }
+ },
+ xEof: function(pCursor){
+ const c = VT.xCursor.get(pCursor),
+ rc = c._rowId>=10;
+ c.dispose();
+ return rc;
+ },
+ xFilter: function(pCursor, idxNum, idxCStr,
+ argc, argv/* [sqlite3_value* ...] */){
+ try{
+ const c = VT.xCursor.get(pCursor);
+ c._rowId = 0;
+ const list = VT.sqlite3ValuesToJs(argc, argv);
+ T.assert(argc === list.length);
+ //log(argc,"xFilter value(s):",list);
+ c.dispose();
+ return 0;
+ }catch(e){
+ return VT.xError('xFilter',e);
+ }
+ },
+ xBestIndex: function(pVtab, pIdxInfo){
+ try{
+ //const t = VT.xVtab.get(pVtab);
+ const sii = capi.sqlite3_index_info;
+ const pii = new sii(pIdxInfo);
+ pii.$estimatedRows = 10;
+ pii.$estimatedCost = 10.0;
+ //log("xBestIndex $nConstraint =",pii.$nConstraint);
+ if(pii.$nConstraint>0){
+ // Validate nthConstraint() and nthConstraintUsage()
+ const max = pii.$nConstraint;
+ for(let i=0; i < max; ++i ){
+ let v = pii.nthConstraint(i,true);
+ T.assert(wasm.isPtr(v));
+ v = pii.nthConstraint(i);
+ T.assert(v instanceof sii.sqlite3_index_constraint)
+ .assert(v.pointer >= pii.$aConstraint);
+ v.dispose();
+ v = pii.nthConstraintUsage(i,true);
+ T.assert(wasm.isPtr(v));
+ v = pii.nthConstraintUsage(i);
+ T.assert(v instanceof sii.sqlite3_index_constraint_usage)
+ .assert(v.pointer >= pii.$aConstraintUsage);
+ v.$argvIndex = i;//just to get some values into xFilter
+ v.dispose();
+ }
+ }
+ //log("xBestIndex $nOrderBy =",pii.$nOrderBy);
+ if(pii.$nOrderBy>0){
+ // Validate nthOrderBy()
+ const max = pii.$nOrderBy;
+ for(let i=0; i < max; ++i ){
+ let v = pii.nthOrderBy(i,true);
+ T.assert(wasm.isPtr(v));
+ v = pii.nthOrderBy(i);
+ T.assert(v instanceof sii.sqlite3_index_orderby)
+ .assert(v.pointer >= pii.$aOrderBy);
+ v.dispose();
+ }
}
+ pii.dispose();
+ return 0;
+ }catch(e){
+ return VT.xError('xBestIndex',e);
}
- pii.dispose();
- return 0;
- }catch(e){
- return vth.xError('xBestIndex',e);
}
}
- };
- /**
- The vtab API places relevance on whether xCreate and
- xConnect are exactly the same function (same pointer
- address). Two JS-side references to the same method will
- end up, without acrobatics to counter it, being compiled as
- two different WASM-side bindings, i.e. two different
- pointers.
-
- In order to account for this, VtabHelper.installMethods()
- checks for duplicate function entries and maps them to the
- same WASM-compiled instance.
- */
- if(1){
- tmplMethods.xCreate = tmplMethods.xConnect;
- }
-
- const tmplMod = new sqlite3.capi.sqlite3_module();
- tmplMod.$iVersion = 0;
+ });
this.db.onclose.disposeAfter.push(tmplMod);
- vth.installMethods(tmplMod, tmplMethods, true);
- if(tmplMethods.xCreate){
- T.assert(tmplMod.$xCreate)
- .assert(tmplMod.$xCreate === tmplMod.$xConnect,
- "installMethods() must avoid re-compiling identical functions");
- tmplMod.$xCreate = 0;
- }
+ T.assert(tmplMod.$xCreate)
+ .assert(tmplMod.$xCreate === tmplMod.$xConnect,
+ "setup() must make these equivalent and "+
+ "installMethods() must avoid re-compiling identical functions");
+ tmplMod.$xCreate = 0 /* make tmplMod eponymous-only */;
let rc = capi.sqlite3_create_module(
this.db, "testvtab", tmplMod, 0
);
this.db.checkRc(rc);
-
const list = this.db.selectArrays(
"SELECT a,b FROM testvtab where a<9999 and b>1 order by a, b"
/* Query is shaped so that it will ensure that some constraints
@@ -1890,7 +1873,7 @@ self.sqlite3InitModule = sqlite3InitModule;
predicate: ()=>!!capi.sqlite3_index_info,
test: function(sqlite3){
warn("The vtab/module JS bindings are experimental and subject to change.");
- const vth = sqlite3.VtabHelper;
+ const VT = sqlite3.vtab;
const tmplCols = Object.assign(Object.create(null),{
A: 0, B: 1
});
@@ -1926,8 +1909,8 @@ self.sqlite3InitModule = sqlite3InitModule;
pDb, "CREATE TABLE ignored(a,b)"
);
if(0===rc){
- const t = vth.xVtab.create(ppVtab);
- T.assert(t === vth.xVtab.get(wasm.getPtrValue(ppVtab)));
+ const t = VT.xVtab.create(ppVtab);
+ T.assert(t === VT.xVtab.get(wasm.getPtrValue(ppVtab)));
vtabTrace("xCreate",...arguments," ppVtab =",t.pointer);
}
return rc;
@@ -1935,12 +1918,12 @@ self.sqlite3InitModule = sqlite3InitModule;
xConnect: true,
xDestroy: function(pVtab){
vtabTrace("xDestroy/xDisconnect",pVtab);
- vth.xVtab.dispose(pVtab);
+ VT.xVtab.dispose(pVtab);
},
xDisconnect: true,
xOpen: function(pVtab, ppCursor){
- const t = vth.xVtab.get(pVtab),
- c = vth.xCursor.create(ppCursor);
+ const t = VT.xVtab.get(pVtab),
+ c = VT.xCursor.create(ppCursor);
T.assert(t instanceof capi.sqlite3_vtab)
.assert(c instanceof capi.sqlite3_vtab_cursor);
vtabTrace("xOpen",...arguments," cursor =",c.pointer);
@@ -1948,19 +1931,19 @@ self.sqlite3InitModule = sqlite3InitModule;
},
xClose: function(pCursor){
vtabTrace("xClose",...arguments);
- const c = vth.xCursor.unget(pCursor);
+ const c = VT.xCursor.unget(pCursor);
T.assert(c instanceof capi.sqlite3_vtab_cursor)
- .assert(!vth.xCursor.get(pCursor));
+ .assert(!VT.xCursor.get(pCursor));
c.dispose();
},
xNext: function(pCursor){
vtabTrace("xNext",...arguments);
- const c = vth.xCursor.get(pCursor);
+ const c = VT.xCursor.get(pCursor);
++c._rowId;
},
xColumn: function(pCursor, pCtx, iCol){
vtabTrace("xColumn",...arguments);
- const c = vth.xCursor.get(pCursor);
+ const c = VT.xCursor.get(pCursor);
switch(iCol){
case tmplCols.A:
capi.sqlite3_result_int(pCtx, 1000 + c._rowId);
@@ -1973,34 +1956,33 @@ self.sqlite3InitModule = sqlite3InitModule;
},
xRowid: function(pCursor, ppRowid64){
vtabTrace("xRowid",...arguments);
- const c = vth.xCursor.get(pCursor);
- vth.xRowid(ppRowid64, c._rowId);
+ const c = VT.xCursor.get(pCursor);
+ VT.xRowid(ppRowid64, c._rowId);
},
xEof: function(pCursor){
vtabTrace("xEof",...arguments);
- return vth.xCursor.get(pCursor)._rowId>=10;
+ return VT.xCursor.get(pCursor)._rowId>=10;
},
xFilter: function(pCursor, idxNum, idxCStr,
argc, argv/* [sqlite3_value* ...] */){
vtabTrace("xFilter",...arguments);
- const c = vth.xCursor.get(pCursor);
+ const c = VT.xCursor.get(pCursor);
c._rowId = 0;
- const list = vth.sqlite3ValuesToJs(argc, argv);
+ const list = VT.sqlite3ValuesToJs(argc, argv);
T.assert(argc === list.length);
},
xBestIndex: function(pVtab, pIdxInfo){
vtabTrace("xBestIndex",...arguments);
- //const t = vth.xVtab.get(pVtab);
- const pii = vth.xIndexInfo(pIdxInfo);
+ //const t = VT.xVtab.get(pVtab);
+ const pii = VT.xIndexInfo(pIdxInfo);
pii.$estimatedRows = 10;
pii.$estimatedCost = 10.0;
pii.dispose();
}
}/*methods*/
};
- const tmplMod = vth.setupModule(modConfig);
- T.assert(tmplMod instanceof capi.sqlite3_module)
- .assert(1===tmplMod.$iVersion);
+ const tmplMod = VT.setupModule(modConfig);
+ T.assert(1===tmplMod.$iVersion);
this.db.onclose.disposeAfter.push(tmplMod);
this.db.checkRc(capi.sqlite3_create_module(
this.db.pointer, modConfig.name, tmplMod.pointer, 0