Skip to content

Commit 7acd4eb

Browse files
committed
src: cleanup sqlite async api
1 parent 081d7c5 commit 7acd4eb

File tree

2 files changed

+59
-94
lines changed

2 files changed

+59
-94
lines changed

src/node_sqlite.cc

Lines changed: 59 additions & 92 deletions
Original file line numberDiff line numberDiff line change
@@ -1129,6 +1129,21 @@ inline void DatabaseNew(const FunctionCallbackInfo<Value>& args,
11291129
allow_unknown_named_params_v.As<Boolean>()->Value());
11301130
}
11311131
}
1132+
1133+
Local<Value> defensive_v;
1134+
if (!options->Get(env->context(), env->defensive_string())
1135+
.ToLocal(&defensive_v)) {
1136+
return;
1137+
}
1138+
if (!defensive_v->IsUndefined()) {
1139+
if (!defensive_v->IsBoolean()) {
1140+
THROW_ERR_INVALID_ARG_TYPE(
1141+
env->isolate(),
1142+
"The \"options.defensive\" argument must be a boolean.");
1143+
return;
1144+
}
1145+
open_config.set_enable_defensive(defensive_v.As<Boolean>()->Value());
1146+
}
11321147
}
11331148

11341149
open_config.set_async(async);
@@ -2576,8 +2591,10 @@ MaybeLocal<Promise::Resolver> StatementAsyncExecutionHelper::All(
25762591
}
25772592
}
25782593

2579-
resolver->Resolve(env->context(),
2580-
Array::New(isolate, js_rows.data(), js_rows.size()));
2594+
resolver
2595+
->Resolve(env->context(),
2596+
Array::New(isolate, js_rows.data(), js_rows.size()))
2597+
.FromJust();
25812598
};
25822599

25832600
Local<Promise::Resolver> resolver =
@@ -2647,7 +2664,6 @@ MaybeLocal<Promise::Resolver> StatementAsyncExecutionHelper::Get(
26472664

26482665
MaybeLocal<Promise::Resolver> StatementAsyncExecutionHelper::Run(
26492666
Environment* env, Statement* stmt) {
2650-
Isolate* isolate = env->isolate();
26512667
Database* db = stmt->db_.get();
26522668
sqlite3* conn = db->Connection();
26532669
auto task =
@@ -3379,61 +3395,16 @@ void SQLTagStore::MemoryInfo(MemoryTracker* tracker) const {
33793395
tracker->TrackFieldWithSize("sql_tags_cache", cache_content_size);
33803396
}
33813397

3382-
// TODO(geeksilva97): move this to a common location if other classes need it
3383-
inline Local<FunctionTemplate> GetStatementConstructorTemplate(
3384-
Isolate* isolate) {
3385-
Local<FunctionTemplate> tmpl =
3386-
NewFunctionTemplate(isolate, IllegalConstructor);
3387-
tmpl->InstanceTemplate()->SetInternalFieldCount(
3388-
Statement::kInternalFieldCount);
3389-
SetProtoMethod(isolate, tmpl, "iterate", Statement::Iterate);
3390-
SetProtoMethod(isolate, tmpl, "all", Statement::All);
3391-
SetProtoMethod(isolate, tmpl, "get", Statement::Get);
3392-
SetProtoMethod(isolate, tmpl, "run", Statement::Run);
3393-
SetProtoMethodNoSideEffect(isolate, tmpl, "columns", Statement::Columns);
3394-
SetSideEffectFreeGetter(isolate,
3395-
tmpl,
3396-
FIXED_ONE_BYTE_STRING(isolate, "sourceSQL"),
3397-
Statement::SourceSQLGetter);
3398-
SetSideEffectFreeGetter(isolate,
3399-
tmpl,
3400-
FIXED_ONE_BYTE_STRING(isolate, "expandedSQL"),
3401-
Statement::ExpandedSQLGetter);
3402-
SetProtoMethod(isolate,
3403-
tmpl,
3404-
"setAllowBareNamedParameters",
3405-
Statement::SetAllowBareNamedParameters);
3406-
SetProtoMethod(isolate,
3407-
tmpl,
3408-
"setAllowUnknownNamedParameters",
3409-
Statement::SetAllowUnknownNamedParameters);
3410-
SetProtoMethod(isolate, tmpl, "setReadBigInts", Statement::SetReadBigInts);
3411-
SetProtoMethod(isolate, tmpl, "setReturnArrays", Statement::SetReturnArrays);
3412-
3413-
return tmpl;
3414-
}
3415-
3416-
Local<FunctionTemplate> Statement::GetConstructorTemplate(
3417-
Environment* env, std::string_view name = "Statement") {
3418-
Isolate* isolate = env->isolate();
3419-
Local<FunctionTemplate> tmpl = GetStatementConstructorTemplate(isolate);
3420-
Local<String> class_name;
3421-
if (!String::NewFromUtf8(isolate, name.data()).ToLocal(&class_name)) {
3422-
return Local<FunctionTemplate>();
3423-
}
3424-
3425-
tmpl->SetClassName(class_name);
3426-
return tmpl;
3427-
}
3428-
34293398
BaseObjectPtr<Statement> Statement::Create(Environment* env,
34303399
BaseObjectPtr<Database> db,
34313400
sqlite3_stmt* stmt) {
3401+
Local<FunctionTemplate> tmpl =
3402+
env->sqlite_statement_async_constructor_template();
3403+
if (!db->is_async()) {
3404+
tmpl = env->sqlite_statement_sync_constructor_template();
3405+
}
34323406
Local<Object> obj;
3433-
if (!GetConstructorTemplate(env)
3434-
->InstanceTemplate()
3435-
->NewInstance(env->context())
3436-
.ToLocal(&obj)) {
3407+
if (!tmpl->InstanceTemplate()->NewInstance(env->context()).ToLocal(&obj)) {
34373408
return nullptr;
34383409
}
34393410

@@ -3783,18 +3754,32 @@ inline void DefineStatementFunctionTemplates(Environment* env) {
37833754
}
37843755
}
37853756

3786-
inline void DefineAsyncInterface(Isolate* isolate,
3787-
Local<Object> target,
3788-
Local<Context> context) {
3789-
Local<FunctionTemplate> db_async_tmpl =
3790-
NewFunctionTemplate(isolate, Database::NewAsync);
3791-
db_async_tmpl->InstanceTemplate()->SetInternalFieldCount(
3792-
Database::kInternalFieldCount);
3793-
3794-
SetProtoMethod(isolate, db_async_tmpl, "close", Database::Close);
3795-
SetProtoMethod(isolate, db_async_tmpl, "prepare", Database::Prepare);
3796-
SetProtoMethod(isolate, db_async_tmpl, "exec", Database::Exec);
3797-
SetConstructorFunction(context, target, "Database", db_async_tmpl);
3757+
inline void DefineDatabaseMethods(Isolate* isolate,
3758+
Local<FunctionTemplate> tmpl) {
3759+
SetProtoMethod(isolate, tmpl, "open", Database::Open);
3760+
SetProtoMethod(isolate, tmpl, "close", Database::Close);
3761+
SetProtoDispose(isolate, tmpl, Database::Dispose);
3762+
SetProtoMethod(isolate, tmpl, "prepare", Database::Prepare);
3763+
SetProtoMethod(isolate, tmpl, "exec", Database::Exec);
3764+
SetProtoMethod(isolate, tmpl, "function", Database::CustomFunction);
3765+
SetProtoMethod(isolate, tmpl, "createTagStore", Database::CreateTagStore);
3766+
SetProtoMethodNoSideEffect(isolate, tmpl, "location", Database::Location);
3767+
SetProtoMethod(isolate, tmpl, "aggregate", Database::AggregateFunction);
3768+
SetProtoMethod(isolate, tmpl, "createSession", Database::CreateSession);
3769+
SetProtoMethod(isolate, tmpl, "applyChangeset", Database::ApplyChangeset);
3770+
SetProtoMethod(
3771+
isolate, tmpl, "enableLoadExtension", Database::EnableLoadExtension);
3772+
SetProtoMethod(isolate, tmpl, "enableDefensive", Database::EnableDefensive);
3773+
SetProtoMethod(isolate, tmpl, "loadExtension", Database::LoadExtension);
3774+
SetProtoMethod(isolate, tmpl, "setAuthorizer", Database::SetAuthorizer);
3775+
SetSideEffectFreeGetter(isolate,
3776+
tmpl,
3777+
FIXED_ONE_BYTE_STRING(isolate, "isOpen"),
3778+
Database::IsOpenGetter);
3779+
SetSideEffectFreeGetter(isolate,
3780+
tmpl,
3781+
FIXED_ONE_BYTE_STRING(isolate, "isTransaction"),
3782+
Database::IsTransactionGetter);
37983783
}
37993784

38003785
static void Initialize(Local<Object> target,
@@ -3806,37 +3791,17 @@ static void Initialize(Local<Object> target,
38063791
Local<FunctionTemplate> db_tmpl = NewFunctionTemplate(isolate, Database::New);
38073792
db_tmpl->InstanceTemplate()->SetInternalFieldCount(
38083793
Database::kInternalFieldCount);
3794+
Local<FunctionTemplate> db_async_tmpl =
3795+
NewFunctionTemplate(isolate, Database::NewAsync);
3796+
db_async_tmpl->InstanceTemplate()->SetInternalFieldCount(
3797+
Database::kInternalFieldCount);
38093798
Local<Object> constants = Object::New(isolate);
38103799

38113800
DefineConstants(constants);
3812-
DefineAsyncInterface(isolate, target, context);
38133801
DefineStatementFunctionTemplates(env);
3802+
DefineDatabaseMethods(isolate, db_tmpl);
3803+
DefineDatabaseMethods(isolate, db_async_tmpl);
38143804

3815-
SetProtoMethod(isolate, db_tmpl, "open", Database::Open);
3816-
SetProtoMethod(isolate, db_tmpl, "close", Database::Close);
3817-
SetProtoDispose(isolate, db_tmpl, Database::Dispose);
3818-
SetProtoMethod(isolate, db_tmpl, "prepare", Database::Prepare);
3819-
SetProtoMethod(isolate, db_tmpl, "exec", Database::Exec);
3820-
SetProtoMethod(isolate, db_tmpl, "function", Database::CustomFunction);
3821-
SetProtoMethod(isolate, db_tmpl, "createTagStore", Database::CreateTagStore);
3822-
SetProtoMethodNoSideEffect(isolate, db_tmpl, "location", Database::Location);
3823-
SetProtoMethod(isolate, db_tmpl, "aggregate", Database::AggregateFunction);
3824-
SetProtoMethod(isolate, db_tmpl, "createSession", Database::CreateSession);
3825-
SetProtoMethod(isolate, db_tmpl, "applyChangeset", Database::ApplyChangeset);
3826-
SetProtoMethod(
3827-
isolate, db_tmpl, "enableLoadExtension", Database::EnableLoadExtension);
3828-
SetProtoMethod(
3829-
isolate, db_tmpl, "enableDefensive", Database::EnableDefensive);
3830-
SetProtoMethod(isolate, db_tmpl, "loadExtension", Database::LoadExtension);
3831-
SetProtoMethod(isolate, db_tmpl, "setAuthorizer", Database::SetAuthorizer);
3832-
SetSideEffectFreeGetter(isolate,
3833-
db_tmpl,
3834-
FIXED_ONE_BYTE_STRING(isolate, "isOpen"),
3835-
Database::IsOpenGetter);
3836-
SetSideEffectFreeGetter(isolate,
3837-
db_tmpl,
3838-
FIXED_ONE_BYTE_STRING(isolate, "isTransaction"),
3839-
Database::IsTransactionGetter);
38403805
Local<String> sqlite_type_key = FIXED_ONE_BYTE_STRING(isolate, "sqlite-type");
38413806
Local<v8::Symbol> sqlite_type_symbol =
38423807
v8::Symbol::For(isolate, sqlite_type_key);
@@ -3849,6 +3814,8 @@ static void Initialize(Local<Object> target,
38493814
target,
38503815
"StatementSync",
38513816
env->sqlite_statement_sync_constructor_template());
3817+
3818+
SetConstructorFunction(context, target, "Database", db_async_tmpl);
38523819
SetConstructorFunction(context,
38533820
target,
38543821
"Statement",

src/node_sqlite.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -247,8 +247,6 @@ class Statement : public BaseObject {
247247
BaseObjectPtr<Database> db,
248248
sqlite3_stmt* stmt);
249249
void MemoryInfo(MemoryTracker* tracker) const override;
250-
static v8::Local<v8::FunctionTemplate> GetConstructorTemplate(
251-
Environment* env, std::string_view class_name);
252250
static BaseObjectPtr<Statement> Create(Environment* env,
253251
BaseObjectPtr<Database> db,
254252
sqlite3_stmt* stmt);

0 commit comments

Comments
 (0)