dbId: an opaque ID value which must be passed in the message
envelope to other calls in this API to tell them which db to
use. If it is not provided to future calls, they will default to
- operating on the first-opened db. This property is, for API
- consistency's sake, also part of the containing message envelope.
- Only the `open` operation includes it in the `result` property.
+ operating on the least-recently-opened db. This property is, for
+ API consistency's sake, also part of the containing message
+ envelope. Only the `open` operation includes it in the `result`
+ property.
persistent: true if the given filename resides in the
known-persistent storage, else false.
Internal helper for managing Worker-level state.
*/
const wState = {
- /** First-opened db is the default for future operations when no
- dbId is provided by the client. */
- defaultDb: undefined,
+ /**
+ Each opened DB is added to this.dbList, and the first entry in
+ that list is the default db. As each db is closed, its entry is
+ removed from the list.
+ */
+ dbList: [],
/** Sequence number of dbId generation. */
idSeq: 0,
/** Map of DB instances to dbId. */
open: function(opt){
const db = new DB(opt.filename);
this.dbs[getDbId(db)] = db;
- if(!this.defaultDb) this.defaultDb = db;
+ if(this.dbList.indexOf(db)<0) this.dbList.push(db);
return db;
},
close: function(db,alsoUnlink){
const filename = db.filename;
const pVfs = sqlite3.wasm.sqlite3_wasm_db_vfs(db.pointer, 0);
db.close();
- if(db===this.defaultDb) this.defaultDb = undefined;
+ const ddNdx = this.dbList.indexOf(db);
+ if(ddNdx>=0) this.dbList.splice(ddNdx, 1);
if(alsoUnlink && filename && pVfs){
sqlite3.wasm.sqlite3_wasm_vfs_unlink(pVfs, filename);
}
}
};
- /** Throws if the given db is falsy or not opened. */
- const affirmDbOpen = function(db = wState.defaultDb){
+ /** Throws if the given db is falsy or not opened, else returns its
+ argument. */
+ const affirmDbOpen = function(db = wState.dbList[0]){
return (db && db.pointer) ? db : toss("DB is not opened.");
};
/** Extract dbId from the given message payload. */
const getMsgDb = function(msgData,affirmExists=true){
- const db = wState.getDb(msgData.dbId,false) || wState.defaultDb;
+ const db = wState.getDb(msgData.dbId,false) || wState.dbList[0];
return affirmExists ? affirmDbOpen(db) : db;
};
const getDefaultDbId = function(){
- return wState.defaultDb && getDbId(wState.defaultDb);
+ return wState.dbList[0] && getDbId(wState.dbList[0]);
};
/**
- A level of "organizational abstraction" for the Worker
- API. Each method in this object must map directly to a Worker
+ A level of "organizational abstraction" for the Worker1
+ API. Each method in this object must map directly to a Worker1
message type key. The onmessage() dispatcher attempts to
dispatch all inbound messages to a method of this object,
passing it the event.data part of the inbound event object. All
const db = wState.open(oargs);
rc.filename = db.filename;
rc.persistent = (!!pDir && db.filename.startsWith(pDir+'/'))
- || sqlite3.capi.sqlite3_js_db_uses_vfs(db.pointer, "opfs");
+ || !!sqlite3.capi.sqlite3_js_db_uses_vfs(db.pointer, "opfs");
rc.dbId = getDbId(db);
return rc;
},
},
/**
- TO(RE)DO, once we can abstract away access to the
- JS environment's virtual filesystem. Currently this
- always throws.
-
- Response is (should be) an object:
+ Exports the database to a byte array, as per
+ sqlite3_serialize(). Response is an object:
{
- buffer: Uint8Array (db file contents),
+ bytearray: Uint8Array (db file contents),
filename: the current db filename,
mimetype: 'application/x-sqlite3'
}
-
- 2022-09-30: we have shell.c:fiddle_export_db() which works fine
- for disk-based databases (even if it's a virtual disk like an
- Emscripten VFS). sqlite3_serialize() can return this for
- :memory: and temp databases.
*/
export: function(ev){
- toss("export() requires reimplementing for portability reasons.");
/**
We need to reimplement this to use the Emscripten FS
interface. That part used to be in the OO#1 API but that
dependency was removed from that level of the API.
*/
- /**const db = getMsgDb(ev);
+ const db = getMsgDb(ev);
const response = {
- buffer: db.exportBinaryImage(),
+ bytearray: sqlite3.capi.sqlite3_js_db_export(db.pointer),
filename: db.filename,
mimetype: 'application/x-sqlite3'
};
- wState.xfer.push(response.buffer.buffer);
- return response;**/
+ wState.xfer.push(response.bytearray.buffer);
+ return response;
}/*export()*/,
toss: function(ev){
-C Internal\stweaks\sto\sthe\sOPFS\sVFS\sresult\scodes.
-D 2022-10-31T11:53:34.287
+C Worker1:\suse\sa\slist,\srather\sthan\sa\ssingle\sslot,\sto\smanage\sthe\sdefault\sdb\slink\sso\sthat\swe\scan\skeep\sthe\sleast-recently-opened\sdb\sas\sthe\sdefault.\sRe-introduce\sworker1.export()\sbut\sdo\snot\syet\sexpose\sit\suntil\san\sequivalent\simport()\s(or\sopen()\soption)\sis\simplemented.
+D 2022-10-31T13:50:05.655
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
F ext/wasm/api/post-js-header.js d6ab3dfef4a06960d28a7eaa338d4e2a1a5981e9b38718168bbde8fdb2a439b8
F ext/wasm/api/pre-js.js 287e462f969342b032c03900e668099fa1471d852df7a472de5bc349161d9c04
F ext/wasm/api/sqlite3-api-cleanup.js ecdc69dbfccfe26146f04799fcfd4a6f5790d46e7e3b9b6e9b0491f92ed8ae34
-F ext/wasm/api/sqlite3-api-glue.js b87543534821ecfa56fc0d0cd153a115fa974e70d6217964baf6e93ef8d25fb1
+F ext/wasm/api/sqlite3-api-glue.js ebfd1d01b249c705482bfe3bdef3b1feaecf55821c46abf79b8105ec9b1c2b1a
F ext/wasm/api/sqlite3-api-oo1.js 4028bc2bac7e3ae2d23b7c99828155b4a06da006b51dc2a929bc0db26337370d
F ext/wasm/api/sqlite3-api-opfs.js 6880cc79a4d1b6075942298d9d1ab07e24d81fbd9e5fe6b7c797b86e4b2af596
F ext/wasm/api/sqlite3-api-prologue.js 873986ca150c79510f647b910f8349bc71b14db21e444cab3b9fad9c4f39ffc7
-F ext/wasm/api/sqlite3-api-worker1.js efdca1b42299d80b54f366d15a8fc5343f3b3e9e3647e5c1fd6f3ee1015e501b
+F ext/wasm/api/sqlite3-api-worker1.js 7de5160ba86ed216e8b99ba1ae0c39c1ff85c11a4818252bfc8dd0dc21109b84
F ext/wasm/api/sqlite3-license-version-header.js a661182fc93fc2cf212dfd0b987f8e138a3ac98f850b1112e29b5fbdaecc87c3
F ext/wasm/api/sqlite3-opfs-async-proxy.js b2264efef84c4a0af5dab426d7573d8b4ee5af3a25ba108b709a835a613c5e36
F ext/wasm/api/sqlite3-wasi.h 25356084cfe0d40458a902afb465df8c21fc4152c1d0a59b563a3fba59a068f9
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P 69d36a6aa5e2cd79d26c0fd3e0d20fe8838fd1be97db07725233bfff1dfe6643
-R a5a69989c955a2bef03fc5f6b9426b6e
+P 32e1a2d2eb8738ae1635e413829f6cf7f64c63d2a86b72940a573de89948e529
+R be757150eb7a7434baec9e7c2d1f82d1
U stephan
-Z 2e8ea5a9464277cec17ca6c43e6fd2fa
+Z e060f282e47bf79484c50e0b31025d45
# Remove this line to create a well-formed Fossil manifest.