mirror of
https://github.com/sqlite/sqlite.git
synced 2025-07-29 08:01:23 +03:00
Expose sqlite3_db_status() and sqlite3_db_config() to wasm, noting that the latter requires several internal wrappers to account for the various varidic forms (C varargs cannot be bound to wasm).
FossilOrigin-Name: d5753668915c1db204fa80153614653243081ffaddea22f26ad59bb1836948b9
This commit is contained in:
@ -39,6 +39,7 @@ _sqlite3_data_count
|
||||
_sqlite3_db_filename
|
||||
_sqlite3_db_handle
|
||||
_sqlite3_db_name
|
||||
_sqlite3_db_status
|
||||
_sqlite3_declare_vtab
|
||||
_sqlite3_deserialize
|
||||
_sqlite3_drop_modules
|
||||
|
@ -614,6 +614,7 @@ self.sqlite3ApiBootstrap.initializers.push(function(sqlite3){
|
||||
//console.debug('wasm.ctype length =',wasm.cstrlen(cJson));
|
||||
const defineGroups = ['access', 'authorizer',
|
||||
'blobFinalizers', 'dataTypes',
|
||||
'dbConfig', 'dbStatus',
|
||||
'encodings', 'fcntl', 'flock', 'ioCap',
|
||||
'limits', 'openFlags',
|
||||
'prepareFlags', 'resultCodes',
|
||||
|
@ -946,6 +946,7 @@ self.sqlite3ApiBootstrap = function sqlite3ApiBootstrap(
|
||||
["sqlite3_db_filename", "string", "sqlite3*", "string"],
|
||||
["sqlite3_db_handle", "sqlite3*", "sqlite3_stmt*"],
|
||||
["sqlite3_db_name", "string", "sqlite3*", "int"],
|
||||
["sqlite3_db_status", "int", "sqlite3*", "int", "*", "*", "int"],
|
||||
["sqlite3_deserialize", "int", "sqlite3*", "string", "*", "i64", "i64", "int"]
|
||||
/* Careful! Short version: de/serialize() are problematic because they
|
||||
might use a different allocator than the user for managing the
|
||||
@ -1601,6 +1602,51 @@ self.sqlite3ApiBootstrap = function sqlite3ApiBootstrap(
|
||||
|
||||
}/* main-window-only bits */
|
||||
|
||||
/**
|
||||
Wraps all known variants of the C-side variadic
|
||||
sqlite3_db_config().
|
||||
|
||||
Full docs: https://sqlite.org/c3ref/db_config.html
|
||||
|
||||
Returns capi.SQLITE_MISUSE if op is not a valid operation ID.
|
||||
*/
|
||||
capi.sqlite3_db_config = function f(pDb, op, ...args){
|
||||
if(!this.s){
|
||||
this.s = wasm.xWrap('sqlite3_wasm_db_config_s','int',
|
||||
['sqlite3*', 'int', 'string:static']
|
||||
/* MAINDBNAME requires a static string */);
|
||||
this.pii = wasm.xWrap('sqlite3_wasm_db_config_pii', 'int',
|
||||
['sqlite3*', 'int', '*','int', 'int']);
|
||||
this.ip = wasm.xWrap('sqlite3_wasm_db_config_ip','int',
|
||||
['sqlite3*', 'int', 'int','*']);
|
||||
}
|
||||
const c = capi;
|
||||
switch(op){
|
||||
case c.SQLITE_DBCONFIG_ENABLE_FKEY:
|
||||
case c.SQLITE_DBCONFIG_ENABLE_TRIGGER:
|
||||
case c.SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER:
|
||||
case c.SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION:
|
||||
case c.SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE:
|
||||
case c.SQLITE_DBCONFIG_ENABLE_QPSG:
|
||||
case c.SQLITE_DBCONFIG_TRIGGER_EQP:
|
||||
case c.SQLITE_DBCONFIG_RESET_DATABASE:
|
||||
case c.SQLITE_DBCONFIG_DEFENSIVE:
|
||||
case c.SQLITE_DBCONFIG_WRITABLE_SCHEMA:
|
||||
case c.SQLITE_DBCONFIG_LEGACY_ALTER_TABLE:
|
||||
case c.SQLITE_DBCONFIG_DQS_DML:
|
||||
case c.SQLITE_DBCONFIG_DQS_DDL:
|
||||
case c.SQLITE_DBCONFIG_ENABLE_VIEW:
|
||||
case c.SQLITE_DBCONFIG_LEGACY_FILE_FORMAT:
|
||||
case c.SQLITE_DBCONFIG_TRUSTED_SCHEMA:
|
||||
return this.ip(pDb, op, args[0], args[1] || 0);
|
||||
case c.SQLITE_DBCONFIG_LOOKASIDE:
|
||||
return this.pii(pDb, op, args[0], args[1], args[2]);
|
||||
case c.SQLITE_DBCONFIG_MAINDBNAME:
|
||||
return this.s(pDb, op, args[0]);
|
||||
default:
|
||||
return c.SQLITE_MISUSE;
|
||||
}
|
||||
}.bind(Object.create(null));
|
||||
|
||||
/* The remainder of the API will be set up in later steps. */
|
||||
const sqlite3 = {
|
||||
|
@ -430,6 +430,45 @@ const char * sqlite3_wasm_enum_json(void){
|
||||
DefInt(SQLITE_NULL);
|
||||
} _DefGroup;
|
||||
|
||||
DefGroup(dbConfig){
|
||||
DefInt(SQLITE_DBCONFIG_MAINDBNAME);
|
||||
DefInt(SQLITE_DBCONFIG_LOOKASIDE);
|
||||
DefInt(SQLITE_DBCONFIG_ENABLE_FKEY);
|
||||
DefInt(SQLITE_DBCONFIG_ENABLE_TRIGGER);
|
||||
DefInt(SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER);
|
||||
DefInt(SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION);
|
||||
DefInt(SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE);
|
||||
DefInt(SQLITE_DBCONFIG_ENABLE_QPSG);
|
||||
DefInt(SQLITE_DBCONFIG_TRIGGER_EQP);
|
||||
DefInt(SQLITE_DBCONFIG_RESET_DATABASE);
|
||||
DefInt(SQLITE_DBCONFIG_DEFENSIVE);
|
||||
DefInt(SQLITE_DBCONFIG_WRITABLE_SCHEMA);
|
||||
DefInt(SQLITE_DBCONFIG_LEGACY_ALTER_TABLE);
|
||||
DefInt(SQLITE_DBCONFIG_DQS_DML);
|
||||
DefInt(SQLITE_DBCONFIG_DQS_DDL);
|
||||
DefInt(SQLITE_DBCONFIG_ENABLE_VIEW);
|
||||
DefInt(SQLITE_DBCONFIG_LEGACY_FILE_FORMAT);
|
||||
DefInt(SQLITE_DBCONFIG_TRUSTED_SCHEMA);
|
||||
DefInt(SQLITE_DBCONFIG_MAX);
|
||||
} _DefGroup;
|
||||
|
||||
DefGroup(dbStatus){
|
||||
DefInt(SQLITE_DBSTATUS_LOOKASIDE_USED);
|
||||
DefInt(SQLITE_DBSTATUS_CACHE_USED);
|
||||
DefInt(SQLITE_DBSTATUS_SCHEMA_USED);
|
||||
DefInt(SQLITE_DBSTATUS_STMT_USED);
|
||||
DefInt(SQLITE_DBSTATUS_LOOKASIDE_HIT);
|
||||
DefInt(SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE);
|
||||
DefInt(SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL);
|
||||
DefInt(SQLITE_DBSTATUS_CACHE_HIT);
|
||||
DefInt(SQLITE_DBSTATUS_CACHE_MISS);
|
||||
DefInt(SQLITE_DBSTATUS_CACHE_WRITE);
|
||||
DefInt(SQLITE_DBSTATUS_DEFERRED_FKS);
|
||||
DefInt(SQLITE_DBSTATUS_CACHE_USED_SHARED);
|
||||
DefInt(SQLITE_DBSTATUS_CACHE_SPILL);
|
||||
DefInt(SQLITE_DBSTATUS_MAX);
|
||||
} _DefGroup;
|
||||
|
||||
DefGroup(encodings) {
|
||||
/* Noting that the wasm binding only aims to support UTF-8. */
|
||||
DefInt(SQLITE_UTF8);
|
||||
@ -1292,7 +1331,69 @@ int sqlite3_wasm_vtab_config(sqlite3 *pDb, int op, int arg){
|
||||
default:
|
||||
return SQLITE_MISUSE;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
** This function is NOT part of the sqlite3 public API. It is strictly
|
||||
** for use by the sqlite project's own JS/WASM bindings.
|
||||
**
|
||||
** Wrapper for the variants of sqlite3_db_config() which take
|
||||
** (int,int*) variadic args.
|
||||
*/
|
||||
SQLITE_WASM_KEEP
|
||||
int sqlite3_wasm_db_config_ip(sqlite3 *pDb, int op, int arg1, int* pArg2){
|
||||
switch(op){
|
||||
case SQLITE_DBCONFIG_ENABLE_FKEY:
|
||||
case SQLITE_DBCONFIG_ENABLE_TRIGGER:
|
||||
case SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER:
|
||||
case SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION:
|
||||
case SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE:
|
||||
case SQLITE_DBCONFIG_ENABLE_QPSG:
|
||||
case SQLITE_DBCONFIG_TRIGGER_EQP:
|
||||
case SQLITE_DBCONFIG_RESET_DATABASE:
|
||||
case SQLITE_DBCONFIG_DEFENSIVE:
|
||||
case SQLITE_DBCONFIG_WRITABLE_SCHEMA:
|
||||
case SQLITE_DBCONFIG_LEGACY_ALTER_TABLE:
|
||||
case SQLITE_DBCONFIG_DQS_DML:
|
||||
case SQLITE_DBCONFIG_DQS_DDL:
|
||||
case SQLITE_DBCONFIG_ENABLE_VIEW:
|
||||
case SQLITE_DBCONFIG_LEGACY_FILE_FORMAT:
|
||||
case SQLITE_DBCONFIG_TRUSTED_SCHEMA:
|
||||
return sqlite3_db_config(pDb, op, arg1, pArg2);
|
||||
default: return SQLITE_MISUSE;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
** This function is NOT part of the sqlite3 public API. It is strictly
|
||||
** for use by the sqlite project's own JS/WASM bindings.
|
||||
**
|
||||
** Wrapper for the variants of sqlite3_db_config() which take
|
||||
** (void*,int,int) variadic args.
|
||||
*/
|
||||
SQLITE_WASM_KEEP
|
||||
int sqlite3_wasm_db_config_pii(sqlite3 *pDb, int op, void * pArg1, int arg2, int arg3){
|
||||
switch(op){
|
||||
case SQLITE_DBCONFIG_LOOKASIDE:
|
||||
return sqlite3_db_config(pDb, op, pArg1, arg2, arg3);
|
||||
default: return SQLITE_MISUSE;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
** This function is NOT part of the sqlite3 public API. It is strictly
|
||||
** for use by the sqlite project's own JS/WASM bindings.
|
||||
**
|
||||
** Wrapper for the variants of sqlite3_db_config() which take
|
||||
** (const char *) variadic args.
|
||||
*/
|
||||
SQLITE_WASM_KEEP
|
||||
int sqlite3_wasm_db_config_s(sqlite3 *pDb, int op, const char *zArg){
|
||||
switch(op){
|
||||
case SQLITE_DBCONFIG_MAINDBNAME:
|
||||
return sqlite3_db_config(pDb, op, zArg);
|
||||
default: return SQLITE_MISUSE;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
@ -1056,6 +1056,32 @@ self.sqlite3InitModule = sqlite3InitModule;
|
||||
.assert(db === sqlite3.oo1.DB.checkRc(db,0))
|
||||
.assert(null === sqlite3.oo1.DB.checkRc(null,0))
|
||||
})
|
||||
////////////////////////////////////////////////////////////////////
|
||||
.t('sqlite3_db_config() and sqlite3_db_status()', function(sqlite3){
|
||||
let rc = capi.sqlite3_db_config(this.db, capi.SQLITE_DBCONFIG_LEGACY_ALTER_TABLE, 0, 0);
|
||||
T.assert(0===rc);
|
||||
rc = capi.sqlite3_db_config(this.db, capi.SQLITE_DBCONFIG_MAX+1, 0);
|
||||
T.assert(capi.SQLITE_MISUSE === rc);
|
||||
rc = capi.sqlite3_db_config(this.db, capi.SQLITE_DBCONFIG_MAINDBNAME, "main");
|
||||
T.assert(0 === rc);
|
||||
const stack = wasm.pstack.pointer;
|
||||
try {
|
||||
const [pCur, pHi] = wasm.pstack.allocPtr(2);
|
||||
rc = capi.sqlite3_db_status(this.db, capi.SQLITE_DBSTATUS_LOOKASIDE_USED,
|
||||
pCur, pHi, 0);
|
||||
T.assert(0===rc);
|
||||
if(wasm.getMemValue(pCur, 'i32')){
|
||||
warn("Cannot test db_config(SQLITE_DBCONFIG_LOOKASIDE)",
|
||||
"while lookaside memory is in use.");
|
||||
}else{
|
||||
rc = capi.sqlite3_db_config(this.db, capi.SQLITE_DBCONFIG_LOOKASIDE,
|
||||
0, 4096, 12);
|
||||
T.assert(0 === rc);
|
||||
}
|
||||
}finally{
|
||||
wasm.pstack.restore(stack);
|
||||
}
|
||||
})
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
.t('DB.Stmt', function(S){
|
||||
|
Reference in New Issue
Block a user