@@ -1182,6 +1182,36 @@ void DatabaseSync::CustomFunction(const FunctionCallbackInfo<Value>& args) {
11821182 CHECK_ERROR_OR_THROW (env->isolate (), db, r, SQLITE_OK, void ());
11831183}
11841184
1185+ void DatabaseSync::Location (const FunctionCallbackInfo<Value>& args) {
1186+ DatabaseSync* db;
1187+ ASSIGN_OR_RETURN_UNWRAP (&db, args.This ());
1188+ Environment* env = Environment::GetCurrent (args);
1189+ THROW_AND_RETURN_ON_BAD_STATE (env, !db->IsOpen (), " database is not open" );
1190+
1191+ std::string db_name = " main" ;
1192+ if (!args[0 ]->IsUndefined ()) {
1193+ if (!args[0 ]->IsString ()) {
1194+ THROW_ERR_INVALID_ARG_TYPE (env->isolate (),
1195+ " The \" dbName\" argument must be a string." );
1196+ return ;
1197+ }
1198+
1199+ db_name = Utf8Value (env->isolate (), args[0 ].As <String>()).ToString ();
1200+ }
1201+
1202+ const char * db_filename =
1203+ sqlite3_db_filename (db->connection_ , db_name.c_str ());
1204+ if (!db_filename || db_filename[0 ] == ' \0 ' ) {
1205+ args.GetReturnValue ().Set (Null (env->isolate ()));
1206+ return ;
1207+ }
1208+
1209+ Local<String> ret;
1210+ if (String::NewFromUtf8 (env->isolate (), db_filename).ToLocal (&ret)) {
1211+ args.GetReturnValue ().Set (ret);
1212+ }
1213+ }
1214+
11851215void DatabaseSync::AggregateFunction (const FunctionCallbackInfo<Value>& args) {
11861216 DatabaseSync* db;
11871217 ASSIGN_OR_RETURN_UNWRAP (&db, args.This ());
@@ -2617,6 +2647,8 @@ static void Initialize(Local<Object> target,
26172647 SetProtoMethod (isolate, db_tmpl, " prepare" , DatabaseSync::Prepare);
26182648 SetProtoMethod (isolate, db_tmpl, " exec" , DatabaseSync::Exec);
26192649 SetProtoMethod (isolate, db_tmpl, " function" , DatabaseSync::CustomFunction);
2650+ SetProtoMethodNoSideEffect (
2651+ isolate, db_tmpl, " location" , DatabaseSync::Location);
26202652 SetProtoMethod (
26212653 isolate, db_tmpl, " aggregate" , DatabaseSync::AggregateFunction);
26222654 SetProtoMethod (
0 commit comments