@@ -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
26482665MaybeLocal<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-
34293398BaseObjectPtr<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
38003785static 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" ,
0 commit comments