diff --git a/Postbox/Database.swift b/Postbox/Database.swift index 168328adeb..a832a1f52f 100644 --- a/Postbox/Database.swift +++ b/Postbox/Database.swift @@ -39,7 +39,9 @@ public final class Database { } } - deinit { sqlite3_close(self.handle) } // sqlite3_close_v2 in Yosemite/iOS 8? + deinit { + sqlite3_close(self.handle) + } // sqlite3_close_v2 in Yosemite/iOS 8? public func execute(_ SQL: String) -> Bool { let res = sqlite3_exec(self.handle, SQL, nil, nil, nil) diff --git a/Postbox/Message.swift b/Postbox/Message.swift index 7e8e175f92..cd327dff00 100644 --- a/Postbox/Message.swift +++ b/Postbox/Message.swift @@ -443,7 +443,7 @@ public struct MessageForwardInfo: Equatable { } } -public protocol MessageAttribute: PostboxCoding { +public protocol MessageAttribute: class, PostboxCoding { var associatedPeerIds: [PeerId] { get } var associatedMessageIds: [MessageId] { get } } diff --git a/Postbox/MessageHistoryIndexTable.swift b/Postbox/MessageHistoryIndexTable.swift index d80896d6c3..6f62bdb02f 100644 --- a/Postbox/MessageHistoryIndexTable.swift +++ b/Postbox/MessageHistoryIndexTable.swift @@ -146,6 +146,10 @@ final class MessageHistoryIndexTable: Table { operations.append(.Update(previousIndex, message)) case let .InsertMessage(insertMessage) where insertMessage.index == message.index: break + case let .InsertExistingMessage(insertMessage) where insertMessage.index == message.index: + operations.removeAll() + operations.append(.Remove(index: previousIndex)) + operations.append(.Update(insertMessage.index, message)) default: operations.append(operation) } diff --git a/Postbox/MessageHistoryView.swift b/Postbox/MessageHistoryView.swift index 7fdea77e61..9d76e6f030 100644 --- a/Postbox/MessageHistoryView.swift +++ b/Postbox/MessageHistoryView.swift @@ -377,6 +377,21 @@ final class MutableMessageHistoryView { } case let .loaded(loadedState): for operationSet in operations { + var addCount = 0 + var removeCount = 0 + for operation in operationSet { + switch operation { + case .InsertMessage: + addCount += 1 + case .Remove: + removeCount += 1 + default: + break + } + } + if addCount == 2 && removeCount == 2 { + assert(true) + } for operation in operationSet { switch operation { case let .InsertMessage(message): diff --git a/Postbox/Postbox.swift b/Postbox/Postbox.swift index 31c2786e3e..fa5ebc22e7 100644 --- a/Postbox/Postbox.swift +++ b/Postbox/Postbox.swift @@ -973,6 +973,7 @@ public func openPostbox(basePath: String, seedConfiguration: SeedConfiguration, subscriber.putNext(.upgrading(progress)) }) if let updatedPath = updatedPath { + valueBox.internalClose() let _ = try? FileManager.default.removeItem(atPath: basePath + "/db") let _ = try? FileManager.default.moveItem(atPath: updatedPath, toPath: basePath + "/db") valueBox = SqliteValueBox(basePath: basePath + "/db", queue: queue, encryptionParameters: encryptionParameters, upgradeProgress: { progress in diff --git a/Postbox/PostboxUpgrade_21to22.swift b/Postbox/PostboxUpgrade_21to22.swift index a44a246511..871d55b2f2 100644 --- a/Postbox/PostboxUpgrade_21to22.swift +++ b/Postbox/PostboxUpgrade_21to22.swift @@ -8,22 +8,9 @@ import SwiftSignalKit func postboxUpgrade_21to22(queue: Queue, basePath: String, valueBox: ValueBox, encryptionParameters: ValueBoxEncryptionParameters, progress: (Float) -> Void) -> String? { postboxLog("Upgrade 21->22 started") - if encryptionParameters.forceEncryptionIfNoSet { - let exportPath = "\(basePath)/version22" - let _ = try? FileManager.default.removeItem(atPath: exportPath) - valueBox.exportEncrypted(to: exportPath, encryptionParameters: encryptionParameters) - - let updatedValueBox = SqliteValueBox(basePath: exportPath, queue: queue, encryptionParameters: encryptionParameters, upgradeProgress: progress) - let metadataTable = MetadataTable(valueBox: updatedValueBox, table: MetadataTable.tableSpec(0)) - updatedValueBox.begin() - metadataTable.setUserVersion(22) - updatedValueBox.commit() - return exportPath - } else { - valueBox.begin() - let metadataTable = MetadataTable(valueBox: valueBox, table: MetadataTable.tableSpec(0)) - metadataTable.setUserVersion(22) - valueBox.commit() - return nil - } + valueBox.begin() + let metadataTable = MetadataTable(valueBox: valueBox, table: MetadataTable.tableSpec(0)) + metadataTable.setUserVersion(22) + valueBox.commit() + return nil } diff --git a/Postbox/SqliteValueBox.swift b/Postbox/SqliteValueBox.swift index 710f1f1e60..a6f77db04f 100644 --- a/Postbox/SqliteValueBox.swift +++ b/Postbox/SqliteValueBox.swift @@ -212,6 +212,10 @@ public final class SqliteValueBox: ValueBox { checkpoints.dispose() } + func internalClose() { + self.database = nil + } + private func openDatabase(encryptionParameters: ValueBoxEncryptionParameters?, upgradeProgress: (Float) -> Void) -> Database { precondition(self.queue.isCurrent())