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:
@ -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):
|
||||||
|
@ -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"]
|
||||||
];
|
];
|
||||||
|
|
||||||
|
@ -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)){
|
||||||
|
@ -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){
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -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());
|
||||||
|
|
||||||
|
22
manifest
22
manifest
@ -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.
|
||||||
|
@ -1 +1 @@
|
|||||||
f3647a3ac8eca8c821b0b1e403da7bfb0feabd0eb5ee83709cd4956dfc56a492
|
da6eaf8d8258f3e2c8633fd7faf4e90c3307b5c60bd8b69c626b3c82b19dbdef
|
Reference in New Issue
Block a user