@@ -925,6 +925,7 @@ void DatabaseSync::CreateTagStore(const FunctionCallbackInfo<Value>& args) {
925925 args.GetReturnValue ().Set (session->object ());
926926}
927927
928+ namespace {
928929std::optional<std::string> ValidateDatabasePath (Environment* env,
929930 Local<Value> path,
930931 const std::string& field_name) {
@@ -972,206 +973,217 @@ std::optional<std::string> ValidateDatabasePath(Environment* env,
972973 return std::nullopt ;
973974}
974975
975- void DatabaseSync::New (const FunctionCallbackInfo<Value>& args) {
976- Environment* env = Environment::GetCurrent (args);
977- if (!args.IsConstructCall ()) {
978- THROW_ERR_CONSTRUCT_CALL_REQUIRED (env);
979- return ;
976+ bool ParseCommonDatabaseOptions (Environment* env,
977+ Local<Object> options,
978+ DatabaseOpenConfiguration& open_config,
979+ bool & open,
980+ bool & allow_load_extension) {
981+ Local<String> open_string = FIXED_ONE_BYTE_STRING (env->isolate (), " open" );
982+ Local<Value> open_v;
983+ if (!options->Get (env->context (), open_string).ToLocal (&open_v)) {
984+ return false ;
980985 }
981-
982- std::optional<std::string> location =
983- ValidateDatabasePath (env, args[0 ], " path" );
984- if (!location.has_value ()) {
985- return ;
986+ if (!open_v->IsUndefined ()) {
987+ if (!open_v->IsBoolean ()) {
988+ THROW_ERR_INVALID_ARG_TYPE (
989+ env->isolate (), " The \" options.open\" argument must be a boolean." );
990+ return false ;
991+ }
992+ open = open_v.As <Boolean>()->Value ();
986993 }
987994
988- DatabaseOpenConfiguration open_config (std::move (location.value ()));
989- bool open = true ;
990- bool allow_load_extension = false ;
991- if (args.Length () > 1 ) {
992- if (!args[1 ]->IsObject ()) {
993- THROW_ERR_INVALID_ARG_TYPE (env->isolate (),
994- " The \" options\" argument must be an object." );
995- return ;
995+ Local<String> read_only_string =
996+ FIXED_ONE_BYTE_STRING (env->isolate (), " readOnly" );
997+ Local<Value> read_only_v;
998+ if (!options->Get (env->context (), read_only_string).ToLocal (&read_only_v)) {
999+ return false ;
1000+ }
1001+ if (!read_only_v->IsUndefined ()) {
1002+ if (!read_only_v->IsBoolean ()) {
1003+ THROW_ERR_INVALID_ARG_TYPE (
1004+ env->isolate (),
1005+ " The \" options.readOnly\" argument must be a boolean." );
1006+ return false ;
9961007 }
1008+ open_config.set_read_only (read_only_v.As <Boolean>()->Value ());
1009+ }
9971010
998- Local<Object> options = args[1 ].As <Object>();
999- Local<String> open_string = FIXED_ONE_BYTE_STRING (env->isolate (), " open" );
1000- Local<Value> open_v;
1001- if (!options->Get (env->context (), open_string).ToLocal (&open_v)) {
1002- return ;
1003- }
1004- if (!open_v->IsUndefined ()) {
1005- if (!open_v->IsBoolean ()) {
1006- THROW_ERR_INVALID_ARG_TYPE (
1007- env->isolate (), " The \" options.open\" argument must be a boolean." );
1008- return ;
1009- }
1010- open = open_v.As <Boolean>()->Value ();
1011+ Local<String> enable_foreign_keys_string =
1012+ FIXED_ONE_BYTE_STRING (env->isolate (), " enableForeignKeyConstraints" );
1013+ Local<Value> enable_foreign_keys_v;
1014+ if (!options->Get (env->context (), enable_foreign_keys_string)
1015+ .ToLocal (&enable_foreign_keys_v)) {
1016+ return false ;
1017+ }
1018+ if (!enable_foreign_keys_v->IsUndefined ()) {
1019+ if (!enable_foreign_keys_v->IsBoolean ()) {
1020+ THROW_ERR_INVALID_ARG_TYPE (
1021+ env->isolate (),
1022+ " The \" options.enableForeignKeyConstraints\" argument must be a "
1023+ " boolean." );
1024+ return false ;
10111025 }
1026+ open_config.set_enable_foreign_keys (
1027+ enable_foreign_keys_v.As <Boolean>()->Value ());
1028+ }
10121029
1013- Local<String> read_only_string =
1014- FIXED_ONE_BYTE_STRING (env->isolate (), " readOnly" );
1015- Local<Value> read_only_v;
1016- if (!options->Get (env->context (), read_only_string).ToLocal (&read_only_v)) {
1017- return ;
1018- }
1019- if (!read_only_v->IsUndefined ()) {
1020- if (!read_only_v->IsBoolean ()) {
1021- THROW_ERR_INVALID_ARG_TYPE (
1022- env->isolate (),
1023- " The \" options.readOnly\" argument must be a boolean." );
1024- return ;
1025- }
1026- open_config.set_read_only (read_only_v.As <Boolean>()->Value ());
1030+ Local<String> enable_dqs_string =
1031+ FIXED_ONE_BYTE_STRING (env->isolate (), " enableDoubleQuotedStringLiterals" );
1032+ Local<Value> enable_dqs_v;
1033+ if (!options->Get (env->context (), enable_dqs_string).ToLocal (&enable_dqs_v)) {
1034+ return false ;
1035+ }
1036+ if (!enable_dqs_v->IsUndefined ()) {
1037+ if (!enable_dqs_v->IsBoolean ()) {
1038+ THROW_ERR_INVALID_ARG_TYPE (
1039+ env->isolate (),
1040+ " The \" options.enableDoubleQuotedStringLiterals\" argument must be "
1041+ " a boolean." );
1042+ return false ;
10271043 }
1044+ open_config.set_enable_dqs (enable_dqs_v.As <Boolean>()->Value ());
1045+ }
10281046
1029- Local<String> enable_foreign_keys_string =
1030- FIXED_ONE_BYTE_STRING (env->isolate (), " enableForeignKeyConstraints" );
1031- Local<Value> enable_foreign_keys_v;
1032- if (!options->Get (env->context (), enable_foreign_keys_string)
1033- .ToLocal (&enable_foreign_keys_v)) {
1034- return ;
1035- }
1036- if (!enable_foreign_keys_v->IsUndefined ()) {
1037- if (!enable_foreign_keys_v->IsBoolean ()) {
1038- THROW_ERR_INVALID_ARG_TYPE (
1039- env->isolate (),
1040- " The \" options.enableForeignKeyConstraints\" argument must be a "
1041- " boolean." );
1042- return ;
1043- }
1044- open_config.set_enable_foreign_keys (
1045- enable_foreign_keys_v.As <Boolean>()->Value ());
1047+ Local<String> allow_extension_string =
1048+ FIXED_ONE_BYTE_STRING (env->isolate (), " allowExtension" );
1049+ Local<Value> allow_extension_v;
1050+ if (!options->Get (env->context (), allow_extension_string)
1051+ .ToLocal (&allow_extension_v)) {
1052+ return false ;
1053+ }
1054+
1055+ if (!allow_extension_v->IsUndefined ()) {
1056+ if (!allow_extension_v->IsBoolean ()) {
1057+ THROW_ERR_INVALID_ARG_TYPE (
1058+ env->isolate (),
1059+ " The \" options.allowExtension\" argument must be a boolean." );
1060+ return false ;
10461061 }
1062+ allow_load_extension = allow_extension_v.As <Boolean>()->Value ();
1063+ }
10471064
1048- Local<String> enable_dqs_string = FIXED_ONE_BYTE_STRING (
1049- env->isolate (), " enableDoubleQuotedStringLiterals" );
1050- Local<Value> enable_dqs_v;
1051- if (!options->Get (env->context (), enable_dqs_string)
1052- .ToLocal (&enable_dqs_v)) {
1053- return ;
1065+ Local<Value> timeout_v;
1066+ if (!options->Get (env->context (), env->timeout_string ())
1067+ .ToLocal (&timeout_v)) {
1068+ return false ;
1069+ }
1070+
1071+ if (!timeout_v->IsUndefined ()) {
1072+ if (!timeout_v->IsInt32 ()) {
1073+ THROW_ERR_INVALID_ARG_TYPE (
1074+ env->isolate (),
1075+ " The \" options.timeout\" argument must be an integer." );
1076+ return false ;
10541077 }
1055- if (!enable_dqs_v->IsUndefined ()) {
1056- if (!enable_dqs_v->IsBoolean ()) {
1078+
1079+ open_config.set_timeout (timeout_v.As <Int32>()->Value ());
1080+ }
1081+
1082+ Local<Value> read_bigints_v;
1083+ if (options->Get (env->context (), env->read_bigints_string ())
1084+ .ToLocal (&read_bigints_v)) {
1085+ if (!read_bigints_v->IsUndefined ()) {
1086+ if (!read_bigints_v->IsBoolean ()) {
10571087 THROW_ERR_INVALID_ARG_TYPE (
10581088 env->isolate (),
1059- " The \" options.enableDoubleQuotedStringLiterals\" argument must be "
1060- " a boolean." );
1061- return ;
1089+ R"( The "options.readBigInts" argument must be a boolean.)" );
1090+ return false ;
10621091 }
1063- open_config.set_enable_dqs (enable_dqs_v.As <Boolean>()->Value ());
1064- }
1065-
1066- Local<String> allow_extension_string =
1067- FIXED_ONE_BYTE_STRING (env->isolate (), " allowExtension" );
1068- Local<Value> allow_extension_v;
1069- if (!options->Get (env->context (), allow_extension_string)
1070- .ToLocal (&allow_extension_v)) {
1071- return ;
1092+ open_config.set_use_big_ints (read_bigints_v.As <Boolean>()->Value ());
10721093 }
1094+ }
10731095
1074- if (!allow_extension_v->IsUndefined ()) {
1075- if (!allow_extension_v->IsBoolean ()) {
1096+ Local<Value> return_arrays_v;
1097+ if (options->Get (env->context (), env->return_arrays_string ())
1098+ .ToLocal (&return_arrays_v)) {
1099+ if (!return_arrays_v->IsUndefined ()) {
1100+ if (!return_arrays_v->IsBoolean ()) {
10761101 THROW_ERR_INVALID_ARG_TYPE (
10771102 env->isolate (),
1078- " The \ " options.allowExtension \ " argument must be a boolean." );
1079- return ;
1103+ R"( The "options.returnArrays " argument must be a boolean.) " );
1104+ return false ;
10801105 }
1081- allow_load_extension = allow_extension_v. As <Boolean>()->Value ();
1106+ open_config. set_return_arrays (return_arrays_v. As <Boolean>()->Value () );
10821107 }
1108+ }
10831109
1084- Local<Value> timeout_v;
1085- if (!options->Get (env->context (), env->timeout_string ())
1086- .ToLocal (&timeout_v)) {
1087- return ;
1110+ Local<Value> allow_bare_named_params_v;
1111+ if (options->Get (env->context (), env->allow_bare_named_params_string ())
1112+ .ToLocal (&allow_bare_named_params_v)) {
1113+ if (!allow_bare_named_params_v->IsUndefined ()) {
1114+ if (!allow_bare_named_params_v->IsBoolean ()) {
1115+ THROW_ERR_INVALID_ARG_TYPE (env->isolate (),
1116+ R"( The "options.allowBareNamedParameters" )"
1117+ " argument must be a boolean." );
1118+ return false ;
1119+ }
1120+ open_config.set_allow_bare_named_params (
1121+ allow_bare_named_params_v.As <Boolean>()->Value ());
10881122 }
1123+ }
10891124
1090- if (!timeout_v->IsUndefined ()) {
1091- if (!timeout_v->IsInt32 ()) {
1125+ Local<Value> allow_unknown_named_params_v;
1126+ if (options->Get (env->context (), env->allow_unknown_named_params_string ())
1127+ .ToLocal (&allow_unknown_named_params_v)) {
1128+ if (!allow_unknown_named_params_v->IsUndefined ()) {
1129+ if (!allow_unknown_named_params_v->IsBoolean ()) {
10921130 THROW_ERR_INVALID_ARG_TYPE (
10931131 env->isolate (),
1094- " The \" options.timeout\" argument must be an integer." );
1095- return ;
1132+ R"( The "options.allowUnknownNamedParameters" )"
1133+ " argument must be a boolean." );
1134+ return false ;
10961135 }
1097-
1098- open_config. set_timeout (timeout_v. As <Int32 >()->Value ());
1136+ open_config. set_allow_unknown_named_params (
1137+ allow_unknown_named_params_v. As <Boolean >()->Value ());
10991138 }
1139+ }
11001140
1101- Local<Value> read_bigints_v;
1102- if (options->Get (env->context (), env->read_bigints_string ())
1103- .ToLocal (&read_bigints_v)) {
1104- if (!read_bigints_v->IsUndefined ()) {
1105- if (!read_bigints_v->IsBoolean ()) {
1106- THROW_ERR_INVALID_ARG_TYPE (
1107- env->isolate (),
1108- R"( The "options.readBigInts" argument must be a boolean.)" );
1109- return ;
1110- }
1111- open_config.set_use_big_ints (read_bigints_v.As <Boolean>()->Value ());
1112- }
1141+ Local<Value> defensive_v;
1142+ if (!options->Get (env->context (), env->defensive_string ())
1143+ .ToLocal (&defensive_v)) {
1144+ return false ;
1145+ }
1146+ if (!defensive_v->IsUndefined ()) {
1147+ if (!defensive_v->IsBoolean ()) {
1148+ THROW_ERR_INVALID_ARG_TYPE (
1149+ env->isolate (),
1150+ " The \" options.defensive\" argument must be a boolean." );
1151+ return false ;
11131152 }
1153+ open_config.set_enable_defensive (defensive_v.As <Boolean>()->Value ());
1154+ }
1155+ return true ;
1156+ }
1157+ } // namespace
11141158
1115- Local<Value> return_arrays_v;
1116- if (options->Get (env->context (), env->return_arrays_string ())
1117- .ToLocal (&return_arrays_v)) {
1118- if (!return_arrays_v->IsUndefined ()) {
1119- if (!return_arrays_v->IsBoolean ()) {
1120- THROW_ERR_INVALID_ARG_TYPE (
1121- env->isolate (),
1122- R"( The "options.returnArrays" argument must be a boolean.)" );
1123- return ;
1124- }
1125- open_config.set_return_arrays (return_arrays_v.As <Boolean>()->Value ());
1126- }
1127- }
1159+ void DatabaseSync::New (const FunctionCallbackInfo<Value>& args) {
1160+ Environment* env = Environment::GetCurrent (args);
1161+ if (!args.IsConstructCall ()) {
1162+ THROW_ERR_CONSTRUCT_CALL_REQUIRED (env);
1163+ return ;
1164+ }
11281165
1129- Local<Value> allow_bare_named_params_v;
1130- if (options->Get (env->context (), env->allow_bare_named_params_string ())
1131- .ToLocal (&allow_bare_named_params_v)) {
1132- if (!allow_bare_named_params_v->IsUndefined ()) {
1133- if (!allow_bare_named_params_v->IsBoolean ()) {
1134- THROW_ERR_INVALID_ARG_TYPE (
1135- env->isolate (),
1136- R"( The "options.allowBareNamedParameters" )"
1137- " argument must be a boolean." );
1138- return ;
1139- }
1140- open_config.set_allow_bare_named_params (
1141- allow_bare_named_params_v.As <Boolean>()->Value ());
1142- }
1143- }
1166+ std::optional<std::string> location =
1167+ ValidateDatabasePath (env, args[0 ], " path" );
1168+ if (!location.has_value ()) {
1169+ return ;
1170+ }
11441171
1145- Local<Value> allow_unknown_named_params_v;
1146- if (options->Get (env->context (), env->allow_unknown_named_params_string ())
1147- .ToLocal (&allow_unknown_named_params_v)) {
1148- if (!allow_unknown_named_params_v->IsUndefined ()) {
1149- if (!allow_unknown_named_params_v->IsBoolean ()) {
1150- THROW_ERR_INVALID_ARG_TYPE (
1151- env->isolate (),
1152- R"( The "options.allowUnknownNamedParameters" )"
1153- " argument must be a boolean." );
1154- return ;
1155- }
1156- open_config.set_allow_unknown_named_params (
1157- allow_unknown_named_params_v.As <Boolean>()->Value ());
1158- }
1172+ DatabaseOpenConfiguration open_config (std::move (location.value ()));
1173+ bool open = true ;
1174+ bool allow_load_extension = false ;
1175+ if (args.Length () > 1 ) {
1176+ if (!args[1 ]->IsObject ()) {
1177+ THROW_ERR_INVALID_ARG_TYPE (env->isolate (),
1178+ " The \" options\" argument must be an object." );
1179+ return ;
11591180 }
11601181
1161- Local<Value> defensive_v ;
1162- if (!options-> Get (env-> context (), env-> defensive_string ())
1163- . ToLocal (&defensive_v )) {
1182+ Local<Object> options = args[ 1 ]. As <Object>() ;
1183+ if (!ParseCommonDatabaseOptions (
1184+ env, options, open_config, open, allow_load_extension )) {
11641185 return ;
11651186 }
1166- if (!defensive_v->IsUndefined ()) {
1167- if (!defensive_v->IsBoolean ()) {
1168- THROW_ERR_INVALID_ARG_TYPE (
1169- env->isolate (),
1170- " The \" options.defensive\" argument must be a boolean." );
1171- return ;
1172- }
1173- open_config.set_enable_defensive (defensive_v.As <Boolean>()->Value ());
1174- }
11751187 }
11761188
11771189 new DatabaseSync (
0 commit comments