1
0
mirror of https://github.com/sqlite/sqlite.git synced 2025-07-29 08:01:23 +03:00

Add sqlite3.capi.sqlite3_js_posix_create_file() and oo1.OpfsDb.importDb() as alternatives for the newly-deprecated sqlite3_js_vfs_create_file().

FossilOrigin-Name: da6eaf8d8258f3e2c8633fd7faf4e90c3307b5c60bd8b69c626b3c82b19dbdef
This commit is contained in:
stephan
2023-08-11 17:38:17 +00:00
parent 7e13152952
commit b949244ea1
8 changed files with 188 additions and 79 deletions

View File

@ -179,7 +179,6 @@ SQLITE_OPT = \
-DSQLITE_OMIT_DEPRECATED \ -DSQLITE_OMIT_DEPRECATED \
-DSQLITE_OMIT_UTF16 \ -DSQLITE_OMIT_UTF16 \
-DSQLITE_OMIT_SHARED_CACHE \ -DSQLITE_OMIT_SHARED_CACHE \
-DSQLITE_OMIT_WAL \
-DSQLITE_THREADSAFE=0 \ -DSQLITE_THREADSAFE=0 \
-DSQLITE_TEMP_STORE=2 \ -DSQLITE_TEMP_STORE=2 \
-DSQLITE_OS_KV_OPTIONAL=1 \ -DSQLITE_OS_KV_OPTIONAL=1 \
@ -187,10 +186,12 @@ SQLITE_OPT = \
-DSQLITE_USE_URI=1 \ -DSQLITE_USE_URI=1 \
-DSQLITE_WASM_ENABLE_C_TESTS \ -DSQLITE_WASM_ENABLE_C_TESTS \
-DSQLITE_C=$(sqlite3.c) -DSQLITE_C=$(sqlite3.c)
#SQLITE_OPT += -DSQLITE_DEBUG
# achtung: enabling -DSQLITE_DEBUG breaks # Enabling SQLITE_DEBUG will break sqlite3_wasm_vfs_create_file()
# sqlite3_wasm_vfs_create_file(), causing it to trigger assertions in # (and thus sqlite3_js_vfs_create_file()). Those functions are
# the core. That was unfortunately not discovered until 2023-08-11. # deprecated and alternatives are in place, but this crash behavior
# can be used to find errant uses of sqlite3_js_vfs_create_file()
# in client code.
.NOTPARALLEL: $(sqlite3.h) .NOTPARALLEL: $(sqlite3.h)
$(sqlite3.h): $(sqlite3.h):

View File

@ -608,6 +608,7 @@ globalThis.sqlite3ApiBootstrap.initializers.push(function(sqlite3){
["sqlite3_wasm_db_vfs", "sqlite3_vfs*", "sqlite3*","string"], ["sqlite3_wasm_db_vfs", "sqlite3_vfs*", "sqlite3*","string"],
["sqlite3_wasm_vfs_create_file", "int", ["sqlite3_wasm_vfs_create_file", "int",
"sqlite3_vfs*","string","*", "int"], "sqlite3_vfs*","string","*", "int"],
["sqlite3_wasm_posix_create_file", "int", "string","*", "int"],
["sqlite3_wasm_vfs_unlink", "int", "sqlite3_vfs*","string"] ["sqlite3_wasm_vfs_unlink", "int", "sqlite3_vfs*","string"]
]; ];

View File

@ -1357,11 +1357,73 @@ globalThis.sqlite3ApiBootstrap = function sqlite3ApiBootstrap(
}; };
/** /**
Achtung: this function does not work in debug builds of sqlite3 If the current environment supports the POSIX file APIs, this routine
because its out-of-scope use of the sqlite3_vfs API triggers creates (or overwrites) the given file using those APIs. This is
unresolvable assertions in the core library. That was primarily intended for use in Emscripten-based builds where the POSIX
unfortunately not discovered until 2023-08-11. Because of that, APIs are transparently proxied by an in-memory virtual filesystem.
this function is now deprecated and should be used in new code. It may behave diffrently in other environments.
The first argument must be either a JS string or WASM C-string
holding the filename. Note that this routine does _not_ create
intermediary directories if the filename has a directory part.
The 2nd argument may either a valid WASM memory pointer, an
ArrayBuffer, or a Uint8Array. The 3rd must be the length, in
bytes, of the data array to copy. If the 2nd argument is an
ArrayBuffer or Uint8Array and the 3rd is not a positive integer
then the 3rd defaults to the array's byteLength value.
Results are undefined if data is a WASM pointer and dataLen is
exceeds data's bounds.
Throws if any arguments are invalid or if creating or writing to
the file fails.
Added in 3.43 as an alternative for the deprecated
sqlite3_js_vfs_create_file().
*/
capi.sqlite3_js_posix_create_file = function(filename, data, dataLen){
let pData;
if(data && wasm.isPtr(data)){
pData = data;
}else if(data instanceof ArrayBuffer || data instanceof Uint8Array){
pData = wasm.allocFromTypedArray(data);
if(arguments.length<3 || !util.isInt32(dataLen) || dataLen<0){
dataLen = data.byteLength;
}
}else{
SQLite3Error.toss("Invalid 2nd argument for sqlite3_js_posix_create_file().");
}
try{
if(!util.isInt32(dataLen) || dataLen<0){
SQLite3Error.toss("Invalid 3rd argument for sqlite3_js_posix_create_file().");
}
const rc = wasm.sqlite3_wasm_posix_create_file(filename, pData, dataLen);
if(rc) SQLite3Error.toss("Creation of file failed with sqlite3 result code",
capi.sqlite3_js_rc_str(rc));
}finally{
wasm.dealloc(pData);
}
};
/**
Deprecation warning: this function does not work properly in
debug builds of sqlite3 because its out-of-scope use of the
sqlite3_vfs API triggers assertions in the core library. That
was unfortunately not discovered until 2023-08-11. This function
is now deprecated and should not be used in new code.
Alternative options:
- "unix" VFS and its variants can get equivalent functionality
with sqlite3_js_posix_create_file().
- OPFS: use either sqlite3.oo1.OpfsDb.importDb(), for the "opfs"
VFS, or the importDb() method of the PoolUtil object provided
by the "opfs-sahpool" OPFS (noting that its VFS name may differ
depending on client-side configuration). We cannot proxy those
from here because the former is necessarily asynchronous and
the latter requires information not available to this function.
Creates a file using the storage appropriate for the given Creates a file using the storage appropriate for the given
sqlite3_vfs. The first argument may be a VFS name (JS string sqlite3_vfs. The first argument may be a VFS name (JS string
@ -1408,9 +1470,13 @@ globalThis.sqlite3ApiBootstrap = function sqlite3ApiBootstrap(
VFS nor the WASM environment imposes requirements which break it. VFS nor the WASM environment imposes requirements which break it.
- "opfs": uses OPFS storage and creates directory parts of the - "opfs": uses OPFS storage and creates directory parts of the
filename. filename. It can only be used to import an SQLite3 database
file and will fail if given anything else.
*/ */
capi.sqlite3_js_vfs_create_file = function(vfs, filename, data, dataLen){ capi.sqlite3_js_vfs_create_file = function(vfs, filename, data, dataLen){
config.warn("sqlite3_js_vfs_create_file() is deprecated and",
"should be avoided because it can lead to C-level crashes.",
"See its documentation for alternative options.");
let pData; let pData;
if(data){ if(data){
if(wasm.isPtr(data)){ if(wasm.isPtr(data)){
@ -1438,7 +1504,7 @@ globalThis.sqlite3ApiBootstrap = function sqlite3ApiBootstrap(
if(rc) SQLite3Error.toss("Creation of file failed with sqlite3 result code", if(rc) SQLite3Error.toss("Creation of file failed with sqlite3 result code",
capi.sqlite3_js_rc_str(rc)); capi.sqlite3_js_rc_str(rc));
}finally{ }finally{
wasm.dealloc(pData); wasm.dealloc(pData);
} }
}; };

View File

@ -1168,11 +1168,41 @@ const installOpfsVfs = function callee(options){
doDir(opt.directory, 0); doDir(opt.directory, 0);
}; };
//TODO to support fiddle and worker1 db upload: /**
//opfsUtil.createFile = function(absName, content=undefined){...} Asynchronously imports the given bytes (a byte array or
//We have sqlite3.wasm.sqlite3_wasm_vfs_create_file() for this ArrayBuffer) into the given database file.
//purpose but its interface and name are still under
//consideration. It very specifically requires the input to be an SQLite3
database and throws if that's not the case. It does so in
order to prevent this function from taking on a larger scope
than it is specifically intended to. i.e. we do not want it to
become a convenience for importing arbitrary files into OPFS.
Throws on error. Resolves to the number of bytes written.
*/
opfsUtil.importDb = async function(filename, bytes){
if(bytes instanceof ArrayBuffer) bytes = new Uint8Array(bytes);
const n = bytes.byteLength;
if(n<512 || n%512!=0){
toss("Byte array size is invalid for an SQLite db.");
}
const header = "SQLite format 3";
for(let i = 0; i < header.length; ++i){
if( header.charCodeAt(i) !== bytes[i] ){
toss("Input does not contain an SQLite database header.");
}
}
const [hDir, fnamePart] = await opfsUtil.getDirForFilename(filename, true);
const hFile = await hDir.getFileHandle(fnamePart, {create:true});
const sah = await hFile.createSyncAccessHandle();
sah.truncate(0);
const nWrote = sah.write(bytes, {at: 0});
sah.close();
if(nWrote != n){
toss("Expected to write "+n+" bytes but wrote "+nWrote+".");
}
return nWrote;
};
if(sqlite3.oo1){ if(sqlite3.oo1){
const OpfsDb = function(...args){ const OpfsDb = function(...args){
@ -1182,6 +1212,7 @@ const installOpfsVfs = function callee(options){
}; };
OpfsDb.prototype = Object.create(sqlite3.oo1.DB.prototype); OpfsDb.prototype = Object.create(sqlite3.oo1.DB.prototype);
sqlite3.oo1.OpfsDb = OpfsDb; sqlite3.oo1.OpfsDb = OpfsDb;
OpfsDb.importDb = opfsUtil.importDb;
sqlite3.oo1.DB.dbCtorHelper.setVfsPostOpenSql( sqlite3.oo1.DB.dbCtorHelper.setVfsPostOpenSql(
opfsVfs.pointer, opfsVfs.pointer,
function(oo1Db, sqlite3){ function(oo1Db, sqlite3){

View File

@ -141,9 +141,6 @@
#ifndef SQLITE_OMIT_UTF16 #ifndef SQLITE_OMIT_UTF16
# define SQLITE_OMIT_UTF16 1 # define SQLITE_OMIT_UTF16 1
#endif #endif
#ifndef SQLITE_OMIT_WAL
# define SQLITE_OMIT_WAL 1
#endif
#ifndef SQLITE_OS_KV_OPTIONAL #ifndef SQLITE_OS_KV_OPTIONAL
# define SQLITE_OS_KV_OPTIONAL 1 # define SQLITE_OS_KV_OPTIONAL 1
#endif #endif
@ -1353,6 +1350,13 @@ int sqlite3_wasm_db_serialize( sqlite3 *pDb, const char *zSchema,
** This function is NOT part of the sqlite3 public API. It is strictly ** This function is NOT part of the sqlite3 public API. It is strictly
** for use by the sqlite project's own JS/WASM bindings. ** for use by the sqlite project's own JS/WASM bindings.
** **
** ACHTUNG: it was discovered on 2023-08-11 that, with SQLITE_DEBUG,
** this function's out-of-scope use of the sqlite3_vfs/file/io_methods
** APIs leads to triggering of assertions in the core library. Its use
** is now deprecated and VFS-specific APIs for importing files need to
** be found to replace it. sqlite3_wasm_posix_create_file() is
** suitable for the "unix" family of VFSes.
**
** Creates a new file using the I/O API of the given VFS, containing ** Creates a new file using the I/O API of the given VFS, containing
** the given number of bytes of the given data. If the file exists, it ** the given number of bytes of the given data. If the file exists, it
** is truncated to the given length and populated with the given ** is truncated to the given length and populated with the given
@ -1395,16 +1399,17 @@ int sqlite3_wasm_vfs_create_file( sqlite3_vfs *pVfs,
const char *zFilename, const char *zFilename,
const unsigned char * pData, const unsigned char * pData,
int nData ){ int nData ){
#ifdef SQLITE_DEBUG
fprintf(stderr,"%s does not work in debug builds because its out-of-scope use of "
"the sqlite3_vfs API triggers assertions in the core library.\n", __func__);
/* ^^^ That was unfortunately not discovered until 2023-08-11. */
return SQLITE_ERROR;
#else
int rc; int rc;
sqlite3_file *pFile = 0; sqlite3_file *pFile = 0;
sqlite3_io_methods const *pIo; sqlite3_io_methods const *pIo;
const int openFlags = SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE; const int openFlags = SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE
#if 0 && defined(SQLITE_DEBUG)
| SQLITE_OPEN_MAIN_JOURNAL
/* ^^^^ This is for testing a horrible workaround to avoid
triggering a specific assert() in os_unix.c:unixOpen(). Please
do not enable this in real builds. */
#endif
;
int flagsOut = 0; int flagsOut = 0;
int fileExisted = 0; int fileExisted = 0;
int doUnlock = 0; int doUnlock = 0;
@ -1468,7 +1473,34 @@ int sqlite3_wasm_vfs_create_file( sqlite3_vfs *pVfs,
RC; RC;
#undef RC #undef RC
return rc; return rc;
#endif }
/**
** This function is NOT part of the sqlite3 public API. It is strictly
** for use by the sqlite project's own JS/WASM bindings.
**
** Creates or overwrites a file using the POSIX file API,
** i.e. Emscripten's virtual filesystem. Creates or truncates
** zFilename, appends pData bytes to it, and returns 0 on success or
** SQLITE_IOERR on error.
*/
SQLITE_WASM_EXPORT
int sqlite3_wasm_posix_create_file( const char *zFilename,
const unsigned char * pData,
int nData ){
int rc;
FILE * pFile = 0;
int fileExisted = 0;
size_t nWrote = 1;
if( !zFilename || nData<0 || (pData==0 && nData>0) ) return SQLITE_MISUSE;
pFile = fopen(zFilename, "w");
if( 0==pFile ) return SQLITE_IOERR;
if( nData>0 ){
nWrote = fwrite(pData, (size_t)nData, 1, pFile);
}
fclose(pFile);
return 1==nWrote ? 0 : SQLITE_IOERR;
} }
/* /*

View File

@ -1657,7 +1657,7 @@ globalThis.sqlite3InitModule = sqlite3InitModule;
.assert('number'===typeof rc[0]) .assert('number'===typeof rc[0])
.assert(rc[0]|0 === rc[0] /* is small integer */); .assert(rc[0]|0 === rc[0] /* is small integer */);
}) })
//////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////
.t({ .t({
name: 'sqlite3_js_db_export()', name: 'sqlite3_js_db_export()',
predicate: ()=>true, predicate: ()=>true,
@ -1671,13 +1671,12 @@ globalThis.sqlite3InitModule = sqlite3InitModule;
} }
}/*sqlite3_js_db_export()*/) }/*sqlite3_js_db_export()*/)
.t({ .t({
name: 'sqlite3_js_vfs_create_file() with db in default VFS', name: 'sqlite3_js_posix_create_file()',
predicate: ()=>true, predicate: ()=>true,
test: function(sqlite3){ test: function(sqlite3){
const db = this.db; const db = this.db;
const pVfs = capi.sqlite3_js_db_vfs(db); const filename = "sqlite3_js_posix_create_file.db";
const filename = "sqlite3_js_vfs_create_file().db"; capi.sqlite3_js_posix_create_file(filename, this.dbExport);
capi.sqlite3_js_vfs_create_file(pVfs, filename, this.dbExport);
delete this.dbExport; delete this.dbExport;
const db2 = new sqlite3.oo1.DB(filename,'r'); const db2 = new sqlite3.oo1.DB(filename,'r');
try { try {
@ -1686,7 +1685,7 @@ globalThis.sqlite3InitModule = sqlite3InitModule;
T.assert(n>0 && db2.selectValue(sql) === n); T.assert(n>0 && db2.selectValue(sql) === n);
}finally{ }finally{
db2.close(); db2.close();
wasm.sqlite3_wasm_vfs_unlink(pVfs, filename); wasm.sqlite3_wasm_vfs_unlink(0, filename);
} }
} }
}/*sqlite3_js_vfs_create_file()*/) }/*sqlite3_js_vfs_create_file()*/)
@ -2907,7 +2906,7 @@ globalThis.sqlite3InitModule = sqlite3InitModule;
.t({ .t({
name: 'OPFS db sanity checks', name: 'OPFS db sanity checks',
test: async function(sqlite3){ test: async function(sqlite3){
const filename = this.opfsDbFile = 'sqlite3-tester1.db'; const filename = this.opfsDbFile = '/dir/sqlite3-tester1.db';
const pVfs = this.opfsVfs = capi.sqlite3_vfs_find('opfs'); const pVfs = this.opfsVfs = capi.sqlite3_vfs_find('opfs');
T.assert(pVfs); T.assert(pVfs);
const unlink = this.opfsUnlink = const unlink = this.opfsUnlink =
@ -2935,22 +2934,23 @@ globalThis.sqlite3InitModule = sqlite3InitModule;
} }
}/*OPFS db sanity checks*/) }/*OPFS db sanity checks*/)
.t({ .t({
name: 'OPFS export/import', name: 'OPFS import',
test: async function(sqlite3){ test: async function(sqlite3){
let db; let db;
try { try {
const exp = this.opfsDbExport; const exp = this.opfsDbExport;
delete this.opfsDbExport; delete this.opfsDbExport;
capi.sqlite3_js_vfs_create_file("opfs", this.opfsDbFile, exp); this.opfsImportSize = await sqlite3.oo1.OpfsDb.importDb(this.opfsDbFile, exp);
const db = new sqlite3.oo1.OpfsDb(this.opfsDbFile); db = new sqlite3.oo1.OpfsDb(this.opfsDbFile);
T.assert(6 === db.selectValue('select count(*) from p')); T.assert(6 === db.selectValue('select count(*) from p')).
assert( this.opfsImportSize == exp.byteLength );
}finally{ }finally{
if(db) db.close(); if(db) db.close();
} }
} }
}/*OPFS export/import*/) }/*OPFS export/import*/)
.t({ .t({
name: 'OPFS utility APIs and sqlite3_js_vfs_create_file()', name: '(Internal-use) OPFS utility APIs',
test: async function(sqlite3){ test: async function(sqlite3){
const filename = this.opfsDbFile; const filename = this.opfsDbFile;
const pVfs = this.opfsVfs; const pVfs = this.opfsVfs;
@ -2959,8 +2959,6 @@ globalThis.sqlite3InitModule = sqlite3InitModule;
delete this.opfsDbFile; delete this.opfsDbFile;
delete this.opfsVfs; delete this.opfsVfs;
delete this.opfsUnlink; delete this.opfsUnlink;
unlink();
// Sanity-test sqlite3_js_vfs_create_file()...
/************************************************************** /**************************************************************
ATTENTION CLIENT-SIDE USERS: sqlite3.opfs is NOT intended ATTENTION CLIENT-SIDE USERS: sqlite3.opfs is NOT intended
for client-side use. It is only for this project's own for client-side use. It is only for this project's own
@ -2968,39 +2966,19 @@ globalThis.sqlite3InitModule = sqlite3InitModule;
any time. any time.
***************************************************************/ ***************************************************************/
const opfs = sqlite3.opfs; const opfs = sqlite3.opfs;
const fSize = 1379; const fSize = this.opfsImportSize;
delete this.opfsImportSize;
let sh; let sh;
try{ try{
T.assert(!(await opfs.entryExists(filename)));
capi.sqlite3_js_vfs_create_file(
pVfs, filename, null, fSize
);
T.assert(await opfs.entryExists(filename)); T.assert(await opfs.entryExists(filename));
let fh = await opfs.rootDirectory.getFileHandle(filename); const [dirHandle, filenamePart] = await opfs.getDirForFilename(filename, false);
const fh = await dirHandle.getFileHandle(filenamePart);
sh = await fh.createSyncAccessHandle(); sh = await fh.createSyncAccessHandle();
T.assert(fSize === await sh.getSize()); T.assert(fSize === await sh.getSize());
await sh.close(); await sh.close();
sh = undefined; sh = undefined;
unlink(); unlink();
T.assert(!(await opfs.entryExists(filename))); T.assert(!(await opfs.entryExists(filename)));
const ba = new Uint8Array([1,2,3,4,5]);
capi.sqlite3_js_vfs_create_file(
"opfs", filename, ba
);
T.assert(await opfs.entryExists(filename));
fh = await opfs.rootDirectory.getFileHandle(filename);
sh = await fh.createSyncAccessHandle();
T.assert(ba.byteLength === await sh.getSize());
await sh.close();
sh = undefined;
unlink();
T.mustThrowMatching(()=>{
capi.sqlite3_js_vfs_create_file(
"no-such-vfs", filename, ba
);
}, "SQLITE_NOTFOUND: Unknown sqlite3_vfs name: no-such-vfs");
}finally{ }finally{
if(sh) await sh.close(); if(sh) await sh.close();
unlink(); unlink();
@ -3103,7 +3081,7 @@ globalThis.sqlite3InitModule = sqlite3InitModule;
const conf2 = JSON.parse(JSON.stringify(sahPoolConfig)); const conf2 = JSON.parse(JSON.stringify(sahPoolConfig));
conf2.name += '-test2'; conf2.name += '-test2';
const POther = await inst(conf2); const POther = await inst(conf2);
log("Installed second SAH instance as",conf2.name); //log("Installed second SAH instance as",conf2.name);
T.assert(0 === POther.getFileCount()) T.assert(0 === POther.getFileCount())
.assert(true === await POther.removeVfs()); .assert(true === await POther.removeVfs());

View File

@ -1,5 +1,5 @@
C Deprecate\ssqlite3_js_vfs_create_file()\sbecause,\sit\swas\sdiscovered\stoday,\sits\sout-of-scope\suse\sof\sthe\ssqlite3_vfs,\ssqlite3_file,\sand\ssqlite3_io_methods\sAPIs\striggers\sunresolvable\sassertions\sin\sthe\score\swhen\sbuilt\swith\sSQLITE_DEBUG. C Add\ssqlite3.capi.sqlite3_js_posix_create_file()\sand\soo1.OpfsDb.importDb()\sas\salternatives\sfor\sthe\snewly-deprecated\ssqlite3_js_vfs_create_file().
D 2023-08-11T14:31:20.718 D 2023-08-11T17:38:17.359
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
@ -488,7 +488,7 @@ F ext/userauth/sqlite3userauth.h 7f3ea8c4686db8e40b0a0e7a8e0b00fac13aa7a3
F ext/userauth/user-auth.txt e6641021a9210364665fe625d067617d03f27b04 F ext/userauth/user-auth.txt e6641021a9210364665fe625d067617d03f27b04
F ext/userauth/userauth.c 7f00cded7dcaa5d47f54539b290a43d2e59f4b1eb5f447545fa865f002fc80cb F ext/userauth/userauth.c 7f00cded7dcaa5d47f54539b290a43d2e59f4b1eb5f447545fa865f002fc80cb
F ext/wasm/EXPORTED_FUNCTIONS.fiddle.in 27450c8b8c70875a260aca55435ec927068b34cef801a96205adb81bdcefc65c F ext/wasm/EXPORTED_FUNCTIONS.fiddle.in 27450c8b8c70875a260aca55435ec927068b34cef801a96205adb81bdcefc65c
F ext/wasm/GNUmakefile 887923b481caf78b5b7eba42a2919fc154314075b2f95e9ab9de79ba1e2c49be F ext/wasm/GNUmakefile 8159bc5f9433fe21022c1a8e8c30cb1a523530ba9ef53bdf5d1e0a2186554806
F ext/wasm/README-dist.txt 6382cb9548076fca472fb3330bbdba3a55c1ea0b180ff9253f084f07ff383576 F ext/wasm/README-dist.txt 6382cb9548076fca472fb3330bbdba3a55c1ea0b180ff9253f084f07ff383576
F ext/wasm/README.md a8a2962c3aebdf8d2104a9102e336c5554e78fc6072746e5daf9c61514e7d193 F ext/wasm/README.md a8a2962c3aebdf8d2104a9102e336c5554e78fc6072746e5daf9c61514e7d193
F ext/wasm/api/EXPORTED_FUNCTIONS.sqlite3-api d6a5078f48a5301ed17b9a30331075d9b2506e1360c1f0dee0c7816c10acd9ab F ext/wasm/api/EXPORTED_FUNCTIONS.sqlite3-api d6a5078f48a5301ed17b9a30331075d9b2506e1360c1f0dee0c7816c10acd9ab
@ -501,16 +501,16 @@ F ext/wasm/api/post-js-footer.js cd0a8ec768501d9bd45d325ab0442037fb0e33d1f3b4f08
F ext/wasm/api/post-js-header.js 47b6b281f39ad59fa6e8b658308cd98ea292c286a68407b35ff3ed9cfd281a62 F ext/wasm/api/post-js-header.js 47b6b281f39ad59fa6e8b658308cd98ea292c286a68407b35ff3ed9cfd281a62
F ext/wasm/api/pre-js.c-pp.js ad906703f7429590f2fbf5e6498513bf727a1a4f0ebfa057afb08161d7511219 F ext/wasm/api/pre-js.c-pp.js ad906703f7429590f2fbf5e6498513bf727a1a4f0ebfa057afb08161d7511219
F ext/wasm/api/sqlite3-api-cleanup.js d235ad237df6954145404305040991c72ef8b1881715d2a650dda7b3c2576d0e F ext/wasm/api/sqlite3-api-cleanup.js d235ad237df6954145404305040991c72ef8b1881715d2a650dda7b3c2576d0e
F ext/wasm/api/sqlite3-api-glue.js cc6b0bb093bdb6279d4af259200b7b9e150e3796a8a3a4cd09a4928c43d25e56 F ext/wasm/api/sqlite3-api-glue.js b65e546568f1dfb35205b9792feb5146a6323d71b55cda58e2ed30def6dd52f3
F ext/wasm/api/sqlite3-api-oo1.js 9678dc4d9a5d39632b6ffe6ea94a023119260815bf32f265bf5f6c36c9516db8 F ext/wasm/api/sqlite3-api-oo1.js 9678dc4d9a5d39632b6ffe6ea94a023119260815bf32f265bf5f6c36c9516db8
F ext/wasm/api/sqlite3-api-prologue.js 57faa6d9b2025cd4431153dde1c0242257c87c5a92d099c331816ce56842fab7 F ext/wasm/api/sqlite3-api-prologue.js 5f283b096b98bfb1ee2f2201e7ff0489dff00e29e1030c30953bdb4f5b87f4bd
F ext/wasm/api/sqlite3-api-worker1.js 9f32af64df1a031071912eea7a201557fe39b1738645c0134562bb84e88e2fec F ext/wasm/api/sqlite3-api-worker1.js 9f32af64df1a031071912eea7a201557fe39b1738645c0134562bb84e88e2fec
F ext/wasm/api/sqlite3-license-version-header.js 0c807a421f0187e778dc1078f10d2994b915123c1223fe752b60afdcd1263f89 F ext/wasm/api/sqlite3-license-version-header.js 0c807a421f0187e778dc1078f10d2994b915123c1223fe752b60afdcd1263f89
F ext/wasm/api/sqlite3-opfs-async-proxy.js 8cf8a897726f14071fae6be6648125162b256dfb4f96555b865dbb7a6b65e379 F ext/wasm/api/sqlite3-opfs-async-proxy.js 8cf8a897726f14071fae6be6648125162b256dfb4f96555b865dbb7a6b65e379
F ext/wasm/api/sqlite3-v-helper.js 7daa0eab0a513a25b05e9abae7b5beaaa39209b3ed12f86aeae9ef8d2719ed25 F ext/wasm/api/sqlite3-v-helper.js 7daa0eab0a513a25b05e9abae7b5beaaa39209b3ed12f86aeae9ef8d2719ed25
F ext/wasm/api/sqlite3-vfs-opfs-sahpool.c-pp.js abb69b5e008961026bf5ff433d7116cb046359af92a5daf73208af2e7ac80ae7 F ext/wasm/api/sqlite3-vfs-opfs-sahpool.c-pp.js abb69b5e008961026bf5ff433d7116cb046359af92a5daf73208af2e7ac80ae7
F ext/wasm/api/sqlite3-vfs-opfs.c-pp.js e7a690e0e78ff4d563f2eca468f91db69f001ff4b79c6d2304cbb6f62dca437d F ext/wasm/api/sqlite3-vfs-opfs.c-pp.js e04fc2fda6a0200ef80efdbb4ddfa0254453558adb17ec3a230f93d2bf1d711c
F ext/wasm/api/sqlite3-wasm.c c19041158df467281b74b0fdb5d2a2d947d3f7248d0e8a9174ddfbcd5b9158bd F ext/wasm/api/sqlite3-wasm.c d4d4c2b349b43b7b861e6d2994299630fb79e07573ea6b61e28e8071b7d16b61
F ext/wasm/api/sqlite3-worker1-promiser.c-pp.js bc06df0d599e625bde6a10a394e326dc68da9ff07fa5404354580f81566e591f F ext/wasm/api/sqlite3-worker1-promiser.c-pp.js bc06df0d599e625bde6a10a394e326dc68da9ff07fa5404354580f81566e591f
F ext/wasm/api/sqlite3-worker1.c-pp.js da509469755035e919c015deea41b4514b5e84c12a1332e6cc8d42cb2cc1fb75 F ext/wasm/api/sqlite3-worker1.c-pp.js da509469755035e919c015deea41b4514b5e84c12a1332e6cc8d42cb2cc1fb75
F ext/wasm/batch-runner.html 4deeed44fe41496dc6898d9fb17938ea3291f40f4bfb977e29d0cef96fbbe4c8 F ext/wasm/batch-runner.html 4deeed44fe41496dc6898d9fb17938ea3291f40f4bfb977e29d0cef96fbbe4c8
@ -555,7 +555,7 @@ F ext/wasm/test-opfs-vfs.html 1f2d672f3f3fce810dfd48a8d56914aba22e45c6834e262555
F ext/wasm/test-opfs-vfs.js f09266873e1a34d9bdb6d3981ec8c9e382f31f215c9fd2f9016d2394b8ae9b7b F ext/wasm/test-opfs-vfs.js f09266873e1a34d9bdb6d3981ec8c9e382f31f215c9fd2f9016d2394b8ae9b7b
F ext/wasm/tester1-worker.html ebc4b820a128963afce328ecf63ab200bd923309eb939f4110510ab449e9814c F ext/wasm/tester1-worker.html ebc4b820a128963afce328ecf63ab200bd923309eb939f4110510ab449e9814c
F ext/wasm/tester1.c-pp.html 1c1bc78b858af2019e663b1a31e76657b73dc24bede28ca92fbe917c3a972af2 F ext/wasm/tester1.c-pp.html 1c1bc78b858af2019e663b1a31e76657b73dc24bede28ca92fbe917c3a972af2
F ext/wasm/tester1.c-pp.js b88dcad5424a652e8204c44a71bbc3deb22a4922c97ba792aedbabb7a6827b91 F ext/wasm/tester1.c-pp.js 64eb0ee6e695d5638d0f758f31a0ca2231e627ca5d768de3d8b44f9f494de8d4
F ext/wasm/tests/opfs/concurrency/index.html 0802373d57034d51835ff6041cda438c7a982deea6079efd98098d3e42fbcbc1 F ext/wasm/tests/opfs/concurrency/index.html 0802373d57034d51835ff6041cda438c7a982deea6079efd98098d3e42fbcbc1
F ext/wasm/tests/opfs/concurrency/test.js a98016113eaf71e81ddbf71655aa29b0fed9a8b79a3cdd3620d1658eb1cc9a5d F ext/wasm/tests/opfs/concurrency/test.js a98016113eaf71e81ddbf71655aa29b0fed9a8b79a3cdd3620d1658eb1cc9a5d
F ext/wasm/tests/opfs/concurrency/worker.js 0a8c1a3e6ebb38aabbee24f122693f1fb29d599948915c76906681bb7da1d3d2 F ext/wasm/tests/opfs/concurrency/worker.js 0a8c1a3e6ebb38aabbee24f122693f1fb29d599948915c76906681bb7da1d3d2
@ -2050,8 +2050,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 00bc9f1b573d683829bf5eb301606c38d6a60fba957d8edaf59116c02cc650bf P f3647a3ac8eca8c821b0b1e403da7bfb0feabd0eb5ee83709cd4956dfc56a492
R 09f42f2546af1fc630e5de807fbbefd6 R 13a39a740b050094d1512ca0996c2993
U stephan U stephan
Z db3821e23214c8f5fc4f09d6344513ee Z 31bd22683b0e5ce210b31aa9d7b3099d
# Remove this line to create a well-formed Fossil manifest. # Remove this line to create a well-formed Fossil manifest.

View File

@ -1 +1 @@
f3647a3ac8eca8c821b0b1e403da7bfb0feabd0eb5ee83709cd4956dfc56a492 da6eaf8d8258f3e2c8633fd7faf4e90c3307b5c60bd8b69c626b3c82b19dbdef