1100b496dSstephan<!doctype html> 2100b496dSstephan<html lang="en-us"> 3100b496dSstephan <head> 4100b496dSstephan <meta charset="utf-8"> 5100b496dSstephan <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 6100b496dSstephan <link rel="shortcut icon" href="data:image/x-icon;," type="image/x-icon"> 7100b496dSstephan <link rel="stylesheet" href="common/emscripten.css"/> 8100b496dSstephan <link rel="stylesheet" href="common/testing.css"/> 9100b496dSstephan <title>speedtest1.wasm</title> 10100b496dSstephan </head> 11100b496dSstephan <body> 12100b496dSstephan <header id='titlebar'><span>speedtest1.wasm</span></header> 13100b496dSstephan <!-- emscripten bits --> 14100b496dSstephan <figure id="module-spinner"> 15100b496dSstephan <div class="spinner"></div> 16100b496dSstephan <div class='center'><strong>Initializing app...</strong></div> 17100b496dSstephan <div class='center'> 18100b496dSstephan On a slow internet connection this may take a moment. If this 19100b496dSstephan message displays for "a long time", intialization may have 20100b496dSstephan failed and the JavaScript console may contain clues as to why. 21100b496dSstephan </div> 22100b496dSstephan </figure> 23100b496dSstephan <div class="emscripten" id="module-status">Downloading...</div> 24100b496dSstephan <div class="emscripten"> 25100b496dSstephan <progress value="0" max="100" id="module-progress" hidden='1'></progress> 26100b496dSstephan </div><!-- /emscripten bits --> 27100b496dSstephan <div>Output is sent to the dev console because we cannot update the UI while the 28100b496dSstephan speedtest is running unless/until we move the speedtest to a worker thread.</div> 29100b496dSstephan <hr> 30100b496dSstephan <div id='test-output'></div> 31100b496dSstephan <script src="common/whwasmutil.js"></script> 32100b496dSstephan <script src="common/SqliteTestUtil.js"></script> 33100b496dSstephan <script src="speedtest1.js"></script> 34*8fc8b5b3Sstephan <script>(function(){ 35*8fc8b5b3Sstephan /** 36*8fc8b5b3Sstephan If this environment contains OPFS, this function initializes it and 37*8fc8b5b3Sstephan returns the name of the dir on which OPFS is mounted, else it returns 38*8fc8b5b3Sstephan an empty string. 39*8fc8b5b3Sstephan */ 40*8fc8b5b3Sstephan const opfsDir = function f(wasmUtil){ 41*8fc8b5b3Sstephan if(undefined !== f._) return f._; 42*8fc8b5b3Sstephan const pdir = '/persistent'; 43*8fc8b5b3Sstephan if( !self.FileSystemHandle 44*8fc8b5b3Sstephan || !self.FileSystemDirectoryHandle 45*8fc8b5b3Sstephan || !self.FileSystemFileHandle){ 46*8fc8b5b3Sstephan return f._ = ""; 47*8fc8b5b3Sstephan } 48*8fc8b5b3Sstephan try{ 49*8fc8b5b3Sstephan if(0===wasmUtil.xCallWrapped( 50*8fc8b5b3Sstephan 'sqlite3_wasm_init_opfs', 'i32', ['string'], pdir 51*8fc8b5b3Sstephan )){ 52*8fc8b5b3Sstephan return f._ = pdir; 53*8fc8b5b3Sstephan }else{ 54*8fc8b5b3Sstephan return f._ = ""; 55*8fc8b5b3Sstephan } 56*8fc8b5b3Sstephan }catch(e){ 57*8fc8b5b3Sstephan // sqlite3_wasm_init_opfs() is not available 58*8fc8b5b3Sstephan return f._ = ""; 59*8fc8b5b3Sstephan } 60*8fc8b5b3Sstephan }; 61*8fc8b5b3Sstephan opfsDir._ = undefined; 62*8fc8b5b3Sstephan 63100b496dSstephan const eOut = document.querySelector('#test-output'); 64*8fc8b5b3Sstephan const log2 = async function(cssClass,...args){ 65100b496dSstephan const ln = document.createElement('div'); 66100b496dSstephan if(cssClass) ln.classList.add(cssClass); 67100b496dSstephan ln.append(document.createTextNode(args.join(' '))); 68100b496dSstephan eOut.append(ln); 69100b496dSstephan //this.e.output.lastElementChild.scrollIntoViewIfNeeded(); 70100b496dSstephan }; 71100b496dSstephan const doHtmlOutput = false 72100b496dSstephan /* can't update DOM while speedtest is running unless we run 73100b496dSstephan speedtest in a worker thread. */; 74*8fc8b5b3Sstephan const log = (...args)=>{ 75100b496dSstephan console.log(...args); 76*8fc8b5b3Sstephan if(doHtmlOutput) log2('', ...args); 77100b496dSstephan }; 78100b496dSstephan const logErr = function(...args){ 79100b496dSstephan console.error(...args); 80*8fc8b5b3Sstephan if(doHtmlOutput) log2('error', ...args); 81100b496dSstephan }; 82100b496dSstephan 83100b496dSstephan const runTests = function(EmscriptenModule){ 84*8fc8b5b3Sstephan console.log("Module inited.",EmscriptenModule); 85100b496dSstephan const wasm = { 86100b496dSstephan exports: EmscriptenModule.asm, 87100b496dSstephan alloc: (n)=>EmscriptenModule._malloc(n), 88*8fc8b5b3Sstephan dealloc: (m)=>EmscriptenModule._free(m), 89*8fc8b5b3Sstephan memory: EmscriptenModule.asm.memory || EmscriptenModule.wasmMemory 90100b496dSstephan }; 91100b496dSstephan //console.debug('wasm =',wasm); 92100b496dSstephan self.WhWasmUtilInstaller(wasm); 93*8fc8b5b3Sstephan const unlink = wasm.xWrap("sqlite3_wasm_vfs_unlink", "int", ["string"]); 94*8fc8b5b3Sstephan const pDir = opfsDir(wasm); 95*8fc8b5b3Sstephan if(pDir){ 96*8fc8b5b3Sstephan console.warn("Persistent storage:",pDir); 97*8fc8b5b3Sstephan } 98100b496dSstephan const scope = wasm.scopedAllocPush(); 99*8fc8b5b3Sstephan const dbFile = 0 ? "" : pDir+"/speedtest1.db"; 100100b496dSstephan try{ 101*8fc8b5b3Sstephan const argv = [ 102100b496dSstephan // TODO: accept flags via URL arguments and/or a 103100b496dSstephan // UI control. A multi-SELECT element should do 104100b496dSstephan // nicely. 105100b496dSstephan "speedtest1", 106*8fc8b5b3Sstephan "--singlethread", 107*8fc8b5b3Sstephan //"--stats", 108*8fc8b5b3Sstephan "--memdb", // note that memdb trumps the filename arg 109*8fc8b5b3Sstephan dbFile 110100b496dSstephan ]; 111*8fc8b5b3Sstephan console.log("argv =",argv); 112*8fc8b5b3Sstephan wasm.xCall('__main_argc_argv', argv.length, 113*8fc8b5b3Sstephan wasm.scopedAllocMainArgv(argv)); 114100b496dSstephan }finally{ 115100b496dSstephan wasm.scopedAllocPop(scope); 116*8fc8b5b3Sstephan if(pDir) unlink(dbFile); 117100b496dSstephan } 118100b496dSstephan }; 119100b496dSstephan 120*8fc8b5b3Sstephan self.sqlite3TestModule.print = log; 121100b496dSstephan self.sqlite3TestModule.printErr = logErr; 122100b496dSstephan sqlite3Speedtest1InitModule(self.sqlite3TestModule).then(function(M){ 123100b496dSstephan setTimeout(()=>runTests(M), 100); 124100b496dSstephan }); 125100b496dSstephan })(); 126100b496dSstephan </script> 127100b496dSstephan </body> 128100b496dSstephan</html> 129