Skip to content

Commit 04c015f

Browse files
committed
sqlite: heap-allocate sqlite3_module per virtual table module
1 parent 7b6bae9 commit 04c015f

2 files changed

Lines changed: 22 additions & 32 deletions

File tree

src/node_sqlite.cc

Lines changed: 19 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -684,7 +684,24 @@ VirtualTableModule::VirtualTableModule(Environment* env,
684684
num_columns_(num_columns),
685685
hidden_col_indices_(std::move(hidden_col_indices)),
686686
use_bigint_args_(use_bigint_args),
687-
direct_only_(direct_only) {
687+
direct_only_(direct_only),
688+
module_def_({}) {
689+
// Initialize the sqlite3_module definition. Each VirtualTableModule instance
690+
// gets its own copy to avoid thread-safety issues with worker threads.
691+
module_def_.iVersion = 1;
692+
module_def_.xCreate = VirtualTableModule::xCreate;
693+
module_def_.xConnect = VirtualTableModule::xCreate;
694+
module_def_.xBestIndex = VirtualTableModule::xBestIndex;
695+
module_def_.xDisconnect = VirtualTableModule::xDisconnect;
696+
module_def_.xDestroy = VirtualTableModule::xDestroy;
697+
module_def_.xOpen = VirtualTableModule::xOpen;
698+
module_def_.xClose = VirtualTableModule::xClose;
699+
module_def_.xFilter = VirtualTableModule::xFilter;
700+
module_def_.xNext = VirtualTableModule::xNext;
701+
module_def_.xEof = VirtualTableModule::xEof;
702+
module_def_.xColumn = VirtualTableModule::xColumn;
703+
module_def_.xRowid = VirtualTableModule::xRowid;
704+
688705
// Build mapping from schema column index to row array index.
689706
// Visible columns are numbered sequentially; hidden columns map to -1.
690707
col_index_map_.assign(num_columns, 0);
@@ -2146,36 +2163,6 @@ void DatabaseSync::CreateModule(const FunctionCallbackInfo<Value>& args) {
21462163

21472164
schema_sql += ")";
21482165

2149-
// Create the static module definition.
2150-
// This must be static or heap-allocated because SQLite retains a pointer.
2151-
static sqlite3_module vtab_module_def = {
2152-
1, // iVersion
2153-
VirtualTableModule::xCreate, // xCreate
2154-
VirtualTableModule::xCreate, // xConnect (same as xCreate)
2155-
VirtualTableModule::xBestIndex, // xBestIndex
2156-
VirtualTableModule::xDisconnect, // xDisconnect
2157-
VirtualTableModule::xDestroy, // xDestroy
2158-
VirtualTableModule::xOpen, // xOpen
2159-
VirtualTableModule::xClose, // xClose
2160-
VirtualTableModule::xFilter, // xFilter
2161-
VirtualTableModule::xNext, // xNext
2162-
VirtualTableModule::xEof, // xEof
2163-
VirtualTableModule::xColumn, // xColumn
2164-
VirtualTableModule::xRowid, // xRowid
2165-
nullptr, // xUpdate
2166-
nullptr, // xBegin
2167-
nullptr, // xSync
2168-
nullptr, // xCommit
2169-
nullptr, // xRollback
2170-
nullptr, // xFindFunction
2171-
nullptr, // xRename
2172-
nullptr, // xSavepoint
2173-
nullptr, // xRelease
2174-
nullptr, // xRollbackTo
2175-
nullptr, // xShadowName
2176-
nullptr, // xIntegrity
2177-
};
2178-
21792166
VirtualTableModule* vtab_mod =
21802167
new VirtualTableModule(env,
21812168
db,
@@ -2188,7 +2175,7 @@ void DatabaseSync::CreateModule(const FunctionCallbackInfo<Value>& args) {
21882175

21892176
int r = sqlite3_create_module_v2(db->connection_,
21902177
*name,
2191-
&vtab_module_def,
2178+
&vtab_mod->module_def_,
21922179
vtab_mod,
21932180
VirtualTableModule::xDestroyModule);
21942181
CHECK_ERROR_OR_THROW(env->isolate(), db, r, SQLITE_OK, void());

src/node_sqlite.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -415,6 +415,9 @@ class VirtualTableModule {
415415
std::vector<int> col_index_map_;
416416
bool use_bigint_args_;
417417
bool direct_only_;
418+
sqlite3_module module_def_;
419+
420+
friend class DatabaseSync;
418421
};
419422

420423
} // namespace sqlite

0 commit comments

Comments
 (0)