1
0
mirror of https://github.com/sqlite/sqlite.git synced 2025-07-29 08:01:23 +03:00

Lots of tweaking in batch-runner.js. Minor internal API update in OO #1 API.

FossilOrigin-Name: 24b82b9504db3d8e1335c2300b133f897dc1a541026dc24be5b0ffd8be66d977
This commit is contained in:
stephan
2022-08-29 18:58:38 +00:00
parent 49a785fa34
commit 2f06bf2541
6 changed files with 147 additions and 67 deletions

View File

@ -294,10 +294,12 @@ $(speedtest1):
$(MAKE) -C ../.. speedtest1 $(MAKE) -C ../.. speedtest1
speedtest1.sql: $(speedtest1) speedtest1.sql: $(speedtest1)
$(speedtest1) --script $@ $(speedtest1) --script $@
batch-sql.in := $(sort $(wildcard *.sql)) speedtest1-000.sql:
batch-runner.list: $(batch-sql.in) $(MAKEFILE) speedtest1.sql echo "select 1;" > $@
batch-runner.list: $(MAKEFILE) speedtest1.sql speedtest1-000.sql
bash split-speedtest1-script.sh speedtest1.sql bash split-speedtest1-script.sh speedtest1.sql
ls -1 *.sql | sort > $@ ls -1 *.sql | grep -v speedtest1.sql | sort > $@
CLEAN_FILES += batch-runner.list speedtest1*.sql
batch: batch-runner.list batch: batch-runner.list
######################################################################## ########################################################################

View File

@ -540,7 +540,7 @@ self.sqlite3ApiBootstrap.initializers.push(function(sqlite3){
if(isTA) wasm.heap8().set(arg.sql, pSql); if(isTA) wasm.heap8().set(arg.sql, pSql);
else wasm.jstrcpy(arg.sql, wasm.heap8(), pSql, sqlByteLen, false); else wasm.jstrcpy(arg.sql, wasm.heap8(), pSql, sqlByteLen, false);
wasm.setMemValue(pSql + sqlByteLen, 0/*NUL terminator*/); wasm.setMemValue(pSql + sqlByteLen, 0/*NUL terminator*/);
while(wasm.getMemValue(pSql, 'i8') while(pSql && wasm.getMemValue(pSql, 'i8')
/* Maintenance reminder:^^^ _must_ be 'i8' or else we /* Maintenance reminder:^^^ _must_ be 'i8' or else we
will very likely cause an endless loop. What that's will very likely cause an endless loop. What that's
doing is checking for a terminating NUL byte. If we doing is checking for a terminating NUL byte. If we
@ -548,8 +548,8 @@ self.sqlite3ApiBootstrap.initializers.push(function(sqlite3){
around the NUL terminator, and get stuck in and around the NUL terminator, and get stuck in and
endless loop at the end of the SQL, endlessly endless loop at the end of the SQL, endlessly
re-preparing an empty statement. */ ){ re-preparing an empty statement. */ ){
wasm.setMemValue(ppStmt, 0, wasm.ptrIR); wasm.setPtrValue(ppStmt, 0);
wasm.setMemValue(pzTail, 0, wasm.ptrIR); wasm.setPtrValue(pzTail, 0);
DB.checkRc(this, capi.sqlite3_prepare_v3( DB.checkRc(this, capi.sqlite3_prepare_v3(
this.pointer, pSql, sqlByteLen, 0, ppStmt, pzTail this.pointer, pSql, sqlByteLen, 0, ppStmt, pzTail
)); ));

View File

@ -24,35 +24,48 @@
<div class="emscripten"> <div class="emscripten">
<progress value="0" max="100" id="module-progress" hidden='1'></progress> <progress value="0" max="100" id="module-progress" hidden='1'></progress>
</div><!-- /emscripten bits --> </div><!-- /emscripten bits -->
<p class='warning'>ACHTUNG: this file requires a generated input list <p>
This page is for running extracts from the output of <tt>speedtest --script</tt>.
</p>
<p id='warn-list' class='warning'>ACHTUNG: this file requires a generated input list
file. Run "make batch" from this directory to generate it. file. Run "make batch" from this directory to generate it.
</p> </p>
<p class='warning'>WARNING: if the WASMFS/OPFS layer crashes, this page may <p id='warn-opfs' class='warning'>WARNING: if the WASMFS/OPFS layer crashes, this page may
become completely unresponsive and need to be closed and become completely unresponsive and need to be closed and
reloaded to recover. reloaded to recover.
</p> </p>
<hr> <hr>
<div> <div>
<select id='sql-select'> <select class='disable-during-eval' id='sql-select'>
<option disabled selected>Populated via script code</option> <option disabled selected>Populated via script code</option>
</select> </select>
<button id='sql-run'>Run selected SQL</button> <button class='disable-during-eval' id='sql-run'>Run selected SQL</button>
<button class='disable-during-eval' id='sql-run-next'>Run next...</button>
<button class='disable-during-eval' id='sql-run-remaining'>Run all remaining...</button>
<button class='disable-during-eval' id='db-reset'>Reset db</button>
<button id='output-clear'>Clear output</button> <button id='output-clear'>Clear output</button>
</div> </div>
<hr> <hr>
<div>(Log output is in reverse order, newest first!)</div>
<div id='test-output'></div> <div id='test-output'></div>
<script src="sqlite3.js"></script> <script src="sqlite3.js"></script>
<script src="common/SqliteTestUtil.js"></script> <script src="common/SqliteTestUtil.js"></script>
<script src="batch-runner.js"></script> <script src="batch-runner.js"></script>
<style> <style>
body {
display: flex;
flex-direction: column;
flex-wrap: wrap;
}
.warning { color: firebrick; } .warning { color: firebrick; }
#test-output { #test-output {
border: 1px inset; border: 1px inset;
padding: 0.25em; padding: 0.25em;
max-height: 20em; /*max-height: 30em;*/
overflow: auto; overflow: auto;
white-space: break-spaces; white-space: break-spaces;
display: flex; flex-direction: column-reverse;
} }
</style> </style>
</body> </body>

View File

@ -17,15 +17,19 @@
(function(){ (function(){
const T = self.SqliteTestUtil; const T = self.SqliteTestUtil;
const toss = function(...args){throw new Error(args.join(' '))}; const toss = function(...args){throw new Error(args.join(' '))};
const debug = console.debug.bind(console); const warn = console.warn.bind(console);
const App = { const App = {
e: { e: {
output: document.querySelector('#test-output'), output: document.querySelector('#test-output'),
selSql: document.querySelector('#sql-select'), selSql: document.querySelector('#sql-select'),
btnRun: document.querySelector('#sql-run'), btnRun: document.querySelector('#sql-run'),
btnClear: document.querySelector('#output-clear') btnRunNext: document.querySelector('#sql-run-next'),
btnRunRemaining: document.querySelector('#sql-run-remaining'),
btnClear: document.querySelector('#output-clear'),
btnReset: document.querySelector('#db-reset')
}, },
cache:{},
log: console.log.bind(console), log: console.log.bind(console),
warn: console.warn.bind(console), warn: console.warn.bind(console),
cls: function(){this.e.output.innerHTML = ''}, cls: function(){this.e.output.innerHTML = ''},
@ -34,6 +38,7 @@
if(cssClass) ln.classList.add(cssClass); if(cssClass) ln.classList.add(cssClass);
ln.append(document.createTextNode(args.join(' '))); ln.append(document.createTextNode(args.join(' ')));
this.e.output.append(ln); this.e.output.append(ln);
//this.e.output.lastElementChild.scrollIntoViewIfNeeded();
}, },
logHtml: function(...args){ logHtml: function(...args){
console.log(...args); console.log(...args);
@ -44,29 +49,38 @@
if(1) this.logHtml2('error', ...args); if(1) this.logHtml2('error', ...args);
}, },
openDb: function(fn){ openDb: function(fn, unlinkFirst=true){
if(this.pDb){ if(this.db && this.db.ptr){
toss("Already have an opened db."); toss("Already have an opened db.");
} }
const capi = this.sqlite3.capi, wasm = capi.wasm; const capi = this.sqlite3.capi, wasm = capi.wasm;
const stack = wasm.scopedAllocPush(); const stack = wasm.scopedAllocPush();
let pDb = 0; let pDb = 0;
try{ try{
/*if(unlinkFirst && fn && ':memory:'!==fn){
capi.sqlite3_wasm_vfs_unlink(fn);
}*/
const oFlags = capi.SQLITE_OPEN_CREATE | capi.SQLITE_OPEN_READWRITE; const oFlags = capi.SQLITE_OPEN_CREATE | capi.SQLITE_OPEN_READWRITE;
const ppDb = wasm.scopedAllocPtr(); const ppDb = wasm.scopedAllocPtr();
const rc = capi.sqlite3_open_v2(fn, ppDb, oFlags, null); const rc = capi.sqlite3_open_v2(fn, ppDb, oFlags, null);
if(rc) toss("sqlite3_open_v2() failed with code",rc);
pDb = wasm.getPtrValue(ppDb) pDb = wasm.getPtrValue(ppDb)
}finally{ }finally{
wasm.scopedAllocPop(stack); wasm.scopedAllocPop(stack);
} }
this.logHtml("Opened db:",capi.sqlite3_db_filename(pDb, 'main')); this.db = Object.create(null);
return this.pDb = pDb; this.db.filename = fn;
this.db.ptr = pDb;
this.logHtml("Opened db:",fn);
return this.db.ptr;
}, },
closeDb: function(){ closeDb: function(unlink=false){
if(this.pDb){ if(this.db && this.db.ptr){
this.sqlite3.capi.sqlite3_close_v2(this.pDb); this.sqlite3.capi.sqlite3_close_v2(this.db.ptr);
this.pDb = undefined; this.logHtml("Closed db",this.db.filename);
if(unlink) capi.sqlite3_wasm_vfs_unlink(this.db.filename);
this.db.ptr = this.db.filename = undefined;
} }
}, },
@ -84,13 +98,15 @@
} }
if(!r.ok) toss("Loading",infile,"failed:",r.statusText); if(!r.ok) toss("Loading",infile,"failed:",r.statusText);
txt = await r.text(); txt = await r.text();
const warning = document.querySelector('#warn-list');
if(warning) warning.remove();
}catch(e){ }catch(e){
this.logErr(e.message); this.logErr(e.message);
throw e; throw e;
}finally{ }finally{
this.blockControls(false); this.blockControls(false);
} }
const list = txt.split('\n'); const list = txt.split(/\n+/);
let opt; let opt;
if(0){ if(0){
opt = document.createElement('option'); opt = document.createElement('option');
@ -101,6 +117,7 @@
sel.appendChild(opt); sel.appendChild(opt);
} }
list.forEach(function(fn){ list.forEach(function(fn){
if(!fn) return;
opt = document.createElement('option'); opt = document.createElement('option');
opt.value = opt.innerText = fn; opt.value = opt.innerText = fn;
sel.appendChild(opt); sel.appendChild(opt);
@ -109,7 +126,8 @@
}, },
/** Fetch ./fn and return its contents as a Uint8Array. */ /** Fetch ./fn and return its contents as a Uint8Array. */
fetchFile: async function(fn){ fetchFile: async function(fn, cacheIt=false){
if(cacheIt && this.cache[fn]) return this.cache[fn];
this.logHtml("Fetching",fn,"..."); this.logHtml("Fetching",fn,"...");
let sql; let sql;
try { try {
@ -121,25 +139,28 @@
throw e; throw e;
} }
this.logHtml("Fetched",sql.length,"bytes from",fn); this.logHtml("Fetched",sql.length,"bytes from",fn);
if(cacheIt) this.cache[fn] = sql;
return sql; return sql;
}, }/*fetchFile()*/,
/** Throws if the given sqlite3 result code is not 0. */
checkRc: function(rc){ checkRc: function(rc){
if(rc){ if(this.db.ptr && rc){
toss("Prepare failed:",this.sqlite3.capi.sqlite3_errmsg(this.pDb)); toss("Prepare failed:",this.sqlite3.capi.sqlite3_errmsg(this.db.ptr));
} }
}, },
blockControls: function(block){ /** Disable or enable certain UI controls. */
[ blockControls: function(disable){
this.e.selSql, this.e.btnRun, this.e.btnClear document.querySelectorAll('.disable-during-eval').forEach((e)=>e.disabled = disable);
].forEach((e)=>e.disabled = block);
}, },
/** Fetch ./fn and eval it as an SQL blob. */ /** Fetch ./fn and eval it as an SQL blob. */
evalFile: async function(fn){ evalFile: async function(fn){
const sql = await this.fetchFile(fn); const sql = await this.fetchFile(fn);
this.logHtml("Running",fn,'...'); const banner = "========================================";
this.logHtml(banner,
"Running",fn,'('+sql.length,'bytes)...');
const capi = this.sqlite3.capi, wasm = capi.wasm; const capi = this.sqlite3.capi, wasm = capi.wasm;
let pStmt = 0, pSqlBegin; let pStmt = 0, pSqlBegin;
const stack = wasm.scopedAllocPush(); const stack = wasm.scopedAllocPush();
@ -147,35 +168,41 @@
metrics.prepTotal = metrics.stepTotal = 0; metrics.prepTotal = metrics.stepTotal = 0;
metrics.stmtCount = 0; metrics.stmtCount = 0;
this.blockControls(true); this.blockControls(true);
// Use setTimeout() so that the above log messages run before the loop starts. if(this.gotErr){
setTimeout((function(){ this.logErr("Cannot run ["+fn+"]: error cleanup is pending.");
metrics.timeStart = performance.now(); return;
}
// Run this async so that the UI can be updated for the above header...
const ff = function(resolve, reject){
metrics.evalFileStart = performance.now();
try { try {
let t; let t;
let sqlByteLen = sql.byteLength; let sqlByteLen = sql.byteLength;
const [ppStmt, pzTail] = wasm.scopedAllocPtr(2); const [ppStmt, pzTail] = wasm.scopedAllocPtr(2);
pSqlBegin = wasm.alloc( sqlByteLen + 1/*SQL + NUL*/); pSqlBegin = wasm.alloc( sqlByteLen + 1/*SQL + NUL*/) || toss("alloc(",sqlByteLen,") failed");
let pSql = pSqlBegin; let pSql = pSqlBegin;
const pSqlEnd = pSqlBegin + sqlByteLen; const pSqlEnd = pSqlBegin + sqlByteLen;
wasm.heap8().set(sql, pSql); wasm.heap8().set(sql, pSql);
wasm.setMemValue(pSql + sqlByteLen, 0); wasm.setMemValue(pSql + sqlByteLen, 0);
while(wasm.getMemValue(pSql,'i8')){ let breaker = 0;
pStmt = 0; while(pSql && wasm.getMemValue(pSql,'i8')){
wasm.setPtrValue(ppStmt, 0); wasm.setPtrValue(ppStmt, 0);
wasm.setPtrValue(pzTail, 0); wasm.setPtrValue(pzTail, 0);
t = performance.now(); t = performance.now();
let rc = capi.sqlite3_prepare_v3( let rc = capi.sqlite3_prepare_v3(
this.pDb, pSql, sqlByteLen, 0, ppStmt, pzTail this.db.ptr, pSql, sqlByteLen, 0, ppStmt, pzTail
); );
metrics.prepTotal += performance.now() - t; metrics.prepTotal += performance.now() - t;
this.checkRc(rc); this.checkRc(rc);
++metrics.stmtCount;
pStmt = wasm.getPtrValue(ppStmt); pStmt = wasm.getPtrValue(ppStmt);
pSql = wasm.getPtrValue(pzTail); pSql = wasm.getPtrValue(pzTail);
sqlByteLen = pSqlEnd - pSql; sqlByteLen = pSqlEnd - pSql;
if(!pStmt) continue/*empty statement*/; if(!pStmt) continue/*empty statement*/;
++metrics.stmtCount;
t = performance.now(); t = performance.now();
rc = capi.sqlite3_step(pStmt); rc = capi.sqlite3_step(pStmt);
capi.sqlite3_finalize(pStmt);
pStmt = 0;
metrics.stepTotal += performance.now() - t; metrics.stepTotal += performance.now() - t;
switch(rc){ switch(rc){
case capi.SQLITE_ROW: case capi.SQLITE_ROW:
@ -184,50 +211,88 @@
} }
} }
}catch(e){ }catch(e){
this.logErr(e.message); if(pStmt) capi.sqlite3_finalize(pStmt);
throw e; this.gotErr = e;
//throw e;
reject(e);
return;
}finally{ }finally{
wasm.dealloc(pSqlBegin); wasm.dealloc(pSqlBegin);
wasm.scopedAllocPop(stack); wasm.scopedAllocPop(stack);
this.blockControls(false); this.blockControls(false);
} }
metrics.timeEnd = performance.now(); metrics.evalFileEnd = performance.now();
metrics.timeTotal = (metrics.timeEnd - metrics.timeStart); metrics.evalTimeTotal = (metrics.evalFileEnd - metrics.evalFileStart);
this.logHtml("Metrics:");//,JSON.stringify(metrics, undefined, ' ')); this.logHtml("Metrics:");//,JSON.stringify(metrics, undefined, ' '));
this.logHtml("prepare() count:",metrics.stmtCount); this.logHtml("prepare() count:",metrics.stmtCount);
this.logHtml("Time in prepare_v2():",metrics.prepTotal,"ms", this.logHtml("Time in prepare_v2():",metrics.prepTotal,"ms",
"("+(metrics.prepTotal / metrics.stmtCount),"ms per prepare())"); "("+(metrics.prepTotal / metrics.stmtCount),"ms per prepare())");
this.logHtml("Time in step():",metrics.stepTotal,"ms", this.logHtml("Time in step():",metrics.stepTotal,"ms",
"("+(metrics.stepTotal / metrics.stmtCount),"ms per step())"); "("+(metrics.stepTotal / metrics.stmtCount),"ms per step())");
this.logHtml("Total runtime:",metrics.timeTotal,"ms"); this.logHtml("Total runtime:",metrics.evalTimeTotal,"ms");
this.logHtml("Overhead (time - prep - step):", this.logHtml("Overhead (time - prep - step):",
(metrics.timeTotal - metrics.prepTotal - metrics.stepTotal)+"ms"); (metrics.evalTimeTotal - metrics.prepTotal - metrics.stepTotal)+"ms");
}.bind(this)), 10); this.logHtml(banner,"End of",fn);
}, resolve(this);
}.bind(this);
let p;
if(1){
p = new Promise(function(res,rej){
setTimeout(()=>ff(res, rej), 50)/*give UI a chance to output the "running" banner*/;
});
}else{
p = new Promise(ff);
}
return p.catch((e)=>this.logErr("Error via evalFile("+fn+"):",e.message));
}/*evalFile()*/,
run: function(sqlite3){ run: function(sqlite3){
delete this.run;
this.sqlite3 = sqlite3; this.sqlite3 = sqlite3;
const capi = sqlite3.capi, wasm = capi.wasm; const capi = sqlite3.capi, wasm = capi.wasm;
this.logHtml("Loaded module:",capi.sqlite3_libversion(), capi.sqlite3_sourceid()); this.logHtml("Loaded module:",capi.sqlite3_libversion(), capi.sqlite3_sourceid());
this.logHtml("WASM heap size =",wasm.heap8().length); this.logHtml("WASM heap size =",wasm.heap8().length);
this.logHtml("WARNING: if the WASMFS/OPFS layer crashes, this page may", this.loadSqlList();
"become unresponsive and need to be closed and ",
"reloaded to recover.");
const pDir = capi.sqlite3_web_persistent_dir(); const pDir = capi.sqlite3_web_persistent_dir();
const dbFile = pDir ? pDir+"/speedtest.db" : ":memory:"; const dbFile = pDir ? pDir+"/speedtest.db" : ":memory:";
if(pDir){ if(!pDir){
// We initially need a clean db file, so... document.querySelector('#warn-opfs').remove();
capi.sqlite3_wasm_vfs_unlink(dbFile);
} }
this.openDb(dbFile); this.openDb(dbFile, !!pDir);
this.loadSqlList();
const who = this; const who = this;
this.e.btnClear.addEventListener('click', ()=>this.cls(), false); this.e.btnClear.addEventListener('click', ()=>this.cls(), false);
this.e.btnRun.addEventListener('click', function(){ this.e.btnRun.addEventListener('click', function(){
if(!who.e.selSql.value) return; if(!who.e.selSql.value) return;
who.evalFile(who.e.selSql.value); who.evalFile(who.e.selSql.value);
}, false); }, false);
} this.e.btnRunNext.addEventListener('click', function(){
++who.e.selSql.selectedIndex;
if(!who.e.selSql.value) return;
who.evalFile(who.e.selSql.value);
}, false);
this.e.btnReset.addEventListener('click', function(){
const fn = who.db.filename;
if(fn){
who.closeDb(true);
who.openDb(fn,true);
}
}, false);
this.e.btnRunRemaining.addEventListener('click', async function(){
let v = who.e.selSql.value;
const timeStart = performance.now();
while(v){
await who.evalFile(v);
if(who.gotError){
who.logErr("Error handling script",v,":",who.gotError.message);
break;
}
++who.e.selSql.selectedIndex;
v = who.e.selSql.value;
}
const timeTotal = performance.now() - timeStart;
who.logHtml("Run-remaining time:",timeTotal,"ms ("+(timeTotal/1000/60)+" minute(s))");
}, false);
}/*run()*/
}/*App*/; }/*App*/;
self.sqlite3TestModule.initSqlite3().then(function(theEmccModule){ self.sqlite3TestModule.initSqlite3().then(function(theEmccModule){

View File

@ -1,5 +1,5 @@
C Add\stest\sdescriptions\sto\sthe\sspeedtest1\s'--\sbegin'\smarkers\sfor\spotential\sdisplay\sby\sthe\sdownstream\sJS\scode\swhich\suses\sthose\smarkers. C Lots\sof\stweaking\sin\sbatch-runner.js.\sMinor\sinternal\sAPI\supdate\sin\sOO\s#1\sAPI.
D 2022-08-29T17:41:16.571 D 2022-08-29T18:58:38.025
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@ -474,7 +474,7 @@ F ext/userauth/user-auth.txt e6641021a9210364665fe625d067617d03f27b04
F ext/userauth/userauth.c 7f00cded7dcaa5d47f54539b290a43d2e59f4b1eb5f447545fa865f002fc80cb F ext/userauth/userauth.c 7f00cded7dcaa5d47f54539b290a43d2e59f4b1eb5f447545fa865f002fc80cb
F ext/wasm/EXPORTED_FUNCTIONS.fiddle db7a4602f043cf4a5e4135be3609a487f9f1c83f05778bfbdf93766be4541b96 F ext/wasm/EXPORTED_FUNCTIONS.fiddle db7a4602f043cf4a5e4135be3609a487f9f1c83f05778bfbdf93766be4541b96
F ext/wasm/EXPORTED_RUNTIME_METHODS.fiddle a004bd5eeeda6d3b28d16779b7f1a80305bfe009dfc7f0721b042967f0d39d02 F ext/wasm/EXPORTED_RUNTIME_METHODS.fiddle a004bd5eeeda6d3b28d16779b7f1a80305bfe009dfc7f0721b042967f0d39d02
F ext/wasm/GNUmakefile 61c0d9dcda9ca174907f87770c9440b26408dc415d2e11a3cbcae017358fd08c F ext/wasm/GNUmakefile cabfbb177d16c550442313416698e66dde575df27177d4ca3ccece5a66b37de4
F ext/wasm/README.md e1ee1e7c321c6a250bf78a84ca6f5882890a237a450ba5a0649c7a8399194c52 F ext/wasm/README.md e1ee1e7c321c6a250bf78a84ca6f5882890a237a450ba5a0649c7a8399194c52
F ext/wasm/api/EXPORTED_FUNCTIONS.sqlite3-api 77ef4bcf37e362b9ad61f9c175dfc0f1b3e571563fb311b96581cf422ee6a8ec F ext/wasm/api/EXPORTED_FUNCTIONS.sqlite3-api 77ef4bcf37e362b9ad61f9c175dfc0f1b3e571563fb311b96581cf422ee6a8ec
F ext/wasm/api/EXPORTED_RUNTIME_METHODS.sqlite3-api 1ec3c73e7d66e95529c3c64ac3de2470b0e9e7fbf7a5b41261c367cf4f1b7287 F ext/wasm/api/EXPORTED_RUNTIME_METHODS.sqlite3-api 1ec3c73e7d66e95529c3c64ac3de2470b0e9e7fbf7a5b41261c367cf4f1b7287
@ -483,14 +483,14 @@ F ext/wasm/api/post-js-footer.js b64319261d920211b8700004d08b956a6c285f3b0bba814
F ext/wasm/api/post-js-header.js 0e853b78db83cb1c06b01663549e0e8b4f377f12f5a2d9a4a06cb776c003880b F ext/wasm/api/post-js-header.js 0e853b78db83cb1c06b01663549e0e8b4f377f12f5a2d9a4a06cb776c003880b
F ext/wasm/api/sqlite3-api-cleanup.js 1a12e64060c2cb0defd34656a76a9b1d7ed58459c290249bb31567c806fd44de F ext/wasm/api/sqlite3-api-cleanup.js 1a12e64060c2cb0defd34656a76a9b1d7ed58459c290249bb31567c806fd44de
F ext/wasm/api/sqlite3-api-glue.js 67ca83974410961953eeaa1dfed3518530d68381729ed1d27f95122f5baeabd3 F ext/wasm/api/sqlite3-api-glue.js 67ca83974410961953eeaa1dfed3518530d68381729ed1d27f95122f5baeabd3
F ext/wasm/api/sqlite3-api-oo1.js 46a5151610076f45472c8d4fd31b728cc12e6fac4d44ea5c7cd1af087a906539 F ext/wasm/api/sqlite3-api-oo1.js 183e863eedaba547ffe4981ab95797813b60da46749992bca400d2646e5ccd82
F ext/wasm/api/sqlite3-api-opfs.js 011799db398157cbd254264b6ebae00d7234b93d0e9e810345f213a5774993c0 F ext/wasm/api/sqlite3-api-opfs.js 011799db398157cbd254264b6ebae00d7234b93d0e9e810345f213a5774993c0
F ext/wasm/api/sqlite3-api-prologue.js 2d5c5d3355f55eefe51922cec5bfedbec0f8300db98a17685ab7a34a03953c7a F ext/wasm/api/sqlite3-api-prologue.js 2d5c5d3355f55eefe51922cec5bfedbec0f8300db98a17685ab7a34a03953c7a
F ext/wasm/api/sqlite3-api-worker1.js 73579555563b789785ae83724014eaf31811073aad9be6596c8336ffb51edd71 F ext/wasm/api/sqlite3-api-worker1.js 73579555563b789785ae83724014eaf31811073aad9be6596c8336ffb51edd71
F ext/wasm/api/sqlite3-wasi.h 25356084cfe0d40458a902afb465df8c21fc4152c1d0a59b563a3fba59a068f9 F ext/wasm/api/sqlite3-wasi.h 25356084cfe0d40458a902afb465df8c21fc4152c1d0a59b563a3fba59a068f9
F ext/wasm/api/sqlite3-wasm.c 0d81282eaeff2a6e9fc5c28a388c5c5b45cf25a9393992fa511ac009b27df982 F ext/wasm/api/sqlite3-wasm.c 0d81282eaeff2a6e9fc5c28a388c5c5b45cf25a9393992fa511ac009b27df982
F ext/wasm/batch-runner.html f9068c4b4222d0c11ba0590391892e4d7576ef1a4fb76974ba0bd3b80c6217f9 F ext/wasm/batch-runner.html e5c3edd4a6c9359f6d9e6c99cb5f87f09007d98fa1c705ed3efa370abcd4323e
F ext/wasm/batch-runner.js 57f325e40812a89f8d47c918963f278d7a249d158cf0d245d75e74577af638c8 F ext/wasm/batch-runner.js 84a465acde760de81d0372415cce56737799876395a878c44a7d3ce5dfe29e39
F ext/wasm/common/SqliteTestUtil.js eb96275bed43fdb364b7d65bcded0ca5e22aaacff120d593d1385f852f486247 F ext/wasm/common/SqliteTestUtil.js eb96275bed43fdb364b7d65bcded0ca5e22aaacff120d593d1385f852f486247
F ext/wasm/common/emscripten.css 3d253a6fdb8983a2ac983855bfbdd4b6fa1ff267c28d69513dd6ef1f289ada3f F ext/wasm/common/emscripten.css 3d253a6fdb8983a2ac983855bfbdd4b6fa1ff267c28d69513dd6ef1f289ada3f
F ext/wasm/common/testing.css 572cf1ffae0b6eb7ca63684d3392bf350217a07b90e7a896e4fa850700c989b0 F ext/wasm/common/testing.css 572cf1ffae0b6eb7ca63684d3392bf350217a07b90e7a896e4fa850700c989b0
@ -2012,8 +2012,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
P 11f3ed61150c5940da6c157e5063e70c3aa0628dfd0023c47bb65b00af74ab1f P e5b7006f0f57f10a490d7eaeb7df77251a2f684602fed8ff161d8ce60033e7bc
R 2ae8456ec9776838052861c3fb138f8f R ac09921b66efbf8cc7311954674841d9
U stephan U stephan
Z 47d6dbc110cfca896ac7235ddcb7f7bf Z 16cfbad53a69907d89a4919845ccdd35
# Remove this line to create a well-formed Fossil manifest. # Remove this line to create a well-formed Fossil manifest.

View File

@ -1 +1 @@
e5b7006f0f57f10a490d7eaeb7df77251a2f684602fed8ff161d8ce60033e7bc 24b82b9504db3d8e1335c2300b133f897dc1a541026dc24be5b0ffd8be66d977