@@ -753,6 +753,14 @@ bool DatabaseSync::Open() {
753753 CHECK_ERROR_OR_THROW (env ()->isolate (), this , r, SQLITE_OK, false );
754754 CHECK_EQ (foreign_keys_enabled, open_config_.get_enable_foreign_keys ());
755755
756+ int defensive_enabled;
757+ r = sqlite3_db_config (connection_,
758+ SQLITE_DBCONFIG_DEFENSIVE,
759+ static_cast <int >(open_config_.get_enable_defensive ()),
760+ &defensive_enabled);
761+ CHECK_ERROR_OR_THROW (env ()->isolate (), this , r, SQLITE_OK, false );
762+ CHECK_EQ (defensive_enabled, open_config_.get_enable_defensive ());
763+
756764 sqlite3_busy_timeout (connection_, open_config_.get_timeout ());
757765
758766 if (allow_load_extension_) {
@@ -1065,6 +1073,21 @@ void DatabaseSync::New(const FunctionCallbackInfo<Value>& args) {
10651073 allow_unknown_named_params_v.As <Boolean>()->Value ());
10661074 }
10671075 }
1076+
1077+ Local<Value> defensive_v;
1078+ if (!options->Get (env->context (), env->defensive_string ())
1079+ .ToLocal (&defensive_v)) {
1080+ return ;
1081+ }
1082+ if (!defensive_v->IsUndefined ()) {
1083+ if (!defensive_v->IsBoolean ()) {
1084+ THROW_ERR_INVALID_ARG_TYPE (
1085+ env->isolate (),
1086+ " The \" options.defensive\" argument must be a boolean." );
1087+ return ;
1088+ }
1089+ open_config.set_enable_defensive (defensive_v.As <Boolean>()->Value ());
1090+ }
10681091 }
10691092
10701093 new DatabaseSync (
@@ -1837,6 +1860,27 @@ void DatabaseSync::EnableLoadExtension(
18371860 CHECK_ERROR_OR_THROW (isolate, db, load_extension_ret, SQLITE_OK, void ());
18381861}
18391862
1863+ void DatabaseSync::EnableDefensive (
1864+ const FunctionCallbackInfo<Value>& args) {
1865+ DatabaseSync* db;
1866+ ASSIGN_OR_RETURN_UNWRAP (&db, args.This ());
1867+ Environment* env = Environment::GetCurrent (args);
1868+ THROW_AND_RETURN_ON_BAD_STATE (env, !db->IsOpen (), " database is not open" );
1869+
1870+ auto isolate = args.GetIsolate ();
1871+ if (!args[0 ]->IsBoolean ()) {
1872+ THROW_ERR_INVALID_ARG_TYPE (isolate,
1873+ " The \" active\" argument must be a boolean." );
1874+ return ;
1875+ }
1876+
1877+ const int enable = args[0 ].As <Boolean>()->Value ();
1878+ int defensive_enabled;
1879+ const int defensive_ret = sqlite3_db_config (
1880+ db->connection_ , SQLITE_DBCONFIG_DEFENSIVE, enable, &defensive_enabled);
1881+ CHECK_ERROR_OR_THROW (isolate, db, defensive_ret, SQLITE_OK, void ());
1882+ }
1883+
18401884void DatabaseSync::LoadExtension (const FunctionCallbackInfo<Value>& args) {
18411885 DatabaseSync* db;
18421886 ASSIGN_OR_RETURN_UNWRAP (&db, args.This ());
@@ -3318,6 +3362,10 @@ static void Initialize(Local<Object> target,
33183362 db_tmpl,
33193363 " enableLoadExtension" ,
33203364 DatabaseSync::EnableLoadExtension);
3365+ SetProtoMethod (isolate,
3366+ db_tmpl,
3367+ " enableDefensive" ,
3368+ DatabaseSync::EnableDefensive);
33213369 SetProtoMethod (
33223370 isolate, db_tmpl, " loadExtension" , DatabaseSync::LoadExtension);
33233371 SetProtoMethod (
0 commit comments