You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
session-ios/SignalMessaging/environment/migrations/OWS113MultiAttachmentMediaM...

75 lines
2.6 KiB
Swift

//
// Copyright (c) 2018 Open Whisper Systems. All rights reserved.
//
import Foundation
import SignalServiceKit
@objc
public class OWS113MultiAttachmentMediaMessages: OWSDatabaseMigration {
// MARK: - Dependencies
// MARK: -
// Increment a similar constant for each migration.
@objc
class func migrationId() -> String {
// NOTE: that we use .1 since there was a bug in the logic to
// set albumMessageId.
return "113.1"
}
override public func runUp(completion: @escaping OWSDatabaseMigrationCompletion) {
Logger.debug("")
BenchAsync(title: "\(self.logTag)") { (benchCompletion) in
self.doMigrationAsync(completion: {
benchCompletion()
completion()
})
}
}
private func doMigrationAsync(completion : @escaping OWSDatabaseMigrationCompletion) {
DispatchQueue.global().async {
var legacyAttachments: [(attachmentId: String, messageId: String)] = []
self.dbReadWriteConnection().read { transaction in
TSMessage.enumerateCollectionObjects(with: transaction) { object, _ in
autoreleasepool {
guard let message: TSMessage = object as? TSMessage else {
Logger.debug("ignoring message with type: \(object)")
return
}
guard let messageId = message.uniqueId else {
owsFailDebug("messageId was unexpectedly nil")
return
}
for attachmentId in message.attachmentIds {
legacyAttachments.append((attachmentId: attachmentId as! String, messageId: messageId))
}
}
}
}
self.dbReadWriteConnection().readWrite { transaction in
for (attachmentId, messageId) in legacyAttachments {
autoreleasepool {
guard let attachment = TSAttachment.fetch(uniqueId: attachmentId, transaction: transaction) else {
Logger.warn("missing attachment for messageId: \(messageId)")
return
}
attachment.migrateAlbumMessageId(messageId)
attachment.save(with: transaction)
}
}
self.save(with: transaction)
}
completion()
}
}
}