Skip to content

Commit e488536

Browse files
committed
sqlite: reuse DatabaseSync template across environments
Cache the template so a shared IsolateData can load the binding twice. Signed-off-by: Guilherme Araújo <arauujogui@gmail.com>
1 parent 66f69bb commit e488536

1 file changed

Lines changed: 53 additions & 42 deletions

File tree

‎src/node_sqlite.cc‎

Lines changed: 53 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -5383,52 +5383,63 @@ static void Initialize(Local<Object> target,
53835383
}
53845384
});
53855385
}
5386-
Local<FunctionTemplate> db_tmpl = NewFunctionTemplate(isolate, Database::New);
5387-
db_tmpl->InstanceTemplate()->SetInternalFieldCount(
5388-
Database::kInternalFieldCount);
53895386
Local<Object> constants = Object::New(isolate);
53905387

53915388
DefineConstants(constants);
53925389

5393-
SetProtoMethod(isolate, db_tmpl, "open", Database::Open);
5394-
SetProtoMethod(isolate, db_tmpl, "close", Database::Close);
5395-
SetProtoDispose(isolate, db_tmpl, Database::Dispose);
5396-
SetProtoMethod(isolate, db_tmpl, "prepare", Database::Prepare);
5397-
SetProtoMethod(isolate, db_tmpl, "exec", Database::Exec);
5398-
SetProtoMethod(isolate, db_tmpl, "function", Database::CustomFunction);
5399-
SetProtoMethod(isolate, db_tmpl, "createTagStore", Database::CreateTagStore);
5400-
SetProtoMethodNoSideEffect(isolate, db_tmpl, "location", Database::Location);
5401-
SetProtoMethod(isolate, db_tmpl, "aggregate", Database::AggregateFunction);
5402-
SetProtoMethod(isolate, db_tmpl, "createSession", Database::CreateSession);
5403-
SetProtoMethod(isolate, db_tmpl, "applyChangeset", Database::ApplyChangeset);
5404-
SetProtoMethod(
5405-
isolate, db_tmpl, "enableLoadExtension", Database::EnableLoadExtension);
5406-
SetProtoMethod(
5407-
isolate, db_tmpl, "enableDefensive", Database::EnableDefensive);
5408-
SetProtoMethod(isolate, db_tmpl, "loadExtension", Database::LoadExtension);
5409-
SetProtoMethod(isolate, db_tmpl, "serialize", Database::Serialize);
5410-
SetProtoMethod(isolate, db_tmpl, "deserialize", Database::Deserialize);
5411-
SetProtoMethod(isolate, db_tmpl, "setAuthorizer", Database::SetAuthorizer);
5412-
SetProtoMethod(isolate, db_tmpl, "createModule", Database::CreateModule);
5413-
SetSideEffectFreeGetter(isolate,
5414-
db_tmpl,
5415-
FIXED_ONE_BYTE_STRING(isolate, "isOpen"),
5416-
Database::IsOpenGetter);
5417-
SetSideEffectFreeGetter(isolate,
5418-
db_tmpl,
5419-
FIXED_ONE_BYTE_STRING(isolate, "isTransaction"),
5420-
Database::IsTransactionGetter);
5421-
SetSideEffectFreeGetter(
5422-
isolate, db_tmpl, env->limits_string(), Database::LimitsGetter);
5423-
Local<String> sqlite_type_key = FIXED_ONE_BYTE_STRING(isolate, "sqlite-type");
5424-
Local<v8::Symbol> sqlite_type_symbol =
5425-
v8::Symbol::For(isolate, sqlite_type_key);
5426-
Local<String> database_sync_string =
5427-
FIXED_ONE_BYTE_STRING(isolate, "node:sqlite");
5428-
db_tmpl->InstanceTemplate()->Set(sqlite_type_symbol, database_sync_string);
5429-
5430-
env->set_sqlite_database_constructor_template(db_tmpl);
5431-
SetConstructorFunction(context, target, "Database", db_tmpl);
5390+
Local<FunctionTemplate> db_tmpl = env->sqlite_database_constructor_template();
5391+
if (db_tmpl.IsEmpty()) {
5392+
db_tmpl = NewFunctionTemplate(isolate, Database::New);
5393+
db_tmpl->SetClassName(FIXED_ONE_BYTE_STRING(isolate, "Database"));
5394+
db_tmpl->InstanceTemplate()->SetInternalFieldCount(
5395+
Database::kInternalFieldCount);
5396+
SetProtoMethod(isolate, db_tmpl, "open", Database::Open);
5397+
SetProtoMethod(isolate, db_tmpl, "close", Database::Close);
5398+
SetProtoDispose(isolate, db_tmpl, Database::Dispose);
5399+
SetProtoMethod(isolate, db_tmpl, "prepare", Database::Prepare);
5400+
SetProtoMethod(isolate, db_tmpl, "exec", Database::Exec);
5401+
SetProtoMethod(isolate, db_tmpl, "function", Database::CustomFunction);
5402+
SetProtoMethod(
5403+
isolate, db_tmpl, "createTagStore", Database::CreateTagStore);
5404+
SetProtoMethodNoSideEffect(
5405+
isolate, db_tmpl, "location", Database::Location);
5406+
SetProtoMethod(isolate, db_tmpl, "aggregate", Database::AggregateFunction);
5407+
SetProtoMethod(isolate, db_tmpl, "createSession", Database::CreateSession);
5408+
SetProtoMethod(
5409+
isolate, db_tmpl, "applyChangeset", Database::ApplyChangeset);
5410+
SetProtoMethod(
5411+
isolate, db_tmpl, "enableLoadExtension", Database::EnableLoadExtension);
5412+
SetProtoMethod(
5413+
isolate, db_tmpl, "enableDefensive", Database::EnableDefensive);
5414+
SetProtoMethod(isolate, db_tmpl, "loadExtension", Database::LoadExtension);
5415+
SetProtoMethod(isolate, db_tmpl, "serialize", Database::Serialize);
5416+
SetProtoMethod(isolate, db_tmpl, "deserialize", Database::Deserialize);
5417+
SetProtoMethod(isolate, db_tmpl, "setAuthorizer", Database::SetAuthorizer);
5418+
SetProtoMethod(isolate, db_tmpl, "createModule", Database::CreateModule);
5419+
SetSideEffectFreeGetter(isolate,
5420+
db_tmpl,
5421+
FIXED_ONE_BYTE_STRING(isolate, "isOpen"),
5422+
Database::IsOpenGetter);
5423+
SetSideEffectFreeGetter(isolate,
5424+
db_tmpl,
5425+
FIXED_ONE_BYTE_STRING(isolate, "isTransaction"),
5426+
Database::IsTransactionGetter);
5427+
SetSideEffectFreeGetter(
5428+
isolate, db_tmpl, env->limits_string(), Database::LimitsGetter);
5429+
Local<String> sqlite_type_key =
5430+
FIXED_ONE_BYTE_STRING(isolate, "sqlite-type");
5431+
Local<v8::Symbol> sqlite_type_symbol =
5432+
v8::Symbol::For(isolate, sqlite_type_key);
5433+
Local<String> database_sync_string =
5434+
FIXED_ONE_BYTE_STRING(isolate, "node:sqlite");
5435+
db_tmpl->InstanceTemplate()->Set(sqlite_type_symbol, database_sync_string);
5436+
env->set_sqlite_database_constructor_template(db_tmpl);
5437+
}
5438+
SetConstructorFunction(context,
5439+
target,
5440+
"Database",
5441+
db_tmpl,
5442+
SetConstructorFunctionFlag::NONE);
54325443
SetConstructorFunction(context,
54335444
target,
54345445
"Statement",

0 commit comments

Comments
 (0)