koffi 2.2.0 → 2.2.2-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ChangeLog.md +6 -0
- package/package.json +2 -2
- package/src/koffi/build/2.2.2-beta.1/koffi_darwin_arm64.tar.gz +0 -0
- package/src/koffi/build/2.2.2-beta.1/koffi_darwin_x64.tar.gz +0 -0
- package/src/koffi/build/2.2.2-beta.1/koffi_freebsd_arm64.tar.gz +0 -0
- package/src/koffi/build/2.2.2-beta.1/koffi_freebsd_ia32.tar.gz +0 -0
- package/src/koffi/build/2.2.2-beta.1/koffi_freebsd_x64.tar.gz +0 -0
- package/src/koffi/build/2.2.2-beta.1/koffi_linux_arm32hf.tar.gz +0 -0
- package/src/koffi/build/2.2.2-beta.1/koffi_linux_arm64.tar.gz +0 -0
- package/src/koffi/build/2.2.2-beta.1/koffi_linux_ia32.tar.gz +0 -0
- package/src/koffi/build/2.2.2-beta.1/koffi_linux_riscv64hf64.tar.gz +0 -0
- package/src/koffi/build/2.2.2-beta.1/koffi_linux_x64.tar.gz +0 -0
- package/src/koffi/build/2.2.2-beta.1/koffi_openbsd_ia32.tar.gz +0 -0
- package/src/koffi/build/2.2.2-beta.1/koffi_openbsd_x64.tar.gz +0 -0
- package/src/koffi/build/2.2.2-beta.1/koffi_win32_arm64.tar.gz +0 -0
- package/src/koffi/build/2.2.2-beta.1/koffi_win32_ia32.tar.gz +0 -0
- package/src/koffi/build/2.2.2-beta.1/koffi_win32_x64.tar.gz +0 -0
- package/src/koffi/qemu/qemu.js +12 -10
- package/src/koffi/src/abi_arm32.cc +7 -11
- package/src/koffi/src/abi_arm64.cc +7 -11
- package/src/koffi/src/abi_riscv64.cc +7 -11
- package/src/koffi/src/abi_x64_sysv.cc +7 -11
- package/src/koffi/src/abi_x64_win.cc +7 -11
- package/src/koffi/src/abi_x86.cc +7 -11
- package/src/koffi/src/call.cc +53 -2
- package/src/koffi/src/call.hh +6 -1
- package/src/koffi/src/ffi.cc +66 -12
- package/src/koffi/src/ffi.hh +2 -0
- package/src/koffi/src/index.js +6 -2
- package/src/koffi/test/CMakeLists.txt +1 -1
- package/src/koffi/test/async.js +3 -0
- package/src/koffi/test/callbacks.js +30 -0
- package/src/koffi/test/misc.c +11 -0
- package/vendor/{sqlite3mc → sqlite3}/sqlite3.c +139 -43
- package/vendor/{sqlite3mc → sqlite3}/sqlite3.h +10 -3
- package/vendor/{sqlite3mc → sqlite3}/sqlite3ext.h +0 -0
- package/vendor/{sqlite3mc → sqlite3}/sqlite3mc.c +156 -53
- package/vendor/{sqlite3mc → sqlite3}/sqlite3mc.def +0 -0
- package/vendor/{sqlite3mc → sqlite3}/sqlite3mc.h +12 -5
- package/vendor/sqlite3/wasm/README.txt +23 -0
- package/vendor/sqlite3/wasm/common/SqliteTestUtil.js +236 -0
- package/vendor/sqlite3/wasm/common/emscripten.css +24 -0
- package/vendor/sqlite3/wasm/common/testing.css +63 -0
- package/vendor/sqlite3/wasm/demo-123-worker.html +44 -0
- package/vendor/sqlite3/wasm/demo-123.html +24 -0
- package/vendor/sqlite3/wasm/demo-123.js +289 -0
- package/vendor/sqlite3/wasm/demo-jsstorage.html +49 -0
- package/vendor/sqlite3/wasm/demo-jsstorage.js +114 -0
- package/vendor/sqlite3/wasm/demo-worker1-promiser.html +34 -0
- package/vendor/sqlite3/wasm/demo-worker1-promiser.js +270 -0
- package/vendor/sqlite3/wasm/demo-worker1.html +34 -0
- package/vendor/sqlite3/wasm/demo-worker1.js +345 -0
- package/vendor/sqlite3/wasm/index.html +90 -0
- package/vendor/sqlite3/wasm/jswasm/sqlite3-opfs-async-proxy.js +830 -0
- package/vendor/sqlite3/wasm/jswasm/sqlite3-worker1-promiser.js +259 -0
- package/vendor/sqlite3/wasm/jswasm/sqlite3-worker1.js +49 -0
- package/vendor/sqlite3/wasm/jswasm/sqlite3.js +10119 -0
- package/vendor/sqlite3/wasm/jswasm/sqlite3.wasm +0 -0
- package/vendor/sqlite3/wasm/tester1-worker.html +63 -0
- package/vendor/sqlite3/wasm/tester1.html +28 -0
- package/vendor/sqlite3/wasm/tester1.js +1864 -0
- package/src/koffi/build/2.2.0/koffi_darwin_arm64.tar.gz +0 -0
- package/src/koffi/build/2.2.0/koffi_darwin_x64.tar.gz +0 -0
- package/src/koffi/build/2.2.0/koffi_freebsd_arm64.tar.gz +0 -0
- package/src/koffi/build/2.2.0/koffi_freebsd_ia32.tar.gz +0 -0
- package/src/koffi/build/2.2.0/koffi_freebsd_x64.tar.gz +0 -0
- package/src/koffi/build/2.2.0/koffi_linux_arm32hf.tar.gz +0 -0
- package/src/koffi/build/2.2.0/koffi_linux_arm64.tar.gz +0 -0
- package/src/koffi/build/2.2.0/koffi_linux_ia32.tar.gz +0 -0
- package/src/koffi/build/2.2.0/koffi_linux_riscv64hf64.tar.gz +0 -0
- package/src/koffi/build/2.2.0/koffi_linux_x64.tar.gz +0 -0
- package/src/koffi/build/2.2.0/koffi_openbsd_ia32.tar.gz +0 -0
- package/src/koffi/build/2.2.0/koffi_openbsd_x64.tar.gz +0 -0
- package/src/koffi/build/2.2.0/koffi_win32_arm64.tar.gz +0 -0
- package/src/koffi/build/2.2.0/koffi_win32_ia32.tar.gz +0 -0
- package/src/koffi/build/2.2.0/koffi_win32_x64.tar.gz +0 -0
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="en-us">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8">
|
|
5
|
+
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
|
6
|
+
<link rel="shortcut icon" href="data:image/x-icon;," type="image/x-icon">
|
|
7
|
+
<link rel="stylesheet" href="common/emscripten.css"/>
|
|
8
|
+
<link rel="stylesheet" href="common/testing.css"/>
|
|
9
|
+
<title>sqlite3-kvvfs.js tests</title>
|
|
10
|
+
</head>
|
|
11
|
+
<body>
|
|
12
|
+
<header id='titlebar'><span>sqlite3-kvvfs.js tests</span></header>
|
|
13
|
+
<!-- emscripten bits -->
|
|
14
|
+
<figure id="module-spinner">
|
|
15
|
+
<div class="spinner"></div>
|
|
16
|
+
<div class='center'><strong>Initializing app...</strong></div>
|
|
17
|
+
<div class='center'>
|
|
18
|
+
On a slow internet connection this may take a moment. If this
|
|
19
|
+
message displays for "a long time", intialization may have
|
|
20
|
+
failed and the JavaScript console may contain clues as to why.
|
|
21
|
+
</div>
|
|
22
|
+
</figure>
|
|
23
|
+
<div class="emscripten" id="module-status">Downloading...</div>
|
|
24
|
+
<div class="emscripten">
|
|
25
|
+
<progress value="0" max="100" id="module-progress" hidden='1'></progress>
|
|
26
|
+
</div><!-- /emscripten bits -->
|
|
27
|
+
<fieldset>
|
|
28
|
+
<legend>Options</legend>
|
|
29
|
+
<div class='toolbar'>
|
|
30
|
+
<button id='btn-clear-log'>Clear log</button>
|
|
31
|
+
<button id='btn-clear-storage'>Clear storage</button>
|
|
32
|
+
<button id='btn-init-db'>(Re)init db</button>
|
|
33
|
+
<button id='btn-select1'>Select db rows</button>
|
|
34
|
+
<button id='btn-storage-size'>Approx. storage size</button>
|
|
35
|
+
</div>
|
|
36
|
+
</fieldset>
|
|
37
|
+
<div id='test-output'></div>
|
|
38
|
+
<style>
|
|
39
|
+
.toolbar {
|
|
40
|
+
display: flex;
|
|
41
|
+
}
|
|
42
|
+
.toolbar > * { margin: 0.25em; }
|
|
43
|
+
fieldset { border-radius: 0.5em; }
|
|
44
|
+
</style>
|
|
45
|
+
<script src="jswasm/sqlite3.js"></script>
|
|
46
|
+
<script src="common/SqliteTestUtil.js"></script>
|
|
47
|
+
<script src="demo-jsstorage.js"></script>
|
|
48
|
+
</body>
|
|
49
|
+
</html>
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/*
|
|
2
|
+
2022-09-12
|
|
3
|
+
|
|
4
|
+
The author disclaims copyright to this source code. In place of a
|
|
5
|
+
legal notice, here is a blessing:
|
|
6
|
+
|
|
7
|
+
* May you do good and not evil.
|
|
8
|
+
* May you find forgiveness for yourself and forgive others.
|
|
9
|
+
* May you share freely, never taking more than you give.
|
|
10
|
+
|
|
11
|
+
***********************************************************************
|
|
12
|
+
|
|
13
|
+
A basic test script for sqlite3.wasm with kvvfs support. This file
|
|
14
|
+
must be run in main JS thread and sqlite3.js must have been loaded
|
|
15
|
+
before it.
|
|
16
|
+
*/
|
|
17
|
+
'use strict';
|
|
18
|
+
(function(){
|
|
19
|
+
const T = self.SqliteTestUtil;
|
|
20
|
+
const toss = function(...args){throw new Error(args.join(' '))};
|
|
21
|
+
const debug = console.debug.bind(console);
|
|
22
|
+
const eOutput = document.querySelector('#test-output');
|
|
23
|
+
const logC = console.log.bind(console)
|
|
24
|
+
const logE = function(domElement){
|
|
25
|
+
eOutput.append(domElement);
|
|
26
|
+
};
|
|
27
|
+
const logHtml = function(cssClass,...args){
|
|
28
|
+
const ln = document.createElement('div');
|
|
29
|
+
if(cssClass) ln.classList.add(cssClass);
|
|
30
|
+
ln.append(document.createTextNode(args.join(' ')));
|
|
31
|
+
logE(ln);
|
|
32
|
+
}
|
|
33
|
+
const log = function(...args){
|
|
34
|
+
logC(...args);
|
|
35
|
+
logHtml('',...args);
|
|
36
|
+
};
|
|
37
|
+
const warn = function(...args){
|
|
38
|
+
logHtml('warning',...args);
|
|
39
|
+
};
|
|
40
|
+
const error = function(...args){
|
|
41
|
+
logHtml('error',...args);
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
const runTests = function(sqlite3){
|
|
45
|
+
const capi = sqlite3.capi,
|
|
46
|
+
oo = sqlite3.oo1,
|
|
47
|
+
wasm = sqlite3.wasm;
|
|
48
|
+
log("Loaded module:",capi.sqlite3_libversion(), capi.sqlite3_sourceid());
|
|
49
|
+
T.assert( 0 !== capi.sqlite3_vfs_find(null) );
|
|
50
|
+
if(!capi.sqlite3_vfs_find('kvvfs')){
|
|
51
|
+
error("This build is not kvvfs-capable.");
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
const dbStorage = 0 ? 'session' : 'local';
|
|
56
|
+
const theStore = 's'===dbStorage[0] ? sessionStorage : localStorage;
|
|
57
|
+
const db = new oo.JsStorageDb( dbStorage );
|
|
58
|
+
// Or: oo.DB(dbStorage, 'c', 'kvvfs')
|
|
59
|
+
log("db.storageSize():",db.storageSize());
|
|
60
|
+
document.querySelector('#btn-clear-storage').addEventListener('click',function(){
|
|
61
|
+
const sz = db.clearStorage();
|
|
62
|
+
log("kvvfs",db.filename+"Storage cleared:",sz,"entries.");
|
|
63
|
+
});
|
|
64
|
+
document.querySelector('#btn-clear-log').addEventListener('click',function(){
|
|
65
|
+
eOutput.innerText = '';
|
|
66
|
+
});
|
|
67
|
+
document.querySelector('#btn-init-db').addEventListener('click',function(){
|
|
68
|
+
try{
|
|
69
|
+
const saveSql = [];
|
|
70
|
+
db.exec({
|
|
71
|
+
sql: ["drop table if exists t;",
|
|
72
|
+
"create table if not exists t(a);",
|
|
73
|
+
"insert into t(a) values(?),(?),(?)"],
|
|
74
|
+
bind: [performance.now() >> 0,
|
|
75
|
+
(performance.now() * 2) >> 0,
|
|
76
|
+
(performance.now() / 2) >> 0],
|
|
77
|
+
saveSql
|
|
78
|
+
});
|
|
79
|
+
console.log("saveSql =",saveSql,theStore);
|
|
80
|
+
log("DB (re)initialized.");
|
|
81
|
+
}catch(e){
|
|
82
|
+
error(e.message);
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
const btnSelect = document.querySelector('#btn-select1');
|
|
86
|
+
btnSelect.addEventListener('click',function(){
|
|
87
|
+
log("DB rows:");
|
|
88
|
+
try{
|
|
89
|
+
db.exec({
|
|
90
|
+
sql: "select * from t order by a",
|
|
91
|
+
rowMode: 0,
|
|
92
|
+
callback: (v)=>log(v)
|
|
93
|
+
});
|
|
94
|
+
}catch(e){
|
|
95
|
+
error(e.message);
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
document.querySelector('#btn-storage-size').addEventListener('click',function(){
|
|
99
|
+
log("size.storageSize(",dbStorage,") says", db.storageSize(),
|
|
100
|
+
"bytes");
|
|
101
|
+
});
|
|
102
|
+
log("Storage backend:",db.filename);
|
|
103
|
+
if(0===db.selectValue('select count(*) from sqlite_master')){
|
|
104
|
+
log("DB is empty. Use the init button to populate it.");
|
|
105
|
+
}else{
|
|
106
|
+
log("DB contains data from a previous session. Use the Clear Ctorage button to delete it.");
|
|
107
|
+
btnSelect.click();
|
|
108
|
+
}
|
|
109
|
+
};
|
|
110
|
+
|
|
111
|
+
sqlite3InitModule(self.sqlite3TestModule).then((sqlite3)=>{
|
|
112
|
+
runTests(sqlite3);
|
|
113
|
+
});
|
|
114
|
+
})();
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="en-us">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8">
|
|
5
|
+
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
|
6
|
+
<link rel="shortcut icon" href="data:image/x-icon;," type="image/x-icon">
|
|
7
|
+
<link rel="stylesheet" href="common/emscripten.css"/>
|
|
8
|
+
<link rel="stylesheet" href="common/testing.css"/>
|
|
9
|
+
<title>worker-promise tests</title>
|
|
10
|
+
</head>
|
|
11
|
+
<body>
|
|
12
|
+
<header id='titlebar'><span>worker-promise tests</span></header>
|
|
13
|
+
<!-- emscripten bits -->
|
|
14
|
+
<figure id="module-spinner">
|
|
15
|
+
<div class="spinner"></div>
|
|
16
|
+
<div class='center'><strong>Initializing app...</strong></div>
|
|
17
|
+
<div class='center'>
|
|
18
|
+
On a slow internet connection this may take a moment. If this
|
|
19
|
+
message displays for "a long time", intialization may have
|
|
20
|
+
failed and the JavaScript console may contain clues as to why.
|
|
21
|
+
</div>
|
|
22
|
+
</figure>
|
|
23
|
+
<div class="emscripten" id="module-status">Downloading...</div>
|
|
24
|
+
<div class="emscripten">
|
|
25
|
+
<progress value="0" max="100" id="module-progress" hidden='1'></progress>
|
|
26
|
+
</div><!-- /emscripten bits -->
|
|
27
|
+
<div>Most stuff on this page happens in the dev console.</div>
|
|
28
|
+
<hr>
|
|
29
|
+
<div id='test-output'></div>
|
|
30
|
+
<script src="common/SqliteTestUtil.js"></script>
|
|
31
|
+
<script src="jswasm/sqlite3-worker1-promiser.js"></script>
|
|
32
|
+
<script src="demo-worker1-promiser.js"></script>
|
|
33
|
+
</body>
|
|
34
|
+
</html>
|
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
/*
|
|
2
|
+
2022-08-23
|
|
3
|
+
|
|
4
|
+
The author disclaims copyright to this source code. In place of a
|
|
5
|
+
legal notice, here is a blessing:
|
|
6
|
+
|
|
7
|
+
* May you do good and not evil.
|
|
8
|
+
* May you find forgiveness for yourself and forgive others.
|
|
9
|
+
* May you share freely, never taking more than you give.
|
|
10
|
+
|
|
11
|
+
***********************************************************************
|
|
12
|
+
|
|
13
|
+
Demonstration of the sqlite3 Worker API #1 Promiser: a Promise-based
|
|
14
|
+
proxy for for the sqlite3 Worker #1 API.
|
|
15
|
+
*/
|
|
16
|
+
'use strict';
|
|
17
|
+
(function(){
|
|
18
|
+
const T = self.SqliteTestUtil;
|
|
19
|
+
const eOutput = document.querySelector('#test-output');
|
|
20
|
+
const warn = console.warn.bind(console);
|
|
21
|
+
const error = console.error.bind(console);
|
|
22
|
+
const log = console.log.bind(console);
|
|
23
|
+
const logHtml = async function(cssClass,...args){
|
|
24
|
+
log.apply(this, args);
|
|
25
|
+
const ln = document.createElement('div');
|
|
26
|
+
if(cssClass) ln.classList.add(cssClass);
|
|
27
|
+
ln.append(document.createTextNode(args.join(' ')));
|
|
28
|
+
eOutput.append(ln);
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
let startTime;
|
|
32
|
+
const testCount = async ()=>{
|
|
33
|
+
logHtml("","Total test count:",T.counter+". Total time =",(performance.now() - startTime),"ms");
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
//why is this triggered even when we catch() a Promise?
|
|
37
|
+
//window.addEventListener('unhandledrejection', function(event) {
|
|
38
|
+
// warn('unhandledrejection',event);
|
|
39
|
+
//});
|
|
40
|
+
|
|
41
|
+
const promiserConfig = {
|
|
42
|
+
worker: ()=>{
|
|
43
|
+
const w = new Worker("jswasm/sqlite3-worker1.js");
|
|
44
|
+
w.onerror = (event)=>error("worker.onerror",event);
|
|
45
|
+
return w;
|
|
46
|
+
},
|
|
47
|
+
debug: 1 ? undefined : (...args)=>console.debug('worker debug',...args),
|
|
48
|
+
onunhandled: function(ev){
|
|
49
|
+
error("Unhandled worker message:",ev.data);
|
|
50
|
+
},
|
|
51
|
+
onready: function(){
|
|
52
|
+
self.sqlite3TestModule.setStatus(null)/*hide the HTML-side is-loading spinner*/;
|
|
53
|
+
runTests();
|
|
54
|
+
},
|
|
55
|
+
onerror: function(ev){
|
|
56
|
+
error("worker1 error:",ev);
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
const workerPromise = self.sqlite3Worker1Promiser(promiserConfig);
|
|
60
|
+
delete self.sqlite3Worker1Promiser;
|
|
61
|
+
|
|
62
|
+
const wtest = async function(msgType, msgArgs, callback){
|
|
63
|
+
if(2===arguments.length && 'function'===typeof msgArgs){
|
|
64
|
+
callback = msgArgs;
|
|
65
|
+
msgArgs = undefined;
|
|
66
|
+
}
|
|
67
|
+
const p = workerPromise({type: msgType, args:msgArgs});
|
|
68
|
+
return callback ? p.then(callback).finally(testCount) : p;
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
const runTests = async function(){
|
|
72
|
+
const dbFilename = '/testing2.sqlite3';
|
|
73
|
+
startTime = performance.now();
|
|
74
|
+
|
|
75
|
+
let sqConfig;
|
|
76
|
+
await wtest('config-get', (ev)=>{
|
|
77
|
+
const r = ev.result;
|
|
78
|
+
log('sqlite3.config subset:', r);
|
|
79
|
+
T.assert('boolean' === typeof r.bigIntEnabled)
|
|
80
|
+
.assert('string'===typeof r.wasmfsOpfsDir)
|
|
81
|
+
.assert('boolean' === typeof r.wasmfsOpfsEnabled);
|
|
82
|
+
sqConfig = r;
|
|
83
|
+
});
|
|
84
|
+
logHtml('',
|
|
85
|
+
"Sending 'open' message and waiting for its response before continuing...");
|
|
86
|
+
|
|
87
|
+
await wtest('open', {
|
|
88
|
+
filename: dbFilename,
|
|
89
|
+
simulateError: 0 /* if true, fail the 'open' */,
|
|
90
|
+
}, function(ev){
|
|
91
|
+
const r = ev.result;
|
|
92
|
+
log("then open result",r);
|
|
93
|
+
T.assert(ev.dbId === r.dbId)
|
|
94
|
+
.assert(ev.messageId)
|
|
95
|
+
.assert('string' === typeof r.vfs);
|
|
96
|
+
promiserConfig.dbId = ev.dbId;
|
|
97
|
+
}).then(runTests2);
|
|
98
|
+
};
|
|
99
|
+
|
|
100
|
+
const runTests2 = async function(){
|
|
101
|
+
const mustNotReach = ()=>toss("This is not supposed to be reached.");
|
|
102
|
+
|
|
103
|
+
await wtest('exec',{
|
|
104
|
+
sql: ["create table t(a,b)",
|
|
105
|
+
"insert into t(a,b) values(1,2),(3,4),(5,6)"
|
|
106
|
+
].join(';'),
|
|
107
|
+
multi: true,
|
|
108
|
+
resultRows: [], columnNames: []
|
|
109
|
+
}, function(ev){
|
|
110
|
+
ev = ev.result;
|
|
111
|
+
T.assert(0===ev.resultRows.length)
|
|
112
|
+
.assert(0===ev.columnNames.length);
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
await wtest('exec',{
|
|
116
|
+
sql: 'select a a, b b from t order by a',
|
|
117
|
+
resultRows: [], columnNames: [],
|
|
118
|
+
}, function(ev){
|
|
119
|
+
ev = ev.result;
|
|
120
|
+
T.assert(3===ev.resultRows.length)
|
|
121
|
+
.assert(1===ev.resultRows[0][0])
|
|
122
|
+
.assert(6===ev.resultRows[2][1])
|
|
123
|
+
.assert(2===ev.columnNames.length)
|
|
124
|
+
.assert('b'===ev.columnNames[1]);
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
await wtest('exec',{
|
|
128
|
+
sql: 'select a a, b b from t order by a',
|
|
129
|
+
resultRows: [], columnNames: [],
|
|
130
|
+
rowMode: 'object'
|
|
131
|
+
}, function(ev){
|
|
132
|
+
ev = ev.result;
|
|
133
|
+
T.assert(3===ev.resultRows.length)
|
|
134
|
+
.assert(1===ev.resultRows[0].a)
|
|
135
|
+
.assert(6===ev.resultRows[2].b)
|
|
136
|
+
});
|
|
137
|
+
|
|
138
|
+
await wtest(
|
|
139
|
+
'exec',
|
|
140
|
+
{sql:'intentional_error'},
|
|
141
|
+
mustNotReach
|
|
142
|
+
).catch((e)=>{
|
|
143
|
+
warn("Intentional error:",e);
|
|
144
|
+
});
|
|
145
|
+
|
|
146
|
+
await wtest('exec',{
|
|
147
|
+
sql:'select 1 union all select 3',
|
|
148
|
+
resultRows: [],
|
|
149
|
+
}, function(ev){
|
|
150
|
+
ev = ev.result;
|
|
151
|
+
T.assert(2 === ev.resultRows.length)
|
|
152
|
+
.assert(1 === ev.resultRows[0][0])
|
|
153
|
+
.assert(3 === ev.resultRows[1][0]);
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
const resultRowTest1 = function f(ev){
|
|
157
|
+
if(undefined === f.counter) f.counter = 0;
|
|
158
|
+
if(null === ev.rowNumber){
|
|
159
|
+
/* End of result set. */
|
|
160
|
+
T.assert(undefined === ev.row)
|
|
161
|
+
.assert(2===ev.columnNames.length)
|
|
162
|
+
.assert('a'===ev.columnNames[0])
|
|
163
|
+
.assert('B'===ev.columnNames[1]);
|
|
164
|
+
}else{
|
|
165
|
+
T.assert(ev.rowNumber > 0);
|
|
166
|
+
++f.counter;
|
|
167
|
+
}
|
|
168
|
+
log("exec() result row:",ev);
|
|
169
|
+
T.assert(null === ev.rowNumber || 'number' === typeof ev.row.B);
|
|
170
|
+
};
|
|
171
|
+
await wtest('exec',{
|
|
172
|
+
sql: 'select a a, b B from t order by a limit 3',
|
|
173
|
+
callback: resultRowTest1,
|
|
174
|
+
rowMode: 'object'
|
|
175
|
+
}, function(ev){
|
|
176
|
+
T.assert(3===resultRowTest1.counter);
|
|
177
|
+
resultRowTest1.counter = 0;
|
|
178
|
+
});
|
|
179
|
+
|
|
180
|
+
const resultRowTest2 = function f(ev){
|
|
181
|
+
if(null === ev.rowNumber){
|
|
182
|
+
/* End of result set. */
|
|
183
|
+
T.assert(undefined === ev.row)
|
|
184
|
+
.assert(1===ev.columnNames.length)
|
|
185
|
+
.assert('a'===ev.columnNames[0])
|
|
186
|
+
}else{
|
|
187
|
+
T.assert(ev.rowNumber > 0);
|
|
188
|
+
f.counter = ev.rowNumber;
|
|
189
|
+
}
|
|
190
|
+
log("exec() result row:",ev);
|
|
191
|
+
T.assert(null === ev.rowNumber || 'number' === typeof ev.row);
|
|
192
|
+
};
|
|
193
|
+
await wtest('exec',{
|
|
194
|
+
sql: 'select a a from t limit 3',
|
|
195
|
+
callback: resultRowTest2,
|
|
196
|
+
rowMode: 0
|
|
197
|
+
}, function(ev){
|
|
198
|
+
T.assert(3===resultRowTest2.counter);
|
|
199
|
+
});
|
|
200
|
+
|
|
201
|
+
const resultRowTest3 = function f(ev){
|
|
202
|
+
if(null === ev.rowNumber){
|
|
203
|
+
T.assert(3===ev.columnNames.length)
|
|
204
|
+
.assert('foo'===ev.columnNames[0])
|
|
205
|
+
.assert('bar'===ev.columnNames[1])
|
|
206
|
+
.assert('baz'===ev.columnNames[2]);
|
|
207
|
+
}else{
|
|
208
|
+
f.counter = ev.rowNumber;
|
|
209
|
+
T.assert('number' === typeof ev.row);
|
|
210
|
+
}
|
|
211
|
+
};
|
|
212
|
+
await wtest('exec',{
|
|
213
|
+
sql: "select 'foo' foo, a bar, 'baz' baz from t limit 2",
|
|
214
|
+
callback: resultRowTest3,
|
|
215
|
+
columnNames: [],
|
|
216
|
+
rowMode: ':bar'
|
|
217
|
+
}, function(ev){
|
|
218
|
+
log("exec() result row:",ev);
|
|
219
|
+
T.assert(2===resultRowTest3.counter);
|
|
220
|
+
});
|
|
221
|
+
|
|
222
|
+
await wtest('exec',{
|
|
223
|
+
multi: true,
|
|
224
|
+
sql:[
|
|
225
|
+
'pragma foreign_keys=0;',
|
|
226
|
+
// ^^^ arbitrary query with no result columns
|
|
227
|
+
'select a, b from t order by a desc; select a from t;'
|
|
228
|
+
// multi-exec only honors results from the first
|
|
229
|
+
// statement with result columns (regardless of whether)
|
|
230
|
+
// it has any rows).
|
|
231
|
+
],
|
|
232
|
+
rowMode: 1,
|
|
233
|
+
resultRows: []
|
|
234
|
+
},function(ev){
|
|
235
|
+
const rows = ev.result.resultRows;
|
|
236
|
+
T.assert(3===rows.length).
|
|
237
|
+
assert(6===rows[0]);
|
|
238
|
+
});
|
|
239
|
+
|
|
240
|
+
await wtest('exec',{sql: 'delete from t where a>3'});
|
|
241
|
+
|
|
242
|
+
await wtest('exec',{
|
|
243
|
+
sql: 'select count(a) from t',
|
|
244
|
+
resultRows: []
|
|
245
|
+
},function(ev){
|
|
246
|
+
ev = ev.result;
|
|
247
|
+
T.assert(1===ev.resultRows.length)
|
|
248
|
+
.assert(2===ev.resultRows[0][0]);
|
|
249
|
+
});
|
|
250
|
+
|
|
251
|
+
await wtest('export', function(ev){
|
|
252
|
+
ev = ev.result;
|
|
253
|
+
T.assert('string' === typeof ev.filename)
|
|
254
|
+
.assert(ev.byteArray instanceof Uint8Array)
|
|
255
|
+
.assert(ev.byteArray.length > 1024)
|
|
256
|
+
.assert('application/x-sqlite3' === ev.mimetype);
|
|
257
|
+
});
|
|
258
|
+
|
|
259
|
+
/***** close() tests must come last. *****/
|
|
260
|
+
await wtest('close',{},function(ev){
|
|
261
|
+
T.assert('string' === typeof ev.result.filename);
|
|
262
|
+
});
|
|
263
|
+
|
|
264
|
+
await wtest('close', (ev)=>{
|
|
265
|
+
T.assert(undefined === ev.result.filename);
|
|
266
|
+
}).finally(()=>logHtml('',"That's all, folks!"));
|
|
267
|
+
}/*runTests2()*/;
|
|
268
|
+
|
|
269
|
+
log("Init complete, but async init bits may still be running.");
|
|
270
|
+
})();
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
|
|
2
|
+
<!doctype html>
|
|
3
|
+
<html lang="en-us">
|
|
4
|
+
<head>
|
|
5
|
+
<meta charset="utf-8">
|
|
6
|
+
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
|
7
|
+
<link rel="shortcut icon" href="data:image/x-icon;," type="image/x-icon">
|
|
8
|
+
<link rel="stylesheet" href="common/emscripten.css"/>
|
|
9
|
+
<link rel="stylesheet" href="common/testing.css"/>
|
|
10
|
+
<title>sqlite3-worker1.js tests</title>
|
|
11
|
+
</head>
|
|
12
|
+
<body>
|
|
13
|
+
<header id='titlebar'><span>sqlite3-worker1.js tests</span></header>
|
|
14
|
+
<!-- emscripten bits -->
|
|
15
|
+
<figure id="module-spinner">
|
|
16
|
+
<div class="spinner"></div>
|
|
17
|
+
<div class='center'><strong>Initializing app...</strong></div>
|
|
18
|
+
<div class='center'>
|
|
19
|
+
On a slow internet connection this may take a moment. If this
|
|
20
|
+
message displays for "a long time", intialization may have
|
|
21
|
+
failed and the JavaScript console may contain clues as to why.
|
|
22
|
+
</div>
|
|
23
|
+
</figure>
|
|
24
|
+
<div class="emscripten" id="module-status">Downloading...</div>
|
|
25
|
+
<div class="emscripten">
|
|
26
|
+
<progress value="0" max="100" id="module-progress" hidden='1'></progress>
|
|
27
|
+
</div><!-- /emscripten bits -->
|
|
28
|
+
<div>Most stuff on this page happens in the dev console.</div>
|
|
29
|
+
<hr>
|
|
30
|
+
<div id='test-output'></div>
|
|
31
|
+
<script src="common/SqliteTestUtil.js"></script>
|
|
32
|
+
<script src="demo-worker1.js"></script>
|
|
33
|
+
</body>
|
|
34
|
+
</html>
|