1
0
mirror of https://github.com/sqlite/sqlite.git synced 2025-07-30 19:03:16 +03:00

Expose the auto-extension API to JS and reorganize some nearby code.

FossilOrigin-Name: 52b229d11d82bfb81c8b63e252c51c57a34dc50498dd685451588c185873c628
This commit is contained in:
stephan
2022-12-26 17:15:05 +00:00
parent ff78b2bee8
commit 84261bac96
6 changed files with 182 additions and 111 deletions

View File

@ -2,6 +2,7 @@ _malloc
_free _free
_realloc _realloc
_sqlite3_aggregate_context _sqlite3_aggregate_context
_sqlite3_auto_extension
_sqlite3_bind_blob _sqlite3_bind_blob
_sqlite3_bind_double _sqlite3_bind_double
_sqlite3_bind_int _sqlite3_bind_int
@ -13,6 +14,7 @@ _sqlite3_bind_pointer
_sqlite3_bind_text _sqlite3_bind_text
_sqlite3_busy_handler _sqlite3_busy_handler
_sqlite3_busy_timeout _sqlite3_busy_timeout
_sqlite3_cancel_auto_extension
_sqlite3_changes _sqlite3_changes
_sqlite3_changes64 _sqlite3_changes64
_sqlite3_clear_bindings _sqlite3_clear_bindings
@ -81,6 +83,7 @@ _sqlite3_randomness
_sqlite3_realloc _sqlite3_realloc
_sqlite3_realloc64 _sqlite3_realloc64
_sqlite3_reset _sqlite3_reset
_sqlite3_reset_auto_extension
_sqlite3_result_blob _sqlite3_result_blob
_sqlite3_result_double _sqlite3_result_double
_sqlite3_result_error _sqlite3_result_error

View File

@ -69,6 +69,7 @@ self.sqlite3ApiBootstrap.initializers.push(function(sqlite3){
wasm.bindingSignatures = [ wasm.bindingSignatures = [
// Please keep these sorted by function name! // Please keep these sorted by function name!
["sqlite3_aggregate_context","void*", "sqlite3_context*", "int"], ["sqlite3_aggregate_context","void*", "sqlite3_context*", "int"],
/* sqlite3_auto_extension() has a hand-written binding. */
/* sqlite3_bind_blob() and sqlite3_bind_text() have hand-written /* sqlite3_bind_blob() and sqlite3_bind_text() have hand-written
bindings to permit more flexible inputs. */ bindings to permit more flexible inputs. */
["sqlite3_bind_double","int", "sqlite3_stmt*", "int", "f64"], ["sqlite3_bind_double","int", "sqlite3_stmt*", "int", "f64"],
@ -87,8 +88,9 @@ self.sqlite3ApiBootstrap.initializers.push(function(sqlite3){
"*" "*"
]], ]],
["sqlite3_busy_timeout","int", "sqlite3*", "int"], ["sqlite3_busy_timeout","int", "sqlite3*", "int"],
/*[sqlite3_close_v2() is implemented by hand to perform some /* sqlite3_cancel_auto_extension() has a hand-written binding. */
extra work. "sqlite3_close_v2", "int", "sqlite3*"],*/ /* sqlite3_close_v2() is implemented by hand to perform some
extra work. */
["sqlite3_changes", "int", "sqlite3*"], ["sqlite3_changes", "int", "sqlite3*"],
["sqlite3_clear_bindings","int", "sqlite3_stmt*"], ["sqlite3_clear_bindings","int", "sqlite3_stmt*"],
["sqlite3_collation_needed", "int", "sqlite3*", "*", "*"/*=>v(ppis)*/], ["sqlite3_collation_needed", "int", "sqlite3*", "*", "*"/*=>v(ppis)*/],
@ -190,6 +192,7 @@ self.sqlite3ApiBootstrap.initializers.push(function(sqlite3){
]], ]],
["sqlite3_realloc", "*","*","int"], ["sqlite3_realloc", "*","*","int"],
["sqlite3_reset", "int", "sqlite3_stmt*"], ["sqlite3_reset", "int", "sqlite3_stmt*"],
/* sqlite3_reset_auto_extension() has a hand-written binding. */
["sqlite3_result_blob", undefined, "sqlite3_context*", "*", "int", "*"], ["sqlite3_result_blob", undefined, "sqlite3_context*", "*", "int", "*"],
["sqlite3_result_double", undefined, "sqlite3_context*", "f64"], ["sqlite3_result_double", undefined, "sqlite3_context*", "f64"],
["sqlite3_result_error", undefined, "sqlite3_context*", "string", "int"], ["sqlite3_result_error", undefined, "sqlite3_context*", "string", "int"],
@ -543,8 +546,10 @@ self.sqlite3ApiBootstrap.initializers.push(function(sqlite3){
}); });
delete self.Jaccwabyt; delete self.Jaccwabyt;
{/* Convert Arrays and certain TypedArrays to strings for {// wasm.xWrap() bindings...
'string:flexible'-type arguments */
/* Convert Arrays and certain TypedArrays to strings for
'string:flexible'-type arguments */
const __xString = wasm.xWrap.argAdapter('string'); const __xString = wasm.xWrap.argAdapter('string');
wasm.xWrap.argAdapter( wasm.xWrap.argAdapter(
'string:flexible', (v)=>__xString(util.flexibleString(v)) 'string:flexible', (v)=>__xString(util.flexibleString(v))
@ -580,9 +585,7 @@ self.sqlite3ApiBootstrap.initializers.push(function(sqlite3){
return rc || (this[v] = wasm.allocCString(v)); return rc || (this[v] = wasm.allocCString(v));
}.bind(Object.create(null)) }.bind(Object.create(null))
); );
}/* special-case string-type argument conversions */
if(1){// wasm.xWrap() bindings...
/** /**
Add some descriptive xWrap() aliases for '*' intended to (A) Add some descriptive xWrap() aliases for '*' intended to (A)
initially improve readability/correctness of initially improve readability/correctness of
@ -590,27 +593,27 @@ self.sqlite3ApiBootstrap.initializers.push(function(sqlite3){
from higher-level representations, e.g. capi.sqlite3_vfs to from higher-level representations, e.g. capi.sqlite3_vfs to
`sqlite3_vfs*` via capi.sqlite3_vfs.pointer. `sqlite3_vfs*` via capi.sqlite3_vfs.pointer.
*/ */
const aPtr = wasm.xWrap.argAdapter('*'); const __xArgPtr = wasm.xWrap.argAdapter('*');
const nilType = function(){}; const nilType = function(){}/*a class no value can ever be an instance of*/;
wasm.xWrap.argAdapter('sqlite3_filename', aPtr) wasm.xWrap.argAdapter('sqlite3_filename', __xArgPtr)
('sqlite3_context*', aPtr) ('sqlite3_context*', __xArgPtr)
('sqlite3_value*', aPtr) ('sqlite3_value*', __xArgPtr)
('void*', aPtr) ('void*', __xArgPtr)
('sqlite3_changegroup*', aPtr) ('sqlite3_changegroup*', __xArgPtr)
('sqlite3_changeset_iter*', aPtr) ('sqlite3_changeset_iter*', __xArgPtr)
//('sqlite3_rebaser*', aPtr) //('sqlite3_rebaser*', __xArgPtr)
('sqlite3_session*', aPtr) ('sqlite3_session*', __xArgPtr)
('sqlite3_stmt*', (v)=> ('sqlite3_stmt*', (v)=>
aPtr((v instanceof (sqlite3?.oo1?.Stmt || nilType)) __xArgPtr((v instanceof (sqlite3?.oo1?.Stmt || nilType))
? v.pointer : v)) ? v.pointer : v))
('sqlite3*', (v)=> ('sqlite3*', (v)=>
aPtr((v instanceof (sqlite3?.oo1?.DB || nilType)) __xArgPtr((v instanceof (sqlite3?.oo1?.DB || nilType))
? v.pointer : v)) ? v.pointer : v))
('sqlite3_index_info*', (v)=> ('sqlite3_index_info*', (v)=>
aPtr((v instanceof (capi.sqlite3_index_info || nilType)) __xArgPtr((v instanceof (capi.sqlite3_index_info || nilType))
? v.pointer : v)) ? v.pointer : v))
('sqlite3_module*', (v)=> ('sqlite3_module*', (v)=>
aPtr((v instanceof (capi.sqlite3_module || nilType)) __xArgPtr((v instanceof (capi.sqlite3_module || nilType))
? v.pointer : v)) ? v.pointer : v))
/** /**
`sqlite3_vfs*`: `sqlite3_vfs*`:
@ -631,8 +634,8 @@ self.sqlite3ApiBootstrap.initializers.push(function(sqlite3){
"Unknown sqlite3_vfs name:", v "Unknown sqlite3_vfs name:", v
); );
} }
return aPtr((v instanceof (capi.sqlite3_vfs || nilType)) return __xArgPtr((v instanceof (capi.sqlite3_vfs || nilType))
? v.pointer : v); ? v.pointer : v);
}); });
const __xRcPtr = wasm.xWrap.resultAdapter('*'); const __xRcPtr = wasm.xWrap.resultAdapter('*');
@ -709,7 +712,83 @@ self.sqlite3ApiBootstrap.initializers.push(function(sqlite3){
return errCode; return errCode;
}; };
} }
}/*xWrap() bindings*/; }/*xWrap() bindings*/
{/* Import C-level constants and structs... */
const cJson = wasm.xCall('sqlite3_wasm_enum_json');
if(!cJson){
toss("Maintenance required: increase sqlite3_wasm_enum_json()'s",
"static buffer size!");
}
//console.debug('wasm.ctype length =',wasm.cstrlen(cJson));
wasm.ctype = JSON.parse(wasm.cstrToJs(cJson));
// Groups of SQLITE_xyz macros...
const defineGroups = ['access', 'authorizer',
'blobFinalizers', 'changeset',
'config', 'dataTypes',
'dbConfig', 'dbStatus',
'encodings', 'fcntl', 'flock', 'ioCap',
'limits', 'openFlags',
'prepareFlags', 'resultCodes',
'sqlite3Status',
'stmtStatus', 'syncFlags',
'trace', 'txnState', 'udfFlags',
'version' ];
if(wasm.bigIntEnabled){
defineGroups.push('serialize', 'session', 'vtab');
}
for(const t of defineGroups){
for(const e of Object.entries(wasm.ctype[t])){
// ^^^ [k,v] there triggers a buggy code transformation via
// one of the Emscripten-driven optimizers.
capi[e[0]] = e[1];
}
}
const __rcMap = Object.create(null);
for(const t of ['resultCodes']){
for(const e of Object.entries(wasm.ctype[t])){
__rcMap[e[1]] = e[0];
}
}
/**
For the given integer, returns the SQLITE_xxx result code as a
string, or undefined if no such mapping is found.
*/
capi.sqlite3_js_rc_str = (rc)=>__rcMap[rc];
/* Bind all registered C-side structs... */
const notThese = Object.assign(Object.create(null),{
// For each struct to NOT register, map its name to true:
WasmTestStruct: true,
/* We unregister the kvvfs VFS from Worker threads below. */
sqlite3_kvvfs_methods: !util.isUIThread(),
/* sqlite3_index_info and friends require int64: */
sqlite3_index_info: !wasm.bigIntEnabled,
sqlite3_index_constraint: !wasm.bigIntEnabled,
sqlite3_index_orderby: !wasm.bigIntEnabled,
sqlite3_index_constraint_usage: !wasm.bigIntEnabled
});
for(const s of wasm.ctype.structs){
if(!notThese[s.name]){
capi[s.name] = sqlite3.StructBinder(s);
}
}
if(capi.sqlite3_index_info){
/* Move these inner structs into sqlite3_index_info. Binding
** them to WASM requires that we create global-scope structs to
** model them with, but those are no longer needed after we've
** passed them to StructBinder. */
for(const k of ['sqlite3_index_constraint',
'sqlite3_index_orderby',
'sqlite3_index_constraint_usage']){
capi.sqlite3_index_info[k] = capi[k];
delete capi[k];
}
capi.sqlite3_vtab_config = wasm.xWrap(
'sqlite3_wasm_vtab_config','int',[
'sqlite3*', 'int', 'int']
);
}/* end vtab-related setup */
}/*end C constant and struct imports*/
/** /**
Internal helper to assist in validating call argument counts in Internal helper to assist in validating call argument counts in
@ -803,7 +882,7 @@ self.sqlite3ApiBootstrap.initializers.push(function(sqlite3){
*/ */
__dbCleanupMap.cleanup = function(pDb){ __dbCleanupMap.cleanup = function(pDb){
pDb = __argPDb(pDb); pDb = __argPDb(pDb);
wasm.xWrap.FuncPtrAdapter.debugFuncInstall = true; wasm.xWrap.FuncPtrAdapter.debugFuncInstall = false;
/** /**
Installing NULL functions in the C API will remove those Installing NULL functions in the C API will remove those
bindings. The FuncPtrAdapter which sits between us and the C bindings. The FuncPtrAdapter which sits between us and the C
@ -1140,8 +1219,8 @@ self.sqlite3ApiBootstrap.initializers.push(function(sqlite3){
}/*sqlite3_create_function_v2() and sqlite3_create_window_function() proxies*/; }/*sqlite3_create_function_v2() and sqlite3_create_window_function() proxies*/;
if(1){/* Special-case handling of sqlite3_prepare_v2() and {/* Special-case handling of sqlite3_prepare_v2() and
sqlite3_prepare_v3() */ sqlite3_prepare_v3() */
/** /**
Helper for string:flexible conversions which require a Helper for string:flexible conversions which require a
@ -1346,81 +1425,41 @@ self.sqlite3ApiBootstrap.initializers.push(function(sqlite3){
}; };
}/* sqlite3_config() */ }/* sqlite3_config() */
{/* Import C-level constants and structs... */ {/*auto-extension bindings.*/
const cJson = wasm.xCall('sqlite3_wasm_enum_json'); const __autoExtFptr = new Set;
if(!cJson){
toss("Maintenance required: increase sqlite3_wasm_enum_json()'s", capi.sqlite3_auto_extension = function(fPtr){
"static buffer size!"); if( fPtr instanceof Function ){
} fPtr = wasm.installFunction('i(ppp)', fPtr);
//console.debug('wasm.ctype length =',wasm.cstrlen(cJson)); }else if( 1!==arguments.length || !wasm.isPtr(fPtr) ){
wasm.ctype = JSON.parse(wasm.cstrToJs(cJson)); return capi.SQLITE_MISUSE;
// Groups of SQLITE_xyz macros...
const defineGroups = ['access', 'authorizer',
'blobFinalizers', 'changeset',
'config', 'dataTypes',
'dbConfig', 'dbStatus',
'encodings', 'fcntl', 'flock', 'ioCap',
'limits', 'openFlags',
'prepareFlags', 'resultCodes',
'sqlite3Status',
'stmtStatus', 'syncFlags',
'trace', 'txnState', 'udfFlags',
'version' ];
if(wasm.bigIntEnabled){
defineGroups.push('serialize', 'session', 'vtab');
}
for(const t of defineGroups){
for(const e of Object.entries(wasm.ctype[t])){
// ^^^ [k,v] there triggers a buggy code transformation via
// one of the Emscripten-driven optimizers.
capi[e[0]] = e[1];
} }
} const rc = wasm.exports.sqlite3_auto_extension(fPtr);
const __rcMap = Object.create(null); if( fPtr!==arguments[0] ){
for(const t of ['resultCodes']){ if(0===rc) __autoExtFptr.add(fPtr);
for(const e of Object.entries(wasm.ctype[t])){ else wasm.uninstallFunction(fPtr);
__rcMap[e[1]] = e[0];
} }
} return rc;
/** };
For the given integer, returns the SQLITE_xxx result code as a
string, or undefined if no such mapping is found. capi.sqlite3_cancel_auto_extension = function(fPtr){
*/ /* We do not do an automatic JS-to-WASM function conversion here
capi.sqlite3_js_rc_str = (rc)=>__rcMap[rc]; because it would be senseless: the converted pointer would
/* Bind all registered C-side structs... */ never possibly match an already-installed one. */;
const notThese = Object.assign(Object.create(null),{ if(!fPtr || 1!==arguments.length || !wasm.isPtr(fPtr)) return 0;
// For each struct to NOT register, map its name to true: return wasm.exports.sqlite3_cancel_auto_extension(fPtr);
WasmTestStruct: true, /* Note that it "cannot happen" that a client passes a pointer which
/* We unregister the kvvfs VFS from Worker threads below. */ is in __autoExtFptr because __autoExtFptr only contains automatic
sqlite3_kvvfs_methods: !util.isUIThread(), conversions created inside sqlite3_auto_extension() and
/* sqlite3_index_info and friends require int64: */ never exposed to the client. */
sqlite3_index_info: !wasm.bigIntEnabled, };
sqlite3_index_constraint: !wasm.bigIntEnabled,
sqlite3_index_orderby: !wasm.bigIntEnabled, capi.sqlite3_reset_auto_extension = function(){
sqlite3_index_constraint_usage: !wasm.bigIntEnabled wasm.exports.sqlite3_reset_auto_extension();
}); for(const fp of __autoExtFptr) wasm.uninstallFunction(fp);
for(const s of wasm.ctype.structs){ __autoExtFptr.clear();
if(!notThese[s.name]){ };
capi[s.name] = sqlite3.StructBinder(s); }/* auto-extension */
}
}
if(capi.sqlite3_index_info){
/* Move these inner structs into sqlite3_index_info. Binding
** them to WASM requires that we create global-scope structs to
** model them with, but those are no longer needed after we've
** passed them to StructBinder. */
for(const k of ['sqlite3_index_constraint',
'sqlite3_index_orderby',
'sqlite3_index_constraint_usage']){
capi.sqlite3_index_info[k] = capi[k];
delete capi[k];
}
capi.sqlite3_vtab_config = wasm.xWrap(
'sqlite3_wasm_vtab_config','int',[
'sqlite3*', 'int', 'int']
);
}/* end vtab-related setup */
}/*end C constant and struct imports*/
const pKvvfs = capi.sqlite3_vfs_find("kvvfs"); const pKvvfs = capi.sqlite3_vfs_find("kvvfs");
if( pKvvfs ){/* kvvfs-specific glue */ if( pKvvfs ){/* kvvfs-specific glue */

View File

@ -1560,6 +1560,10 @@ self.WhWasmUtilInstaller = function(target){
context. This mode is the default if bindScope is _not_ set context. This mode is the default if bindScope is _not_ set
but a property named contextKey (described below) is. but a property named contextKey (described below) is.
- 'permanent': the function is installed and left there
forever. There is no way to recover its pointer address
later on.
- callProxy (function): if set, this must be a function which - callProxy (function): if set, this must be a function which
will act as a proxy for any "converted" JS function. It is will act as a proxy for any "converted" JS function. It is
passed the being-converted function value and must return passed the being-converted function value and must return
@ -1645,6 +1649,7 @@ self.WhWasmUtilInstaller = function(target){
} }
this.isTransient = 'transient'===this.bindScope; this.isTransient = 'transient'===this.bindScope;
this.isContext = 'context'===this.bindScope; this.isContext = 'context'===this.bindScope;
this.isPermanent = 'permanent'===this.bindScope;
this.singleton = ('singleton'===this.bindScope) ? [] : undefined; this.singleton = ('singleton'===this.bindScope) ? [] : undefined;
//console.warn("FuncPtrAdapter()",opt,this); //console.warn("FuncPtrAdapter()",opt,this);
this.callProxy = (opt.callProxy instanceof Function) this.callProxy = (opt.callProxy instanceof Function)
@ -1668,7 +1673,7 @@ self.WhWasmUtilInstaller = function(target){
static debugOut = console.debug.bind(console); static debugOut = console.debug.bind(console);
static bindScopes = [ static bindScopes = [
'transient', 'context', 'singleton' 'transient', 'context', 'singleton', 'permanent'
]; ];
/* Dummy impl. Overwritten per-instance as needed. */ /* Dummy impl. Overwritten per-instance as needed. */

View File

@ -2687,6 +2687,30 @@ self.sqlite3InitModule = sqlite3InitModule;
}/*OPFS util sanity checks*/) }/*OPFS util sanity checks*/)
;/* end OPFS tests */ ;/* end OPFS tests */
////////////////////////////////////////////////////////////////////////
T.g('Auto-extension API')
.t({
name: "Auto-extension sanity checks.",
test: function(sqlite3){
let counter = 0;
const fp = wasm.installFunction('i(ppp)', function(pDb,pzErr,pApi){
++counter;
return 0;
});
(new sqlite3.oo1.DB()).close();
T.assert( 0===counter );
capi.sqlite3_auto_extension(fp);
(new sqlite3.oo1.DB()).close();
T.assert( 1===counter );
(new sqlite3.oo1.DB()).close();
T.assert( 2===counter );
capi.sqlite3_cancel_auto_extension(fp);
wasm.uninstallFunction(fp);
(new sqlite3.oo1.DB()).close();
T.assert( 2===counter );
}
});
//////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////
T.g('Session API') T.g('Session API')
.t({ .t({

View File

@ -1,5 +1,5 @@
C Fix\san\sinfinite\sloop\sin\sthe\sMEMSYS5\sauxiliary\smemory\sallocator\sthat\soccurs\nfor\smemory\sallocations\sbetween\s1GiB\sand\s2GiB\sin\ssize.\s\sError\sintroduced\nby\scheck-in\s[949133231f8f751a].\s\sThe\sproblem\sonly\saffects\sbuilds\sthat\ninclude\sthe\sSQLITE_ENABLE_MEMSYS5\scompile-time\soption. C Expose\sthe\sauto-extension\sAPI\sto\sJS\sand\sreorganize\ssome\snearby\scode.
D 2022-12-26T15:14:24.028 D 2022-12-26T17:15:05.417
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
@ -494,7 +494,7 @@ F ext/wasm/EXPORTED_FUNCTIONS.fiddle.in 27450c8b8c70875a260aca55435ec927068b34ce
F ext/wasm/GNUmakefile ffe0e9818a3b6b36c85a1d10dab76b220a8f5cd83439c62e50223a7970b3d68a F ext/wasm/GNUmakefile ffe0e9818a3b6b36c85a1d10dab76b220a8f5cd83439c62e50223a7970b3d68a
F ext/wasm/README-dist.txt 2d670b426fc7c613b90a7d2f2b05b433088fe65181abead970980f0a4a75ea20 F ext/wasm/README-dist.txt 2d670b426fc7c613b90a7d2f2b05b433088fe65181abead970980f0a4a75ea20
F ext/wasm/README.md ef39861aa21632fdbca0bdd469f78f0096f6449a720f3f39642594af503030e9 F ext/wasm/README.md ef39861aa21632fdbca0bdd469f78f0096f6449a720f3f39642594af503030e9
F ext/wasm/api/EXPORTED_FUNCTIONS.sqlite3-api beec6b5993e234153446aaa48e68d2a75db590b3c7eed26bd61e5fb5f8c9a881 F ext/wasm/api/EXPORTED_FUNCTIONS.sqlite3-api 1e61a3ff4085974080ecf782d4defea6b7d443eaa98f9aea773b5f5b416b417c
F ext/wasm/api/EXPORTED_RUNTIME_METHODS.sqlite3-api 1ec3c73e7d66e95529c3c64ac3de2470b0e9e7fbf7a5b41261c367cf4f1b7287 F ext/wasm/api/EXPORTED_RUNTIME_METHODS.sqlite3-api 1ec3c73e7d66e95529c3c64ac3de2470b0e9e7fbf7a5b41261c367cf4f1b7287
F ext/wasm/api/README.md 77a2f1f2fc60a35def7455dffc8d3f2c56385d6ac5c6cecc60fa938252ea2c54 F ext/wasm/api/README.md 77a2f1f2fc60a35def7455dffc8d3f2c56385d6ac5c6cecc60fa938252ea2c54
F ext/wasm/api/extern-post-js.c-pp.js 8923f76c3d2213159e12d641dc750523ead5c848185dc4996fae5cc12397f88d F ext/wasm/api/extern-post-js.c-pp.js 8923f76c3d2213159e12d641dc750523ead5c848185dc4996fae5cc12397f88d
@ -503,7 +503,7 @@ 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 b88499dc303c21fc3f55f2c364a0f814f587b60a95784303881169f9e91c1d5f F ext/wasm/api/pre-js.c-pp.js b88499dc303c21fc3f55f2c364a0f814f587b60a95784303881169f9e91c1d5f
F ext/wasm/api/sqlite3-api-cleanup.js 680d5ccfff54459db136a49b2199d9f879c8405d9c99af1dda0cc5e7c29056f4 F ext/wasm/api/sqlite3-api-cleanup.js 680d5ccfff54459db136a49b2199d9f879c8405d9c99af1dda0cc5e7c29056f4
F ext/wasm/api/sqlite3-api-glue.js e16bf1de4c08d3906298d532e1e61478791286e768d7ba1538ca90d0fa344e12 F ext/wasm/api/sqlite3-api-glue.js b55e13aadf33a037e9a6950f370d16e2b0e858b74a2070faa2c87d7cde48c80c
F ext/wasm/api/sqlite3-api-oo1.js 045c98796950c22556fc0842fe9f0d9a67f31920f247e24fb440571cdb6be5b0 F ext/wasm/api/sqlite3-api-oo1.js 045c98796950c22556fc0842fe9f0d9a67f31920f247e24fb440571cdb6be5b0
F ext/wasm/api/sqlite3-api-prologue.js e862e5b79d565bd79c8ff59ebb6618a07ecb1a0262a1560dc6a10aa0f4d6f531 F ext/wasm/api/sqlite3-api-prologue.js e862e5b79d565bd79c8ff59ebb6618a07ecb1a0262a1560dc6a10aa0f4d6f531
F ext/wasm/api/sqlite3-api-worker1.js c9ef8865f072e61251260b218aa4ed614a21a25e9e3cc6f22acf81794d32fc0b F ext/wasm/api/sqlite3-api-worker1.js c9ef8865f072e61251260b218aa4ed614a21a25e9e3cc6f22acf81794d32fc0b
@ -521,7 +521,7 @@ F ext/wasm/c-pp.c 92285f7bce67ed7b7020b40fde8ed0982c442b63dc33df9dfd4b658d4a6c07
F ext/wasm/common/SqliteTestUtil.js d8bf97ecb0705a2299765c8fc9e11b1a5ac7f10988bbf375a6558b7ca287067b F ext/wasm/common/SqliteTestUtil.js d8bf97ecb0705a2299765c8fc9e11b1a5ac7f10988bbf375a6558b7ca287067b
F ext/wasm/common/emscripten.css 11bd104b6c0d597c67d40cc8ecc0a60dae2b965151e3b6a37fa5708bac3acd15 F ext/wasm/common/emscripten.css 11bd104b6c0d597c67d40cc8ecc0a60dae2b965151e3b6a37fa5708bac3acd15
F ext/wasm/common/testing.css 0ff15602a3ab2bad8aef2c3bd120c7ee3fd1c2054ad2ace7e214187ae68d926f F ext/wasm/common/testing.css 0ff15602a3ab2bad8aef2c3bd120c7ee3fd1c2054ad2ace7e214187ae68d926f
F ext/wasm/common/whwasmutil.js 63188a5b90de3c17a2fdf3f1a90321ffdeaa2c34f6ca9d76f830fb0800867854 F ext/wasm/common/whwasmutil.js cad510071533dbe47787bce53f2e0dcab5b05d2dde1dbe477d8fb04e00d4e8c4
F ext/wasm/demo-123-worker.html a0b58d9caef098a626a1a1db567076fca4245e8d60ba94557ede8684350a81ed F ext/wasm/demo-123-worker.html a0b58d9caef098a626a1a1db567076fca4245e8d60ba94557ede8684350a81ed
F ext/wasm/demo-123.html 8c70a412ce386bd3796534257935eb1e3ea5c581e5d5aea0490b8232e570a508 F ext/wasm/demo-123.html 8c70a412ce386bd3796534257935eb1e3ea5c581e5d5aea0490b8232e570a508
F ext/wasm/demo-123.js ebae30756585bca655b4ab2553ec9236a87c23ad24fc8652115dcedb06d28df6 F ext/wasm/demo-123.js ebae30756585bca655b4ab2553ec9236a87c23ad24fc8652115dcedb06d28df6
@ -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 d43f3c131d88f10d00aff3e328fed13c858d674ea2ff1ff90225506137f85aa9 F ext/wasm/tester1-worker.html d43f3c131d88f10d00aff3e328fed13c858d674ea2ff1ff90225506137f85aa9
F ext/wasm/tester1.c-pp.html d34bef3d48e5cbc1c7c06882ad240fec49bf88f5f65696cc2c72c416933aa406 F ext/wasm/tester1.c-pp.html d34bef3d48e5cbc1c7c06882ad240fec49bf88f5f65696cc2c72c416933aa406
F ext/wasm/tester1.c-pp.js 4a5b1a1f5296686f04db017e5984230a266f2c09f1e8d25d76682566b5cacbc2 F ext/wasm/tester1.c-pp.js 93e3ebae7f0caa1b54265447f76b0485d4a28799e02b7c2a3cc92883aa84fda6
F ext/wasm/tests/opfs/concurrency/index.html 86d8ac435074d1e7007b91105f4897f368c165e8cecb6a9aa3d81f5cf5dcbe70 F ext/wasm/tests/opfs/concurrency/index.html 86d8ac435074d1e7007b91105f4897f368c165e8cecb6a9aa3d81f5cf5dcbe70
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
@ -2067,8 +2067,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 ae3ae92ec45d3d5de92e70876502f8108fc3fcd87848e86c2b83f8842f1ff139 P 8da0f0c38a458c57f979d59b49cf4804ef81fc2eccabde1f166bab24dd1dabea
R af6df6d036a8bd991cf092623d05af75 R c287fdd5af6e6026238c7a465fc6dd21
U drh U stephan
Z 333253e835d0b6bf644788ba3ea65af5 Z 8fd2961047ac7596d6fac75a1b2c944b
# Remove this line to create a well-formed Fossil manifest. # Remove this line to create a well-formed Fossil manifest.

View File

@ -1 +1 @@
8da0f0c38a458c57f979d59b49cf4804ef81fc2eccabde1f166bab24dd1dabea 52b229d11d82bfb81c8b63e252c51c57a34dc50498dd685451588c185873c628