diff --git a/ArticlesDatabase/Sources/ArticlesDatabase/Operations/FetchAllUnreadCountsOperation.swift b/ArticlesDatabase/Sources/ArticlesDatabase/Operations/FetchAllUnreadCountsOperation.swift index 892ccc1de..6730b8bd0 100644 --- a/ArticlesDatabase/Sources/ArticlesDatabase/Operations/FetchAllUnreadCountsOperation.swift +++ b/ArticlesDatabase/Sources/ArticlesDatabase/Operations/FetchAllUnreadCountsOperation.swift @@ -13,7 +13,7 @@ import FMDB public final class FetchAllUnreadCountsOperation: MainThreadOperation { - var result: UnreadCountDictionaryCompletionResult = .failure(.isSuspended) + var result: UnreadCountDictionaryCompletionResult = .failure(.suspended) // MainThreadOperation public var isCanceled = false diff --git a/ArticlesDatabase/Sources/ArticlesDatabase/Operations/FetchFeedUnreadCountOperation.swift b/ArticlesDatabase/Sources/ArticlesDatabase/Operations/FetchFeedUnreadCountOperation.swift index 5da2ede10..b0ec6e0d9 100644 --- a/ArticlesDatabase/Sources/ArticlesDatabase/Operations/FetchFeedUnreadCountOperation.swift +++ b/ArticlesDatabase/Sources/ArticlesDatabase/Operations/FetchFeedUnreadCountOperation.swift @@ -14,7 +14,7 @@ import FMDB /// Fetch the unread count for a single feed. public final class FetchFeedUnreadCountOperation: MainThreadOperation { - var result: SingleUnreadCountResult = .failure(.isSuspended) + var result: SingleUnreadCountResult = .failure(.suspended) // MainThreadOperation public var isCanceled = false diff --git a/ArticlesDatabase/Sources/ArticlesDatabase/Operations/FetchUnreadCountsForFeedsOperation.swift b/ArticlesDatabase/Sources/ArticlesDatabase/Operations/FetchUnreadCountsForFeedsOperation.swift index c7bdb209b..65916649a 100644 --- a/ArticlesDatabase/Sources/ArticlesDatabase/Operations/FetchUnreadCountsForFeedsOperation.swift +++ b/ArticlesDatabase/Sources/ArticlesDatabase/Operations/FetchUnreadCountsForFeedsOperation.swift @@ -14,7 +14,7 @@ import FMDB /// Fetch the unread counts for a number of feeds. public final class FetchUnreadCountsForFeedsOperation: MainThreadOperation { - var result: UnreadCountDictionaryCompletionResult = .failure(.isSuspended) + var result: UnreadCountDictionaryCompletionResult = .failure(.suspended) // MainThreadOperation public var isCanceled = false diff --git a/Database/Sources/Database/Database.swift b/Database/Sources/Database/Database.swift index f13c26b26..f7d8aafb2 100644 --- a/Database/Sources/Database/Database.swift +++ b/Database/Sources/Database/Database.swift @@ -10,7 +10,7 @@ import Foundation import FMDB public enum DatabaseError: Error, Sendable { - case isSuspended // On iOS, to support background refreshing, a database may be suspended. + case suspended // On iOS, to support background refreshing, a database may be suspended. } /// Result type that provides an FMDatabase or a DatabaseError. diff --git a/Database/Sources/Database/DatabaseQueue.swift b/Database/Sources/Database/DatabaseQueue.swift index a8e4042f3..bcedcbb91 100644 --- a/Database/Sources/Database/DatabaseQueue.swift +++ b/Database/Sources/Database/DatabaseQueue.swift @@ -235,7 +235,7 @@ private extension DatabaseQueue { isCallingDatabase = true autoreleasepool { if _isSuspended { - databaseBlock(.failure(.isSuspended)) + databaseBlock(.failure(.suspended)) } else { if useTransaction { diff --git a/Database/Sources/Database/FMDatabase+Extras.swift b/Database/Sources/Database/FMDatabase+Extras.swift new file mode 100644 index 000000000..bd007c264 --- /dev/null +++ b/Database/Sources/Database/FMDatabase+Extras.swift @@ -0,0 +1,52 @@ +// +// File.swift +// +// +// Created by Brent Simmons on 3/10/24. +// + +import Foundation +import FMDB + +public extension FMDatabase { + + static func openAndSetUpDatabase(path: String) -> FMDatabase { + + let database = FMDatabase(path: path)! + + database.open() + database.executeStatements("PRAGMA synchronous = 1;") + database.setShouldCacheStatements(true) + + return database + } + + func executeUpdateInTransaction(_ sql : String, withArgumentsIn parameters: [Any]?) { + + beginTransaction() + executeUpdate(sql, withArgumentsIn: parameters) + commit() + } + + func vacuum() { + + executeStatements("vacuum;") + } + + func runCreateStatements(_ statements: String) { + + statements.enumerateLines { (line, stop) in + if line.lowercased().hasPrefix("create") { + self.executeStatements(line) + } + stop = false + } + } + + func insertRows(_ dictionaries: [DatabaseDictionary], insertType: RSDatabaseInsertType, tableName: String) { + + for dictionary in dictionaries { + _ = rs_insertRow(with: dictionary, insertType: insertType, tableName: tableName) + } + } +} diff --git a/Database/Sources/Database/FMResultSet+Extras.swift b/Database/Sources/Database/FMResultSet+Extras.swift new file mode 100644 index 000000000..3a945b964 --- /dev/null +++ b/Database/Sources/Database/FMResultSet+Extras.swift @@ -0,0 +1,22 @@ +// +// File.swift +// +// +// Created by Brent Simmons on 3/10/24. +// + +import Foundation +import FMDB + +public extension FMResultSet { + + func intWithCountResult() -> Int? { + + guard next() else { + return nil + } + + return Int(long(forColumnIndex: 0)) + } +} + diff --git a/SyncDatabase/Sources/SyncDatabase/SyncDatabase.swift b/SyncDatabase/Sources/SyncDatabase/SyncDatabase.swift index 79feb5507..1291985d6 100644 --- a/SyncDatabase/Sources/SyncDatabase/SyncDatabase.swift +++ b/SyncDatabase/Sources/SyncDatabase/SyncDatabase.swift @@ -87,7 +87,7 @@ extension SyncDatabase { try await self.insertStatuses(statuses) completion(nil) } catch { - completion(DatabaseError.isSuspended) + completion(DatabaseError.suspended) } } } @@ -102,7 +102,7 @@ extension SyncDatabase { completion(.success([SyncStatus]())) } } catch { - completion(.failure(DatabaseError.isSuspended)) + completion(.failure(DatabaseError.suspended)) } } } @@ -118,7 +118,7 @@ extension SyncDatabase { } } catch { - completion(.failure(DatabaseError.isSuspended)) + completion(.failure(DatabaseError.suspended)) } } } @@ -133,7 +133,7 @@ extension SyncDatabase { completion(.success(Set())) } } catch { - completion(.failure(DatabaseError.isSuspended)) + completion(.failure(DatabaseError.suspended)) } } } @@ -148,7 +148,7 @@ extension SyncDatabase { completion(.success(Set())) } } catch { - completion(.failure(DatabaseError.isSuspended)) + completion(.failure(DatabaseError.suspended)) } } } @@ -160,7 +160,7 @@ extension SyncDatabase { try await self.resetAllSelectedForProcessing() completion?(nil) } catch { - completion?(DatabaseError.isSuspended) + completion?(DatabaseError.suspended) } } } @@ -172,7 +172,7 @@ extension SyncDatabase { try await self.resetSelectedForProcessing(articleIDs) completion?(nil) } catch { - completion?(DatabaseError.isSuspended) + completion?(DatabaseError.suspended) } } } @@ -184,7 +184,7 @@ extension SyncDatabase { try await self.deleteSelectedForProcessing(articleIDs) completion?(nil) } catch { - completion?(DatabaseError.isSuspended) + completion?(DatabaseError.suspended) } } } diff --git a/SyncDatabase/Sources/SyncDatabase/SyncStatusTable.swift b/SyncDatabase/Sources/SyncDatabase/SyncStatusTable.swift index ff86f49b5..10bb06d83 100644 --- a/SyncDatabase/Sources/SyncDatabase/SyncStatusTable.swift +++ b/SyncDatabase/Sources/SyncDatabase/SyncStatusTable.swift @@ -12,61 +12,6 @@ import Articles import Database import FMDB -extension FMDatabase { - - static func openAndSetUpDatabase(path: String) -> FMDatabase { - - let database = FMDatabase(path: path)! - - database.open() - database.executeStatements("PRAGMA synchronous = 1;") - database.setShouldCacheStatements(true) - - return database - } - - func executeUpdateInTransaction(_ sql : String, withArgumentsIn parameters: [Any]?) { - - beginTransaction() - executeUpdate(sql, withArgumentsIn: parameters) - commit() - } - - func vacuum() { - - executeStatements("vacuum;") - } - - func runCreateStatements(_ statements: String) { - - statements.enumerateLines { (line, stop) in - if line.lowercased().hasPrefix("create") { - self.executeStatements(line) - } - stop = false - } - } - - func insertRows(_ dictionaries: [DatabaseDictionary], insertType: RSDatabaseInsertType, tableName: String) { - - for dictionary in dictionaries { - _ = rs_insertRow(with: dictionary, insertType: insertType, tableName: tableName) - } - } -} - -extension FMResultSet { - - func intWithCountResult() -> Int? { - - guard next() else { - return nil - } - - return Int(long(forColumnIndex: 0)) - } -} - actor SyncStatusTable { static private let tableName = "syncStatus" @@ -107,7 +52,7 @@ actor SyncStatusTable { func selectForProcessing(limit: Int?) throws -> Set? { guard let database else { - throw DatabaseError.isSuspended + throw DatabaseError.suspended } let updateSQL = "update syncStatus set selected = true" @@ -131,7 +76,7 @@ actor SyncStatusTable { func selectPendingCount() throws -> Int? { guard let database else { - throw DatabaseError.isSuspended + throw DatabaseError.suspended } let sql = "select count(*) from syncStatus" @@ -154,7 +99,7 @@ actor SyncStatusTable { func resetAllSelectedForProcessing() throws { guard let database else { - throw DatabaseError.isSuspended + throw DatabaseError.suspended } let updateSQL = "update syncStatus set selected = false" @@ -167,7 +112,7 @@ actor SyncStatusTable { return } guard let database else { - throw DatabaseError.isSuspended + throw DatabaseError.suspended } let parameters = articleIDs.map { $0 as AnyObject } @@ -183,7 +128,7 @@ actor SyncStatusTable { return } guard let database else { - throw DatabaseError.isSuspended + throw DatabaseError.suspended } let parameters = articleIDs.map { $0 as AnyObject } @@ -196,7 +141,7 @@ actor SyncStatusTable { func insertStatuses(_ statuses: [SyncStatus]) throws { guard let database else { - throw DatabaseError.isSuspended + throw DatabaseError.suspended } database.beginTransaction() @@ -231,7 +176,7 @@ private extension SyncStatusTable { func selectPendingArticleIDs(_ statusKey: ArticleStatus.Key) throws -> Set? { guard let database else { - throw DatabaseError.isSuspended + throw DatabaseError.suspended } let sql = "select articleID from syncStatus where selected == false and key = \"\(statusKey.rawValue)\";"