| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | globalThis.sqlite3ApiBootstrap.initializers.push(function(sqlite3){ |
| | 'use strict'; |
| | const toss = (...args)=>{throw new Error(args.join(' '))}; |
| | const capi = sqlite3.capi, wasm = sqlite3.wasm, util = sqlite3.util; |
| | globalThis.WhWasmUtilInstaller(wasm); |
| | delete globalThis.WhWasmUtilInstaller; |
| |
|
| | if(0){ |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | const dealloc = wasm.exports[sqlite3.config.deallocExportName]; |
| | const nFunc = wasm.functionTable().length; |
| | let i; |
| | for(i = 0; i < nFunc; ++i){ |
| | const e = wasm.functionEntry(i); |
| | if(dealloc === e){ |
| | capi.SQLITE_WASM_DEALLOC = i; |
| | break; |
| | } |
| | } |
| | if(dealloc !== wasm.functionEntry(capi.SQLITE_WASM_DEALLOC)){ |
| | toss("Internal error: cannot find function pointer for SQLITE_WASM_DEALLOC."); |
| | } |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | const bindingSignatures = { |
| | core: [ |
| | |
| | ["sqlite3_aggregate_context","void*", "sqlite3_context*", "int"], |
| | |
| | |
| | |
| | ["sqlite3_bind_double","int", "sqlite3_stmt*", "int", "f64"], |
| | ["sqlite3_bind_int","int", "sqlite3_stmt*", "int", "int"], |
| | ["sqlite3_bind_null",undefined, "sqlite3_stmt*", "int"], |
| | ["sqlite3_bind_parameter_count", "int", "sqlite3_stmt*"], |
| | ["sqlite3_bind_parameter_index","int", "sqlite3_stmt*", "string"], |
| | ["sqlite3_bind_parameter_name", "string", "sqlite3_stmt*", "int"], |
| | ["sqlite3_bind_pointer", "int", |
| | "sqlite3_stmt*", "int", "*", "string:static", "*"], |
| | ["sqlite3_busy_handler","int", [ |
| | "sqlite3*", |
| | new wasm.xWrap.FuncPtrAdapter({ |
| | signature: 'i(pi)', |
| | contextKey: (argv,argIndex)=>argv[0] |
| | }), |
| | "*" |
| | ]], |
| | ["sqlite3_busy_timeout","int", "sqlite3*", "int"], |
| | |
| | |
| | |
| | ["sqlite3_changes", "int", "sqlite3*"], |
| | ["sqlite3_clear_bindings","int", "sqlite3_stmt*"], |
| | ["sqlite3_collation_needed", "int", "sqlite3*", "*", "*"], |
| | ["sqlite3_column_blob","*", "sqlite3_stmt*", "int"], |
| | ["sqlite3_column_bytes","int", "sqlite3_stmt*", "int"], |
| | ["sqlite3_column_count", "int", "sqlite3_stmt*"], |
| | ["sqlite3_column_decltype", "string", "sqlite3_stmt*", "int"], |
| | ["sqlite3_column_double","f64", "sqlite3_stmt*", "int"], |
| | ["sqlite3_column_int","int", "sqlite3_stmt*", "int"], |
| | ["sqlite3_column_name","string", "sqlite3_stmt*", "int"], |
| | |
| | |
| | |
| | ["sqlite3_column_text","string", "sqlite3_stmt*", "int"], |
| | |
| | ["sqlite3_column_type","int", "sqlite3_stmt*", "int"], |
| | ["sqlite3_column_value","sqlite3_value*", "sqlite3_stmt*", "int"], |
| | ["sqlite3_commit_hook", "void*", [ |
| | "sqlite3*", |
| | new wasm.xWrap.FuncPtrAdapter({ |
| | name: 'sqlite3_commit_hook', |
| | signature: 'i(p)', |
| | contextKey: (argv)=>argv[0] |
| | }), |
| | '*' |
| | ]], |
| | ["sqlite3_compileoption_get", "string", "int"], |
| | ["sqlite3_compileoption_used", "int", "string"], |
| | ["sqlite3_complete", "int", "string:flexible"], |
| | ["sqlite3_context_db_handle", "sqlite3*", "sqlite3_context*"], |
| | |
| | |
| | |
| | |
| | |
| | |
| | ["sqlite3_data_count", "int", "sqlite3_stmt*"], |
| | ["sqlite3_db_filename", "string", "sqlite3*", "string"], |
| | ["sqlite3_db_handle", "sqlite3*", "sqlite3_stmt*"], |
| | ["sqlite3_db_name", "string", "sqlite3*", "int"], |
| | ["sqlite3_db_readonly", "int", "sqlite3*", "string"], |
| | ["sqlite3_db_status", "int", "sqlite3*", "int", "*", "*", "int"], |
| | ["sqlite3_errcode", "int", "sqlite3*"], |
| | ["sqlite3_errmsg", "string", "sqlite3*"], |
| | ["sqlite3_error_offset", "int", "sqlite3*"], |
| | ["sqlite3_errstr", "string", "int"], |
| | ["sqlite3_exec", "int", [ |
| | "sqlite3*", "string:flexible", |
| | new wasm.xWrap.FuncPtrAdapter({ |
| | signature: 'i(pipp)', |
| | bindScope: 'transient', |
| | callProxy: (callback)=>{ |
| | let aNames; |
| | return (pVoid, nCols, pColVals, pColNames)=>{ |
| | try { |
| | const aVals = wasm.cArgvToJs(nCols, pColVals); |
| | if(!aNames) aNames = wasm.cArgvToJs(nCols, pColNames); |
| | return callback(aVals, aNames) | 0; |
| | }catch(e){ |
| | |
| | |
| | |
| | |
| | |
| | |
| | return e.resultCode || capi.SQLITE_ERROR; |
| | } |
| | } |
| | } |
| | }), |
| | "*", "**" |
| | ]], |
| | ["sqlite3_expanded_sql", "string", "sqlite3_stmt*"], |
| | ["sqlite3_extended_errcode", "int", "sqlite3*"], |
| | ["sqlite3_extended_result_codes", "int", "sqlite3*", "int"], |
| | ["sqlite3_file_control", "int", "sqlite3*", "string", "int", "*"], |
| | ["sqlite3_finalize", "int", "sqlite3_stmt*"], |
| | ["sqlite3_free", undefined,"*"], |
| | ["sqlite3_get_autocommit", "int", "sqlite3*"], |
| | ["sqlite3_get_auxdata", "*", "sqlite3_context*", "int"], |
| | ["sqlite3_initialize", undefined], |
| | ["sqlite3_interrupt", undefined, "sqlite3*"], |
| | ["sqlite3_is_interrupted", "int", "sqlite3*"], |
| | ["sqlite3_keyword_count", "int"], |
| | ["sqlite3_keyword_name", "int", ["int", "**", "*"]], |
| | ["sqlite3_keyword_check", "int", ["string", "int"]], |
| | ["sqlite3_libversion", "string"], |
| | ["sqlite3_libversion_number", "int"], |
| | ["sqlite3_limit", "int", ["sqlite3*", "int", "int"]], |
| | ["sqlite3_malloc", "*","int"], |
| | ["sqlite3_next_stmt", "sqlite3_stmt*", ["sqlite3*","sqlite3_stmt*"]], |
| | ["sqlite3_open", "int", "string", "*"], |
| | ["sqlite3_open_v2", "int", "string", "*", "int", "string"], |
| | |
| | |
| | |
| | |
| | |
| | ["sqlite3_realloc", "*","*","int"], |
| | ["sqlite3_reset", "int", "sqlite3_stmt*"], |
| | |
| | ["sqlite3_result_blob", undefined, "sqlite3_context*", "*", "int", "*"], |
| | ["sqlite3_result_double", undefined, "sqlite3_context*", "f64"], |
| | ["sqlite3_result_error", undefined, "sqlite3_context*", "string", "int"], |
| | ["sqlite3_result_error_code", undefined, "sqlite3_context*", "int"], |
| | ["sqlite3_result_error_nomem", undefined, "sqlite3_context*"], |
| | ["sqlite3_result_error_toobig", undefined, "sqlite3_context*"], |
| | ["sqlite3_result_int", undefined, "sqlite3_context*", "int"], |
| | ["sqlite3_result_null", undefined, "sqlite3_context*"], |
| | ["sqlite3_result_pointer", undefined, |
| | "sqlite3_context*", "*", "string:static", "*"], |
| | ["sqlite3_result_subtype", undefined, "sqlite3_value*", "int"], |
| | ["sqlite3_result_text", undefined, "sqlite3_context*", "string", "int", "*"], |
| | ["sqlite3_result_zeroblob", undefined, "sqlite3_context*", "int"], |
| | ["sqlite3_rollback_hook", "void*", [ |
| | "sqlite3*", |
| | new wasm.xWrap.FuncPtrAdapter({ |
| | name: 'sqlite3_rollback_hook', |
| | signature: 'v(p)', |
| | contextKey: (argv)=>argv[0] |
| | }), |
| | '*' |
| | ]], |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | ["sqlite3_set_auxdata", undefined, [ |
| | "sqlite3_context*", "int", "*", |
| | true |
| | ? "*" |
| | : new wasm.xWrap.FuncPtrAdapter({ |
| | |
| | |
| | name: 'xDestroyAuxData', |
| | signature: 'v(p)', |
| | contextKey: (argv, argIndex)=>argv[0] |
| | }) |
| | ]], |
| | ['sqlite3_set_errmsg', 'int', 'sqlite3*', 'int', 'string'], |
| | ["sqlite3_shutdown", undefined], |
| | ["sqlite3_sourceid", "string"], |
| | ["sqlite3_sql", "string", "sqlite3_stmt*"], |
| | ["sqlite3_status", "int", "int", "*", "*", "int"], |
| | ["sqlite3_step", "int", "sqlite3_stmt*"], |
| | ["sqlite3_stmt_busy", "int", "sqlite3_stmt*"], |
| | ["sqlite3_stmt_readonly", "int", "sqlite3_stmt*"], |
| | ["sqlite3_stmt_status", "int", "sqlite3_stmt*", "int", "int"], |
| | ["sqlite3_strglob", "int", "string","string"], |
| | ["sqlite3_stricmp", "int", "string", "string"], |
| | ["sqlite3_strlike", "int", "string", "string","int"], |
| | ["sqlite3_strnicmp", "int", "string", "string", "int"], |
| | ["sqlite3_table_column_metadata", "int", |
| | "sqlite3*", "string", "string", "string", |
| | "**", "**", "*", "*", "*"], |
| | ["sqlite3_total_changes", "int", "sqlite3*"], |
| | ["sqlite3_trace_v2", "int", [ |
| | "sqlite3*", "int", |
| | new wasm.xWrap.FuncPtrAdapter({ |
| | name: 'sqlite3_trace_v2::callback', |
| | signature: 'i(ippp)', |
| | contextKey: (argv,argIndex)=>argv[0] |
| | }), |
| | "*" |
| | ]], |
| | ["sqlite3_txn_state", "int", ["sqlite3*","string"]], |
| | |
| | |
| | |
| | ["sqlite3_uri_boolean", "int", "sqlite3_filename", "string", "int"], |
| | ["sqlite3_uri_key", "string", "sqlite3_filename", "int"], |
| | ["sqlite3_uri_parameter", "string", "sqlite3_filename", "string"], |
| | ["sqlite3_user_data","void*", "sqlite3_context*"], |
| | ["sqlite3_value_blob", "*", "sqlite3_value*"], |
| | ["sqlite3_value_bytes","int", "sqlite3_value*"], |
| | ["sqlite3_value_double","f64", "sqlite3_value*"], |
| | ["sqlite3_value_dup", "sqlite3_value*", "sqlite3_value*"], |
| | ["sqlite3_value_free", undefined, "sqlite3_value*"], |
| | ["sqlite3_value_frombind", "int", "sqlite3_value*"], |
| | ["sqlite3_value_int","int", "sqlite3_value*"], |
| | ["sqlite3_value_nochange", "int", "sqlite3_value*"], |
| | ["sqlite3_value_numeric_type", "int", "sqlite3_value*"], |
| | ["sqlite3_value_pointer", "*", "sqlite3_value*", "string:static"], |
| | ["sqlite3_value_subtype", "int", "sqlite3_value*"], |
| | |
| | ["sqlite3_value_text", "string", "sqlite3_value*"], |
| | |
| | ["sqlite3_value_type", "int", "sqlite3_value*"], |
| | ["sqlite3_vfs_find", "*", "string"], |
| | ["sqlite3_vfs_register", "int", "sqlite3_vfs*", "int"], |
| | ["sqlite3_vfs_unregister", "int", "sqlite3_vfs*"] |
| |
|
| | |
| | ], |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | int64: [ |
| | ["sqlite3_bind_int64","int", ["sqlite3_stmt*", "int", "i64"]], |
| | ["sqlite3_changes64","i64", ["sqlite3*"]], |
| | ["sqlite3_column_int64","i64", ["sqlite3_stmt*", "int"]], |
| | ["sqlite3_deserialize", "int", "sqlite3*", "string", "*", "i64", "i64", "int"] |
| | |
| | |
| | |
| | |
| | |
| | |
| | , |
| | ["sqlite3_last_insert_rowid", "i64", ["sqlite3*"]], |
| | ["sqlite3_malloc64", "*","i64"], |
| | ["sqlite3_msize", "i64", "*"], |
| | ["sqlite3_overload_function", "int", ["sqlite3*","string","int"]], |
| | ["sqlite3_realloc64", "*","*", "i64"], |
| | ["sqlite3_result_int64", undefined, "*", "i64"], |
| | ["sqlite3_result_zeroblob64", "int", "*", "i64"], |
| | ["sqlite3_serialize","*", "sqlite3*", "string", "*", "int"], |
| | ["sqlite3_set_last_insert_rowid", undefined, ["sqlite3*", "i64"]], |
| | ["sqlite3_status64", "int", "int", "*", "*", "int"], |
| | ["sqlite3_db_status64", "int", "sqlite3*", "int", "*", "*", "int"], |
| | ["sqlite3_total_changes64", "i64", ["sqlite3*"]], |
| | ["sqlite3_update_hook", "*", [ |
| | "sqlite3*", |
| | new wasm.xWrap.FuncPtrAdapter({ |
| | name: 'sqlite3_update_hook::callback', |
| | signature: "v(pippj)", |
| | contextKey: (argv)=>argv[0], |
| | callProxy: (callback)=>{ |
| | return (p,op,z0,z1,rowid)=>{ |
| | callback(p, op, wasm.cstrToJs(z0), wasm.cstrToJs(z1), rowid); |
| | }; |
| | } |
| | }), |
| | "*" |
| | ]], |
| | ["sqlite3_uri_int64", "i64", ["sqlite3_filename", "string", "i64"]], |
| | ["sqlite3_value_int64","i64", "sqlite3_value*"] |
| | |
| | ], |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | wasmInternal: [ |
| | ["sqlite3__wasm_db_reset", "int", "sqlite3*"], |
| | ["sqlite3__wasm_db_vfs", "sqlite3_vfs*", "sqlite3*","string"], |
| | [ |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | "sqlite3__wasm_vfs_create_file", "int", "sqlite3_vfs*","string","*", "int" |
| | ], |
| | ["sqlite3__wasm_posix_create_file", "int", "string","*", "int"], |
| | ["sqlite3__wasm_vfs_unlink", "int", "sqlite3_vfs*","string"], |
| | ["sqlite3__wasm_qfmt_token","string:dealloc", "string","int"] |
| | ] |
| | } ; |
| |
|
| | if( !!wasm.exports.sqlite3_progress_handler ){ |
| | bindingSignatures.core.push( |
| | ["sqlite3_progress_handler", undefined, [ |
| | "sqlite3*", "int", new wasm.xWrap.FuncPtrAdapter({ |
| | name: 'xProgressHandler', |
| | signature: 'i(p)', |
| | bindScope: 'context', |
| | contextKey: (argv,argIndex)=>argv[0] |
| | }), "*" |
| | ]] |
| | ); |
| | } |
| |
|
| | if( !!wasm.exports.sqlite3_stmt_explain ){ |
| | bindingSignatures.core.push( |
| | ["sqlite3_stmt_explain", "int", "sqlite3_stmt*", "int"], |
| | ["sqlite3_stmt_isexplain", "int", "sqlite3_stmt*"] |
| | ); |
| | } |
| |
|
| | if( !!wasm.exports.sqlite3_set_authorizer ){ |
| | bindingSignatures.core.push( |
| | ["sqlite3_set_authorizer", "int", [ |
| | "sqlite3*", |
| | new wasm.xWrap.FuncPtrAdapter({ |
| | name: "sqlite3_set_authorizer::xAuth", |
| | signature: "i(pi"+"ssss)", |
| | contextKey: (argv, argIndex)=>argv[0], |
| | |
| | |
| | |
| | |
| | |
| | callProxy: (callback)=>{ |
| | return (pV, iCode, s0, s1, s2, s3)=>{ |
| | try{ |
| | s0 = s0 && wasm.cstrToJs(s0); s1 = s1 && wasm.cstrToJs(s1); |
| | s2 = s2 && wasm.cstrToJs(s2); s3 = s3 && wasm.cstrToJs(s3); |
| | return callback(pV, iCode, s0, s1, s2, s3) | 0; |
| | }catch(e){ |
| | return e.resultCode || capi.SQLITE_ERROR; |
| | } |
| | } |
| | } |
| | }), |
| | "*" |
| | ]] |
| | ); |
| | } |
| |
|
| | if( !!wasm.exports.sqlite3_column_origin_name ){ |
| | bindingSignatures.core.push( |
| | ["sqlite3_column_database_name","string", "sqlite3_stmt*", "int"], |
| | ["sqlite3_column_origin_name","string", "sqlite3_stmt*", "int"], |
| | ["sqlite3_column_table_name","string", "sqlite3_stmt*", "int"] |
| | ); |
| | } |
| |
|
| | if(false && wasm.compileOptionUsed('SQLITE_ENABLE_NORMALIZE')){ |
| | |
| | |
| | |
| | bindingSignatures.core.push(["sqlite3_normalized_sql", "string", "sqlite3_stmt*"]); |
| | } |
| |
|
| | |
| | if( !!wasm.exports.sqlite3_key_v2 ){ |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | bindingSignatures.core.push( |
| | ["sqlite3_key", "int", "sqlite3*", "string", "int"], |
| | ["sqlite3_key_v2","int","sqlite3*","string","*","int"], |
| | ["sqlite3_rekey", "int", "sqlite3*", "string", "int"], |
| | ["sqlite3_rekey_v2", "int", "sqlite3*", "string", "*", "int"], |
| | ["sqlite3_activate_see", undefined, "string"] |
| | ); |
| | } |
| | |
| |
|
| | if( wasm.bigIntEnabled && !!wasm.exports.sqlite3_declare_vtab ){ |
| | bindingSignatures.int64.push( |
| | ["sqlite3_create_module", "int", |
| | ["sqlite3*","string","sqlite3_module*","*"]], |
| | ["sqlite3_create_module_v2", "int", |
| | ["sqlite3*","string","sqlite3_module*","*","*"]], |
| | ["sqlite3_declare_vtab", "int", ["sqlite3*", "string:flexible"]], |
| | ["sqlite3_drop_modules", "int", ["sqlite3*", "**"]], |
| | ["sqlite3_vtab_collation","string","sqlite3_index_info*","int"], |
| | |
| | |
| | ["sqlite3_vtab_distinct","int", "sqlite3_index_info*"], |
| | ["sqlite3_vtab_in","int", "sqlite3_index_info*", "int", "int"], |
| | ["sqlite3_vtab_in_first", "int", "sqlite3_value*", "**"], |
| | ["sqlite3_vtab_in_next", "int", "sqlite3_value*", "**"], |
| | ["sqlite3_vtab_nochange","int", "sqlite3_context*"], |
| | ["sqlite3_vtab_on_conflict","int", "sqlite3*"], |
| | ["sqlite3_vtab_rhs_value","int", "sqlite3_index_info*", "int", "**"] |
| | ); |
| | } |
| |
|
| | if(wasm.bigIntEnabled && !!wasm.exports.sqlite3_preupdate_hook){ |
| | bindingSignatures.int64.push( |
| | ["sqlite3_preupdate_blobwrite", "int", "sqlite3*"], |
| | ["sqlite3_preupdate_count", "int", "sqlite3*"], |
| | ["sqlite3_preupdate_depth", "int", "sqlite3*"], |
| | ["sqlite3_preupdate_hook", "*", [ |
| | "sqlite3*", |
| | new wasm.xWrap.FuncPtrAdapter({ |
| | name: 'sqlite3_preupdate_hook', |
| | signature: "v(ppippjj)", |
| | contextKey: (argv)=>argv[0], |
| | callProxy: (callback)=>{ |
| | return (p,db,op,zDb,zTbl,iKey1,iKey2)=>{ |
| | callback(p, db, op, wasm.cstrToJs(zDb), wasm.cstrToJs(zTbl), |
| | iKey1, iKey2); |
| | }; |
| | } |
| | }), |
| | "*" |
| | ]], |
| | ["sqlite3_preupdate_new", "int", ["sqlite3*", "int", "**"]], |
| | ["sqlite3_preupdate_old", "int", ["sqlite3*", "int", "**"]] |
| | ); |
| | } |
| |
|
| | |
| | if(wasm.bigIntEnabled |
| | && !!wasm.exports.sqlite3changegroup_add |
| | && !!wasm.exports.sqlite3session_create |
| | && !!wasm.exports.sqlite3_preupdate_hook ){ |
| | |
| | |
| | |
| | |
| | |
| | |
| | const __ipsProxy = { |
| | signature: 'i(ps)', |
| | callProxy:(callback)=>{ |
| | return (p,s)=>{ |
| | try{return callback(p, wasm.cstrToJs(s)) | 0} |
| | catch(e){return e.resultCode || capi.SQLITE_ERROR} |
| | } |
| | } |
| | }; |
| |
|
| | bindingSignatures.int64.push( |
| | ['sqlite3changegroup_add', 'int', ['sqlite3_changegroup*', 'int', 'void*']], |
| | ['sqlite3changegroup_add_strm', 'int', [ |
| | 'sqlite3_changegroup*', |
| | new wasm.xWrap.FuncPtrAdapter({ |
| | name: 'xInput', signature: 'i(ppp)', bindScope: 'transient' |
| | }), |
| | 'void*' |
| | ]], |
| | ['sqlite3changegroup_delete', undefined, ['sqlite3_changegroup*']], |
| | ['sqlite3changegroup_new', 'int', ['**']], |
| | ['sqlite3changegroup_output', 'int', ['sqlite3_changegroup*', 'int*', '**']], |
| | ['sqlite3changegroup_output_strm', 'int', [ |
| | 'sqlite3_changegroup*', |
| | new wasm.xWrap.FuncPtrAdapter({ |
| | name: 'xOutput', signature: 'i(ppi)', bindScope: 'transient' |
| | }), |
| | 'void*' |
| | ]], |
| | ['sqlite3changeset_apply', 'int', [ |
| | 'sqlite3*', 'int', 'void*', |
| | new wasm.xWrap.FuncPtrAdapter({ |
| | name: 'xFilter', bindScope: 'transient', ...__ipsProxy |
| | }), |
| | new wasm.xWrap.FuncPtrAdapter({ |
| | name: 'xConflict', signature: 'i(pip)', bindScope: 'transient' |
| | }), |
| | 'void*' |
| | ]], |
| | ['sqlite3changeset_apply_strm', 'int', [ |
| | 'sqlite3*', |
| | new wasm.xWrap.FuncPtrAdapter({ |
| | name: 'xInput', signature: 'i(ppp)', bindScope: 'transient' |
| | }), |
| | 'void*', |
| | new wasm.xWrap.FuncPtrAdapter({ |
| | name: 'xFilter', bindScope: 'transient', ...__ipsProxy |
| | }), |
| | new wasm.xWrap.FuncPtrAdapter({ |
| | name: 'xConflict', signature: 'i(pip)', bindScope: 'transient' |
| | }), |
| | 'void*' |
| | ]], |
| | ['sqlite3changeset_apply_v2', 'int', [ |
| | 'sqlite3*', 'int', 'void*', |
| | new wasm.xWrap.FuncPtrAdapter({ |
| | name: 'xFilter', bindScope: 'transient', ...__ipsProxy |
| | }), |
| | new wasm.xWrap.FuncPtrAdapter({ |
| | name: 'xConflict', signature: 'i(pip)', bindScope: 'transient' |
| | }), |
| | 'void*', '**', 'int*', 'int' |
| |
|
| | ]], |
| | ['sqlite3changeset_apply_v2_strm', 'int', [ |
| | 'sqlite3*', |
| | new wasm.xWrap.FuncPtrAdapter({ |
| | name: 'xInput', signature: 'i(ppp)', bindScope: 'transient' |
| | }), |
| | 'void*', |
| | new wasm.xWrap.FuncPtrAdapter({ |
| | name: 'xFilter', bindScope: 'transient', ...__ipsProxy |
| | }), |
| | new wasm.xWrap.FuncPtrAdapter({ |
| | name: 'xConflict', signature: 'i(pip)', bindScope: 'transient' |
| | }), |
| | 'void*', '**', 'int*', 'int' |
| | ]], |
| | ['sqlite3changeset_apply_v3', 'int', [ |
| | 'sqlite3*', 'int', 'void*', |
| | new wasm.xWrap.FuncPtrAdapter({ |
| | name: 'xFilter', signature: 'i(pp)', bindScope: 'transient' |
| | }), |
| | new wasm.xWrap.FuncPtrAdapter({ |
| | name: 'xConflict', signature: 'i(pip)', bindScope: 'transient' |
| | }), |
| | 'void*', '**', 'int*', 'int' |
| |
|
| | ]], |
| | ['sqlite3changeset_apply_v3_strm', 'int', [ |
| | 'sqlite3*', |
| | new wasm.xWrap.FuncPtrAdapter({ |
| | name: 'xInput', signature: 'i(ppp)', bindScope: 'transient' |
| | }), |
| | 'void*', |
| | new wasm.xWrap.FuncPtrAdapter({ |
| | name: 'xFilter', signature: 'i(pp)', bindScope: 'transient' |
| | }), |
| | new wasm.xWrap.FuncPtrAdapter({ |
| | name: 'xConflict', signature: 'i(pip)', bindScope: 'transient' |
| | }), |
| | 'void*', '**', 'int*', 'int' |
| | ]], |
| | ['sqlite3changeset_concat', 'int', ['int','void*', 'int', 'void*', 'int*', '**']], |
| | ['sqlite3changeset_concat_strm', 'int', [ |
| | new wasm.xWrap.FuncPtrAdapter({ |
| | name: 'xInputA', signature: 'i(ppp)', bindScope: 'transient' |
| | }), |
| | 'void*', |
| | new wasm.xWrap.FuncPtrAdapter({ |
| | name: 'xInputB', signature: 'i(ppp)', bindScope: 'transient' |
| | }), |
| | 'void*', |
| | new wasm.xWrap.FuncPtrAdapter({ |
| | name: 'xOutput', signature: 'i(ppi)', bindScope: 'transient' |
| | }), |
| | 'void*' |
| | ]], |
| | ['sqlite3changeset_conflict', 'int', ['sqlite3_changeset_iter*', 'int', '**']], |
| | ['sqlite3changeset_finalize', 'int', ['sqlite3_changeset_iter*']], |
| | ['sqlite3changeset_fk_conflicts', 'int', ['sqlite3_changeset_iter*', 'int*']], |
| | ['sqlite3changeset_invert', 'int', ['int', 'void*', 'int*', '**']], |
| | ['sqlite3changeset_invert_strm', 'int', [ |
| | new wasm.xWrap.FuncPtrAdapter({ |
| | name: 'xInput', signature: 'i(ppp)', bindScope: 'transient' |
| | }), |
| | 'void*', |
| | new wasm.xWrap.FuncPtrAdapter({ |
| | name: 'xOutput', signature: 'i(ppi)', bindScope: 'transient' |
| | }), |
| | 'void*' |
| | ]], |
| | ['sqlite3changeset_new', 'int', ['sqlite3_changeset_iter*', 'int', '**']], |
| | ['sqlite3changeset_next', 'int', ['sqlite3_changeset_iter*']], |
| | ['sqlite3changeset_old', 'int', ['sqlite3_changeset_iter*', 'int', '**']], |
| | ['sqlite3changeset_op', 'int', [ |
| | 'sqlite3_changeset_iter*', '**', 'int*', 'int*','int*' |
| | ]], |
| | ['sqlite3changeset_pk', 'int', ['sqlite3_changeset_iter*', '**', 'int*']], |
| | ['sqlite3changeset_start', 'int', ['**', 'int', '*']], |
| | ['sqlite3changeset_start_strm', 'int', [ |
| | '**', |
| | new wasm.xWrap.FuncPtrAdapter({ |
| | name: 'xInput', signature: 'i(ppp)', bindScope: 'transient' |
| | }), |
| | 'void*' |
| | ]], |
| | ['sqlite3changeset_start_v2', 'int', ['**', 'int', '*', 'int']], |
| | ['sqlite3changeset_start_v2_strm', 'int', [ |
| | '**', |
| | new wasm.xWrap.FuncPtrAdapter({ |
| | name: 'xInput', signature: 'i(ppp)', bindScope: 'transient' |
| | }), |
| | 'void*', 'int' |
| | ]], |
| | ['sqlite3session_attach', 'int', ['sqlite3_session*', 'string']], |
| | ['sqlite3session_changeset', 'int', ['sqlite3_session*', 'int*', '**']], |
| | ['sqlite3session_changeset_size', 'i64', ['sqlite3_session*']], |
| | ['sqlite3session_changeset_strm', 'int', [ |
| | 'sqlite3_session*', |
| | new wasm.xWrap.FuncPtrAdapter({ |
| | name: 'xOutput', signature: 'i(ppp)', bindScope: 'transient' |
| | }), |
| | 'void*' |
| | ]], |
| | ['sqlite3session_config', 'int', ['int', 'void*']], |
| | ['sqlite3session_create', 'int', ['sqlite3*', 'string', '**']], |
| | |
| | ['sqlite3session_diff', 'int', ['sqlite3_session*', 'string', 'string', '**']], |
| | ['sqlite3session_enable', 'int', ['sqlite3_session*', 'int']], |
| | ['sqlite3session_indirect', 'int', ['sqlite3_session*', 'int']], |
| | ['sqlite3session_isempty', 'int', ['sqlite3_session*']], |
| | ['sqlite3session_memory_used', 'i64', ['sqlite3_session*']], |
| | ['sqlite3session_object_config', 'int', ['sqlite3_session*', 'int', 'void*']], |
| | ['sqlite3session_patchset', 'int', ['sqlite3_session*', '*', '**']], |
| | ['sqlite3session_patchset_strm', 'int', [ |
| | 'sqlite3_session*', |
| | new wasm.xWrap.FuncPtrAdapter({ |
| | name: 'xOutput', signature: 'i(ppp)', bindScope: 'transient' |
| | }), |
| | 'void*' |
| | ]], |
| | ['sqlite3session_table_filter', undefined, [ |
| | 'sqlite3_session*', |
| | new wasm.xWrap.FuncPtrAdapter({ |
| | name: 'xFilter', ...__ipsProxy, |
| | contextKey: (argv,argIndex)=>argv[0] |
| | }), |
| | '*' |
| | ]] |
| | ); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | sqlite3.StructBinder = globalThis.Jaccwabyt({ |
| | heap: wasm.heap8u, |
| | alloc: wasm.alloc, |
| | dealloc: wasm.dealloc, |
| | bigIntEnabled: wasm.bigIntEnabled, |
| | pointerIR: wasm.ptr.ir, |
| | memberPrefix: |
| | |
| | |
| | '$' |
| | }); |
| | delete globalThis.Jaccwabyt; |
| |
|
| | { |
| |
|
| | |
| | |
| | const __xString = wasm.xWrap.argAdapter('string'); |
| | wasm.xWrap.argAdapter( |
| | 'string:flexible', (v)=>__xString(util.flexibleString(v)) |
| | ); |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | wasm.xWrap.argAdapter( |
| | 'string:static', |
| | function(v){ |
| | if(wasm.isPtr(v)) return v; |
| | v = ''+v; |
| | let rc = this[v]; |
| | return rc || (this[v] = wasm.allocCString(v)); |
| | }.bind(Object.create(null)) |
| | ); |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | const __xArgPtr = wasm.xWrap.argAdapter('*'); |
| | const nilType = function(){ |
| | |
| | }; |
| | wasm.xWrap.argAdapter('sqlite3_filename', __xArgPtr) |
| | ('sqlite3_context*', __xArgPtr) |
| | ('sqlite3_value*', __xArgPtr) |
| | ('void*', __xArgPtr) |
| | ('sqlite3_changegroup*', __xArgPtr) |
| | ('sqlite3_changeset_iter*', __xArgPtr) |
| | ('sqlite3_session*', __xArgPtr) |
| | ('sqlite3_stmt*', (v)=> |
| | __xArgPtr((v instanceof (sqlite3?.oo1?.Stmt || nilType)) |
| | ? v.pointer : v)) |
| | ('sqlite3*', (v)=> |
| | __xArgPtr((v instanceof (sqlite3?.oo1?.DB || nilType)) |
| | ? v.pointer : v)) |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | ('sqlite3_vfs*', (v)=>{ |
| | if('string'===typeof v){ |
| | |
| | |
| | |
| | return capi.sqlite3_vfs_find(v) |
| | || sqlite3.SQLite3Error.toss( |
| | capi.SQLITE_NOTFOUND, |
| | "Unknown sqlite3_vfs name:", v |
| | ); |
| | } |
| | return __xArgPtr((v instanceof (capi.sqlite3_vfs || nilType)) |
| | ? v.pointer : v); |
| | }); |
| | if( wasm.exports.sqlite3_declare_vtab ){ |
| | wasm.xWrap.argAdapter('sqlite3_index_info*', (v)=> |
| | __xArgPtr((v instanceof (capi.sqlite3_index_info || nilType)) |
| | ? v.pointer : v)) |
| | ('sqlite3_module*', (v)=> |
| | __xArgPtr((v instanceof (capi.sqlite3_module || nilType)) |
| | ? v.pointer : v) |
| | ); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | const __xRcPtr = wasm.xWrap.resultAdapter('*'); |
| | wasm.xWrap.resultAdapter('sqlite3*', __xRcPtr) |
| | ('sqlite3_context*', __xRcPtr) |
| | ('sqlite3_stmt*', __xRcPtr) |
| | ('sqlite3_value*', __xRcPtr) |
| | ('sqlite3_vfs*', __xRcPtr) |
| | ('void*', __xRcPtr); |
| |
|
| | |
| | |
| | |
| | |
| | for(const e of bindingSignatures.core){ |
| | capi[e[0]] = wasm.xWrap.apply(null, e); |
| | } |
| | for(const e of bindingSignatures.wasmInternal){ |
| | util[e[0]] = wasm.xWrap.apply(null, e); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | for(const e of bindingSignatures.int64){ |
| | capi[e[0]] = wasm.bigIntEnabled |
| | ? wasm.xWrap.apply(null, e) |
| | : ()=>toss(e[0]+"() is unavailable due to lack", |
| | "of BigInt support in this build."); |
| | } |
| |
|
| | |
| | delete bindingSignatures.core; |
| | delete bindingSignatures.int64; |
| | delete bindingSignatures.wasmInternal; |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | util.sqlite3__wasm_db_error = function(pDb, resultCode, message){ |
| | if( !pDb ) return capi.SQLITE_MISUSE; |
| | if(resultCode instanceof sqlite3.WasmAllocError){ |
| | resultCode = capi.SQLITE_NOMEM; |
| | message = 0 ; |
| | }else if(resultCode instanceof Error){ |
| | message = message || ''+resultCode; |
| | resultCode = (resultCode.resultCode || capi.SQLITE_ERROR); |
| | } |
| | return capi.sqlite3_set_errmsg(pDb, resultCode, message) || resultCode; |
| | }; |
| | } |
| |
|
| | { |
| | const cJson = wasm.xCall('sqlite3__wasm_enum_json'); |
| | if(!cJson){ |
| | toss("Maintenance required: increase sqlite3__wasm_enum_json()'s", |
| | "static buffer size!"); |
| | } |
| | wasm.ctype = JSON.parse(wasm.cstrToJs(cJson)); |
| | |
| | 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])){ |
| | |
| | |
| | capi[e[0]] = e[1]; |
| | } |
| | } |
| | if(!wasm.functionEntry(capi.SQLITE_WASM_DEALLOC)){ |
| | toss("Internal error: cannot resolve exported function", |
| | "entry SQLITE_WASM_DEALLOC (=="+capi.SQLITE_WASM_DEALLOC+")."); |
| | } |
| | const __rcMap = Object.create(null); |
| | for(const e of Object.entries(wasm.ctype['resultCodes'])){ |
| | __rcMap[e[1]] = e[0]; |
| | } |
| | |
| | |
| | |
| | |
| | capi.sqlite3_js_rc_str = (rc)=>__rcMap[rc]; |
| |
|
| | |
| | const notThese = Object.assign(Object.create(null),{ |
| | |
| | WasmTestStruct: true, |
| | |
| | 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){ |
| | |
| | |
| | |
| | |
| | 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'] |
| | ); |
| | } |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | const __dbArgcMismatch = (pDb,f,n)=>{ |
| | return util.sqlite3__wasm_db_error(pDb, capi.SQLITE_MISUSE, |
| | f+"() requires "+n+" argument"+ |
| | (1===n?"":'s')+"."); |
| | }; |
| |
|
| | |
| | |
| | |
| | |
| | const __errEncoding = (pDb)=>{ |
| | return util.sqlite3__wasm_db_error( |
| | pDb, capi.SQLITE_FORMAT, "SQLITE_UTF8 is the only supported encoding." |
| | ); |
| | }; |
| |
|
| | |
| | |
| | |
| | |
| | |
| | const __argPDb = (pDb)=>wasm.xWrap.argAdapter('sqlite3*')(pDb); |
| | const __argStr = (str)=>wasm.isPtr(str) ? wasm.cstrToJs(str) : str; |
| | const __dbCleanupMap = function( |
| | pDb, mode |
| | ){ |
| | pDb = __argPDb(pDb); |
| | let m = this.dbMap.get(pDb); |
| | if(!mode){ |
| | this.dbMap.delete(pDb); |
| | return m; |
| | }else if(!m && mode>0){ |
| | this.dbMap.set(pDb, (m = Object.create(null))); |
| | } |
| | return m; |
| | }.bind(Object.assign(Object.create(null),{ |
| | dbMap: new Map |
| | })); |
| |
|
| | __dbCleanupMap.addCollation = function(pDb, name){ |
| | const m = __dbCleanupMap(pDb, 1); |
| | if(!m.collation) m.collation = new Set; |
| | m.collation.add(__argStr(name).toLowerCase()); |
| | }; |
| |
|
| | __dbCleanupMap._addUDF = function(pDb, name, arity, map){ |
| | |
| | name = __argStr(name).toLowerCase(); |
| | let u = map.get(name); |
| | if(!u) map.set(name, (u = new Set)); |
| | u.add((arity<0) ? -1 : arity); |
| | }; |
| |
|
| | __dbCleanupMap.addFunction = function(pDb, name, arity){ |
| | const m = __dbCleanupMap(pDb, 1); |
| | if(!m.udf) m.udf = new Map; |
| | this._addUDF(pDb, name, arity, m.udf); |
| | }; |
| |
|
| | if( wasm.exports.sqlite3_create_window_function ){ |
| | __dbCleanupMap.addWindowFunc = function(pDb, name, arity){ |
| | const m = __dbCleanupMap(pDb, 1); |
| | if(!m.wudf) m.wudf = new Map; |
| | this._addUDF(pDb, name, arity, m.wudf); |
| | }; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | __dbCleanupMap.cleanup = function(pDb){ |
| | pDb = __argPDb(pDb); |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | for(const obj of [ |
| | |
| | ['sqlite3_busy_handler',3], |
| | ['sqlite3_commit_hook',3], |
| | ['sqlite3_preupdate_hook',3], |
| | ['sqlite3_progress_handler',4], |
| | ['sqlite3_rollback_hook',3], |
| | ['sqlite3_set_authorizer',3], |
| | ['sqlite3_trace_v2', 4], |
| | ['sqlite3_update_hook',3] |
| | |
| | |
| | |
| | |
| | ]){ |
| | const [name, arity] = obj; |
| | const x = wasm.exports[name]; |
| | if( !x ){ |
| | |
| | continue; |
| | } |
| | const closeArgs = [pDb]; |
| | closeArgs.length = arity |
| | |
| | |
| | ; |
| | |
| | try{ capi[name](...closeArgs) } |
| | catch(e){ |
| | |
| | sqlite3.config.warn("close-time call of",name+"(",closeArgs,") threw:",e); |
| | } |
| | |
| | } |
| | const m = __dbCleanupMap(pDb, 0); |
| | if(!m) return; |
| | if(m.collation){ |
| | for(const name of m.collation){ |
| | try{ |
| | capi.sqlite3_create_collation_v2( |
| | pDb, name, capi.SQLITE_UTF8, 0, 0, 0 |
| | ); |
| | }catch(e){ |
| | |
| | } |
| | } |
| | delete m.collation; |
| | } |
| | let i; |
| | for(i = 0; i < 2; ++i){ |
| | const fmap = i ? m.wudf : m.udf; |
| | if(!fmap) continue; |
| | const func = i |
| | ? capi.sqlite3_create_window_function |
| | : capi.sqlite3_create_function_v2; |
| | for(const e of fmap){ |
| | const name = e[0], arities = e[1]; |
| | const fargs = [pDb, name, 0, capi.SQLITE_UTF8, 0, 0, 0, 0, 0]; |
| | if(i) fargs.push(0); |
| | for(const arity of arities){ |
| | try{ fargs[2] = arity; func.apply(null, fargs); } |
| | catch(e){} |
| | } |
| | arities.clear(); |
| | } |
| | fmap.clear(); |
| | } |
| | delete m.udf; |
| | delete m.wudf; |
| | }; |
| |
|
| | { |
| | const __sqlite3CloseV2 = wasm.xWrap("sqlite3_close_v2", "int", "sqlite3*"); |
| | capi.sqlite3_close_v2 = function(pDb){ |
| | if(1!==arguments.length) return __dbArgcMismatch(pDb, 'sqlite3_close_v2', 1); |
| | if(pDb){ |
| | try{__dbCleanupMap.cleanup(pDb)} catch(e){} |
| | } |
| | return __sqlite3CloseV2(pDb); |
| | }; |
| | } |
| |
|
| | if(capi.sqlite3session_create){ |
| | const __sqlite3SessionDelete = wasm.xWrap( |
| | 'sqlite3session_delete', undefined, ['sqlite3_session*'] |
| | ); |
| | capi.sqlite3session_delete = function(pSession){ |
| | if(1!==arguments.length){ |
| | return __dbArgcMismatch(pDb, 'sqlite3session_delete', 1); |
| | |
| | |
| | |
| | } |
| | else if(pSession){ |
| | |
| | capi.sqlite3session_table_filter(pSession, 0, 0); |
| | } |
| | __sqlite3SessionDelete(pSession); |
| | }; |
| | } |
| |
|
| | { |
| | |
| | const contextKey = (argv,argIndex)=>{ |
| | return 'argv['+argIndex+']:'+argv[0]+ |
| | ':'+wasm.cstrToJs(argv[1]).toLowerCase() |
| | }; |
| | const __sqlite3CreateCollationV2 = wasm.xWrap( |
| | 'sqlite3_create_collation_v2', 'int', [ |
| | 'sqlite3*', 'string', 'int', '*', |
| | new wasm.xWrap.FuncPtrAdapter({ |
| | |
| | name: 'xCompare', signature: 'i(pipip)', contextKey |
| | }), |
| | new wasm.xWrap.FuncPtrAdapter({ |
| | |
| | name: 'xDestroy', signature: 'v(p)', contextKey |
| | }) |
| | ] |
| | ); |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | capi.sqlite3_create_collation_v2 = function(pDb,zName,eTextRep,pArg,xCompare,xDestroy){ |
| | if(6!==arguments.length) return __dbArgcMismatch(pDb, 'sqlite3_create_collation_v2', 6); |
| | else if( 0 === (eTextRep & 0xf) ){ |
| | eTextRep |= capi.SQLITE_UTF8; |
| | }else if( capi.SQLITE_UTF8 !== (eTextRep & 0xf) ){ |
| | return __errEncoding(pDb); |
| | } |
| | try{ |
| | const rc = __sqlite3CreateCollationV2(pDb, zName, eTextRep, pArg, xCompare, xDestroy); |
| | if(0===rc && xCompare instanceof Function){ |
| | __dbCleanupMap.addCollation(pDb, zName); |
| | } |
| | return rc; |
| | }catch(e){ |
| | return util.sqlite3__wasm_db_error(pDb, e); |
| | } |
| | }; |
| |
|
| | capi.sqlite3_create_collation = (pDb,zName,eTextRep,pArg,xCompare)=>{ |
| | return (5===arguments.length) |
| | ? capi.sqlite3_create_collation_v2(pDb,zName,eTextRep,pArg,xCompare,0) |
| | : __dbArgcMismatch(pDb, 'sqlite3_create_collation', 5); |
| | }; |
| |
|
| | } |
| |
|
| | { |
| | |
| | |
| | |
| | const contextKey = function(argv,argIndex){ |
| | return ( |
| | argv[0] |
| | +':'+(argv[2] < 0 ? -1 : argv[2]) |
| | +':'+argIndex |
| | +':'+wasm.cstrToJs(argv[1]).toLowerCase() |
| | ) |
| | }; |
| |
|
| | |
| | |
| | |
| | |
| | const __cfProxy = Object.assign(Object.create(null), { |
| | xInverseAndStep: { |
| | signature:'v(pip)', contextKey, |
| | callProxy: (callback)=>{ |
| | return (pCtx, argc, pArgv)=>{ |
| | try{ callback(pCtx, ...capi.sqlite3_values_to_js(argc, pArgv)) } |
| | catch(e){ capi.sqlite3_result_error_js(pCtx, e) } |
| | }; |
| | } |
| | }, |
| | xFinalAndValue: { |
| | signature:'v(p)', contextKey, |
| | callProxy: (callback)=>{ |
| | return (pCtx)=>{ |
| | try{ capi.sqlite3_result_js(pCtx, callback(pCtx)) } |
| | catch(e){ capi.sqlite3_result_error_js(pCtx, e) } |
| | }; |
| | } |
| | }, |
| | xFunc: { |
| | signature:'v(pip)', contextKey, |
| | callProxy: (callback)=>{ |
| | return (pCtx, argc, pArgv)=>{ |
| | try{ |
| | capi.sqlite3_result_js( |
| | pCtx, |
| | callback(pCtx, ...capi.sqlite3_values_to_js(argc, pArgv)) |
| | ); |
| | }catch(e){ |
| | |
| | capi.sqlite3_result_error_js(pCtx, e); |
| | } |
| | }; |
| | } |
| | }, |
| | xDestroy: { |
| | signature:'v(p)', contextKey, |
| | |
| | callProxy: (callback)=>{ |
| | return (pVoid)=>{ |
| | try{ callback(pVoid) } |
| | catch(e){ console.error("UDF xDestroy method threw:",e) } |
| | }; |
| | } |
| | } |
| | }); |
| |
|
| | const __sqlite3CreateFunction = wasm.xWrap( |
| | "sqlite3_create_function_v2", "int", [ |
| | "sqlite3*", "string", "int", |
| | "int", "*", |
| | new wasm.xWrap.FuncPtrAdapter({name: 'xFunc', ...__cfProxy.xFunc}), |
| | new wasm.xWrap.FuncPtrAdapter({name: 'xStep', ...__cfProxy.xInverseAndStep}), |
| | new wasm.xWrap.FuncPtrAdapter({name: 'xFinal', ...__cfProxy.xFinalAndValue}), |
| | new wasm.xWrap.FuncPtrAdapter({name: 'xDestroy', ...__cfProxy.xDestroy}) |
| | ] |
| | ); |
| |
|
| | const __sqlite3CreateWindowFunction = |
| | wasm.exports.sqlite3_create_window_function |
| | ? wasm.xWrap( |
| | "sqlite3_create_window_function", "int", [ |
| | "sqlite3*", "string", "int", |
| | "int", "*", |
| | new wasm.xWrap.FuncPtrAdapter({name: 'xStep', ...__cfProxy.xInverseAndStep}), |
| | new wasm.xWrap.FuncPtrAdapter({name: 'xFinal', ...__cfProxy.xFinalAndValue}), |
| | new wasm.xWrap.FuncPtrAdapter({name: 'xValue', ...__cfProxy.xFinalAndValue}), |
| | new wasm.xWrap.FuncPtrAdapter({name: 'xInverse', ...__cfProxy.xInverseAndStep}), |
| | new wasm.xWrap.FuncPtrAdapter({name: 'xDestroy', ...__cfProxy.xDestroy}) |
| | ] |
| | ) |
| | : undefined; |
| |
|
| | |
| | capi.sqlite3_create_function_v2 = function f( |
| | pDb, funcName, nArg, eTextRep, pApp, |
| | xFunc, |
| | xStep, |
| | xFinal, |
| | xDestroy |
| | ){ |
| | if( f.length!==arguments.length ){ |
| | return __dbArgcMismatch(pDb,"sqlite3_create_function_v2",f.length); |
| | }else if( 0 === (eTextRep & 0xf) ){ |
| | eTextRep |= capi.SQLITE_UTF8; |
| | }else if( capi.SQLITE_UTF8 !== (eTextRep & 0xf) ){ |
| | return __errEncoding(pDb); |
| | } |
| | try{ |
| | const rc = __sqlite3CreateFunction(pDb, funcName, nArg, eTextRep, |
| | pApp, xFunc, xStep, xFinal, xDestroy); |
| | if(0===rc && (xFunc instanceof Function |
| | || xStep instanceof Function |
| | || xFinal instanceof Function |
| | || xDestroy instanceof Function)){ |
| | __dbCleanupMap.addFunction(pDb, funcName, nArg); |
| | } |
| | return rc; |
| | }catch(e){ |
| | console.error("sqlite3_create_function_v2() setup threw:",e); |
| | return util.sqlite3__wasm_db_error(pDb, e, "Creation of UDF threw: "+e); |
| | } |
| | }; |
| |
|
| | |
| | capi.sqlite3_create_function = function f( |
| | pDb, funcName, nArg, eTextRep, pApp, |
| | xFunc, xStep, xFinal |
| | ){ |
| | return (f.length===arguments.length) |
| | ? capi.sqlite3_create_function_v2(pDb, funcName, nArg, eTextRep, |
| | pApp, xFunc, xStep, xFinal, 0) |
| | : __dbArgcMismatch(pDb,"sqlite3_create_function",f.length); |
| | }; |
| |
|
| | |
| | if( __sqlite3CreateWindowFunction ){ |
| | capi.sqlite3_create_window_function = function f( |
| | pDb, funcName, nArg, eTextRep, pApp, |
| | xStep, |
| | xFinal, |
| | xValue, |
| | xInverse, |
| | xDestroy |
| | ){ |
| | if( f.length!==arguments.length ){ |
| | return __dbArgcMismatch(pDb,"sqlite3_create_window_function",f.length); |
| | }else if( 0 === (eTextRep & 0xf) ){ |
| | eTextRep |= capi.SQLITE_UTF8; |
| | }else if( capi.SQLITE_UTF8 !== (eTextRep & 0xf) ){ |
| | return __errEncoding(pDb); |
| | } |
| | try{ |
| | const rc = __sqlite3CreateWindowFunction(pDb, funcName, nArg, eTextRep, |
| | pApp, xStep, xFinal, xValue, |
| | xInverse, xDestroy); |
| | if(0===rc && (xStep instanceof Function |
| | || xFinal instanceof Function |
| | || xValue instanceof Function |
| | || xInverse instanceof Function |
| | || xDestroy instanceof Function)){ |
| | __dbCleanupMap.addWindowFunc(pDb, funcName, nArg); |
| | } |
| | return rc; |
| | }catch(e){ |
| | console.error("sqlite3_create_window_function() setup threw:",e); |
| | return util.sqlite3__wasm_db_error(pDb, e, "Creation of UDF threw: "+e); |
| | } |
| | }; |
| | }else{ |
| | delete capi.sqlite3_create_window_function; |
| | } |
| | |
| | |
| | |
| | |
| | capi.sqlite3_create_function_v2.udfSetResult = |
| | capi.sqlite3_create_function.udfSetResult = capi.sqlite3_result_js; |
| | if(capi.sqlite3_create_window_function){ |
| | capi.sqlite3_create_window_function.udfSetResult = capi.sqlite3_result_js; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | capi.sqlite3_create_function_v2.udfConvertArgs = |
| | capi.sqlite3_create_function.udfConvertArgs = capi.sqlite3_values_to_js; |
| | if(capi.sqlite3_create_window_function){ |
| | capi.sqlite3_create_window_function.udfConvertArgs = capi.sqlite3_values_to_js; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | capi.sqlite3_create_function_v2.udfSetError = |
| | capi.sqlite3_create_function.udfSetError = capi.sqlite3_result_error_js; |
| | if(capi.sqlite3_create_window_function){ |
| | capi.sqlite3_create_window_function.udfSetError = capi.sqlite3_result_error_js; |
| | } |
| |
|
| | }; |
| |
|
| | { |
| | |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | const __flexiString = (v,n)=>{ |
| | if('string'===typeof v){ |
| | n = -1; |
| | }else if(util.isSQLableTypedArray(v)){ |
| | n = v.byteLength; |
| | v = wasm.typedArrayToString( |
| | (v instanceof ArrayBuffer) ? new Uint8Array(v) : v |
| | ); |
| | }else if(Array.isArray(v)){ |
| | v = v.join(""); |
| | n = -1; |
| | } |
| | return [v, n]; |
| | }; |
| |
|
| | |
| | |
| | |
| | const __prepare = { |
| | |
| | |
| | |
| | |
| | |
| | |
| | basic: wasm.xWrap('sqlite3_prepare_v3', |
| | "int", ["sqlite3*", "string", |
| | "int", |
| | "int", "**", |
| | "**"]), |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | full: wasm.xWrap('sqlite3_prepare_v3', |
| | "int", ["sqlite3*", "*", "int", "int", |
| | "**", "**"]) |
| | }; |
| |
|
| | |
| | capi.sqlite3_prepare_v3 = function f(pDb, sql, sqlLen, prepFlags, ppStmt, pzTail){ |
| | if(f.length!==arguments.length){ |
| | return __dbArgcMismatch(pDb,"sqlite3_prepare_v3",f.length); |
| | } |
| | const [xSql, xSqlLen] = __flexiString(sql, Number(sqlLen)); |
| | switch(typeof xSql){ |
| | case 'string': return __prepare.basic(pDb, xSql, xSqlLen, prepFlags, ppStmt, null); |
| | case (typeof wasm.ptr.null): |
| | return __prepare.full(pDb, wasm.ptr.coerce(xSql), xSqlLen, prepFlags, |
| | ppStmt, pzTail); |
| | default: |
| | return util.sqlite3__wasm_db_error( |
| | pDb, capi.SQLITE_MISUSE, |
| | "Invalid SQL argument type for sqlite3_prepare_v2/v3(). typeof="+(typeof xSql) |
| | ); |
| | } |
| | }; |
| |
|
| | |
| | capi.sqlite3_prepare_v2 = function f(pDb, sql, sqlLen, ppStmt, pzTail){ |
| | return (f.length===arguments.length) |
| | ? capi.sqlite3_prepare_v3(pDb, sql, sqlLen, 0, ppStmt, pzTail) |
| | : __dbArgcMismatch(pDb,"sqlite3_prepare_v2",f.length); |
| | }; |
| |
|
| | } |
| |
|
| | { |
| | const __bindText = wasm.xWrap("sqlite3_bind_text", "int", [ |
| | "sqlite3_stmt*", "int", "string", "int", "*" |
| | ]); |
| | const __bindBlob = wasm.xWrap("sqlite3_bind_blob", "int", [ |
| | "sqlite3_stmt*", "int", "*", "int", "*" |
| | ]); |
| |
|
| | |
| | capi.sqlite3_bind_text = function f(pStmt, iCol, text, nText, xDestroy){ |
| | if(f.length!==arguments.length){ |
| | return __dbArgcMismatch(capi.sqlite3_db_handle(pStmt), |
| | "sqlite3_bind_text", f.length); |
| | }else if(wasm.isPtr(text) || null===text){ |
| | return __bindText(pStmt, iCol, text, nText, xDestroy); |
| | }else if(text instanceof ArrayBuffer){ |
| | text = new Uint8Array(text); |
| | }else if(Array.isArray(pMem)){ |
| | text = pMem.join(''); |
| | } |
| | let p, n; |
| | try{ |
| | if(util.isSQLableTypedArray(text)){ |
| | p = wasm.allocFromTypedArray(text); |
| | n = text.byteLength; |
| | }else if('string'===typeof text){ |
| | [p, n] = wasm.allocCString(text); |
| | }else{ |
| | return util.sqlite3__wasm_db_error( |
| | capi.sqlite3_db_handle(pStmt), capi.SQLITE_MISUSE, |
| | "Invalid 3rd argument type for sqlite3_bind_text()." |
| | ); |
| | } |
| | return __bindText(pStmt, iCol, p, n, capi.SQLITE_WASM_DEALLOC); |
| | }catch(e){ |
| | wasm.dealloc(p); |
| | return util.sqlite3__wasm_db_error( |
| | capi.sqlite3_db_handle(pStmt), e |
| | ); |
| | } |
| | }; |
| |
|
| | |
| | capi.sqlite3_bind_blob = function f(pStmt, iCol, pMem, nMem, xDestroy){ |
| | if(f.length!==arguments.length){ |
| | return __dbArgcMismatch(capi.sqlite3_db_handle(pStmt), |
| | "sqlite3_bind_blob", f.length); |
| | }else if(wasm.isPtr(pMem) || null===pMem){ |
| | return __bindBlob(pStmt, iCol, pMem, nMem, xDestroy); |
| | }else if(pMem instanceof ArrayBuffer){ |
| | pMem = new Uint8Array(pMem); |
| | }else if(Array.isArray(pMem)){ |
| | pMem = pMem.join(''); |
| | } |
| | let p, n; |
| | try{ |
| | if(util.isBindableTypedArray(pMem)){ |
| | p = wasm.allocFromTypedArray(pMem); |
| | n = nMem>=0 ? nMem : pMem.byteLength; |
| | }else if('string'===typeof pMem){ |
| | [p, n] = wasm.allocCString(pMem); |
| | }else{ |
| | return util.sqlite3__wasm_db_error( |
| | capi.sqlite3_db_handle(pStmt), capi.SQLITE_MISUSE, |
| | "Invalid 3rd argument type for sqlite3_bind_blob()." |
| | ); |
| | } |
| | return __bindBlob(pStmt, iCol, p, n, capi.SQLITE_WASM_DEALLOC); |
| | }catch(e){ |
| | wasm.dealloc(p); |
| | return util.sqlite3__wasm_db_error( |
| | capi.sqlite3_db_handle(pStmt), e |
| | ); |
| | } |
| | }; |
| |
|
| | } |
| |
|
| | |
| | if(!capi.sqlite3_column_text){ |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | const argStmt = wasm.xWrap.argAdapter('sqlite3_stmt*'), |
| | argInt = wasm.xWrap.argAdapter('int'), |
| | argValue = wasm.xWrap.argAdapter('sqlite3_value*'), |
| | newStr = |
| | (cstr,n)=>wasm.typedArrayToString(wasm.heap8u(), |
| | Number(cstr), Number(cstr)+n) |
| | capi.sqlite3_column_text = function(stmt, colIndex){ |
| | const a0 = argStmt(stmt), a1 = argInt(colIndex); |
| | const cstr = wasm.exports.sqlite3_column_text(a0, a1); |
| | return cstr |
| | ? newStr(cstr,wasm.exports.sqlite3_column_bytes(a0, a1)) |
| | : null; |
| | }; |
| | capi.sqlite3_value_text = function(val){ |
| | const a0 = argValue(val); |
| | const cstr = wasm.exports.sqlite3_value_text(a0); |
| | return cstr |
| | ? newStr(cstr,wasm.exports.sqlite3_value_bytes(a0)) |
| | : null; |
| | }; |
| | } |
| | |
| |
|
| | { |
| | |
| | |
| | |
| | |
| | |
| | |
| | capi.sqlite3_config = function(op, ...args){ |
| | if(arguments.length<2) return capi.SQLITE_MISUSE; |
| | switch(op){ |
| | case capi.SQLITE_CONFIG_COVERING_INDEX_SCAN: |
| | case capi.SQLITE_CONFIG_MEMSTATUS: |
| | case capi.SQLITE_CONFIG_SMALL_MALLOC: |
| | case capi.SQLITE_CONFIG_SORTERREF_SIZE: |
| | case capi.SQLITE_CONFIG_STMTJRNL_SPILL: |
| | case capi.SQLITE_CONFIG_URI: |
| | return wasm.exports.sqlite3__wasm_config_i(op, args[0]); |
| | case capi.SQLITE_CONFIG_LOOKASIDE: |
| | return wasm.exports.sqlite3__wasm_config_ii(op, args[0], args[1]); |
| | case capi.SQLITE_CONFIG_MEMDB_MAXSIZE: |
| | return wasm.exports.sqlite3__wasm_config_j(op, args[0]); |
| | case capi.SQLITE_CONFIG_GETMALLOC: |
| | case capi.SQLITE_CONFIG_GETMUTEX: |
| | case capi.SQLITE_CONFIG_GETPCACHE2: |
| | case capi.SQLITE_CONFIG_GETPCACHE: |
| | case capi.SQLITE_CONFIG_HEAP: |
| | case capi.SQLITE_CONFIG_LOG: |
| | case capi.SQLITE_CONFIG_MALLOC: |
| | case capi.SQLITE_CONFIG_MMAP_SIZE: |
| | case capi.SQLITE_CONFIG_MULTITHREAD: |
| | case capi.SQLITE_CONFIG_MUTEX: |
| | case capi.SQLITE_CONFIG_PAGECACHE: |
| | case capi.SQLITE_CONFIG_PCACHE2: |
| | case capi.SQLITE_CONFIG_PCACHE: |
| | case capi.SQLITE_CONFIG_PCACHE_HDRSZ: |
| | case capi.SQLITE_CONFIG_PMASZ: |
| | case capi.SQLITE_CONFIG_SERIALIZED: |
| | case capi.SQLITE_CONFIG_SINGLETHREAD: |
| | case capi.SQLITE_CONFIG_SQLLOG: |
| | case capi.SQLITE_CONFIG_WIN32_HEAPSIZE: |
| | default: |
| | |
| | |
| | |
| | |
| | return capi.SQLITE_NOTFOUND; |
| | } |
| | }; |
| | } |
| |
|
| | { |
| | const __autoExtFptr = new Set; |
| |
|
| | capi.sqlite3_auto_extension = function(fPtr){ |
| | if( fPtr instanceof Function ){ |
| | fPtr = wasm.installFunction('i(ppp)', fPtr); |
| | }else if( 1!==arguments.length || !wasm.isPtr(fPtr) ){ |
| | return capi.SQLITE_MISUSE; |
| | } |
| | const rc = wasm.exports.sqlite3_auto_extension(fPtr); |
| | if( fPtr!==arguments[0] ){ |
| | if(0===rc) __autoExtFptr.add(fPtr); |
| | else wasm.uninstallFunction(fPtr); |
| | } |
| | return rc; |
| | }; |
| |
|
| | capi.sqlite3_cancel_auto_extension = function(fPtr){ |
| | |
| | |
| | ; |
| | if(!fPtr || 1!==arguments.length || !wasm.isPtr(fPtr)) return 0; |
| | return wasm.exports.sqlite3_cancel_auto_extension(fPtr); |
| | |
| | |
| | |
| | |
| | }; |
| |
|
| | capi.sqlite3_reset_auto_extension = function(){ |
| | wasm.exports.sqlite3_reset_auto_extension(); |
| | for(const fp of __autoExtFptr) wasm.uninstallFunction(fp); |
| | __autoExtFptr.clear(); |
| | }; |
| | } |
| |
|
| | |
| | wasm.xWrap.FuncPtrAdapter.warnOnUse = true; |
| |
|
| | const StructBinder = sqlite3.StructBinder |
| | |
| | ; |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | const installMethod = function callee( |
| | tgt, name, func, applyArgcCheck = callee.installMethodArgcCheck |
| | ){ |
| | if(!(tgt instanceof StructBinder.StructType)){ |
| | toss("Usage error: target object is-not-a StructType."); |
| | }else if(!(func instanceof Function) && !wasm.isPtr(func)){ |
| | toss("Usage error: expecting a Function or WASM pointer to one."); |
| | } |
| | if(1===arguments.length){ |
| | return (n,f)=>callee(tgt, n, f, applyArgcCheck); |
| | } |
| | if(!callee.argcProxy){ |
| | callee.argcProxy = function(tgt, funcName, func,sig){ |
| | return function(...args){ |
| | if(func.length!==arguments.length){ |
| | toss("Argument mismatch for", |
| | tgt.structInfo.name+"::"+funcName |
| | +": Native signature is:",sig); |
| | } |
| | return func.apply(this, args); |
| | } |
| | }; |
| | |
| | |
| | callee.removeFuncList = function(){ |
| | if(this.ondispose.__removeFuncList){ |
| | this.ondispose.__removeFuncList.forEach( |
| | (v,ndx)=>{ |
| | if(wasm.isPtr(v)){ |
| | try{wasm.uninstallFunction(v)} |
| | catch(e){} |
| | } |
| | |
| | |
| | } |
| | ); |
| | delete this.ondispose.__removeFuncList; |
| | } |
| | }; |
| | } |
| | const sigN = tgt.memberSignature(name); |
| | if(sigN.length<2){ |
| | toss("Member",name,"does not have a function pointer signature:",sigN); |
| | } |
| | const memKey = tgt.memberKey(name); |
| | const fProxy = (applyArgcCheck && !wasm.isPtr(func)) |
| | |
| | |
| | |
| | |
| | ? callee.argcProxy(tgt, memKey, func, sigN) |
| | : func; |
| | if(wasm.isPtr(fProxy)){ |
| | if(fProxy && !wasm.functionEntry(fProxy)){ |
| | toss("Pointer",fProxy,"is not a WASM function table entry."); |
| | } |
| | tgt[memKey] = fProxy; |
| | }else{ |
| | const pFunc = wasm.installFunction(fProxy, sigN); |
| | tgt[memKey] = pFunc; |
| | if(!tgt.ondispose || !tgt.ondispose.__removeFuncList){ |
| | tgt.addOnDispose('ondispose.__removeFuncList handler', |
| | callee.removeFuncList); |
| | tgt.ondispose.__removeFuncList = []; |
| | } |
| | tgt.ondispose.__removeFuncList.push(memKey, pFunc); |
| | } |
| | return (n,f)=>callee(tgt, n, f, applyArgcCheck); |
| | }; |
| | installMethod.installMethodArgcCheck = false; |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | const installMethods = function( |
| | structInstance, methods, applyArgcCheck = installMethod.installMethodArgcCheck |
| | ){ |
| | const seen = new Map ; |
| | for(const k of Object.keys(methods)){ |
| | const m = methods[k]; |
| | const prior = seen.get(m); |
| | if(prior){ |
| | const mkey = structInstance.memberKey(k); |
| | structInstance[mkey] = structInstance[structInstance.memberKey(prior)]; |
| | }else{ |
| | installMethod(structInstance, k, m, applyArgcCheck); |
| | seen.set(m, k); |
| | } |
| | } |
| | return structInstance; |
| | }; |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | StructBinder.StructType.prototype.installMethod = function callee( |
| | name, func, applyArgcCheck = installMethod.installMethodArgcCheck |
| | ){ |
| | return (arguments.length < 3 && name && 'object'===typeof name) |
| | ? installMethods(this, ...arguments) |
| | : installMethod(this, ...arguments); |
| | }; |
| |
|
| | |
| | |
| | |
| | |
| | StructBinder.StructType.prototype.installMethods = function( |
| | methods, applyArgcCheck = installMethod.installMethodArgcCheck |
| | ){ |
| | return installMethods(this, methods, applyArgcCheck); |
| | }; |
| |
|
| | }); |
| |
|