mirror of
https://github.com/sqlite/sqlite.git
synced 2025-07-29 08:01:23 +03:00
Initial bits for a JS API variant in which the client operates in the main thread and sqlite3 in a Worker. This is far from complete.
FossilOrigin-Name: f6d6f969791f0d2367ae5418623b4794f6df657d9d7d9002fb5aec4206dcfd4c
This commit is contained in:
@ -85,7 +85,8 @@
|
|||||||
if(!Module.postRun) Module.postRun = [];
|
if(!Module.postRun) Module.postRun = [];
|
||||||
/* ^^^^ the name Module is, in this setup, scope-local in the generated
|
/* ^^^^ the name Module is, in this setup, scope-local in the generated
|
||||||
file sqlite3.js, with which this file gets combined at build-time. */
|
file sqlite3.js, with which this file gets combined at build-time. */
|
||||||
Module.postRun.push(function(namespace){
|
Module.postRun.push(function(namespace/*the module object, the target for
|
||||||
|
installed features*/){
|
||||||
'use strict';
|
'use strict';
|
||||||
/* For reference: sql.js does essentially everything we want and
|
/* For reference: sql.js does essentially everything we want and
|
||||||
it solves much of the wasm-related voodoo, but we'll need a
|
it solves much of the wasm-related voodoo, but we'll need a
|
||||||
@ -470,7 +471,7 @@ Module.postRun.push(function(namespace){
|
|||||||
execMulti():
|
execMulti():
|
||||||
|
|
||||||
- .multi: if true, this function acts as a proxy for
|
- .multi: if true, this function acts as a proxy for
|
||||||
execMulti().
|
execMulti() and behaves identically to that function.
|
||||||
*/
|
*/
|
||||||
exec: function(/*(sql [,optionsObj]) or (optionsObj)*/){
|
exec: function(/*(sql [,optionsObj]) or (optionsObj)*/){
|
||||||
affirmDbOpen(this);
|
affirmDbOpen(this);
|
||||||
@ -549,13 +550,15 @@ Module.postRun.push(function(namespace){
|
|||||||
|
|
||||||
ACHTUNG #1: The callback MUST NOT modify the Stmt
|
ACHTUNG #1: The callback MUST NOT modify the Stmt
|
||||||
object. Calling any of the Stmt.get() variants,
|
object. Calling any of the Stmt.get() variants,
|
||||||
Stmt.getColumnName(), or simililar, is legal, but calling
|
Stmt.getColumnName(), or similar, is legal, but calling
|
||||||
step() or finalize() is not. Routines which are illegal
|
step() or finalize() is not. Routines which are illegal
|
||||||
in this context will trigger an exception.
|
in this context will trigger an exception.
|
||||||
|
|
||||||
ACHTUNG #2: The semantics of the `bind` and `callback`
|
ACHTUNG #2: The semantics of the `bind` and `callback`
|
||||||
options may well change or those options may be removed
|
options may well change or those options may be removed
|
||||||
altogether for this function (but retained for exec()).
|
altogether for this function (but retained for exec()).
|
||||||
|
Generally speaking, neither bind parameters nor a callback
|
||||||
|
are generically useful when executing multi-statement SQL.
|
||||||
*/
|
*/
|
||||||
execMulti: function(/*(sql [,obj]) || (obj)*/){
|
execMulti: function(/*(sql [,obj]) || (obj)*/){
|
||||||
affirmDbOpen(this);
|
affirmDbOpen(this);
|
||||||
@ -1327,8 +1330,8 @@ Module.postRun.push(function(namespace){
|
|||||||
DB,
|
DB,
|
||||||
Stmt,
|
Stmt,
|
||||||
/**
|
/**
|
||||||
Reports whether a given compile-time option, named by the
|
Reports info about compile-time options. It has several
|
||||||
given argument. It has several distinct uses:
|
distinct uses:
|
||||||
|
|
||||||
If optName is an array then it is expected to be a list of
|
If optName is an array then it is expected to be a list of
|
||||||
compilation options and this function returns an object
|
compilation options and this function returns an object
|
||||||
@ -1387,10 +1390,41 @@ Module.postRun.push(function(namespace){
|
|||||||
'string'===typeof optName
|
'string'===typeof optName
|
||||||
) ? !!api.sqlite3_compileoption_used(optName) : false;
|
) ? !!api.sqlite3_compileoption_used(optName) : false;
|
||||||
}
|
}
|
||||||
};
|
}/*SQLite3 object*/;
|
||||||
|
|
||||||
namespace.sqlite3 = {
|
namespace.sqlite3 = {
|
||||||
api: api,
|
api: api,
|
||||||
SQLite3
|
SQLite3
|
||||||
};
|
};
|
||||||
|
|
||||||
|
if(self === self.window){
|
||||||
|
/* This is running in the main window thread, so we're done. */
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
/******************************************************************
|
||||||
|
End of main window thread. What follows is only intended for use
|
||||||
|
in Worker threads.
|
||||||
|
******************************************************************/
|
||||||
|
|
||||||
|
/*
|
||||||
|
TODO: we need an API which can proxy the DB API via a Worker
|
||||||
|
message interface. The primary quirky factor in such an API is
|
||||||
|
that clients cannot pass callback functions to it, so have to receive
|
||||||
|
all query results via asynchronous message-passing.
|
||||||
|
|
||||||
|
Certain important considerations here include:
|
||||||
|
|
||||||
|
- Support only one db connectior or multiple? The former is far
|
||||||
|
easier, but there's always going to be a user out there who
|
||||||
|
wants to juggle six database handles at once.
|
||||||
|
|
||||||
|
- Fetching multiple results: do we pass them on as a series of
|
||||||
|
messages, with start/end messages on either end, or do we
|
||||||
|
collect all results and bundle them back in a single message?
|
||||||
|
The former is, generically speaking, more memory-efficient but
|
||||||
|
the latter far easier to implement in this environment.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
setTimeout(()=>postMessage({type:'sqlite3-api',data:'loaded'}), 0);
|
||||||
});
|
});
|
||||||
|
35
ext/fiddle/sqlite3-worker.js
Normal file
35
ext/fiddle/sqlite3-worker.js
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
/*
|
||||||
|
2022-05-23
|
||||||
|
|
||||||
|
The author disclaims copyright to this source code. In place of a
|
||||||
|
legal notice, here is a blessing:
|
||||||
|
|
||||||
|
* May you do good and not evil.
|
||||||
|
* May you find forgiveness for yourself and forgive others.
|
||||||
|
* May you share freely, never taking more than you give.
|
||||||
|
|
||||||
|
***********************************************************************
|
||||||
|
|
||||||
|
UNDER CONSTRUCTION
|
||||||
|
|
||||||
|
This is a JS Worker file for the main sqlite3 api. It loads
|
||||||
|
sqlite3.js and offers access to the db via the Worker
|
||||||
|
message-passing interface.
|
||||||
|
*/
|
||||||
|
|
||||||
|
"use strict";
|
||||||
|
(function(){
|
||||||
|
/** Posts a worker message as {type:type, data:data}. */
|
||||||
|
const wMsg = (type,data)=>self.postMessage({type, data});
|
||||||
|
self.onmessage = function(ev){
|
||||||
|
/*ev = ev.data;
|
||||||
|
switch(ev.type){
|
||||||
|
default: break;
|
||||||
|
};*/
|
||||||
|
console.warn("Unknown sqlite3-worker message type:",ev);
|
||||||
|
};
|
||||||
|
importScripts('sqlite3.js');
|
||||||
|
initSqlite3Module().then(function(){
|
||||||
|
wMsg('sqlite3-api','ready');
|
||||||
|
});
|
||||||
|
})();
|
@ -10,7 +10,8 @@
|
|||||||
|
|
||||||
***********************************************************************
|
***********************************************************************
|
||||||
|
|
||||||
A basic test script for sqlite3-api.js.
|
A basic test script for sqlite3-api.js. This file must be run in
|
||||||
|
main JS thread and sqlite3.js must have been loaded before it.
|
||||||
*/
|
*/
|
||||||
(function(){
|
(function(){
|
||||||
const T = self.SqliteTestUtil;
|
const T = self.SqliteTestUtil;
|
||||||
|
32
ext/fiddle/testing2.html
Normal file
32
ext/fiddle/testing2.html
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html lang="en-us">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||||
|
<link rel="shortcut icon" href="data:image/x-icon;," type="image/x-icon">
|
||||||
|
<link rel="stylesheet" href="emscripten.css"/>
|
||||||
|
<link rel="stylesheet" href="testing.css"/>
|
||||||
|
<title>sqlite3-worker.js tests</title>
|
||||||
|
<style></style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<header id='titlebar'><span>sqlite3-worker.js tests</span></header>
|
||||||
|
<!-- emscripten bits -->
|
||||||
|
<figure id="module-spinner">
|
||||||
|
<div class="spinner"></div>
|
||||||
|
<div class='center'><strong>Initializing app...</strong></div>
|
||||||
|
<div class='center'>
|
||||||
|
On a slow internet connection this may take a moment. If this
|
||||||
|
message displays for "a long time", intialization may have
|
||||||
|
failed and the JavaScript console may contain clues as to why.
|
||||||
|
</div>
|
||||||
|
</figure>
|
||||||
|
<div class="emscripten" id="module-status">Downloading...</div>
|
||||||
|
<div class="emscripten">
|
||||||
|
<progress value="0" max="100" id="module-progress" hidden='1'></progress>
|
||||||
|
</div><!-- /emscripten bits -->
|
||||||
|
<div>Everything on this page happens in the dev console.</div>
|
||||||
|
<script src="testing-common.js"></script>
|
||||||
|
<script src="testing2.js"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
43
ext/fiddle/testing2.js
Normal file
43
ext/fiddle/testing2.js
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
/*
|
||||||
|
2022-05-22
|
||||||
|
|
||||||
|
The author disclaims copyright to this source code. In place of a
|
||||||
|
legal notice, here is a blessing:
|
||||||
|
|
||||||
|
* May you do good and not evil.
|
||||||
|
* May you find forgiveness for yourself and forgive others.
|
||||||
|
* May you share freely, never taking more than you give.
|
||||||
|
|
||||||
|
***********************************************************************
|
||||||
|
|
||||||
|
A basic test script for sqlite3-worker.js.
|
||||||
|
*/
|
||||||
|
(function(){
|
||||||
|
/** Posts a worker message as {type:type, data:data}. */
|
||||||
|
const SW = new Worker("sqlite3-worker.js");
|
||||||
|
const wMsg = (type,data)=>SW.postMessage({type, data});
|
||||||
|
const log = console.log.bind(console);
|
||||||
|
const warn = console.warn.bind(console);
|
||||||
|
SW.onmessage = function(ev){
|
||||||
|
if(!ev.data || 'object'!==typeof ev.data){
|
||||||
|
warn("Unknown sqlite3-worker message type:",ev);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
ev = ev.data/*expecting a nested object*/;
|
||||||
|
switch(ev.type){
|
||||||
|
case 'sqlite3-api':
|
||||||
|
switch(ev.data){
|
||||||
|
case 'loaded':
|
||||||
|
log("Message:",ev); return;
|
||||||
|
case 'ready':
|
||||||
|
log("Message:",ev);
|
||||||
|
self.sqlite3TestModule.setStatus(null);
|
||||||
|
return;
|
||||||
|
default: break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
warn("Unknown sqlite3-api message type:",ev);
|
||||||
|
};
|
||||||
|
log("Init complete, but async bits may still be running.");
|
||||||
|
})();
|
19
manifest
19
manifest
@ -1,5 +1,5 @@
|
|||||||
C New\sFULL\sJOIN\stest\scases.\s\sNo\schanges\sto\scode.
|
C Initial\sbits\sfor\sa\sJS\sAPI\svariant\sin\swhich\sthe\sclient\soperates\sin\sthe\smain\sthread\sand\ssqlite3\sin\sa\sWorker.\sThis\sis\sfar\sfrom\scomplete.
|
||||||
D 2022-05-31T18:18:09.648
|
D 2022-06-01T00:00:59.491
|
||||||
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
|
||||||
@ -65,10 +65,13 @@ F ext/fiddle/fiddle-worker.js 3a19253dc026d1ad9064ee853f3c4da3385223ce4434dab183
|
|||||||
F ext/fiddle/fiddle.html 724f1cd4126616bc87f5871f78d3f7aaaf41e45c9728724627baab87e6af35f0
|
F ext/fiddle/fiddle.html 724f1cd4126616bc87f5871f78d3f7aaaf41e45c9728724627baab87e6af35f0
|
||||||
F ext/fiddle/fiddle.js 5b456ed7085830cda2fc75a0801476174a978521949335f24bc4154d076dcd4d
|
F ext/fiddle/fiddle.js 5b456ed7085830cda2fc75a0801476174a978521949335f24bc4154d076dcd4d
|
||||||
F ext/fiddle/index.md d9c1c308d8074341bc3b11d1d39073cd77754cb3ca9aeb949f23fdd8323d81cf
|
F ext/fiddle/index.md d9c1c308d8074341bc3b11d1d39073cd77754cb3ca9aeb949f23fdd8323d81cf
|
||||||
F ext/fiddle/sqlite3-api.js 8500698d2163f4a25f8e5e6810ad826487342579d6a321d82b244dbc8e6f6db6
|
F ext/fiddle/sqlite3-api.js ff9580cf075c08bd124ad057079bd32fd121f1e122c8c40e3a836466c1fe1197
|
||||||
|
F ext/fiddle/sqlite3-worker.js c137daed6529b5f527ed61eb358cb0d23f90e04784442479cd15ac684eccdf7a
|
||||||
F ext/fiddle/testing.css 750572dded671d2cf142bbcb27af5542522ac08db128245d0b9fe410aa1d7f2a
|
F ext/fiddle/testing.css 750572dded671d2cf142bbcb27af5542522ac08db128245d0b9fe410aa1d7f2a
|
||||||
F ext/fiddle/testing1.html ea1f3be727f78e420007f823912c1a03b337ecbb8e79449abc2244ad4fe15d9a
|
F ext/fiddle/testing1.html ea1f3be727f78e420007f823912c1a03b337ecbb8e79449abc2244ad4fe15d9a
|
||||||
F ext/fiddle/testing1.js 94a7597955c8fdbd15839a70d9b8279bc690205dda65ff175f688f13bf315745
|
F ext/fiddle/testing1.js e09c224da12b34bd90a1128d4a9cfc546ccca00074d00571977eb44746bf487d
|
||||||
|
F ext/fiddle/testing2.html 9063b2430ade2fe9da4e711addd1b51a2741cf0c7ebf6926472a5e5dd63c0bc4
|
||||||
|
F ext/fiddle/testing2.js 0382f20c6c5e1b2a034240a29d627f0e6ccb9c3be50d7dd1627b04ad5f92b787
|
||||||
F ext/fts1/README.txt 20ac73b006a70bcfd80069bdaf59214b6cf1db5e
|
F ext/fts1/README.txt 20ac73b006a70bcfd80069bdaf59214b6cf1db5e
|
||||||
F ext/fts1/ft_hash.c 3927bd880e65329bdc6f506555b228b28924921b
|
F ext/fts1/ft_hash.c 3927bd880e65329bdc6f506555b228b28924921b
|
||||||
F ext/fts1/ft_hash.h 06df7bba40dadd19597aa400a875dbc2fed705ea
|
F ext/fts1/ft_hash.h 06df7bba40dadd19597aa400a875dbc2fed705ea
|
||||||
@ -1971,8 +1974,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 f2d224c5fa06de70f6f22e159a3b7065d4c6b004f9accc13004b9ac1f2fd5549
|
P 13e89ef6649475815d3f4e4aef73a4be1157dd388e55c7f856faeb4b7387774b
|
||||||
R 5689511af50987f5a7f98a74e3792280
|
R 1d9b814402b0908178d5c21bd5502d71
|
||||||
U drh
|
U stephan
|
||||||
Z cf62f2b6249a650ef9ed77273d324cc2
|
Z f7d167c241a574fa46d16e96c1270f84
|
||||||
# Remove this line to create a well-formed Fossil manifest.
|
# Remove this line to create a well-formed Fossil manifest.
|
||||||
|
@ -1 +1 @@
|
|||||||
13e89ef6649475815d3f4e4aef73a4be1157dd388e55c7f856faeb4b7387774b
|
f6d6f969791f0d2367ae5418623b4794f6df657d9d7d9002fb5aec4206dcfd4c
|
Reference in New Issue
Block a user