Skip to content

Commit d4d6cc2

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 38a6da5 commit d4d6cc2

1 file changed

Lines changed: 68 additions & 65 deletions

File tree

src/node_sqlite.cc

Lines changed: 68 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,23 @@ using v8::Value;
122122
} while (0)
123123

124124
namespace {
125+
126+
inline void SetSideEffectFreeGetter(Isolate* isolate,
127+
Local<FunctionTemplate> class_template,
128+
Local<String> name,
129+
FunctionCallback fn) {
130+
Local<FunctionTemplate> getter =
131+
FunctionTemplate::New(isolate,
132+
fn,
133+
Local<Value>(),
134+
v8::Signature::New(isolate, class_template),
135+
/* length */ 0,
136+
ConstructorBehavior::kThrow,
137+
SideEffectType::kHasNoSideEffect);
138+
class_template->InstanceTemplate()->SetAccessorProperty(
139+
name, getter, Local<FunctionTemplate>(), DontDelete);
140+
}
141+
125142
Local<DictionaryTemplate> getLazyIterTemplate(Environment* env) {
126143
auto iter_template = env->iter_template();
127144
if (iter_template.IsEmpty()) {
@@ -220,8 +237,6 @@ void JSValueToSQLiteResult(Isolate* isolate,
220237
}
221238
}
222239

223-
class DatabaseSync;
224-
225240
inline void THROW_ERR_SQLITE_ERROR(Isolate* isolate, DatabaseSync* db) {
226241
if (db->ShouldIgnoreSQLiteError()) {
227242
db->SetIgnoreNextSQLiteError(false);
@@ -719,6 +734,52 @@ void DatabaseSync::MemoryInfo(MemoryTracker* tracker) const {
719734
"open_config", sizeof(open_config_), "DatabaseOpenConfiguration");
720735
}
721736

737+
namespace {
738+
v8::Local<v8::FunctionTemplate> CreateDatabaseSyncConstructorTemplate(
739+
Environment* env) {
740+
Isolate* isolate = env->isolate();
741+
742+
Local<FunctionTemplate> tmpl =
743+
NewFunctionTemplate(isolate, DatabaseSync::New);
744+
tmpl->InstanceTemplate()->SetInternalFieldCount(
745+
DatabaseSync::kInternalFieldCount);
746+
747+
SetProtoMethod(isolate, tmpl, "open", DatabaseSync::Open);
748+
SetProtoMethod(isolate, tmpl, "close", DatabaseSync::Close);
749+
SetProtoDispose(isolate, tmpl, DatabaseSync::Dispose);
750+
SetProtoMethod(isolate, tmpl, "prepare", DatabaseSync::Prepare);
751+
SetProtoMethod(isolate, tmpl, "exec", DatabaseSync::Exec);
752+
SetProtoMethod(isolate, tmpl, "function", DatabaseSync::CustomFunction);
753+
SetProtoMethod(isolate, tmpl, "createTagStore", DatabaseSync::CreateTagStore);
754+
SetProtoMethodNoSideEffect(isolate, tmpl, "location", DatabaseSync::Location);
755+
SetProtoMethod(isolate, tmpl, "aggregate", DatabaseSync::AggregateFunction);
756+
SetProtoMethod(isolate, tmpl, "createSession", DatabaseSync::CreateSession);
757+
SetProtoMethod(isolate, tmpl, "applyChangeset", DatabaseSync::ApplyChangeset);
758+
SetProtoMethod(
759+
isolate, tmpl, "enableLoadExtension", DatabaseSync::EnableLoadExtension);
760+
SetProtoMethod(
761+
isolate, tmpl, "enableDefensive", DatabaseSync::EnableDefensive);
762+
SetProtoMethod(isolate, tmpl, "loadExtension", DatabaseSync::LoadExtension);
763+
SetProtoMethod(isolate, tmpl, "setAuthorizer", DatabaseSync::SetAuthorizer);
764+
SetSideEffectFreeGetter(isolate,
765+
tmpl,
766+
FIXED_ONE_BYTE_STRING(isolate, "isOpen"),
767+
DatabaseSync::IsOpenGetter);
768+
SetSideEffectFreeGetter(isolate,
769+
tmpl,
770+
FIXED_ONE_BYTE_STRING(isolate, "isTransaction"),
771+
DatabaseSync::IsTransactionGetter);
772+
Local<String> sqlite_type_key = FIXED_ONE_BYTE_STRING(isolate, "sqlite-type");
773+
Local<v8::Symbol> sqlite_type_symbol =
774+
v8::Symbol::For(isolate, sqlite_type_key);
775+
Local<String> database_sync_string =
776+
FIXED_ONE_BYTE_STRING(isolate, "node:sqlite");
777+
tmpl->InstanceTemplate()->Set(sqlite_type_symbol, database_sync_string);
778+
779+
return tmpl;
780+
}
781+
} // namespace
782+
722783
bool DatabaseSync::Open() {
723784
if (IsOpen()) {
724785
THROW_ERR_INVALID_STATE(env(), "database is already open");
@@ -2792,23 +2853,6 @@ SQLTagStore::SQLTagStore(Environment* env,
27922853
MakeWeak();
27932854
}
27942855

2795-
static inline void SetSideEffectFreeGetter(
2796-
Isolate* isolate,
2797-
Local<FunctionTemplate> class_template,
2798-
Local<String> name,
2799-
FunctionCallback fn) {
2800-
Local<FunctionTemplate> getter =
2801-
FunctionTemplate::New(isolate,
2802-
fn,
2803-
Local<Value>(),
2804-
v8::Signature::New(isolate, class_template),
2805-
/* length */ 0,
2806-
ConstructorBehavior::kThrow,
2807-
SideEffectType::kHasNoSideEffect);
2808-
class_template->InstanceTemplate()->SetAccessorProperty(
2809-
name, getter, Local<FunctionTemplate>(), DontDelete);
2810-
}
2811-
28122856
SQLTagStore::~SQLTagStore() {}
28132857

28142858
Local<FunctionTemplate> SQLTagStore::GetConstructorTemplate(Environment* env) {
@@ -3454,56 +3498,15 @@ static void Initialize(Local<Object> target,
34543498
void* priv) {
34553499
Environment* env = Environment::GetCurrent(context);
34563500
Isolate* isolate = env->isolate();
3457-
Local<FunctionTemplate> db_tmpl =
3458-
NewFunctionTemplate(isolate, DatabaseSync::New);
3459-
db_tmpl->InstanceTemplate()->SetInternalFieldCount(
3460-
DatabaseSync::kInternalFieldCount);
3501+
34613502
Local<Object> constants = Object::New(isolate);
34623503

34633504
DefineConstants(constants);
34643505

3465-
SetProtoMethod(isolate, db_tmpl, "open", DatabaseSync::Open);
3466-
SetProtoMethod(isolate, db_tmpl, "close", DatabaseSync::Close);
3467-
SetProtoDispose(isolate, db_tmpl, DatabaseSync::Dispose);
3468-
SetProtoMethod(isolate, db_tmpl, "prepare", DatabaseSync::Prepare);
3469-
SetProtoMethod(isolate, db_tmpl, "exec", DatabaseSync::Exec);
3470-
SetProtoMethod(isolate, db_tmpl, "function", DatabaseSync::CustomFunction);
3471-
SetProtoMethod(
3472-
isolate, db_tmpl, "createTagStore", DatabaseSync::CreateTagStore);
3473-
SetProtoMethodNoSideEffect(
3474-
isolate, db_tmpl, "location", DatabaseSync::Location);
3475-
SetProtoMethod(
3476-
isolate, db_tmpl, "aggregate", DatabaseSync::AggregateFunction);
3477-
SetProtoMethod(
3478-
isolate, db_tmpl, "createSession", DatabaseSync::CreateSession);
3479-
SetProtoMethod(
3480-
isolate, db_tmpl, "applyChangeset", DatabaseSync::ApplyChangeset);
3481-
SetProtoMethod(isolate,
3482-
db_tmpl,
3483-
"enableLoadExtension",
3484-
DatabaseSync::EnableLoadExtension);
3485-
SetProtoMethod(
3486-
isolate, db_tmpl, "enableDefensive", DatabaseSync::EnableDefensive);
3487-
SetProtoMethod(
3488-
isolate, db_tmpl, "loadExtension", DatabaseSync::LoadExtension);
3489-
SetProtoMethod(
3490-
isolate, db_tmpl, "setAuthorizer", DatabaseSync::SetAuthorizer);
3491-
SetSideEffectFreeGetter(isolate,
3492-
db_tmpl,
3493-
FIXED_ONE_BYTE_STRING(isolate, "isOpen"),
3494-
DatabaseSync::IsOpenGetter);
3495-
SetSideEffectFreeGetter(isolate,
3496-
db_tmpl,
3497-
FIXED_ONE_BYTE_STRING(isolate, "isTransaction"),
3498-
DatabaseSync::IsTransactionGetter);
3499-
Local<String> sqlite_type_key = FIXED_ONE_BYTE_STRING(isolate, "sqlite-type");
3500-
Local<v8::Symbol> sqlite_type_symbol =
3501-
v8::Symbol::For(isolate, sqlite_type_key);
3502-
Local<String> database_sync_string =
3503-
FIXED_ONE_BYTE_STRING(isolate, "node:sqlite");
3504-
db_tmpl->InstanceTemplate()->Set(sqlite_type_symbol, database_sync_string);
3505-
3506-
SetConstructorFunction(context, target, "DatabaseSync", db_tmpl);
3506+
SetConstructorFunction(context,
3507+
target,
3508+
"DatabaseSync",
3509+
CreateDatabaseSyncConstructorTemplate(env));
35073510
SetConstructorFunction(context,
35083511
target,
35093512
"StatementSync",

0 commit comments

Comments
 (0)