@@ -169,16 +169,45 @@ napi_value Database::Close(napi_env env, napi_callback_info info) {
169169 UNWRAP_DB_HANDLE ();
170170
171171 if (*dbHandle && (*dbHandle)->descriptor ) {
172- DEBUG_LOG (" %p Database::Close closing database: %s\n " , dbHandle->get (), (*dbHandle)-> descriptor ->path .c_str ());
172+ DEBUG_LOG (" %p Database::Close Closing database: \" %s\"\ n " , dbHandle->get (), (*dbHandle)->path .c_str ());
173173 DBRegistry::CloseDB (*dbHandle);
174- DEBUG_LOG (" %p Database::Close closed database\n " , dbHandle->get ());
174+ DEBUG_LOG (" %p Database::Close Closed database\n " , dbHandle->get ());
175175 } else {
176176 DEBUG_LOG (" %p Database::Close Database not opened\n " , dbHandle->get ());
177177 }
178178
179179 NAPI_RETURN_UNDEFINED ();
180180}
181181
182+ /* *
183+ * Destroys the RocksDB database.
184+ *
185+ * @example
186+ * ```typescript
187+ * const db = new NativeDatabase();
188+ * db.destroy();
189+ * ```
190+ */
191+ napi_value Database::Destroy (napi_env env, napi_callback_info info) {
192+ NAPI_METHOD_ARGV (1 );
193+ UNWRAP_DB_HANDLE ();
194+
195+ if (*dbHandle) {
196+ try {
197+ DBRegistry::DestroyDB ((*dbHandle)->path );
198+ } catch (const std::exception& e) {
199+ DEBUG_LOG (" %p Database::Destroy Error: %s\n " , dbHandle->get (), e.what ());
200+ ::napi_throw_error (env, nullptr , e.what());
201+ return nullptr ;
202+ }
203+ } else {
204+ ::napi_throw_error (env, nullptr , " Invalid database handle" );
205+ return nullptr ;
206+ }
207+
208+ NAPI_RETURN_UNDEFINED ();
209+ }
210+
182211/* *
183212 * Drops the RocksDB database column family asynchronously. If the column family
184213 * is the default, it will clear the database instead.
@@ -639,6 +668,7 @@ napi_value Database::GetDBIntProperty(napi_env env, napi_callback_info info) {
639668napi_value Database::GetSync (napi_env env, napi_callback_info info) {
640669 NAPI_METHOD_ARGV (3 );
641670 UNWRAP_DB_HANDLE_AND_OPEN ();
671+
642672 // we store this in key slice (no copying) because we are synchronously using the key
643673 rocksdb::Slice keySlice;
644674 if (!rocksdb_js::getSliceFromArg (env, argv[0 ], keySlice, (*dbHandle)->defaultKeyBufferPtr , " Key must be a buffer" )) {
@@ -906,6 +936,11 @@ napi_value Database::Open(napi_env env, napi_callback_info info) {
906936
907937 try {
908938 (*dbHandle)->open (path, dbHandleOptions);
939+
940+ // now that the database is open and the dbHandle has a reference to
941+ // the descriptor, we can attach the database instance's smart_ptr to
942+ // the descriptor so it gets cleaned up when the descriptor is closed
943+ (*dbHandle)->descriptor ->attach (*dbHandle);
909944 } catch (const std::exception& e) {
910945 DEBUG_LOG (" %p Database::Open Error: %s\n " , dbHandle->get (), e.what ());
911946 ::napi_throw_error (env, nullptr , e.what());
@@ -1156,6 +1191,7 @@ void Database::Init(napi_env env, napi_value exports) {
11561191 { " clear" , nullptr , Clear, nullptr , nullptr , nullptr , napi_default, nullptr },
11571192 { " clearSync" , nullptr , ClearSync, nullptr , nullptr , nullptr , napi_default, nullptr },
11581193 { " close" , nullptr , Close, nullptr , nullptr , nullptr , napi_default, nullptr },
1194+ { " destroy" , nullptr , Destroy, nullptr , nullptr , nullptr , napi_default, nullptr },
11591195 { " drop" , nullptr , Drop, nullptr , nullptr , nullptr , napi_default, nullptr },
11601196 { " dropSync" , nullptr , DropSync, nullptr , nullptr , nullptr , napi_default, nullptr },
11611197 { " flush" , nullptr , Flush, nullptr , nullptr , nullptr , napi_default, nullptr },
0 commit comments