Add code to migrate database model

Add code to migrate database model when `authors` column is not present in the index
This recreates `search` table and resets the articles index
Added missing or code in error
This commit is contained in:
Fábio Oliveira 2021-02-10 19:46:16 +01:00
parent 5636ca0a01
commit cf1be33044
3 changed files with 9 additions and 4 deletions

View File

@ -63,6 +63,7 @@ public final class ArticlesDatabase {
} }
private let articlesTable: ArticlesTable private let articlesTable: ArticlesTable
private let searchTable: SearchTable
private let queue: DatabaseQueue private let queue: DatabaseQueue
private let operationQueue = MainThreadOperationQueue() private let operationQueue = MainThreadOperationQueue()
private let retentionStyle: RetentionStyle private let retentionStyle: RetentionStyle
@ -71,6 +72,7 @@ public final class ArticlesDatabase {
let queue = DatabaseQueue(databasePath: databaseFilePath) let queue = DatabaseQueue(databasePath: databaseFilePath)
self.queue = queue self.queue = queue
self.articlesTable = ArticlesTable(name: DatabaseTableName.articles, accountID: accountID, queue: queue, retentionStyle: retentionStyle) self.articlesTable = ArticlesTable(name: DatabaseTableName.articles, accountID: accountID, queue: queue, retentionStyle: retentionStyle)
self.searchTable = SearchTable(queue: queue, articlesTable: self.articlesTable)
self.retentionStyle = retentionStyle self.retentionStyle = retentionStyle
try! queue.runCreateStatements(ArticlesDatabase.tableCreationStatements) try! queue.runCreateStatements(ArticlesDatabase.tableCreationStatements)
@ -81,6 +83,9 @@ public final class ArticlesDatabase {
} }
database.executeStatements("CREATE INDEX if not EXISTS articles_searchRowID on articles(searchRowID);") database.executeStatements("CREATE INDEX if not EXISTS articles_searchRowID on articles(searchRowID);")
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;") 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;")
if !self.searchTable.containsColumn("authors", in: database) {
database.executeStatements("DROP TABLE if EXISTS search;CREATE VIRTUAL TABLE if not EXISTS search using fts4(title, body, authors);UPDATE articles SET searchRowID = null;")
}
} }
DispatchQueue.main.async { DispatchQueue.main.async {

View File

@ -158,8 +158,8 @@ final class ArticlesTable: DatabaseTable {
art.contentText, art.contentText,
art.summary, art.summary,
art.searchRowID, art.searchRowID,
(SELECT GROUP_CONCAT(name SEPARATOR ' ') (SELECT GROUP_CONCAT(name, ' ')
FROM authorLookup as autL FROM authorsLookup as autL
JOIN authors as aut ON autL.authorID = aut.authorID JOIN authors as aut ON autL.authorID = aut.authorID
WHERE art.articleID = autL.articleID WHERE art.articleID = autL.articleID
GROUP BY autl.articleID) as authors GROUP BY autl.articleID) as authors

View File

@ -61,7 +61,7 @@ final class ArticleSearchInfo: Hashable {
// MARK: Equatable // MARK: Equatable
static func == (lhs: ArticleSearchInfo, rhs: ArticleSearchInfo) -> Bool { static func == (lhs: ArticleSearchInfo, rhs: ArticleSearchInfo) -> Bool {
return lhs.articleID == rhs.articleID && lhs.title == rhs.title && lhs.contentHTML == rhs.contentHTML && lhs.contentText == rhs.contentText && lhs.summary == rhs.summary && lhs.searchRowID == rhs.searchRowID return lhs.articleID == rhs.articleID && lhs.title == rhs.title && lhs.authorsNames == rhs.authorsNames && lhs.contentHTML == rhs.contentHTML && lhs.contentText == rhs.contentText && lhs.summary == rhs.summary && lhs.searchRowID == rhs.searchRowID
} }
} }
@ -203,7 +203,7 @@ private extension SearchTable {
return nil return nil
} }
let placeholders = NSString.rs_SQLValueList(withPlaceholders: UInt(searchRowIDs.count))! let placeholders = NSString.rs_SQLValueList(withPlaceholders: UInt(searchRowIDs.count))!
let sql = "select rowid, title, body from \(name) where rowid in \(placeholders);" let sql = "select rowid, title, body, authors from \(name) where rowid in \(placeholders);"
guard let resultSet = database.executeQuery(sql, withArgumentsIn: searchRowIDs) else { guard let resultSet = database.executeQuery(sql, withArgumentsIn: searchRowIDs) else {
return nil return nil
} }