*/
self.sqlite3ApiBootstrap.initializers.push(function(sqlite3){
const toss = (...args)=>{throw new Error(args.join(' '))};
+ const toss3 = (...args)=>{throw new sqlite3.SQLite3Error(...args)};
const capi = sqlite3.capi, util = capi.util;
/* What follows is colloquially known as "OO API #1". It is a
const getOwnOption = (opts, p, dflt)=>
opts.hasOwnProperty(p) ? opts[p] : dflt;
- /**
- An Error subclass specifically for reporting DB-level errors and
- enabling clients to unambiguously identify such exceptions.
- */
- class SQLite3Error extends Error {
- /**
- Constructs this object with a message equal to all arguments
- concatenated with a space between each one.
- */
- constructor(...args){
- super(args.join(' '));
- this.name = 'SQLite3Error';
- }
- };
- const toss3 = (...args)=>{throw new SQLite3Error(...args)};
- sqlite3.SQLite3Error = SQLite3Error;
-
// Documented in DB.checkRc()
const checkSqlite3Rc = function(dbPtr, sqliteResultCode){
if(sqliteResultCode){
if(dbPtr instanceof DB) dbPtr = dbPtr.pointer;
- throw new SQLite3Error(
+ toss3(
"sqlite result code",sqliteResultCode+":",
(dbPtr
? capi.sqlite3_errmsg(dbPtr)
If passed an object, any additional properties it has are copied
as-is into the new object.
*/
- dbCtorHelper.normalizeArgs = function(filename,flags = 'c',vfs = null){
+ dbCtorHelper.normalizeArgs = function(filename=':memory:',flags = 'c',vfs = null){
const arg = {};
if(1===arguments.length && 'object'===typeof arguments[0]){
const x = arguments[0];
Object.keys(x).forEach((k)=>arg[k] = x[k]);
if(undefined===arg.flags) arg.flags = 'c';
if(undefined===arg.vfs) arg.vfs = null;
+ if(undefined===arg.filename) arg.filename = ':memory:';
}else{
arg.filename = filename;
arg.flags = flags;
The final argument is analogous to the final argument of
sqlite3_open_v2(): the name of an sqlite3 VFS. Pass a falsy value,
- or not at all, to use the default. If passed a value, it must
+ or none at all, to use the default. If passed a value, it must
be the string name of a VFS
The constructor optionally (and preferably) takes its arguments
*/
prepare: function(sql){
affirmDbOpen(this);
- if(Array.isArray(sql)) sql = sql.join('');
- const stack = capi.wasm.scopedAllocPush();
+ const stack = capi.wasm.pstack.pointer;
let ppStmt, pStmt;
try{
- ppStmt = capi.wasm.scopedAllocPtr()/* output (sqlite3_stmt**) arg */;
+ ppStmt = capi.wasm.pstack.alloc(8)/* output (sqlite3_stmt**) arg */;
DB.checkRc(this, capi.sqlite3_prepare_v2(this.pointer, sql, -1, ppStmt, null));
pStmt = capi.wasm.getPtrValue(ppStmt);
}
- finally {capi.wasm.scopedAllocPop(stack)}
+ finally {
+ capi.wasm.pstack.restore(stack);
+ }
if(!pStmt) toss3("Cannot prepare empty SQL.");
const stmt = new Stmt(this, pStmt, BindTypes);
__stmtMap.get(this)[pStmt] = stmt;
SQLITE_{typename} constants. Passing the undefined value is
the same as not passing a value.
- Throws on error (e.g. malformedSQL).
+ Throws on error (e.g. malformed SQL).
*/
selectValue: function(sql,bind,asType){
let stmt, rc;
}
}
};
- }
+ }/* static init */
affirmSupportedBindType(val);
ndx = affirmParamIndex(stmt,ndx);
let rc = 0;
case BindTypes.number: {
let m;
if(util.isInt32(val)) m = capi.sqlite3_bind_int;
- else if(capi.wasm.bigIntEnabled && ('bigint'===typeof val)){
+ else if('bigint'===typeof val){
if(val<f._minInt || val>f._maxInt){
- toss3("BigInt value is out of range for int64: "+val);
+ toss3("BigInt value is out of range for storing as int64: "+val);
+ }else if(capi.wasm.bigIntEnabled){
+ m = capi.sqlite3_bind_int64;
+ }else if(val >= Number.MIN_SAFE_INTEGER && val <= Number.MAX_SAFE_INTEGER){
+ val = Number(val);
+ m = capi.sqlite3_bind_double;
+ }else{
+ toss3("BigInt value is out of range for storing as double: "+val);
+ }
+ }else{ // !int32, !bigint
+ val = Number(val);
+ if(capi.wasm.bigIntEnabled && Number.isInteger(val)){
+ m = capi.sqlite3_bind_int64;
+ }else{
+ m = capi.sqlite3_bind_double;
}
- m = capi.sqlite3_bind_int64;
- }else if(Number.isInteger(val)){
- m = capi.sqlite3_bind_int64;
- }else{
- m = capi.sqlite3_bind_double;
}
rc = m(stmt.pointer, ndx, val);
break;
- null is bound as NULL.
- undefined as a standalone value is a no-op intended to
- simplify certain client-side use cases: passing undefined
- as a value to this function will not actually bind
- anything and this function will skip confirmation that
- binding is even legal. (Those semantics simplify certain
- client-side uses.) Conversely, a value of undefined as an
- array or object property when binding an array/object
- (see below) is treated the same as null.
-
- - Numbers are bound as either doubles or integers: doubles
- if they are larger than 32 bits, else double or int32,
- depending on whether they have a fractional part. (It is,
- as of this writing, illegal to call (from JS) a WASM
- function which either takes or returns an int64.)
- Booleans are bound as integer 0 or 1. It is not expected
- the distinction of binding doubles which have no
- fractional parts is integers is significant for the
- majority of clients due to sqlite3's data typing
- model. If capi.wasm.bigIntEnabled is true then this
- routine will bind BigInt values as 64-bit integers.
+ simplify certain client-side use cases: passing undefined as
+ a value to this function will not actually bind anything and
+ this function will skip confirmation that binding is even
+ legal. (Those semantics simplify certain client-side uses.)
+ Conversely, a value of undefined as an array or object
+ property when binding an array/object (see below) is treated
+ the same as null.
+
+ - Numbers are bound as either doubles or integers: doubles if
+ they are larger than 32 bits, else double or int32, depending
+ on whether they have a fractional part. Booleans are bound as
+ integer 0 or 1. It is not expected the distinction of binding
+ doubles which have no fractional parts is integers is
+ significant for the majority of clients due to sqlite3's data
+ typing model. If [BigInt] support is enabled then this
+ routine will bind BigInt values as 64-bit integers if they'll
+ fit in 64 bits. If that support disabled, it will store the
+ BigInt as an int32 or a double if it can do so without loss
+ of precision. If the BigInt is _too BigInt_ then it will
+ throw.
- Strings are bound as strings (use bindAsBlob() to force
- blob binding).
+ blob binding).
- Uint8Array and Int8Array instances are bound as blobs.
- (TODO: binding the other TypedArray types.)
+ (TODO: binding the other TypedArray types.)
If passed an array, each element of the array is bound at
the parameter index equal to the array index plus 1
This is intended to simplify use cases such as:
```
- aDb.prepare("insert in foo(a) values(?)").bind(123).stepFinalize();
+ aDb.prepare("insert into foo(a) values(?)").bind(123).stepFinalize();
```
*/
stepFinalize: function(){
},
// Design note: the only reason most of these getters have a 'get'
// prefix is for consistency with getVALUE_TYPE(). The latter
- // arguablly really need that prefix for API readability and the
+ // arguably really need that prefix for API readability and the
// rest arguably don't, but consistency is a powerful thing.
/**
Returns the result column name of the given index, or
cannot have result columns. This object's columnCount member
holds the number of columns.
*/
- getColumnNames: function(tgt){
+ getColumnNames: function(tgt=[]){
affirmColIndex(affirmStmtOpen(this),0);
- if(!tgt) tgt = [];
for(let i = 0; i < this.columnCount; ++i){
tgt.push(capi.sqlite3_column_name(this.pointer, i));
}
-C Correct\sfiddle\sdb\sexport\sbreakage\scaused\sby\sa\spost-testing\sAPI\schange\smade\sin\s[1fa019c88dea].
-D 2022-10-01T19:21:52.215
+C General\sinternal\scleanups\sin\sthe\soo1\sAPI.
+D 2022-10-02T00:09:40.160
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
F ext/wasm/api/pre-js.js 2db711eb637991b383fc6b5c0f3df65ec48a7201e5730e304beba8de2d3f9b0b
F ext/wasm/api/sqlite3-api-cleanup.js 5d22d1d3818ecacb23bfa223d5970cd0617d8cdbb48c8bc4bbd463f05b021a99
F ext/wasm/api/sqlite3-api-glue.js b15a51b88aaa472d36bf82d5123dbfdafe8ddf6ca75fba934510e4a20bbe4adb
-F ext/wasm/api/sqlite3-api-oo1.js 9caed0757a5e039ed92467e827fd3ca347fa08f19fe086fcbdd14a4ebe9c2f01
+F ext/wasm/api/sqlite3-api-oo1.js 7667d320f6b9fb5252050a2f9c0b1769e11b84dbc0763b999baf65b451b14369
F ext/wasm/api/sqlite3-api-opfs.js 1b097808b7b081b0f0700cf97d49ef19760e401706168edff9cd45cf9169f541
-F ext/wasm/api/sqlite3-api-prologue.js 8692571345efc0f6844092e5ffa86cbd72af0fa23696599c04cc28d64c5d1d11
+F ext/wasm/api/sqlite3-api-prologue.js a93bd69969eb8b8f9c4cb34e5d86dcbbe5adbeeea39c1cce57194256c5f28434
F ext/wasm/api/sqlite3-api-worker1.js 7f4f46cb6b512a48572d7567233896e6a9c46570c44bdc3d13419730c7c221c8
F ext/wasm/api/sqlite3-wasi.h 25356084cfe0d40458a902afb465df8c21fc4152c1d0a59b563a3fba59a068f9
F ext/wasm/api/sqlite3-wasm.c d72aecf0e50a4403402095ef4e8d6a814fdc2256589944c1dc974c70d2f65b7e
F ext/wasm/testing-worker1-promiser.html 6eaec6e04a56cf24cf4fa8ef49d78ce8905dde1354235c9125dca6885f7ce893
F ext/wasm/testing-worker1-promiser.js bd788e33c1807e0a6dda9c9a9d784bd3350ca49c9dd8ae2cc8719b506b6e013e
F ext/wasm/testing1.html 50575755e43232dbe4c2f97c9086b3118eb91ec2ee1fae931e6d7669fb17fcae
-F ext/wasm/testing1.js 419e029ee4ae3cf98dd4c20aebdb111afe743b54ed8856e5f59775c3241fd21f
+F ext/wasm/testing1.js 51ef1ced0669f804787ce96f19dcf64367550a7923a998514be56076326988d7
F ext/wasm/testing2.html a66951c38137ff1d687df79466351f3c734fa9c6d9cce71d3cf97c291b2167e3
F ext/wasm/testing2.js 88f40ef3cd8201bdadd120a711c36bbf0ce56cc0eab1d5e7debb71fed7822494
F ext/wasm/wasmfs.make 3cce1820006196de140f90f2da4b4ea657083fb5bfee7d125be43f7a85748c8f
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P c8a173cf16d2567bf9b13f52904077a2e7209776c76613c7bff59cd66e24bf11
-R d4bf3165ea62de5a9f288d66d4a2cd95
+P e73cc44ec36c7585ebb914bdeed5b39480fca7c7a8d3c4426bfe769c87b98d17
+R 4b53a976c2062b810a77639258e8be02
U stephan
-Z a03f054bd345e55a260c4a080b874912
+Z f0b55570286779c7113ac4ef57233011
# Remove this line to create a well-formed Fossil manifest.