From 227734d286aa570ba72d5e6633e4cbb03ad0bed9 Mon Sep 17 00:00:00 2001 From: William Casarin Date: Wed, 10 Jan 2024 13:19:36 -0800 Subject: [PATCH] Revert "Revert "nostrdb: close database when backgrounded"" This reverts commit 26bd50c948a5b2efb48e767fc529fd75a68d6a60. --- damus/ContentView.swift | 11 +++++++-- nostrdb/Ndb.swift | 55 +++++++++++++++++++++++++++++++++++++---- nostrdb/NdbTxn.swift | 9 ++++++- 3 files changed, 67 insertions(+), 8 deletions(-) diff --git a/damus/ContentView.swift b/damus/ContentView.swift index 93694694..98a5f1bf 100644 --- a/damus/ContentView.swift +++ b/damus/ContentView.swift @@ -461,18 +461,25 @@ struct ContentView: View { .onReceive(handle_notify(.disconnect_relays)) { () in damus_state.pool.disconnect() } + .onReceive(NotificationCenter.default.publisher(for: UIApplication.willEnterForegroundNotification)) { obj in + print("📙 DAMUS ACTIVE NOTIFY") + try? damus_state.ndb.reopen() + } .onChange(of: scenePhase) { (phase: ScenePhase) in + guard let damus_state else { return } switch phase { case .background: print("📙 DAMUS BACKGROUNDED") + Task { @MainActor in + damus_state.ndb.close() + } break case .inactive: print("📙 DAMUS INACTIVE") break case .active: print("📙 DAMUS ACTIVE") - guard let ds = damus_state else { return } - ds.pool.ping() + damus_state.pool.ping() @unknown default: break } diff --git a/nostrdb/Ndb.swift b/nostrdb/Ndb.swift index 11cec2c4..3fdea3d2 100644 --- a/nostrdb/Ndb.swift +++ b/nostrdb/Ndb.swift @@ -15,8 +15,23 @@ enum NdbSearchOrder { case newest_first } + +enum DatabaseError: Error { + case failed_open + + var errorDescription: String? { + switch self { + case .failed_open: + return "Failed to open database" + } + } +} + class Ndb { - let ndb: ndb_t + var ndb: ndb_t + let path: String? + let owns_db: Bool + var closed: Bool static func safemode() -> Ndb? { guard let path = db_path ?? old_db_path else { return nil } @@ -58,8 +73,8 @@ class Ndb { static var empty: Ndb { Ndb(ndb: ndb_t(ndb: nil)) } - - init?(path: String? = nil, owns_db_file: Bool = true) { + + static func open(path: String? = nil, owns_db_file: Bool = true) -> ndb_t? { var ndb_p: OpaquePointer? = nil let ingest_threads: Int32 = 4 @@ -102,9 +117,20 @@ class Ndb { return nil } - self.ndb = ndb_t(ndb: ndb_p) + return ndb_t(ndb: ndb_p) } + init?(path: String? = nil, owns_db_file: Bool = true) { + guard let db = Self.open(path: path, owns_db_file: owns_db_file) else { + return nil + } + + self.path = path + self.owns_db = owns_db_file + self.ndb = db + self.closed = false + } + private static func migrate_db_location_if_needed() throws { guard let old_db_path, let db_path else { throw Errors.cannot_find_db_path @@ -144,6 +170,23 @@ class Ndb { init(ndb: ndb_t) { self.ndb = ndb + self.path = nil + self.owns_db = true + self.closed = false + } + + func close() { + self.closed = true + ndb_destroy(self.ndb.ndb) + } + + func reopen() throws { + guard self.closed, + let db = Self.open(path: self.path, owns_db_file: self.owns_db) else { + throw DatabaseError.failed_open + } + + self.ndb = db } func lookup_note_by_key_with_txn(_ key: NoteKey, txn: NdbTxn) -> NdbNote? { @@ -344,12 +387,14 @@ class Ndb { } func process_event(_ str: String) -> Bool { + guard !closed else { return false } return str.withCString { cstr in return ndb_process_event(ndb.ndb, cstr, Int32(str.utf8.count)) != 0 } } func process_events(_ str: String) -> Bool { + guard !closed else { return false } return str.withCString { cstr in return ndb_process_events(ndb.ndb, cstr, str.utf8.count) != 0 } @@ -387,7 +432,7 @@ class Ndb { } deinit { - ndb_destroy(ndb.ndb) + self.close() } } diff --git a/nostrdb/NdbTxn.swift b/nostrdb/NdbTxn.swift index 06d7fdce..a7628902 100644 --- a/nostrdb/NdbTxn.swift +++ b/nostrdb/NdbTxn.swift @@ -29,7 +29,14 @@ class NdbTxn { self.inherited = true } else { self.txn = ndb_txn() - let _ = ndb_begin_query(ndb.ndb.ndb, &self.txn) + let ok = ndb_begin_query(ndb.ndb.ndb, &self.txn) != 0 + if !ok { + self.moved = false + self.txn = ndb_txn() + self.inherited = true + self.val = with(self) + return + } Thread.current.threadDictionary["ndb_txn"] = self.txn self.inherited = false }