@@ -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,26 @@ void DatabaseSync::EnableLoadExtension(
18371860 CHECK_ERROR_OR_THROW (isolate, db, load_extension_ret, SQLITE_OK, void ());
18381861}
18391862
1863+ void DatabaseSync::EnableDefensive (const FunctionCallbackInfo<Value>& args) {
1864+ DatabaseSync* db;
1865+ ASSIGN_OR_RETURN_UNWRAP (&db, args.This ());
1866+ Environment* env = Environment::GetCurrent (args);
1867+ THROW_AND_RETURN_ON_BAD_STATE (env, !db->IsOpen (), " database is not open" );
1868+
1869+ auto isolate = args.GetIsolate ();
1870+ if (!args[0 ]->IsBoolean ()) {
1871+ THROW_ERR_INVALID_ARG_TYPE (isolate,
1872+ " The \" active\" argument must be a boolean." );
1873+ return ;
1874+ }
1875+
1876+ const int enable = args[0 ].As <Boolean>()->Value ();
1877+ int defensive_enabled;
1878+ const int defensive_ret = sqlite3_db_config (
1879+ db->connection_ , SQLITE_DBCONFIG_DEFENSIVE, enable, &defensive_enabled);
1880+ CHECK_ERROR_OR_THROW (isolate, db, defensive_ret, SQLITE_OK, void ());
1881+ }
1882+
18401883void DatabaseSync::LoadExtension (const FunctionCallbackInfo<Value>& args) {
18411884 DatabaseSync* db;
18421885 ASSIGN_OR_RETURN_UNWRAP (&db, args.This ());
@@ -3318,6 +3361,8 @@ static void Initialize(Local<Object> target,
33183361 db_tmpl,
33193362 " enableLoadExtension" ,
33203363 DatabaseSync::EnableLoadExtension);
3364+ SetProtoMethod (
3365+ isolate, db_tmpl, " enableDefensive" , DatabaseSync::EnableDefensive);
33213366 SetProtoMethod (
33223367 isolate, db_tmpl, " loadExtension" , DatabaseSync::LoadExtension);
33233368 SetProtoMethod (
0 commit comments