@@ -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 (
@@ -1835,6 +1858,26 @@ void DatabaseSync::EnableLoadExtension(
18351858 CHECK_ERROR_OR_THROW (isolate, db, load_extension_ret, SQLITE_OK, void ());
18361859}
18371860
1861+ void DatabaseSync::EnableDefensive (const FunctionCallbackInfo<Value>& args) {
1862+ DatabaseSync* db;
1863+ ASSIGN_OR_RETURN_UNWRAP (&db, args.This ());
1864+ Environment* env = Environment::GetCurrent (args);
1865+ THROW_AND_RETURN_ON_BAD_STATE (env, !db->IsOpen (), " database is not open" );
1866+
1867+ auto isolate = args.GetIsolate ();
1868+ if (!args[0 ]->IsBoolean ()) {
1869+ THROW_ERR_INVALID_ARG_TYPE (isolate,
1870+ " The \" active\" argument must be a boolean." );
1871+ return ;
1872+ }
1873+
1874+ const int enable = args[0 ].As <Boolean>()->Value ();
1875+ int defensive_enabled;
1876+ const int defensive_ret = sqlite3_db_config (
1877+ db->connection_ , SQLITE_DBCONFIG_DEFENSIVE, enable, &defensive_enabled);
1878+ CHECK_ERROR_OR_THROW (isolate, db, defensive_ret, SQLITE_OK, void ());
1879+ }
1880+
18381881void DatabaseSync::LoadExtension (const FunctionCallbackInfo<Value>& args) {
18391882 DatabaseSync* db;
18401883 ASSIGN_OR_RETURN_UNWRAP (&db, args.This ());
@@ -3316,6 +3359,8 @@ static void Initialize(Local<Object> target,
33163359 db_tmpl,
33173360 " enableLoadExtension" ,
33183361 DatabaseSync::EnableLoadExtension);
3362+ SetProtoMethod (
3363+ isolate, db_tmpl, " enableDefensive" , DatabaseSync::EnableDefensive);
33193364 SetProtoMethod (
33203365 isolate, db_tmpl, " loadExtension" , DatabaseSync::LoadExtension);
33213366 SetProtoMethod (
0 commit comments