From 2c4ee99dc2811c608087af44d225e23ee86f0f12 Mon Sep 17 00:00:00 2001 From: Brent Simmons Date: Sun, 29 Mar 2020 18:51:03 -0700 Subject: [PATCH] Create and use ArticlesDatabase.RetentionStyle enum. --- Frameworks/Account/Account.swift | 3 ++- .../ArticlesDatabase/ArticlesDatabase.swift | 24 +++++++++++++++---- .../ArticlesDatabase/ArticlesTable.swift | 7 ++++-- 3 files changed, 26 insertions(+), 8 deletions(-) diff --git a/Frameworks/Account/Account.swift b/Frameworks/Account/Account.swift index 271677817..584c051df 100644 --- a/Frameworks/Account/Account.swift +++ b/Frameworks/Account/Account.swift @@ -251,7 +251,8 @@ public final class Account: DisplayNameProvider, UnreadCountProvider, Container, self.dataFolder = dataFolder let databaseFilePath = (dataFolder as NSString).appendingPathComponent("DB.sqlite3") - self.database = ArticlesDatabase(databaseFilePath: databaseFilePath, accountID: accountID) + let retentionStyle: ArticlesDatabase.RetentionStyle = type == .onMyMac ? .feedBased : .syncSystem + self.database = ArticlesDatabase(databaseFilePath: databaseFilePath, accountID: accountID, retentionStyle: retentionStyle) switch type { case .onMyMac: diff --git a/Frameworks/ArticlesDatabase/ArticlesDatabase.swift b/Frameworks/ArticlesDatabase/ArticlesDatabase.swift index ec94b2e35..d6b79d33b 100644 --- a/Frameworks/ArticlesDatabase/ArticlesDatabase.swift +++ b/Frameworks/ArticlesDatabase/ArticlesDatabase.swift @@ -43,14 +43,21 @@ public typealias ArticleStatusesResultBlock = (ArticleStatusesResult) -> Void public final class ArticlesDatabase { + public enum RetentionStyle { + case feedBased // Local and iCloud: article retention is defined by contents of feed + case syncSystem // Feedbin, Feedly, etc.: article retention is defined by external system + } + private let articlesTable: ArticlesTable private let queue: DatabaseQueue private let operationQueue = MainThreadOperationQueue() + private let retentionStyle: RetentionStyle - public init(databaseFilePath: String, accountID: String) { + public init(databaseFilePath: String, accountID: String, retentionStyle: RetentionStyle) { let queue = DatabaseQueue(databasePath: databaseFilePath) self.queue = queue - self.articlesTable = ArticlesTable(name: DatabaseTableName.articles, accountID: accountID, queue: queue) + self.articlesTable = ArticlesTable(name: DatabaseTableName.articles, accountID: accountID, queue: queue, retentionStyle: retentionStyle) + self.retentionStyle = retentionStyle try! queue.runCreateStatements(ArticlesDatabase.tableCreationStatements) queue.runInDatabase { databaseResult in @@ -62,7 +69,6 @@ public final class ArticlesDatabase { database.executeStatements("DROP TABLE if EXISTS tags;DROP INDEX if EXISTS tags_tagName_index;DROP INDEX if EXISTS articles_feedID_index;DROP INDEX if EXISTS statuses_read_index;DROP TABLE if EXISTS attachments;DROP TABLE if EXISTS attachmentsLookup;") } -// queue.vacuumIfNeeded(daysBetweenVacuums: 9) // TODO: restore this after we do database cleanups. DispatchQueue.main.async { self.articlesTable.indexUnindexedArticles() } @@ -183,8 +189,14 @@ public final class ArticlesDatabase { // MARK: - Saving and Updating Articles - /// Update articles and save new ones. + /// Update articles and save new ones — for feed-based systems (local and iCloud). + public func update(with feed: ParsedFeed, completion: @escaping UpdateArticlesCompletionBlock) { + precondition(retentionStyle == .feedBased) + } + + /// Update articles and save new ones — for sync systems (Feedbin, Feedly, etc.). public func update(webFeedIDsAndItems: [String: Set], defaultRead: Bool, completion: @escaping UpdateArticlesCompletionBlock) { + precondition(retentionStyle == .syncSystem) articlesTable.update(webFeedIDsAndItems, defaultRead, completion) } @@ -219,6 +231,7 @@ public final class ArticlesDatabase { articlesTable.createStatusesIfNeeded(articleIDs, completion) } +#if os(iOS) // MARK: - Suspend and Resume (for iOS) /// Cancel current operations and close the database. @@ -239,7 +252,8 @@ public final class ArticlesDatabase { queue.resume() operationQueue.resume() } - +#endif + // MARK: - Caches /// Call to free up some memory. Should be done when the app is backgrounded, for instance. diff --git a/Frameworks/ArticlesDatabase/ArticlesTable.swift b/Frameworks/ArticlesDatabase/ArticlesTable.swift index 35b52d583..8b78d22fe 100644 --- a/Frameworks/ArticlesDatabase/ArticlesTable.swift +++ b/Frameworks/ArticlesDatabase/ArticlesTable.swift @@ -19,6 +19,8 @@ final class ArticlesTable: DatabaseTable { private let queue: DatabaseQueue private let statusesTable: StatusesTable private let authorsLookupTable: DatabaseLookupTable + private let retentionStyle: ArticlesDatabase.RetentionStyle + private var articlesCache = [String: Article]() private lazy var searchTable: SearchTable = { @@ -30,13 +32,14 @@ final class ArticlesTable: DatabaseTable { private typealias ArticlesFetchMethod = (FMDatabase) -> Set
- init(name: String, accountID: String, queue: DatabaseQueue) { + init(name: String, accountID: String, queue: DatabaseQueue, retentionStyle: ArticlesDatabase.RetentionStyle) { self.name = name self.accountID = accountID self.queue = queue self.statusesTable = StatusesTable(queue: queue) - + self.retentionStyle = retentionStyle + let authorsTable = AuthorsTable(name: DatabaseTableName.authors) self.authorsLookupTable = DatabaseLookupTable(name: DatabaseTableName.authorsLookup, objectIDKey: DatabaseKey.articleID, relatedObjectIDKey: DatabaseKey.authorID, relatedTable: authorsTable, relationshipName: RelationshipName.authors) }