diff --git a/Account/Sources/Account/Account.swift b/Account/Sources/Account/Account.swift index 5585cdd9d..b40b18e6f 100644 --- a/Account/Sources/Account/Account.swift +++ b/Account/Sources/Account/Account.swift @@ -1471,14 +1471,12 @@ private extension Account { } func fetchUnreadCount(_ feed: Feed, _ completion: VoidCompletionBlock?) { - database.fetchUnreadCount(feed.feedID) { result in - Task { @MainActor in - if let unreadCount = try? result.get() { - feed.unreadCount = unreadCount - } - completion?() - } - } + Task { @MainActor in + if let unreadCount = try? await database.unreadCountForFeed(feed.feedID) { + feed.unreadCount = unreadCount + } + completion?() + } } func fetchUnreadCounts(_ feeds: Set, _ completion: VoidCompletionBlock?) { diff --git a/ArticlesDatabase/Sources/ArticlesDatabase/ArticlesDatabase.swift b/ArticlesDatabase/Sources/ArticlesDatabase/ArticlesDatabase.swift index 2ae827e29..02f6603cb 100644 --- a/ArticlesDatabase/Sources/ArticlesDatabase/ArticlesDatabase.swift +++ b/ArticlesDatabase/Sources/ArticlesDatabase/ArticlesDatabase.swift @@ -181,14 +181,8 @@ public typealias ArticleStatusesResultBlock = (ArticleStatusesResult) -> Void operationQueue.add(operation) } - /// Fetch unread count for a single feed. - public func fetchUnreadCount(_ feedID: String, _ completion: @escaping SingleUnreadCountCompletionBlock) { - let operation = FetchFeedUnreadCountOperation(feedID: feedID, databaseQueue: queue, cutoffDate: articlesTable.articleCutoffDate) - operation.completionBlock = { operation in - let fetchOperation = operation as! FetchFeedUnreadCountOperation - completion(fetchOperation.result) - } - operationQueue.add(operation) + public func unreadCountForFeed(_ feedID: String) async throws -> Int { + try await articlesTable.unreadCountForFeedID(feedID) } /// Fetch non-zero unread counts for given feedIDs. diff --git a/ArticlesDatabase/Sources/ArticlesDatabase/ArticlesTable.swift b/ArticlesDatabase/Sources/ArticlesDatabase/ArticlesTable.swift index 0ab97ec35..1aabab0cd 100644 --- a/ArticlesDatabase/Sources/ArticlesDatabase/ArticlesTable.swift +++ b/ArticlesDatabase/Sources/ArticlesDatabase/ArticlesTable.swift @@ -396,6 +396,30 @@ final class ArticlesTable: DatabaseTable { // MARK: - Unread Counts + func r async throws -> Int { + + try await withCheckedThrowingContinuation { continuation in + queue.runInDatabase { databaseResult in + + func readUnreadCount(_ database: FMDatabase) -> Int { + let sql = "select count(*) from articles natural join statuses where feedID=? and read=0;" + guard let resultSet = database.executeQuery(sql, withArgumentsIn: [feedID]) else { + return 0 + } + return self.numberWithCountResultSet(resultSet) + } + + switch databaseResult { + case .success(let database): + let unreadCount = readUnreadCount(database) + continuation.resume(returning: unreadCount) + case .failure(let databaseError): + continuation.resume(throwing: databaseError) + } + } + } + } + func fetchUnreadCount(_ feedIDs: Set, _ since: Date, _ completion: @escaping SingleUnreadCountCompletionBlock) { // Get unread count for today, for instance. if feedIDs.isEmpty { diff --git a/ArticlesDatabase/Sources/ArticlesDatabase/Operations/FetchFeedUnreadCountOperation.swift b/ArticlesDatabase/Sources/ArticlesDatabase/Operations/FetchFeedUnreadCountOperation.swift deleted file mode 100644 index d7728fb26..000000000 --- a/ArticlesDatabase/Sources/ArticlesDatabase/Operations/FetchFeedUnreadCountOperation.swift +++ /dev/null @@ -1,75 +0,0 @@ -// -// FetchFeedUnreadCountOperation.swift -// ArticlesDatabase -// -// Created by Brent Simmons on 1/27/20. -// Copyright © 2020 Ranchero Software. All rights reserved. -// - -import Foundation -import RSCore -import RSDatabase -import RSDatabaseObjC - -/// Fetch the unread count for a single feed. -public final class FetchFeedUnreadCountOperation: MainThreadOperation { - - var result: SingleUnreadCountResult = .failure(.isSuspended) - - // MainThreadOperation - public var isCanceled = false - public var id: Int? - public weak var operationDelegate: MainThreadOperationDelegate? - public var name: String? = "FetchFeedUnreadCountOperation" - public var completionBlock: MainThreadOperation.MainThreadOperationCompletionBlock? - - private let queue: DatabaseQueue - private let cutoffDate: Date - private let feedID: String - - init(feedID: String, databaseQueue: DatabaseQueue, cutoffDate: Date) { - self.feedID = feedID - self.queue = databaseQueue - self.cutoffDate = cutoffDate - } - - public func run() { - queue.runInDatabase { databaseResult in - if self.isCanceled { - self.informOperationDelegateOfCompletion() - return - } - - switch databaseResult { - case .success(let database): - self.fetchUnreadCount(database) - case .failure: - self.informOperationDelegateOfCompletion() - } - } - } -} - -private extension FetchFeedUnreadCountOperation { - - func fetchUnreadCount(_ database: FMDatabase) { - let sql = "select count(*) from articles natural join statuses where feedID=? and read=0;" - - guard let resultSet = database.executeQuery(sql, withArgumentsIn: [feedID]) else { - informOperationDelegateOfCompletion() - return - } - if isCanceled { - informOperationDelegateOfCompletion() - return - } - - if resultSet.next() { - let unreadCount = resultSet.long(forColumnIndex: 0) - result = .success(unreadCount) - } - resultSet.close() - - informOperationDelegateOfCompletion() - } -}