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

Merge kv-vfs branch into fiddle-opfs. Adjust various JS APIs and apps to deal with the new method of handling kvvfs. Adjust speedtest1 JS build to include sqlite3-api.js so that it can use kvvfs and opfs VFSes. Permit passing of the vfs as a URL parameter to certain demo/test apps. Milestone: speedtest-worker.html?vfs=opfs runs with the standalone OPFS impl.

FossilOrigin-Name: ec09f32f7ae2249aaf27388ad2062982afa8bbbb5f88d236d6d9068bf33ad93d
This commit is contained in:
stephan
2022-09-19 13:16:35 +00:00
parent 5ef7f04775
commit b5ae85eca2
13 changed files with 132 additions and 193 deletions

View File

@ -53,7 +53,8 @@ SQLITE_OPT = \
-DSQLITE_OMIT_UTF16 \ -DSQLITE_OMIT_UTF16 \
-DSQLITE_OMIT_SHARED_CACHE \ -DSQLITE_OMIT_SHARED_CACHE \
-DSQLITE_THREADSAFE=0 \ -DSQLITE_THREADSAFE=0 \
-DSQLITE_TEMP_STORE=3 -DSQLITE_TEMP_STORE=3 \
-DSQLITE_OS_KV_OPTIONAL=1
#SQLITE_OPT += -DSQLITE_ENABLE_MEMSYS5 #SQLITE_OPT += -DSQLITE_ENABLE_MEMSYS5
# ^^^ MEMSYS5 is hypothetically useful for non-Emscripten builds but # ^^^ MEMSYS5 is hypothetically useful for non-Emscripten builds but
# requires adding more infrastructure and fixing one spot in the # requires adding more infrastructure and fixing one spot in the
@ -192,16 +193,19 @@ emcc.cflags += -I. -I$(dir.top) # $(SQLITE_OPT)
######################################################################## ########################################################################
# emcc flags specific to building the final .js/.wasm file... # emcc flags specific to building the final .js/.wasm file...
emcc.jsflags := -fPIC emcc.jsflags := -fPIC
emcc.jsflags := --minify 0 emcc.jsflags += --minify 0
emcc.jsflags += --no-entry emcc.jsflags += --no-entry
emcc.jsflags += -sMODULARIZE emcc.jsflags += -sMODULARIZE
emcc.jsflags += -sSTRICT_JS emcc.jsflags += -sSTRICT_JS
emcc.jsflags += -sDYNAMIC_EXECUTION=0 emcc.jsflags += -sDYNAMIC_EXECUTION=0
emcc.jsflags += -sNO_POLYFILL emcc.jsflags += -sNO_POLYFILL
emcc.jsflags += -sEXPORTED_FUNCTIONS=@$(dir.wasm)/EXPORTED_FUNCTIONS.api emcc.jsflags += -sEXPORTED_FUNCTIONS=@$(dir.wasm)/EXPORTED_FUNCTIONS.api
emcc.jsflags += -sEXPORTED_RUNTIME_METHODS=FS,wasmMemory,allocateUTF8OnStack emcc.exportedRuntimeMethods := \
-sEXPORTED_RUNTIME_METHODS=FS,wasmMemory,allocateUTF8OnStack
# FS ==> stdio/POSIX I/O proxies
# wasmMemory ==> required by our code for use with -sIMPORTED_MEMORY # wasmMemory ==> required by our code for use with -sIMPORTED_MEMORY
# allocateUTF8OnStack => for kvvp internals # allocateUTF8OnStack => for kvvfs internals
emcc.jsflags += $(emcc.exportedRuntimeMethods)
emcc.jsflags += -sUSE_CLOSURE_COMPILER=0 emcc.jsflags += -sUSE_CLOSURE_COMPILER=0
emcc.jsflags += -sIMPORTED_MEMORY emcc.jsflags += -sIMPORTED_MEMORY
emcc.environment := -sENVIRONMENT=web emcc.environment := -sENVIRONMENT=web
@ -332,17 +336,23 @@ speedtest1-common.eflags := -g $(emcc_opt)
speedtest1.eflags := speedtest1.eflags :=
speedtest1.eflags += -sENVIRONMENT=web speedtest1.eflags += -sENVIRONMENT=web
speedtest1-common.eflags += -sINVOKE_RUN=0 speedtest1-common.eflags += -sINVOKE_RUN=0
#speedtest1-common.eflags += --no-entry speedtest1-common.eflags += --no-entry
speedtest1-common.eflags += -flto #speedtest1-common.eflags += -flto
speedtest1-common.eflags += -sABORTING_MALLOC speedtest1-common.eflags += -sABORTING_MALLOC
speedtest1-common.eflags += -sINITIAL_MEMORY=128450560 speedtest1-common.eflags += -sINITIAL_MEMORY=128450560
speedtest1-common.eflags += -sSTRICT_JS speedtest1-common.eflags += -sSTRICT_JS
speedtest1-common.eflags += -sMODULARIZE speedtest1-common.eflags += -sMODULARIZE
speedtest1-common.eflags += -Wno-limited-postlink-optimizations speedtest1-common.eflags += -Wno-limited-postlink-optimizations
speedtest1-common.eflags += -sEXPORTED_FUNCTIONS=_main,_malloc,_free speedtest1-common.eflags += -sEXPORTED_FUNCTIONS=@$(dir.wasm)/EXPORTED_FUNCTIONS.speedtest1
speedtest1-common.eflags += $(emcc.exportedRuntimeMethods)
speedtest1-common.eflags += -sALLOW_TABLE_GROWTH
speedtest1-common.eflags += -sDYNAMIC_EXECUTION=0 speedtest1-common.eflags += -sDYNAMIC_EXECUTION=0
speedtest1-common.eflags += --minify 0 speedtest1-common.eflags += --minify 0
speedtest1-common.eflags += -sEXPORT_NAME=sqlite3Speedtest1InitModule speedtest1-common.eflags += -sEXPORT_NAME=sqlite3Speedtest1InitModule
speedtest1-common.eflags += --post-js=$(post-js.js)
ifneq (0,$(enable_bigint))
speedtest1-common.eflags += -sWASM_BIGINT
endif
speedtest1.exit-runtime0 := -sEXIT_RUNTIME=0 speedtest1.exit-runtime0 := -sEXIT_RUNTIME=0
speedtest1.exit-runtime1 := -sEXIT_RUNTIME=1 speedtest1.exit-runtime1 := -sEXIT_RUNTIME=1
# Re -sEXIT_RUNTIME=1 vs 0: if it's 1 and speedtest1 crashes, we get # Re -sEXIT_RUNTIME=1 vs 0: if it's 1 and speedtest1 crashes, we get
@ -362,25 +372,29 @@ speedtest1.exit-runtime1 := -sEXIT_RUNTIME=1
# -sEXIT_RUNTIME=1 but we need EXIT_RUNTIME=0 for the worker-based app # -sEXIT_RUNTIME=1 but we need EXIT_RUNTIME=0 for the worker-based app
# which runs speedtest1 multiple times. # which runs speedtest1 multiple times.
EXPORTED_FUNCTIONS.speedtest1: EXPORTED_FUNCTIONS.api
{ echo _wasm_main; cat EXPORTED_FUNCTIONS.api; } > $@
CLEAN_FILES += EXPORTED_FUNCTIONS.speedtest1
speedtest1.js := speedtest1.js speedtest1.js := speedtest1.js
speedtest1.wasm := $(subst .js,.wasm,$(speedtest1.js)) speedtest1.wasm := $(subst .js,.wasm,$(speedtest1.js))
speedtest1.cflags := \ speedtest1.cflags := \
-I. -I.. -I$(dir.top) \ -I. -I.. -I$(dir.top) \
-DSQLITE_SPEEDTEST1_WASM -DSQLITE_SPEEDTEST1_WASM
speedtest1.cs := $(speedtest1.c) $(sqlite3-wasm.c) $(jaccwabyt_test.c)
$(speedtest1.js): emcc.cflags+= $(speedtest1.js): emcc.cflags+=
# speedtest1 notes re. sqlite3-wasm.o vs sqlite3-wasm.c: building against # speedtest1 notes re. sqlite3-wasm.o vs sqlite3-wasm.c: building against
# the latter (predictably) results in a slightly faster binary, but we're # the latter (predictably) results in a slightly faster binary, but we're
# close enough to the target speed requirements that the 500ms makes a # close enough to the target speed requirements that the 500ms makes a
# difference. # difference.
$(speedtest1.js): $(speedtest1.c) $(sqlite3-wasm.c) $(MAKEFILE) $(sqlite3.c) $(speedtest1.js): $(MAKEFILE) $(speedtest1.cs) $(post-js.js) \
EXPORTED_FUNCTIONS.speedtest1
@echo "Building $@ ..." @echo "Building $@ ..."
$(emcc.bin) \ $(emcc.bin) \
$(speedtest1.eflags) $(speedtest1-common.eflags) $(speedtest1.cflags) \ $(speedtest1.eflags) $(speedtest1-common.eflags) $(speedtest1.cflags) \
$(SQLITE_OPT) \ $(SQLITE_OPT) \
$(speedtest1.exit-runtime0) \ $(speedtest1.exit-runtime0) \
'-DSQLITE_DEFAULT_UNIX_VFS="unix-none"' \ '-DSQLITE_DEFAULT_UNIX_VFS="unix-none"' \
-o $@ $(speedtest1.c) $(sqlite3-wasm.c) -lm -o $@ $(speedtest1.cs) -lm
$(maybe-wasm-strip) $(speedtest1.wasm) $(maybe-wasm-strip) $(speedtest1.wasm)
ls -la $@ $(speedtest1.wasm) ls -la $@ $(speedtest1.wasm)
@ -434,7 +448,6 @@ oz:
######################################################################## ########################################################################
# Sub-makes... # Sub-makes...
include kvvfs.make
######################################################################## ########################################################################
# Some platforms do not support the WASMFS build. Raspberry Pi OS is one # Some platforms do not support the WASMFS build. Raspberry Pi OS is one

View File

@ -749,6 +749,8 @@ self.sqlite3ApiBootstrap = function sqlite3ApiBootstrap(
}; };
/** /**
Experimental and subject to change or removal.
Returns true if sqlite3.capi.sqlite3_web_persistent_dir() is a Returns true if sqlite3.capi.sqlite3_web_persistent_dir() is a
non-empty string and the given name starts with (that string + non-empty string and the given name starts with (that string +
'/'), else returns false. '/'), else returns false.

View File

@ -42,8 +42,8 @@
.toolbar > * { margin: 0.25em; } .toolbar > * { margin: 0.25em; }
fieldset { border-radius: 0.5em; } fieldset { border-radius: 0.5em; }
</style> </style>
<script src="sqlite3-kvvfs.js"></script> <script src="sqlite3.js"></script>
<script src="common/SqliteTestUtil.js"></script> <script src="common/SqliteTestUtil.js"></script>
<script src="kvvfs1.js"></script> <script src="demo-kvvfs1.js"></script>
</body> </body>
</html> </html>

View File

@ -10,8 +10,9 @@
*********************************************************************** ***********************************************************************
A basic test script for sqlite3-kvvfs.wasm. This file must be run in A basic test script for sqlite3.wasm with kvvfs support. This file
main JS thread and sqlite3-kvvfs.js must have been loaded before it. must be run in main JS thread and sqlite3.js must have been loaded
before it.
*/ */
'use strict'; 'use strict';
(function(){ (function(){
@ -49,7 +50,7 @@
log("Loaded module:",capi.sqlite3_libversion(), capi.sqlite3_sourceid()); log("Loaded module:",capi.sqlite3_libversion(), capi.sqlite3_sourceid());
T.assert( 0 !== capi.sqlite3_vfs_find(null) ); T.assert( 0 !== capi.sqlite3_vfs_find(null) );
if(!capi.sqlite3_vfs_find('kvvfs')){ if(!capi.sqlite3_vfs_find('kvvfs')){
warn("This build is not kvvfs-capable."); error("This build is not kvvfs-capable.");
return; return;
} }

View File

@ -51,9 +51,10 @@
<li><a href='speedtest1.html'>speedtest1</a>: a main-thread WASM build of speedtest1.</li> <li><a href='speedtest1.html'>speedtest1</a>: a main-thread WASM build of speedtest1.</li>
<li><a href='speedtest1-worker.html'>speedtest1-worker</a>: an interactive Worker-thread variant of speedtest1.</li> <li><a href='speedtest1-worker.html'>speedtest1-worker</a>: an interactive Worker-thread variant of speedtest1.</li>
<li><a href='speedtest1-wasmfs.html'>speedtest1-wasmfs</a>: a variant of speedtest1 built solely for the wasmfs/opfs feature.</li> <li><a href='speedtest1-wasmfs.html'>speedtest1-wasmfs</a>: a variant of speedtest1 built solely for the wasmfs/opfs feature.</li>
<li><a href='speedtest1-kvvfs.html'>speedtest1-kvvfs</a>: a variant of speedtest1 built solely for the kv-vfs feature.</li> <li><a href='speedtest1.html?vfs=kvvfs'>speedtest1-kvvfs</a>: speedtest1 with the kvvfs.</li>
<li><a href='kvvfs1.html'>kvvfs1</a>: very basic demo of using the key-value vfs for storing <li><a href='demo-kvvfs1.html'>demo-kvvfs1</a>: very basic
a persistent db in JS localStorage or sessionStorage.</li> demo of using the key-value vfs for storing a persistent db
in JS localStorage or sessionStorage.</li>
<li><a href='scratchpad-wasmfs-main.html'>scratchpad-wasmfs-main</a>: <li><a href='scratchpad-wasmfs-main.html'>scratchpad-wasmfs-main</a>:
experimenting with WASMFS/OPFS-based persistence. Maintenance experimenting with WASMFS/OPFS-based persistence. Maintenance
reminder: we cannot currently (2022-09-15) load WASMFS in a reminder: we cannot currently (2022-09-15) load WASMFS in a

View File

@ -1,112 +0,0 @@
#!/usr/bin/make
#^^^^ help emacs select makefile mode
#
# This is a sub-make for building a standalone kvvfs-based
# sqlite3.wasm. It is intended to be "include"d from the main
# GNUMakefile.
#
# Notable potential TODOs:
#
# - Trim down a custom sqlite3-api.js for this build. We can elimate
# the jaccwabyt dependency, for example, because this build won't
# make use of the VFS bits. Similarly, we can eliminate or replace
# parts of the OO1 API, or provide a related API which manages
# singletons of the localStorage/sessionStorage instances.
#
########################################################################
MAKEFILE.kvvfs := $(lastword $(MAKEFILE_LIST))
kvvfs.js := sqlite3-kvvfs.js
kvvfs.wasm := sqlite3-kvvfs.wasm
kvvfs.wasm.c := $(dir.api)/sqlite3-wasm.c
CLEAN_FILES += $(kvvfs.js) $(kvvfs.wasm)
########################################################################
# emcc flags for .c/.o/.wasm.
kvvfs.flags =
#kvvfs.flags += -v # _very_ loud but also informative about what it's doing
########################################################################
# emcc flags for .c/.o.
kvvfs.cflags :=
kvvfs.cflags += -std=c99 -fPIC -g
kvvfs.cflags += -I. -I$(dir.top)
kvvfs.cflags += -DSQLITE_OS_KV=1 $(SQLITE_OPT)
kvvfs.extra.c :=
ifeq (1,1)
# To get testing1.js to run with $(kvvfs.js) we need...
kvvfs.extra.c += $(jaccwabyt_test.c)
endif
########################################################################
# emcc flags specific to building the final .js/.wasm file...
kvvfs.jsflags := -fPIC
kvvfs.jsflags += --no-entry
kvvfs.jsflags += --minify 0
kvvfs.jsflags += -sENVIRONMENT=web
kvvfs.jsflags += -sMODULARIZE
kvvfs.jsflags += -sSTRICT_JS
kvvfs.jsflags += -sDYNAMIC_EXECUTION=0
kvvfs.jsflags += -sNO_POLYFILL
ifeq (,$(kvvfs.extra.c))
kvvfs.jsflags += -sEXPORTED_FUNCTIONS=@$(dir.api)/EXPORTED_FUNCTIONS.sqlite3-api
else
# need more exports for jaccwabyt test code...
kvvfs.jsflags += -sEXPORTED_FUNCTIONS=@$(dir.wasm)/EXPORTED_FUNCTIONS.api
endif
kvvfs.jsflags += -sEXPORTED_RUNTIME_METHODS=FS,wasmMemory,allocateUTF8OnStack
# wasmMemory ==> for -sIMPORTED_MEMORY
# allocateUTF8OnStack ==> kvvfs internals
kvvfs.jsflags += -sUSE_CLOSURE_COMPILER=0
kvvfs.jsflags += -sIMPORTED_MEMORY
#kvvfs.jsflags += -sINITIAL_MEMORY=13107200
#kvvfs.jsflags += -sTOTAL_STACK=4194304
kvvfs.jsflags += -sEXPORT_NAME=sqlite3InitModule
kvvfs.jsflags += -sGLOBAL_BASE=4096 # HYPOTHETICALLY keep func table indexes from overlapping w/ heap addr.
kvvfs.jsflags += --post-js=$(post-js.js)
#kvvfs.jsflags += -sFILESYSTEM=0 # only for experimentation. sqlite3 needs the FS API
# Perhaps the kvvfs build doesn't?
#kvvfs.jsflags += -sABORTING_MALLOC
kvvfs.jsflags += -sALLOW_MEMORY_GROWTH
kvvfs.jsflags += -sALLOW_TABLE_GROWTH
kvvfs.jsflags += -Wno-limited-postlink-optimizations
# ^^^^^ it likes to warn when we have "limited optimizations" via the -g3 flag.
kvvfs.jsflags += -sERROR_ON_UNDEFINED_SYMBOLS=0
kvvfs.jsflags += -sLLD_REPORT_UNDEFINED
#kvvfs.jsflags += --import-undefined
kvvfs.jsflags += -sMEMORY64=0
ifneq (0,$(enable_bigint))
kvvfs.jsflags += -sWASM_BIGINT
endif
$(kvvfs.js): $(kvvfs.wasm.c) $(sqlite3.c) $(kvvfs.extra.c) \
EXPORTED_FUNCTIONS.api $(MAKEFILE) $(MAKEFILE.kvvfs) \
$(post-js.js)
@echo "Building $@ ..."
$(emcc.bin) -o $@ $(emcc_opt) $(emcc.flags) \
$(SQLITE_OPT) \
$(kvvfs.cflags) $(kvvfs.jsflags) $(kvvfs.wasm.c) $(kvvfs.extra.c)
chmod -x $(kvvfs.wasm)
$(maybe-wasm-strip) $(kvvfs.wasm)
@ls -la $@ $(kvvfs.wasm)
kvvfs: $(kvvfs.js)
all: kvvfs
########################################################################
# speedtest1-kvvfs
speedtest1-kvvfs.js := speedtest1-kvvfs.js
speedtest1-kvvfs.wasm := speedtest1-kvvfs.wasm
CLEAN_FILES += $(speedtest1-kvvfs.js) $(speedtest1-kvvfs.wasm)
$(speedtest1-kvvfs.js): $(speedtest1.c) $(sqlite3-wasm.c) $(sqlite3.c) $(MAKEFILE.kvvfs)
$(emcc.bin) \
$(speedtest1.eflags) $(speedtest1-common.eflags) $(speedtest1.cflags) \
$(SQLITE_OPT) \
$(speedtest1.exit-runtime1) \
$(kvvfs.cflags) \
-o $@ $(speedtest1.c) $(sqlite3-wasm.c) -lm
$(maybe-wasm-strip) $(speedtest1-kvvfs.wasm)
ls -la $@ $(speedtest1-kvvfs.wasm)
speedtest1: $(speedtest1-kvvfs.js)

View File

@ -139,7 +139,7 @@
"Give it time..."); "Give it time...");
logList.length = 0; logList.length = 0;
setTimeout(function(){ setTimeout(function(){
wasm.xCall('__main_argc_argv', argv.length, wasm.xCall('wasm_main', argv.length,
wasm.scopedAllocMainArgv(argv)); wasm.scopedAllocMainArgv(argv));
wasm.scopedAllocPop(scope); wasm.scopedAllocPop(scope);
if(pDir) unlink(dbFile); if(pDir) unlink(dbFile);

View File

@ -30,7 +30,9 @@
<div id='toolbar'> <div id='toolbar'>
<div id='toolbar-select'> <div id='toolbar-select'>
<select id='select-flags' size='10' multiple></select> <select id='select-flags' size='10' multiple></select>
<div>TODO? Options which require values are not represented here.</div> <div>The following flags can be passed as URL parameters:
vfs=NAME, size=N
</div>
</div> </div>
<div class='toolbar-inner-vertical'> <div class='toolbar-inner-vertical'>
<div id='toolbar-selected-flags'></div> <div id='toolbar-selected-flags'></div>
@ -124,6 +126,7 @@
justify-content: flex-start; justify-content: flex-start;
} }
</style> </style>
<script src="common/SqliteTestUtil.js"></script>
<script>(function(){ <script>(function(){
'use strict'; 'use strict';
const E = (sel)=>document.querySelector(sel); const E = (sel)=>document.querySelector(sel);
@ -167,7 +170,7 @@
return str+a.join('&nbsp;'); return str+a.join('&nbsp;');
}; };
const W = new Worker("speedtest1-worker.js"); const W = new Worker("speedtest1-worker.js"+self.location.search);
const mPost = function(msgType,payload){ const mPost = function(msgType,payload){
W.postMessage({type: msgType, data: payload}); W.postMessage({type: msgType, data: payload});
}; };
@ -177,7 +180,16 @@
const eLinkMainThread = E('#link-main-thread'); const eLinkMainThread = E('#link-main-thread');
const eLinkWasmfs = E('#link-wasmfs'); const eLinkWasmfs = E('#link-wasmfs');
const eLinkKvvfs = E('#link-kvvfs'); const eLinkKvvfs = E('#link-kvvfs');
const getSelectedFlags = ()=>Array.prototype.map.call(eFlags.selectedOptions, (v)=>v.value); const urlParams = new URL(self.location.href).searchParams;
const getSelectedFlags = ()=>{
const f = Array.prototype.map.call(eFlags.selectedOptions, (v)=>v.value);
[
'size', 'vfs'
].forEach(function(k){
if(urlParams.has(k)) f.push('--'+k, urlParams.get(k));
});
return f;
};
const updateSelectedFlags = function(){ const updateSelectedFlags = function(){
eSelectedFlags.innerText = ''; eSelectedFlags.innerText = '';
const flags = getSelectedFlags(); const flags = getSelectedFlags();

View File

@ -6,7 +6,7 @@
returns the name of the dir on which OPFS is mounted, else it returns returns the name of the dir on which OPFS is mounted, else it returns
an empty string. an empty string.
*/ */
const opfsDir = function f(wasmUtil){ const wasmfsDir = function f(wasmUtil){
if(undefined !== f._) return f._; if(undefined !== f._) return f._;
const pdir = '/persistent'; const pdir = '/persistent';
if( !self.FileSystemHandle if( !self.FileSystemHandle
@ -27,7 +27,7 @@
return f._ = ""; return f._ = "";
} }
}; };
opfsDir._ = undefined; wasmfsDir._ = undefined;
const mPost = function(msgType,payload){ const mPost = function(msgType,payload){
postMessage({type: msgType, data: payload}); postMessage({type: msgType, data: payload});
@ -52,7 +52,7 @@
]; ];
App.logBuffer.length = 0; App.logBuffer.length = 0;
mPost('run-start', [...argv]); mPost('run-start', [...argv]);
App.wasm.xCall('__main_argc_argv', argv.length, App.wasm.xCall('wasm_main', argv.length,
App.wasm.scopedAllocMainArgv(argv)); App.wasm.scopedAllocMainArgv(argv));
}catch(e){ }catch(e){
mPost('error',e.message); mPost('error',e.message);
@ -79,20 +79,18 @@
printErr: logErr, printErr: logErr,
setStatus: (text)=>mPost('load-status',text) setStatus: (text)=>mPost('load-status',text)
}; };
self.sqlite3Speedtest1InitModule(EmscriptenModule).then(function(EmscriptenModule){ self.sqlite3Speedtest1InitModule(EmscriptenModule).then(function(EModule){
const S = EModule.sqlite3;
log("Module inited."); log("Module inited.");
App.wasm = { return S.installOpfsVfs()
exports: EmscriptenModule.asm, .catch((e)=>console.warn(e.message))
alloc: (n)=>EmscriptenModule._malloc(n), .then(()=>{
dealloc: (m)=>EmscriptenModule._free(m), App.unlink = S.capi.wasm.xWrap("sqlite3_wasm_vfs_unlink", "int", ["string"]);
memory: EmscriptenModule.asm.memory || EmscriptenModule.wasmMemory App.pDir = wasmfsDir(S.wasm);
}; App.wasm = S.capi.wasm;
//console.debug('wasm =',wasm); //if(App.pDir) log("Persistent storage:",pDir);
self.WhWasmUtilInstaller(App.wasm); //else log("Using transient storage.");
App.unlink = App.wasm.xWrap("sqlite3_wasm_vfs_unlink", "int", ["string"]);
App.pDir = opfsDir(App.wasm);
if(App.pDir) log("Persistent storage:",pDir);
else log("Using transient storage.");
mPost('ready',true); mPost('ready',true);
}); });
});
})(); })();

View File

@ -45,7 +45,7 @@
returns the name of the dir on which OPFS is mounted, else it returns returns the name of the dir on which OPFS is mounted, else it returns
an empty string. an empty string.
*/ */
const opfsDir = function f(wasmUtil){ const wasmfsDir = function f(wasmUtil){
if(undefined !== f._) return f._; if(undefined !== f._) return f._;
const pdir = '/persistent'; const pdir = '/persistent';
if( !self.FileSystemHandle if( !self.FileSystemHandle
@ -66,7 +66,7 @@
return f._ = ""; return f._ = "";
} }
}; };
opfsDir._ = undefined; wasmfsDir._ = undefined;
const eOut = document.querySelector('#test-output'); const eOut = document.querySelector('#test-output');
const log2 = function(cssClass,...args){ const log2 = function(cssClass,...args){
@ -92,28 +92,41 @@
logList.push('ERROR: '+args.join(' ')); logList.push('ERROR: '+args.join(' '));
}; };
const runTests = function(EmscriptenModule){ const runTests = function(sqlite3){
console.log("Module inited.",EmscriptenModule); const capi = sqlite3.capi, wasm = capi.wasm;
const wasm = { //console.debug('sqlite3 =',sqlite3);
exports: EmscriptenModule.asm,
alloc: (n)=>EmscriptenModule._malloc(n),
dealloc: (m)=>EmscriptenModule._free(m),
memory: EmscriptenModule.asm.memory || EmscriptenModule.wasmMemory
};
//console.debug('wasm =',wasm);
self.WhWasmUtilInstaller(wasm);
const unlink = wasm.xWrap("sqlite3_wasm_vfs_unlink", "int", ["string"]); const unlink = wasm.xWrap("sqlite3_wasm_vfs_unlink", "int", ["string"]);
const pDir = opfsDir(wasm); const pDir = wasmfsDir(wasm);
if(pDir){ if(pDir){
console.warn("Persistent storage:",pDir); console.warn("Persistent storage:",pDir);
} }
const scope = wasm.scopedAllocPush(); const scope = wasm.scopedAllocPush();
const dbFile = 0 ? "" : pDir+"/speedtest1.db"; let dbFile = pDir+"/speedtest1.db";
const urlArgs = self.SqliteTestUtil.processUrlArgs(); const urlParams = self.SqliteTestUtil.processUrlArgs();
const argv = ["speedtest1"]; const argv = ["speedtest1"];
if(urlArgs.flags){ if('string'===typeof urlParams.vfs){
if(!capi.sqlite3_vfs_find(urlParams.vfs)){
log2('error',"Unknown VFS:",urlParams.vfs);
return;
}
argv.push("--vfs", urlParams.vfs);
log2('',"Using VFS:",urlParams.vfs);
if('kvvfs' === urlParams.vfs){
urlParams.size = 1;
dbFile = 'session';
log2('',"kvvfs VFS: forcing --size 1 and filename 'session'");
capi.sqlite3_web_kvvfs_clear('session');
}
}
[
'size'
].forEach(function(k){
const v = urlParams[k];
if(v) argv.push('--'+k, urlParams[k]);
});
if(urlParams.flags){
// transform flags=a,b,c to ["--a", "--b", "--c"] // transform flags=a,b,c to ["--a", "--b", "--c"]
argv.push(...(urlArgs.flags.split(',').map((v)=>'--'+v))); argv.push(...(urlParams.flags.split(',').map((v)=>'--'+v)));
}else{ }else{
argv.push( argv.push(
"--singlethread", "--singlethread",
@ -134,7 +147,7 @@
"Give it time..."); "Give it time...");
logList.length = 0; logList.length = 0;
setTimeout(function(){ setTimeout(function(){
wasm.xCall('__main_argc_argv', argv.length, wasm.xCall('wasm_main', argv.length,
wasm.scopedAllocMainArgv(argv)); wasm.scopedAllocMainArgv(argv));
wasm.scopedAllocPop(scope); wasm.scopedAllocPop(scope);
if(pDir) unlink(dbFile); if(pDir) unlink(dbFile);
@ -145,8 +158,11 @@
self.sqlite3TestModule.print = log; self.sqlite3TestModule.print = log;
self.sqlite3TestModule.printErr = logErr; self.sqlite3TestModule.printErr = logErr;
sqlite3Speedtest1InitModule(self.sqlite3TestModule).then(function(M){ sqlite3Speedtest1InitModule(self.sqlite3TestModule)
setTimeout(()=>runTests(M), 100); .then((EmscriptenModule)=>{
return EmscriptenModule.sqlite3.installOpfsVfs()
.catch((e)=>{console.warn(e.message)})
.then(()=>runTests(EmscriptenModule.sqlite3));
}); });
})(); })();
</script> </script>

View File

@ -1,5 +1,5 @@
C speedtest1:\sadd\s--vfs\sNAME\sflag\sand\seliminate\scode\sduplication\sin\sargc\ssize\sverification\sfor\sall\sflags\swhich\stake\sa\svalue. C Merge\skv-vfs\sbranch\sinto\sfiddle-opfs.\sAdjust\svarious\sJS\sAPIs\sand\sapps\sto\sdeal\swith\sthe\snew\smethod\sof\shandling\skvvfs.\sAdjust\sspeedtest1\sJS\sbuild\sto\sinclude\ssqlite3-api.js\sso\sthat\sit\scan\suse\skvvfs\sand\sopfs\sVFSes.\sPermit\spassing\sof\sthe\svfs\sas\sa\sURL\sparameter\sto\scertain\sdemo/test\sapps.\sMilestone:\sspeedtest-worker.html?vfs=opfs\sruns\swith\sthe\sstandalone\sOPFS\simpl.
D 2022-09-19T11:47:38.781 D 2022-09-19T13:16:35.953
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 7fb73f7150ab79d83bb45a67d257553c905c78cd3d693101699243f36c5ae6c3 F ext/wasm/EXPORTED_FUNCTIONS.fiddle 7fb73f7150ab79d83bb45a67d257553c905c78cd3d693101699243f36c5ae6c3
F ext/wasm/EXPORTED_RUNTIME_METHODS.fiddle a004bd5eeeda6d3b28d16779b7f1a80305bfe009dfc7f0721b042967f0d39d02 F ext/wasm/EXPORTED_RUNTIME_METHODS.fiddle a004bd5eeeda6d3b28d16779b7f1a80305bfe009dfc7f0721b042967f0d39d02
F ext/wasm/GNUmakefile 19ba3304cf4e5e5f480a5c3701b2c7d7b7383f70416359fc4a1d304b4ffdd895 F ext/wasm/GNUmakefile b6a5b642e8b3e587d3edcfeb6b6275acbe4730293f4ad46c4997cd932d57aec5
F ext/wasm/README.md e1ee1e7c321c6a250bf78a84ca6f5882890a237a450ba5a0649c7a8399194c52 F ext/wasm/README.md e1ee1e7c321c6a250bf78a84ca6f5882890a237a450ba5a0649c7a8399194c52
F ext/wasm/api/EXPORTED_FUNCTIONS.sqlite3-api 150a793a47205b8009ac934f3b6d6ebf67b965c072339aaa25ce808a19e116cc F ext/wasm/api/EXPORTED_FUNCTIONS.sqlite3-api 150a793a47205b8009ac934f3b6d6ebf67b965c072339aaa25ce808a19e116cc
F ext/wasm/api/EXPORTED_RUNTIME_METHODS.sqlite3-api 1ec3c73e7d66e95529c3c64ac3de2470b0e9e7fbf7a5b41261c367cf4f1b7287 F ext/wasm/api/EXPORTED_RUNTIME_METHODS.sqlite3-api 1ec3c73e7d66e95529c3c64ac3de2470b0e9e7fbf7a5b41261c367cf4f1b7287
@ -485,7 +485,7 @@ F ext/wasm/api/sqlite3-api-cleanup.js 8564a6077cdcaea9a9f428a019af8a05887f0131e6
F ext/wasm/api/sqlite3-api-glue.js 366d580c8e5bf7fcf4c6dee6f646c31f5549bd417ea03a59a0acca00e8ecce30 F ext/wasm/api/sqlite3-api-glue.js 366d580c8e5bf7fcf4c6dee6f646c31f5549bd417ea03a59a0acca00e8ecce30
F ext/wasm/api/sqlite3-api-oo1.js 2d13dddf0d2b4168a9249f124134d37924331e5b55e05dba18b6d661fbeefe48 F ext/wasm/api/sqlite3-api-oo1.js 2d13dddf0d2b4168a9249f124134d37924331e5b55e05dba18b6d661fbeefe48
F ext/wasm/api/sqlite3-api-opfs.js 580be306be7301fa0b3cb2abd5765561a3d7f4746a7679f95394af50a14671bb F ext/wasm/api/sqlite3-api-opfs.js 580be306be7301fa0b3cb2abd5765561a3d7f4746a7679f95394af50a14671bb
F ext/wasm/api/sqlite3-api-prologue.js 4e3e26880d444000cca1b4f3ddfa9d49581dfecd1de9426080239ecc208c447d F ext/wasm/api/sqlite3-api-prologue.js 7b1e4a45f733a6f95551b383eb37cb86754d18214b11f668298f7a83a23ef732
F ext/wasm/api/sqlite3-api-worker1.js ee4cf149cbacb63d06b536674f822aa5088b7e022cdffc69f1f36cebe2f9fea0 F ext/wasm/api/sqlite3-api-worker1.js ee4cf149cbacb63d06b536674f822aa5088b7e022cdffc69f1f36cebe2f9fea0
F ext/wasm/api/sqlite3-wasi.h 25356084cfe0d40458a902afb465df8c21fc4152c1d0a59b563a3fba59a068f9 F ext/wasm/api/sqlite3-wasi.h 25356084cfe0d40458a902afb465df8c21fc4152c1d0a59b563a3fba59a068f9
F ext/wasm/api/sqlite3-wasm.c 4130e2df9587f4e4c3afc04c3549d682c8a5c0cfe5b22819a0a86edb7f01b9bd F ext/wasm/api/sqlite3-wasm.c 4130e2df9587f4e4c3afc04c3549d682c8a5c0cfe5b22819a0a86edb7f01b9bd
@ -499,25 +499,24 @@ F ext/wasm/common/whwasmutil.js f7282ef36c9625330d4e6e82d1beec6678cd101e95e7108c
F ext/wasm/demo-123-worker.html e419b66495d209b5211ec64903b4cfb3ca7df20d652b41fcd28bf018a773234f F ext/wasm/demo-123-worker.html e419b66495d209b5211ec64903b4cfb3ca7df20d652b41fcd28bf018a773234f
F ext/wasm/demo-123.html aa281d33b7eefa755f3122b7b5a18f39a42dc5fb69c8879171bf14b4c37c4ec4 F ext/wasm/demo-123.html aa281d33b7eefa755f3122b7b5a18f39a42dc5fb69c8879171bf14b4c37c4ec4
F ext/wasm/demo-123.js 234655683e35a4543a23de7b10800d76b0369947b33e089e5613171fa7795afb F ext/wasm/demo-123.js 234655683e35a4543a23de7b10800d76b0369947b33e089e5613171fa7795afb
F ext/wasm/demo-kvvfs1.html 7d4f28873de67f51ac18c584b7d920825139866a96049a49c424d6f5a0ea5e7f w ext/wasm/kvvfs1.html
F ext/wasm/demo-kvvfs1.js e884ea35022d772c0d1dd884b40011413696438394f605c6cd4808cfb1642a4a w ext/wasm/kvvfs1.js
F ext/wasm/fiddle/emscripten.css 3d253a6fdb8983a2ac983855bfbdd4b6fa1ff267c28d69513dd6ef1f289ada3f F ext/wasm/fiddle/emscripten.css 3d253a6fdb8983a2ac983855bfbdd4b6fa1ff267c28d69513dd6ef1f289ada3f
F ext/wasm/fiddle/fiddle-worker.js bccf46045be8824752876f3eec01c223be0616ccac184bffd0024cfe7a3262b8 F ext/wasm/fiddle/fiddle-worker.js bccf46045be8824752876f3eec01c223be0616ccac184bffd0024cfe7a3262b8
F ext/wasm/fiddle/fiddle.html 550c5aafce40bd218de9bf26192749f69f9b10bc379423ecd2e162bcef885c08 F ext/wasm/fiddle/fiddle.html 550c5aafce40bd218de9bf26192749f69f9b10bc379423ecd2e162bcef885c08
F ext/wasm/fiddle/fiddle.js 4ffcfc9a235beebaddec689a549e9e0dfad6dca5c1f0b41f03468d7e76480686 F ext/wasm/fiddle/fiddle.js 4ffcfc9a235beebaddec689a549e9e0dfad6dca5c1f0b41f03468d7e76480686
F ext/wasm/index.html aed40adf52598a353e27e50480d53e59a5e75e9ba889f7d8bb2fda45a0a91c3b F ext/wasm/index.html de69bc78273fbe024a21dae0f378a87b37ad4cd585ed0cd0a0ed2c5d5afe9fbc
F ext/wasm/jaccwabyt/jaccwabyt.js 0d7f32817456a0f3937fcfd934afeb32154ca33580ab264dab6c285e6dbbd215 F ext/wasm/jaccwabyt/jaccwabyt.js 0d7f32817456a0f3937fcfd934afeb32154ca33580ab264dab6c285e6dbbd215
F ext/wasm/jaccwabyt/jaccwabyt.md 447cc02b598f7792edaa8ae6853a7847b8178a18ed356afacbdbf312b2588106 F ext/wasm/jaccwabyt/jaccwabyt.md 447cc02b598f7792edaa8ae6853a7847b8178a18ed356afacbdbf312b2588106
F ext/wasm/jaccwabyt/jaccwabyt_test.c 39e4b865a33548f943e2eb9dd0dc8d619a80de05d5300668e9960fff30d0d36f F ext/wasm/jaccwabyt/jaccwabyt_test.c 39e4b865a33548f943e2eb9dd0dc8d619a80de05d5300668e9960fff30d0d36f
F ext/wasm/jaccwabyt/jaccwabyt_test.exports 5ff001ef975c426ffe88d7d8a6e96ec725e568d2c2307c416902059339c06f19 F ext/wasm/jaccwabyt/jaccwabyt_test.exports 5ff001ef975c426ffe88d7d8a6e96ec725e568d2c2307c416902059339c06f19
F ext/wasm/kvvfs.make 4b2ba6d061f3a52da9f5812f86f4faa80fb4d9456a152f6b0585dccd667a4e22
F ext/wasm/kvvfs1.html 13bb24190bfb276a57b228499519badcc1bf39ed07e4b37bc2a425ce6418fed1
F ext/wasm/kvvfs1.js ec1c1d071bb055711f9151df05616111432cf3e6bf7ac7f8dcbcfb56c9d9ed48
F ext/wasm/scratchpad-wasmfs-main.html 20cf6f1a8f368e70d01e8c17200e3eaa90f1c8e1029186d836d14b83845fbe06 F ext/wasm/scratchpad-wasmfs-main.html 20cf6f1a8f368e70d01e8c17200e3eaa90f1c8e1029186d836d14b83845fbe06
F ext/wasm/scratchpad-wasmfs-main.js f0836e3576df7a89390d777bb53e142e559e8a79becfb2a5a976490b05a1c4fa F ext/wasm/scratchpad-wasmfs-main.js f0836e3576df7a89390d777bb53e142e559e8a79becfb2a5a976490b05a1c4fa
F ext/wasm/speedtest1-kvvfs.html c8b65c20e2b35298dc02d8e0a394d5e1eb857fd22e504468388234aee13aef08 F ext/wasm/speedtest1-kvvfs.html c8b65c20e2b35298dc02d8e0a394d5e1eb857fd22e504468388234aee13aef08
F ext/wasm/speedtest1-wasmfs.html 6a67a6812f03a2058eb5c6ad0c8dea4bf749d0160ed9d6b826dabe7b766c3cf7 F ext/wasm/speedtest1-wasmfs.html 3a6f89fdd025d137ea9122a84a454d5d31cafa8495e7371e984f4d4b8ce58834
F ext/wasm/speedtest1-worker.html d8881ae802d15fb8adb94049265173e99f350e07e1d4e6f9e1cbd8969fe63a04 F ext/wasm/speedtest1-worker.html edbfbff9249b33a889fb76e7df9640d83e03f1e0d25b6c9e228f00d629a76ed0
F ext/wasm/speedtest1-worker.js fb5d282c0b8aed18daf41c57f768cbf434f8137dbff707d53dcedcd7d4cb60ef F ext/wasm/speedtest1-worker.js d26605f9518978ccbefbec2cbcdf90437c00828e3cb0fd69712f58b37f9e071c
F ext/wasm/speedtest1.html fbb8e4d1639028443f3687a683be660beca6927920545cf6b1fdf503104591c0 F ext/wasm/speedtest1.html 225ef377f7c42b8044505d9ef1a8c97c8dddb6d8799d322bd654c9f70c0f2f6f
F ext/wasm/split-speedtest1-script.sh a3e271938d4d14ee49105eb05567c6a69ba4c1f1293583ad5af0cd3a3779e205 x F ext/wasm/split-speedtest1-script.sh a3e271938d4d14ee49105eb05567c6a69ba4c1f1293583ad5af0cd3a3779e205 x
F ext/wasm/sql/000-mandelbrot.sql 775337a4b80938ac8146aedf88808282f04d02d983d82675bd63d9c2d97a15f0 F ext/wasm/sql/000-mandelbrot.sql 775337a4b80938ac8146aedf88808282f04d02d983d82675bd63d9c2d97a15f0
F ext/wasm/sql/001-sudoku.sql 35b7cb7239ba5d5f193bc05ec379bcf66891bce6f2a5b3879f2f78d0917299b5 F ext/wasm/sql/001-sudoku.sql 35b7cb7239ba5d5f193bc05ec379bcf66891bce6f2a5b3879f2f78d0917299b5
@ -1508,7 +1507,7 @@ F test/speed3.test 694affeb9100526007436334cf7d08f3d74b85ef
F test/speed4.test abc0ad3399dcf9703abed2fff8705e4f8e416715 F test/speed4.test abc0ad3399dcf9703abed2fff8705e4f8e416715
F test/speed4p.explain 6b5f104ebeb34a038b2f714150f51d01143e59aa F test/speed4p.explain 6b5f104ebeb34a038b2f714150f51d01143e59aa
F test/speed4p.test 377a0c48e5a92e0b11c1c5ebb1bc9d83a7312c922bc0cb05970ef5d6a96d1f0c F test/speed4p.test 377a0c48e5a92e0b11c1c5ebb1bc9d83a7312c922bc0cb05970ef5d6a96d1f0c
F test/speedtest1.c 4be5c905c7b3ee72d8e54dea3a846b8c3e7f9674cf3d080968e0e6651ba3c302 F test/speedtest1.c 752fc1cad512f7c94271d3fdb46d6d90c9f6b61d0a4722a28c7028f53952fb1d
F test/spellfix.test 951a6405d49d1a23d6b78027d3877b4a33eeb8221dcab5704b499755bb4f552e F test/spellfix.test 951a6405d49d1a23d6b78027d3877b4a33eeb8221dcab5704b499755bb4f552e
F test/spellfix2.test dfc8f519a3fc204cb2dfa8b4f29821ae90f6f8c3 F test/spellfix2.test dfc8f519a3fc204cb2dfa8b4f29821ae90f6f8c3
F test/spellfix3.test 0f9efaaa502a0e0a09848028518a6fb096c8ad33 F test/spellfix3.test 0f9efaaa502a0e0a09848028518a6fb096c8ad33
@ -2028,8 +2027,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 9370ce94780e974da03d5c74cf9a5983eed333e7b3bc54e605c5f30b3fa99287 354726aa6c399053785f29104de15091629ce4bc275b9e2205cb3656a9e81cd7 P 281d09867134e0a057cfadd9bfcbf0e21b8ac9737a278c41973d33a3101be7bc
R 00556834ec19d453fd785f2bebf86235 R 6442d22e3df1d96228caf48bf4bfd7a0
U stephan U stephan
Z 19b45de03e5674211a91148844c56c0b Z 5bc762c205d5862d76e828c3121841fc
# Remove this line to create a well-formed Fossil manifest. # Remove this line to create a well-formed Fossil manifest.

View File

@ -1 +1 @@
281d09867134e0a057cfadd9bfcbf0e21b8ac9737a278c41973d33a3101be7bc ec09f32f7ae2249aaf27388ad2062982afa8bbbb5f88d236d6d9068bf33ad93d

View File

@ -2197,7 +2197,6 @@ static int xCompileOptions(void *pCtx, int nVal, char **azVal, char **azCol){
printf("-- Compile option: %s\n", azVal[0]); printf("-- Compile option: %s\n", azVal[0]);
return SQLITE_OK; return SQLITE_OK;
} }
int main(int argc, char **argv){ int main(int argc, char **argv){
int doAutovac = 0; /* True for --autovacuum */ int doAutovac = 0; /* True for --autovacuum */
int cacheSize = 0; /* Desired cache size. 0 means default */ int cacheSize = 0; /* Desired cache size. 0 means default */
@ -2634,3 +2633,13 @@ int main(int argc, char **argv){
free( pHeap ); free( pHeap );
return 0; return 0;
} }
#ifdef SQLITE_SPEEDTEST1_WASM
/*
** A workaround for some inconsistent behaviour with how
** main() does (or does not) get exported to WASM.
*/
int wasm_main(int argc, char **argv){
return main(argc, argv);
}
#endif