Skip to content

Commit 2e66b8c

Browse files
sqlite: extract DatabaseSync tmpl into separate function
The `node:sqlite` module `Initialize` would get quite large if both of the async and sync database templates were embedded. Therefore move the template creation into a seperate function. I've avoided the `GetConstructorTemplate` pattern, because it seems to imply exposing the template via `PER_ISOLATE_TEMPLATE_PROPERTIES` which is unnecessary in our case.
1 parent f8d5bad commit 2e66b8c

1 file changed

Lines changed: 72 additions & 69 deletions

File tree

src/node_sqlite.cc

Lines changed: 72 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,23 @@ using v8::Value;
130130
} while (0)
131131

132132
namespace {
133+
134+
inline void SetSideEffectFreeGetter(Isolate* isolate,
135+
Local<FunctionTemplate> class_template,
136+
Local<String> name,
137+
FunctionCallback fn) {
138+
Local<FunctionTemplate> getter =
139+
FunctionTemplate::New(isolate,
140+
fn,
141+
Local<Value>(),
142+
v8::Signature::New(isolate, class_template),
143+
/* length */ 0,
144+
ConstructorBehavior::kThrow,
145+
SideEffectType::kHasNoSideEffect);
146+
class_template->InstanceTemplate()->SetAccessorProperty(
147+
name, getter, Local<FunctionTemplate>(), DontDelete);
148+
}
149+
133150
Local<DictionaryTemplate> getLazyIterTemplate(Environment* env) {
134151
auto iter_template = env->iter_template();
135152
if (iter_template.IsEmpty()) {
@@ -238,8 +255,6 @@ void JSValueToSQLiteResult(Isolate* isolate,
238255
}
239256
}
240257

241-
class DatabaseSync;
242-
243258
inline void THROW_ERR_SQLITE_ERROR(Isolate* isolate, DatabaseSync* db) {
244259
if (db->ShouldIgnoreSQLiteError()) {
245260
db->SetIgnoreNextSQLiteError(false);
@@ -906,6 +921,56 @@ void DatabaseSync::MemoryInfo(MemoryTracker* tracker) const {
906921
"open_config", sizeof(open_config_), "DatabaseOpenConfiguration");
907922
}
908923

924+
namespace {
925+
v8::Local<v8::FunctionTemplate> CreateDatabaseSyncConstructorTemplate(
926+
Environment* env) {
927+
Isolate* isolate = env->isolate();
928+
929+
Local<FunctionTemplate> tmpl =
930+
NewFunctionTemplate(isolate, DatabaseSync::New);
931+
tmpl->InstanceTemplate()->SetInternalFieldCount(
932+
DatabaseSync::kInternalFieldCount);
933+
934+
SetProtoMethod(isolate, tmpl, "open", DatabaseSync::Open);
935+
SetProtoMethod(isolate, tmpl, "close", DatabaseSync::Close);
936+
SetProtoDispose(isolate, tmpl, DatabaseSync::Dispose);
937+
SetProtoMethod(isolate, tmpl, "prepare", DatabaseSync::Prepare);
938+
SetProtoMethod(isolate, tmpl, "exec", DatabaseSync::Exec);
939+
SetProtoMethod(isolate, tmpl, "function", DatabaseSync::CustomFunction);
940+
SetProtoMethod(isolate, tmpl, "createTagStore", DatabaseSync::CreateTagStore);
941+
SetProtoMethodNoSideEffect(isolate, tmpl, "location", DatabaseSync::Location);
942+
SetProtoMethod(isolate, tmpl, "aggregate", DatabaseSync::AggregateFunction);
943+
SetProtoMethod(isolate, tmpl, "createSession", DatabaseSync::CreateSession);
944+
SetProtoMethod(isolate, tmpl, "applyChangeset", DatabaseSync::ApplyChangeset);
945+
SetProtoMethod(
946+
isolate, tmpl, "enableLoadExtension", DatabaseSync::EnableLoadExtension);
947+
SetProtoMethod(
948+
isolate, tmpl, "enableDefensive", DatabaseSync::EnableDefensive);
949+
SetProtoMethod(isolate, tmpl, "loadExtension", DatabaseSync::LoadExtension);
950+
SetProtoMethod(isolate, tmpl, "setAuthorizer", DatabaseSync::SetAuthorizer);
951+
SetSideEffectFreeGetter(isolate,
952+
tmpl,
953+
FIXED_ONE_BYTE_STRING(isolate, "isOpen"),
954+
DatabaseSync::IsOpenGetter);
955+
SetSideEffectFreeGetter(isolate,
956+
tmpl,
957+
FIXED_ONE_BYTE_STRING(isolate, "isTransaction"),
958+
DatabaseSync::IsTransactionGetter);
959+
SetSideEffectFreeGetter(isolate,
960+
tmpl,
961+
FIXED_ONE_BYTE_STRING(isolate, "limits"),
962+
DatabaseSync::LimitsGetter);
963+
Local<String> sqlite_type_key = FIXED_ONE_BYTE_STRING(isolate, "sqlite-type");
964+
Local<v8::Symbol> sqlite_type_symbol =
965+
v8::Symbol::For(isolate, sqlite_type_key);
966+
Local<String> database_sync_string =
967+
FIXED_ONE_BYTE_STRING(isolate, "node:sqlite");
968+
tmpl->InstanceTemplate()->Set(sqlite_type_symbol, database_sync_string);
969+
970+
return tmpl;
971+
}
972+
} // namespace
973+
909974
bool DatabaseSync::Open() {
910975
if (IsOpen()) {
911976
THROW_ERR_INVALID_STATE(env(), "database is already open");
@@ -3060,23 +3125,6 @@ SQLTagStore::SQLTagStore(Environment* env,
30603125
MakeWeak();
30613126
}
30623127

3063-
static inline void SetSideEffectFreeGetter(
3064-
Isolate* isolate,
3065-
Local<FunctionTemplate> class_template,
3066-
Local<String> name,
3067-
FunctionCallback fn) {
3068-
Local<FunctionTemplate> getter =
3069-
FunctionTemplate::New(isolate,
3070-
fn,
3071-
Local<Value>(),
3072-
v8::Signature::New(isolate, class_template),
3073-
/* length */ 0,
3074-
ConstructorBehavior::kThrow,
3075-
SideEffectType::kHasNoSideEffect);
3076-
class_template->InstanceTemplate()->SetAccessorProperty(
3077-
name, getter, Local<FunctionTemplate>(), DontDelete);
3078-
}
3079-
30803128
SQLTagStore::~SQLTagStore() {}
30813129

30823130
Local<FunctionTemplate> SQLTagStore::GetConstructorTemplate(Environment* env) {
@@ -3722,60 +3770,15 @@ static void Initialize(Local<Object> target,
37223770
void* priv) {
37233771
Environment* env = Environment::GetCurrent(context);
37243772
Isolate* isolate = env->isolate();
3725-
Local<FunctionTemplate> db_tmpl =
3726-
NewFunctionTemplate(isolate, DatabaseSync::New);
3727-
db_tmpl->InstanceTemplate()->SetInternalFieldCount(
3728-
DatabaseSync::kInternalFieldCount);
3773+
37293774
Local<Object> constants = Object::New(isolate);
37303775

37313776
DefineConstants(constants);
37323777

3733-
SetProtoMethod(isolate, db_tmpl, "open", DatabaseSync::Open);
3734-
SetProtoMethod(isolate, db_tmpl, "close", DatabaseSync::Close);
3735-
SetProtoDispose(isolate, db_tmpl, DatabaseSync::Dispose);
3736-
SetProtoMethod(isolate, db_tmpl, "prepare", DatabaseSync::Prepare);
3737-
SetProtoMethod(isolate, db_tmpl, "exec", DatabaseSync::Exec);
3738-
SetProtoMethod(isolate, db_tmpl, "function", DatabaseSync::CustomFunction);
3739-
SetProtoMethod(
3740-
isolate, db_tmpl, "createTagStore", DatabaseSync::CreateTagStore);
3741-
SetProtoMethodNoSideEffect(
3742-
isolate, db_tmpl, "location", DatabaseSync::Location);
3743-
SetProtoMethod(
3744-
isolate, db_tmpl, "aggregate", DatabaseSync::AggregateFunction);
3745-
SetProtoMethod(
3746-
isolate, db_tmpl, "createSession", DatabaseSync::CreateSession);
3747-
SetProtoMethod(
3748-
isolate, db_tmpl, "applyChangeset", DatabaseSync::ApplyChangeset);
3749-
SetProtoMethod(isolate,
3750-
db_tmpl,
3751-
"enableLoadExtension",
3752-
DatabaseSync::EnableLoadExtension);
3753-
SetProtoMethod(
3754-
isolate, db_tmpl, "enableDefensive", DatabaseSync::EnableDefensive);
3755-
SetProtoMethod(
3756-
isolate, db_tmpl, "loadExtension", DatabaseSync::LoadExtension);
3757-
SetProtoMethod(
3758-
isolate, db_tmpl, "setAuthorizer", DatabaseSync::SetAuthorizer);
3759-
SetSideEffectFreeGetter(isolate,
3760-
db_tmpl,
3761-
FIXED_ONE_BYTE_STRING(isolate, "isOpen"),
3762-
DatabaseSync::IsOpenGetter);
3763-
SetSideEffectFreeGetter(isolate,
3764-
db_tmpl,
3765-
FIXED_ONE_BYTE_STRING(isolate, "isTransaction"),
3766-
DatabaseSync::IsTransactionGetter);
3767-
SetSideEffectFreeGetter(isolate,
3768-
db_tmpl,
3769-
FIXED_ONE_BYTE_STRING(isolate, "limits"),
3770-
DatabaseSync::LimitsGetter);
3771-
Local<String> sqlite_type_key = FIXED_ONE_BYTE_STRING(isolate, "sqlite-type");
3772-
Local<v8::Symbol> sqlite_type_symbol =
3773-
v8::Symbol::For(isolate, sqlite_type_key);
3774-
Local<String> database_sync_string =
3775-
FIXED_ONE_BYTE_STRING(isolate, "node:sqlite");
3776-
db_tmpl->InstanceTemplate()->Set(sqlite_type_symbol, database_sync_string);
3777-
3778-
SetConstructorFunction(context, target, "DatabaseSync", db_tmpl);
3778+
SetConstructorFunction(context,
3779+
target,
3780+
"DatabaseSync",
3781+
CreateDatabaseSyncConstructorTemplate(env));
37793782
SetConstructorFunction(context,
37803783
target,
37813784
"StatementSync",

0 commit comments

Comments
 (0)