diff --git a/Signal/src/ViewControllers/ConversationView/ConversationViewItem.h b/Signal/src/ViewControllers/ConversationView/ConversationViewItem.h index 699d83d41a..c83558e741 100644 --- a/Signal/src/ViewControllers/ConversationView/ConversationViewItem.h +++ b/Signal/src/ViewControllers/ConversationView/ConversationViewItem.h @@ -53,7 +53,6 @@ NSString *NSStringForPerMessageExpirationState(PerMessageExpirationState value); @class TSAttachmentStream; @class TSInteraction; @class TSThread; -@class YapDatabaseReadTransaction; @interface ConversationMediaAlbumItem : NSObject diff --git a/Signal/src/ViewControllers/ConversationView/ConversationViewItem.m b/Signal/src/ViewControllers/ConversationView/ConversationViewItem.m index 4154f39b30..c5c8f725a1 100644 --- a/Signal/src/ViewControllers/ConversationView/ConversationViewItem.m +++ b/Signal/src/ViewControllers/ConversationView/ConversationViewItem.m @@ -720,14 +720,11 @@ NSString *NSStringForPerMessageExpirationState(PerMessageExpirationState cellTyp return; } - if (transaction.transitional_yapReadTransaction != nil) { - if (message.contactShare) { - self.contactShare = - [[ContactShareViewModel alloc] initWithContactShareRecord:message.contactShare - transaction:transaction.transitional_yapReadTransaction]; - self.messageCellType = OWSMessageCellType_ContactShare; - return; - } + if (message.contactShare) { + self.contactShare = + [[ContactShareViewModel alloc] initWithContactShareRecord:message.contactShare transaction:transaction]; + self.messageCellType = OWSMessageCellType_ContactShare; + return; } // Check for stickers _before_ media or quoted reply handling; diff --git a/Signal/src/ViewControllers/DebugUI/DebugUIMessages.m b/Signal/src/ViewControllers/DebugUI/DebugUIMessages.m index 8bf6752793..db6f371f34 100644 --- a/Signal/src/ViewControllers/DebugUI/DebugUIMessages.m +++ b/Signal/src/ViewControllers/DebugUI/DebugUIMessages.m @@ -3625,31 +3625,25 @@ typedef OWSContact * (^OWSContactBlock)(SDSAnyWriteTransaction *transaction); verificationState:OWSVerificationStateNoLongerVerified isLocalChange:NO]]; - if (transaction.transitional_yapWriteTransaction) { - [result addObject:[TSErrorMessage missingSessionWithEnvelope:[self createEnvelopeForThread:thread] - withTransaction:transaction.transitional_yapWriteTransaction]]; - [result addObject:[TSErrorMessage - invalidKeyExceptionWithEnvelope:[self createEnvelopeForThread:thread] - withTransaction:transaction.transitional_yapWriteTransaction]]; - [result addObject:[TSErrorMessage invalidVersionWithEnvelope:[self createEnvelopeForThread:thread] - withTransaction:transaction.transitional_yapWriteTransaction]]; - [result - addObject:[TSErrorMessage corruptedMessageWithEnvelope:[self createEnvelopeForThread:thread] - withTransaction:transaction.transitional_yapWriteTransaction]]; + [result addObject:[TSErrorMessage missingSessionWithEnvelope:[self createEnvelopeForThread:thread] + withTransaction:transaction]]; + [result addObject:[TSErrorMessage invalidKeyExceptionWithEnvelope:[self createEnvelopeForThread:thread] + withTransaction:transaction]]; + [result addObject:[TSErrorMessage invalidVersionWithEnvelope:[self createEnvelopeForThread:thread] + withTransaction:transaction]]; + [result addObject:[TSErrorMessage corruptedMessageWithEnvelope:[self createEnvelopeForThread:thread] + withTransaction:transaction]]; #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wdeprecated-declarations" - TSInvalidIdentityKeyReceivingErrorMessage *_Nullable blockingSNChangeMessage = - [TSInvalidIdentityKeyReceivingErrorMessage - untrustedKeyWithEnvelope:[self createEnvelopeForThread:thread] - withTransaction:transaction.transitional_yapWriteTransaction]; + TSInvalidIdentityKeyReceivingErrorMessage *_Nullable blockingSNChangeMessage = + [TSInvalidIdentityKeyReceivingErrorMessage untrustedKeyWithEnvelope:[self createEnvelopeForThread:thread] + withTransaction:transaction]; #pragma clang diagnostic pop - OWSAssertDebug(blockingSNChangeMessage); - [result addObject:blockingSNChangeMessage]; - } else { - OWSFailDebug(@"failure: not yet implemented for GRDB"); - } + OWSAssertDebug(blockingSNChangeMessage); + [result addObject:blockingSNChangeMessage]; + // MJK TODO - should be safe to remove this senderTimestamp [result addObject:[[TSErrorMessage alloc] initWithTimestamp:[NSDate ows_millisecondTimeStamp] diff --git a/Signal/src/ViewControllers/DebugUI/DebugUIMisc.m b/Signal/src/ViewControllers/DebugUI/DebugUIMisc.m index f11c956568..25f67390cb 100644 --- a/Signal/src/ViewControllers/DebugUI/DebugUIMisc.m +++ b/Signal/src/ViewControllers/DebugUI/DebugUIMisc.m @@ -219,8 +219,8 @@ NS_ASSUME_NONNULL_BEGIN NSString *fileName = filePath.lastPathComponent; __block BOOL success; - [OWSPrimaryStorage.sharedManager.newDatabaseConnection - readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { + [self.databaseStorage + writeWithBlock:^(SDSAnyWriteTransaction *transaction) { NSError *error; success = [[NSFileManager defaultManager] copyItemAtPath:OWSPrimaryStorage.databaseFilePath toPath:filePath diff --git a/Signal/src/ViewControllers/DebugUI/DebugUIStress.m b/Signal/src/ViewControllers/DebugUI/DebugUIStress.m index 06d2859353..99b571ade0 100644 --- a/Signal/src/ViewControllers/DebugUI/DebugUIStress.m +++ b/Signal/src/ViewControllers/DebugUI/DebugUIStress.m @@ -523,14 +523,14 @@ NS_ASSUME_NONNULL_BEGIN + (void)hallucinateTwinGroup:(TSGroupThread *)groupThread { __block TSGroupThread *thread; - [OWSPrimaryStorage.dbReadWriteConnection - readWriteWithBlock:^(YapDatabaseReadWriteTransaction *_Nonnull transaction) { + [self.databaseStorage + writeWithBlock:^(SDSAnyWriteTransaction *transaction) { TSGroupModel *groupModel = [[TSGroupModel alloc] initWithTitle:[groupThread.groupModel.groupName stringByAppendingString:@" Copy"] members:groupThread.groupModel.groupMembers image:groupThread.groupModel.groupImage groupId:[Randomness generateRandomBytes:kGroupIdLength]]; - thread = [TSGroupThread getOrCreateThreadWithGroupModel:groupModel transaction:transaction.asAnyWrite]; + thread = [TSGroupThread getOrCreateThreadWithGroupModel:groupModel transaction:transaction]; }]; OWSAssertDebug(thread); @@ -559,13 +559,12 @@ NS_ASSUME_NONNULL_BEGIN [recipientAddresses addObject:self.tsAccountManager.localAddress]; __block TSGroupThread *thread; - [OWSPrimaryStorage.dbReadWriteConnection readWriteWithBlock:^( - YapDatabaseReadWriteTransaction *_Nonnull transaction) { + [self.databaseStorage writeWithBlock:^(SDSAnyWriteTransaction *transaction) { TSGroupModel *groupModel = [[TSGroupModel alloc] initWithTitle:NSUUID.UUID.UUIDString members:recipientAddresses image:nil groupId:[Randomness generateRandomBytes:kGroupIdLength]]; - thread = [TSGroupThread getOrCreateThreadWithGroupModel:groupModel transaction:transaction.asAnyWrite]; + thread = [TSGroupThread getOrCreateThreadWithGroupModel:groupModel transaction:transaction]; }]; OWSAssertDebug(thread); diff --git a/Signal/src/ViewControllers/HomeView/HomeViewCell.h b/Signal/src/ViewControllers/HomeView/HomeViewCell.h index 4509205f4c..135fbfa24d 100644 --- a/Signal/src/ViewControllers/HomeView/HomeViewCell.h +++ b/Signal/src/ViewControllers/HomeView/HomeViewCell.h @@ -1,11 +1,10 @@ // -// Copyright (c) 2018 Open Whisper Systems. All rights reserved. +// Copyright (c) 2019 Open Whisper Systems. All rights reserved. // NS_ASSUME_NONNULL_BEGIN @class ThreadViewModel; -@class YapDatabaseReadTransaction; @interface HomeViewCell : UITableViewCell diff --git a/Signal/src/ViewControllers/HomeView/HomeViewController.m b/Signal/src/ViewControllers/HomeView/HomeViewController.m index 7e7675af41..d5f3293cd3 100644 --- a/Signal/src/ViewControllers/HomeView/HomeViewController.m +++ b/Signal/src/ViewControllers/HomeView/HomeViewController.m @@ -1510,10 +1510,9 @@ NSString *const kArchiveButtonPseudoGroup = @"kArchiveButtonPseudoGroup"; if (![[uiDatabaseConnection ext:TSThreadDatabaseViewExtensionName] hasChangesForGroup:self.currentGrouping inNotifications:notifications]) { - [uiDatabaseConnection readWithBlock:^(YapDatabaseReadTransaction *transaction) { - SDSAnyReadTransaction *anyReadTransaction = transaction.asAnyRead; + [self.databaseStorage uiReadWithBlock:^(SDSAnyReadTransaction *transaction) { [self.threadMapping updateSwallowingErrorsWithIsViewingArchive:self.isViewingArchive - transaction:anyReadTransaction]; + transaction:transaction]; }]; [self updateViewState]; diff --git a/Signal/src/ViewControllers/MessageDetailViewController.swift b/Signal/src/ViewControllers/MessageDetailViewController.swift index 44f76ffa43..aa9f93a19f 100644 --- a/Signal/src/ViewControllers/MessageDetailViewController.swift +++ b/Signal/src/ViewControllers/MessageDetailViewController.swift @@ -20,6 +20,14 @@ protocol MessageDetailViewDelegate: AnyObject { @objc class MessageDetailViewController: OWSViewController { + // MARK: - Dependencies + + private var databaseStorage: SDSDatabaseStorage { + return SDSDatabaseStorage.shared + } + + // MARK: - + @objc weak var delegate: MessageDetailViewDelegate? @@ -424,13 +432,13 @@ class MessageDetailViewController: OWSViewController { return rows } - private func fetchAttachment(transaction: YapDatabaseReadTransaction) -> TSAttachment? { + private func fetchAttachment(transaction: SDSAnyReadTransaction) -> TSAttachment? { // TODO: Support multi-image messages. guard let attachmentId = message.attachmentIds.firstObject as? String else { return nil } - guard let attachment = TSAttachment.anyFetch(uniqueId: attachmentId, transaction: transaction.asAnyRead) else { + guard let attachment = TSAttachment.anyFetch(uniqueId: attachmentId, transaction: transaction) else { Logger.warn("Missing attachment. Was it deleted?") return nil } @@ -562,12 +570,12 @@ class MessageDetailViewController: OWSViewController { AssertIsOnMainThread() - try self.uiDatabaseConnection.read { transaction in + try databaseStorage.uiReadThrows { transaction in guard let uniqueId = self.message.uniqueId else { Logger.error("Message is missing uniqueId.") return } - guard let newMessage = TSInteraction.anyFetch(uniqueId: uniqueId, transaction: transaction.asAnyRead) as? TSMessage else { + guard let newMessage = TSInteraction.anyFetch(uniqueId: uniqueId, transaction: transaction) as? TSMessage else { Logger.error("Message was deleted") throw DetailViewError.messageWasDeleted } diff --git a/Signal/src/util/Pastelog.m b/Signal/src/util/Pastelog.m index 902828f874..362e655673 100644 --- a/Signal/src/util/Pastelog.m +++ b/Signal/src/util/Pastelog.m @@ -15,6 +15,7 @@ #import #import #import +#import #import #import #import @@ -597,9 +598,8 @@ typedef void (^DebugLogUploadFailure)(DebugLogUploader *uploader, NSError *error DispatchMainThreadSafe(^{ __block TSThread *thread = nil; - [OWSPrimaryStorage.dbReadWriteConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { - thread = [TSContactThread getOrCreateThreadWithContactAddress:recipientAddress - transaction:transaction.asAnyWrite]; + [self.databaseStorage writeWithBlock:^(SDSAnyWriteTransaction *transaction) { + thread = [TSContactThread getOrCreateThreadWithContactAddress:recipientAddress transaction:transaction]; }]; [self.databaseStorage readWithBlock:^(SDSAnyReadTransaction *transaction) { [ThreadUtil enqueueMessageWithText:url.absoluteString diff --git a/SignalMessaging/ViewControllers/SelectThreadViewController.m b/SignalMessaging/ViewControllers/SelectThreadViewController.m index e993503223..f30193cebc 100644 --- a/SignalMessaging/ViewControllers/SelectThreadViewController.m +++ b/SignalMessaging/ViewControllers/SelectThreadViewController.m @@ -47,6 +47,15 @@ NS_ASSUME_NONNULL_BEGIN @implementation SelectThreadViewController +#pragma mark - Dependencies + +- (SDSDatabaseStorage *)databaseStorage +{ + return SDSDatabaseStorage.shared; +} + +#pragma mark - + - (void)loadView { [super loadView]; @@ -209,12 +218,11 @@ NS_ASSUME_NONNULL_BEGIN if (!cell.hasAccessoryText) { // Don't add a disappearing messages indicator if we've already added a "blocked" label. __block OWSDisappearingMessagesConfiguration *disappearingMessagesConfiguration; - [self.uiDatabaseConnection - readWithBlock:^(YapDatabaseReadTransaction *_Nonnull transaction) { - disappearingMessagesConfiguration = [OWSDisappearingMessagesConfiguration - anyFetchWithUniqueId:thread.uniqueId - transaction:transaction.asAnyRead]; - }]; + [strongSelf.databaseStorage uiReadWithBlock:^(SDSAnyReadTransaction *transaction) { + disappearingMessagesConfiguration = + [OWSDisappearingMessagesConfiguration anyFetchWithUniqueId:thread.uniqueId + transaction:transaction]; + }]; if (disappearingMessagesConfiguration && disappearingMessagesConfiguration.isEnabled) { DisappearingTimerConfigurationView *disappearingTimerConfigurationView = @@ -327,9 +335,9 @@ NS_ASSUME_NONNULL_BEGIN } __block TSThread *thread = nil; - [OWSPrimaryStorage.dbReadWriteConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { + [self.databaseStorage writeWithBlock:^(SDSAnyWriteTransaction *transaction) { thread = [TSContactThread getOrCreateThreadWithContactAddress:signalAccount.recipientAddress - transaction:transaction.asAnyWrite]; + transaction:transaction]; }]; OWSAssertDebug(thread); diff --git a/SignalMessaging/ViewModels/ContactShareViewModel.swift b/SignalMessaging/ViewModels/ContactShareViewModel.swift index 35350a21d6..f7f6db7257 100644 --- a/SignalMessaging/ViewModels/ContactShareViewModel.swift +++ b/SignalMessaging/ViewModels/ContactShareViewModel.swift @@ -40,8 +40,8 @@ public class ContactShareViewModel: NSObject { } @objc - public convenience init(contactShareRecord: OWSContact, transaction: YapDatabaseReadTransaction) { - if let avatarAttachment = contactShareRecord.avatarAttachment(with: transaction.asAnyRead) as? TSAttachmentStream { + public convenience init(contactShareRecord: OWSContact, transaction: SDSAnyReadTransaction) { + if let avatarAttachment = contactShareRecord.avatarAttachment(with: transaction) as? TSAttachmentStream { self.init(contactShareRecord: contactShareRecord, avatarImageData: avatarAttachment.validStillImageData()) } else { self.init(contactShareRecord: contactShareRecord, avatarImageData: nil) diff --git a/SignalMessaging/Views/ContactCellView.m b/SignalMessaging/Views/ContactCellView.m index 2b2b31c245..69182182e7 100644 --- a/SignalMessaging/Views/ContactCellView.m +++ b/SignalMessaging/Views/ContactCellView.m @@ -8,8 +8,8 @@ #import "UIFont+OWS.h" #import "UIView+OWS.h" #import -#import #import +#import #import #import #import @@ -53,11 +53,9 @@ const CGFloat kContactCellAvatarTextMargin = 12; return Environment.shared.contactsManager; } -- (OWSPrimaryStorage *)primaryStorage +- (SDSDatabaseStorage *)databaseStorage { - OWSAssertDebug(SSKEnvironment.shared.primaryStorage); - - return SSKEnvironment.shared.primaryStorage; + return SDSDatabaseStorage.shared; } - (TSAccountManager *)tsAccountManager @@ -129,8 +127,8 @@ const CGFloat kContactCellAvatarTextMargin = 12; self.address = address; - [self.primaryStorage.dbReadConnection readWithBlock:^(YapDatabaseReadTransaction *transaction) { - self.thread = [TSContactThread getThreadWithContactAddress:address transaction:transaction.asAnyRead]; + [self.databaseStorage readWithBlock:^(SDSAnyReadTransaction *transaction) { + self.thread = [TSContactThread getThreadWithContactAddress:address transaction:transaction]; }]; [[NSNotificationCenter defaultCenter] addObserver:self diff --git a/SignalMessaging/utils/ThreadUtil.m b/SignalMessaging/utils/ThreadUtil.m index 63a471d2dd..0ca81999ab 100644 --- a/SignalMessaging/utils/ThreadUtil.m +++ b/SignalMessaging/utils/ThreadUtil.m @@ -742,50 +742,15 @@ typedef void (^BuildOutgoingMessageCompletionBlock)(TSOutgoingMessage *savedMess { OWSLogInfo(@""); - [OWSPrimaryStorage.sharedManager.newDatabaseConnection - readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { - [self removeAllObjectsInCollection:[TSThread collection] class:[TSThread class] transaction:transaction]; - [self removeAllObjectsInCollection:[TSInteraction collection] - class:[TSInteraction class] - transaction:transaction]; - [self removeAllObjectsInCollection:[TSAttachment collection] - class:[TSAttachment class] - transaction:transaction]; - [self removeAllObjectsInCollection:[SignalRecipient collection] - class:[SignalRecipient class] - transaction:transaction]; - }]; + [self.databaseStorage writeWithBlock:^(SDSAnyWriteTransaction *transaction) { + [TSThread anyRemoveAllWithInstantationWithTransaction:transaction]; + [TSInteraction anyRemoveAllWithInstantationWithTransaction:transaction]; + [TSAttachment anyRemoveAllWithInstantationWithTransaction:transaction]; + [SignalRecipient anyRemoveAllWithInstantationWithTransaction:transaction]; + }]; [TSAttachmentStream deleteAttachments]; } -+ (void)removeAllObjectsInCollection:(NSString *)collection - class:(Class) class - transaction:(YapDatabaseReadWriteTransaction *)transaction { - OWSAssertDebug(collection.length > 0); - OWSAssertDebug(class); - OWSAssertDebug(transaction); - - NSArray *_Nullable uniqueIds = [transaction allKeysInCollection:collection]; - if (!uniqueIds) { - OWSFailDebug(@"couldn't load uniqueIds for collection: %@.", collection); - return; - } - OWSLogInfo(@"Deleting %lu objects from: %@", (unsigned long)uniqueIds.count, collection); - NSUInteger count = 0; - for (NSString *uniqueId in uniqueIds) { - // We need to fetch each object, since [TSYapDatabaseObject removeWithTransaction:] sometimes does important - // work. - TSYapDatabaseObject *_Nullable object = [class fetchObjectWithUniqueID:uniqueId transaction:transaction]; - if (!object) { - OWSFailDebug(@"couldn't load object for deletion: %@.", collection); - continue; - } - [object removeWithTransaction:transaction]; - count++; - }; - OWSLogInfo(@"Deleted %lu/%lu objects from: %@", (unsigned long)count, (unsigned long)uniqueIds.count, collection); -} - #pragma mark - Find Content + (nullable TSInteraction *)findInteractionInThreadByTimestamp:(uint64_t)timestamp diff --git a/SignalServiceKit/src/Contacts/OWSDisappearingMessagesConfiguration.h b/SignalServiceKit/src/Contacts/OWSDisappearingMessagesConfiguration.h index 75b6454ae8..e027c39d1d 100644 --- a/SignalServiceKit/src/Contacts/OWSDisappearingMessagesConfiguration.h +++ b/SignalServiceKit/src/Contacts/OWSDisappearingMessagesConfiguration.h @@ -37,6 +37,9 @@ NS_SWIFT_NAME(init(uniqueId:durationSeconds:enabled:)); @property (nonatomic, readonly) NSUInteger durationIndex; @property (nonatomic, readonly) NSString *durationString; @property (nonatomic, readonly) BOOL dictionaryValueDidChange; + +// GRDB TODO: We might be able to find a better way to avoid saving defaults +// than isNewRecord. @property (readonly, getter=isNewRecord) BOOL newRecord; + (instancetype)fetchOrBuildDefaultWithThreadId:(NSString *)threadId transaction:(SDSAnyReadTransaction *)transaction; diff --git a/SignalServiceKit/src/Contacts/OWSDisappearingMessagesConfiguration.m b/SignalServiceKit/src/Contacts/OWSDisappearingMessagesConfiguration.m index 96aa9e6b54..a26162d829 100644 --- a/SignalServiceKit/src/Contacts/OWSDisappearingMessagesConfiguration.m +++ b/SignalServiceKit/src/Contacts/OWSDisappearingMessagesConfiguration.m @@ -159,6 +159,23 @@ NS_ASSUME_NONNULL_BEGIN - (void)saveWithTransaction:(YapDatabaseReadWriteTransaction *)transaction { [super saveWithTransaction:transaction]; + + self.originalDictionaryValue = [self dictionaryValue]; + self.newRecord = NO; +} + +- (void)anyDidInsertWithTransaction:(SDSAnyWriteTransaction *)transaction +{ + [super anyDidInsertWithTransaction:transaction]; + + self.originalDictionaryValue = [self dictionaryValue]; + self.newRecord = NO; +} + +- (void)anyDidUpdateWithTransaction:(SDSAnyWriteTransaction *)transaction +{ + [super anyDidUpdateWithTransaction:transaction]; + self.originalDictionaryValue = [self dictionaryValue]; self.newRecord = NO; } diff --git a/SignalServiceKit/src/Messages/Attachments/TSAttachmentPointer.m b/SignalServiceKit/src/Messages/Attachments/TSAttachmentPointer.m index faa15c43e5..f83ce5c14a 100644 --- a/SignalServiceKit/src/Messages/Attachments/TSAttachmentPointer.m +++ b/SignalServiceKit/src/Messages/Attachments/TSAttachmentPointer.m @@ -291,12 +291,32 @@ NS_ASSUME_NONNULL_BEGIN }]; } -// TODO: We could add a similar check to the GRDB insert logic. - (void)ydb_saveWithTransaction:(YapDatabaseReadWriteTransaction *)transaction +{ + [self checkForStreamOverwrite:transaction.asAnyRead]; + + [super ydb_saveWithTransaction:transaction]; +} + +- (void)anyWillInsertWithTransaction:(SDSAnyWriteTransaction *)transaction +{ + [super anyWillInsertWithTransaction:transaction]; + + [self checkForStreamOverwrite:transaction]; +} + +- (void)anyWillUpdateWithTransaction:(SDSAnyWriteTransaction *)transaction +{ + [super anyWillUpdateWithTransaction:transaction]; + + [self checkForStreamOverwrite:transaction]; +} + +- (void)checkForStreamOverwrite:(SDSAnyReadTransaction *)transaction { #ifdef DEBUG if (self.uniqueId.length > 0) { - id _Nullable oldObject = [transaction objectForKey:self.uniqueId inCollection:TSAttachment.collection]; + TSAttachment *_Nullable oldObject = [TSAttachment anyFetchWithUniqueId:self.uniqueId transaction:transaction]; if ([oldObject isKindOfClass:[TSAttachmentStream class]]) { OWSFailDebug(@"We should never overwrite a TSAttachmentStream with a TSAttachmentPointer."); } @@ -304,8 +324,6 @@ NS_ASSUME_NONNULL_BEGIN OWSFailDebug(@"Missing uniqueId."); } #endif - - [super ydb_saveWithTransaction:transaction]; } @end diff --git a/SignalServiceKit/src/Messages/DeviceSyncing/OWSSyncGroupsMessage.h b/SignalServiceKit/src/Messages/DeviceSyncing/OWSSyncGroupsMessage.h index 5e74f29750..ec5bc80410 100644 --- a/SignalServiceKit/src/Messages/DeviceSyncing/OWSSyncGroupsMessage.h +++ b/SignalServiceKit/src/Messages/DeviceSyncing/OWSSyncGroupsMessage.h @@ -7,7 +7,6 @@ NS_ASSUME_NONNULL_BEGIN @class SDSAnyReadTransaction; -@class YapDatabaseReadTransaction; @interface OWSSyncGroupsMessage : OWSOutgoingSyncMessage diff --git a/SignalServiceKit/src/Messages/Interactions/TSErrorMessage.h b/SignalServiceKit/src/Messages/Interactions/TSErrorMessage.h index 063d878766..0e2ae046f0 100644 --- a/SignalServiceKit/src/Messages/Interactions/TSErrorMessage.h +++ b/SignalServiceKit/src/Messages/Interactions/TSErrorMessage.h @@ -97,16 +97,16 @@ NS_SWIFT_NAME(init(uniqueId:receivedAtTimestamp:sortId:timestamp:uniqueThreadId: // --- CODE GENERATION MARKER + (instancetype)corruptedMessageWithEnvelope:(SSKProtoEnvelope *)envelope - withTransaction:(YapDatabaseReadWriteTransaction *)transaction; + withTransaction:(SDSAnyWriteTransaction *)transaction; + (instancetype)invalidVersionWithEnvelope:(SSKProtoEnvelope *)envelope - withTransaction:(YapDatabaseReadWriteTransaction *)transaction; + withTransaction:(SDSAnyWriteTransaction *)transaction; + (instancetype)invalidKeyExceptionWithEnvelope:(SSKProtoEnvelope *)envelope - withTransaction:(YapDatabaseReadWriteTransaction *)transaction; + withTransaction:(SDSAnyWriteTransaction *)transaction; + (instancetype)missingSessionWithEnvelope:(SSKProtoEnvelope *)envelope - withTransaction:(YapDatabaseReadWriteTransaction *)transaction; + withTransaction:(SDSAnyWriteTransaction *)transaction; + (instancetype)nonblockingIdentityChangeInThread:(TSThread *)thread address:(SignalServiceAddress *)address; diff --git a/SignalServiceKit/src/Messages/Interactions/TSErrorMessage.m b/SignalServiceKit/src/Messages/Interactions/TSErrorMessage.m index 98ff8528ff..f29ba29b2c 100644 --- a/SignalServiceKit/src/Messages/Interactions/TSErrorMessage.m +++ b/SignalServiceKit/src/Messages/Interactions/TSErrorMessage.m @@ -10,7 +10,6 @@ #import "TSErrorMessage_privateConstructor.h" #import #import -#import NS_ASSUME_NONNULL_BEGIN @@ -138,11 +137,11 @@ NSUInteger TSErrorMessageSchemaVersion = 2; } - (instancetype)initWithEnvelope:(SSKProtoEnvelope *)envelope - withTransaction:(YapDatabaseReadWriteTransaction *)transaction + withTransaction:(SDSAnyWriteTransaction *)transaction failedMessageType:(TSErrorMessageType)errorMessageType { - TSContactThread *contactThread = [TSContactThread getOrCreateThreadWithContactAddress:envelope.sourceAddress - transaction:transaction.asAnyWrite]; + TSContactThread *contactThread = + [TSContactThread getOrCreateThreadWithContactAddress:envelope.sourceAddress transaction:transaction]; // Legit usage of senderTimestamp. We don't actually currently surface it in the UI, but it serves as // a reference to the envelope which we failed to process. @@ -262,7 +261,7 @@ perMessageExpirationDurationSeconds:perMessageExpirationDurationSeconds } + (instancetype)corruptedMessageWithEnvelope:(SSKProtoEnvelope *)envelope - withTransaction:(YapDatabaseReadWriteTransaction *)transaction + withTransaction:(SDSAnyWriteTransaction *)transaction { return [[self alloc] initWithEnvelope:envelope withTransaction:transaction @@ -270,7 +269,7 @@ perMessageExpirationDurationSeconds:perMessageExpirationDurationSeconds } + (instancetype)invalidVersionWithEnvelope:(SSKProtoEnvelope *)envelope - withTransaction:(YapDatabaseReadWriteTransaction *)transaction + withTransaction:(SDSAnyWriteTransaction *)transaction { return [[self alloc] initWithEnvelope:envelope withTransaction:transaction @@ -278,7 +277,7 @@ perMessageExpirationDurationSeconds:perMessageExpirationDurationSeconds } + (instancetype)invalidKeyExceptionWithEnvelope:(SSKProtoEnvelope *)envelope - withTransaction:(YapDatabaseReadWriteTransaction *)transaction + withTransaction:(SDSAnyWriteTransaction *)transaction { return [[self alloc] initWithEnvelope:envelope withTransaction:transaction @@ -286,7 +285,7 @@ perMessageExpirationDurationSeconds:perMessageExpirationDurationSeconds } + (instancetype)missingSessionWithEnvelope:(SSKProtoEnvelope *)envelope - withTransaction:(YapDatabaseReadWriteTransaction *)transaction + withTransaction:(SDSAnyWriteTransaction *)transaction { return [[self alloc] initWithEnvelope:envelope withTransaction:transaction failedMessageType:TSErrorMessageNoSession]; diff --git a/SignalServiceKit/src/Messages/Interactions/TSIncomingMessage.h b/SignalServiceKit/src/Messages/Interactions/TSIncomingMessage.h index 056c152b43..7ba8a1f20c 100644 --- a/SignalServiceKit/src/Messages/Interactions/TSIncomingMessage.h +++ b/SignalServiceKit/src/Messages/Interactions/TSIncomingMessage.h @@ -106,19 +106,6 @@ NS_SWIFT_NAME(init(uniqueId:receivedAtTimestamp:sortId:timestamp:uniqueThreadId: - (instancetype)initWithCoder:(NSCoder *)coder NS_DESIGNATED_INITIALIZER; -/* - * Find a message matching the senderId and timestamp, if any. - * - * @param authorId - * Signal ID (i.e. e164) of the user who sent the message - * @params timestamp - * When the message was created in milliseconds since epoch - * - */ -+ (nullable instancetype)findMessageWithAddress:(SignalServiceAddress *)address - timestamp:(uint64_t)timestamp - transaction:(YapDatabaseReadWriteTransaction *)transaction; - // This will be 0 for messages created before we were tracking sourceDeviceId @property (nonatomic, readonly) UInt32 sourceDeviceId; diff --git a/SignalServiceKit/src/Messages/Interactions/TSIncomingMessage.m b/SignalServiceKit/src/Messages/Interactions/TSIncomingMessage.m index 41e4778054..378b7a8a47 100644 --- a/SignalServiceKit/src/Messages/Interactions/TSIncomingMessage.m +++ b/SignalServiceKit/src/Messages/Interactions/TSIncomingMessage.m @@ -13,7 +13,6 @@ #import "TSGroupThread.h" #import #import -#import NS_ASSUME_NONNULL_BEGIN @@ -165,46 +164,15 @@ perMessageExpirationDurationSeconds:perMessageExpirationDurationSeconds // --- CODE GENERATION MARKER -+ (nullable instancetype)findMessageWithAddress:(SignalServiceAddress *)address - timestamp:(uint64_t)timestamp - transaction:(YapDatabaseReadWriteTransaction *)transaction -{ - OWSAssertDebug(transaction); - - __block TSIncomingMessage *foundMessage; - // In theory we could build a new secondaryIndex for (authorId,timestamp), but in practice there should - // be *very* few (millisecond) timestamps with multiple authors. - [TSDatabaseSecondaryIndexes - enumerateMessagesWithTimestamp:timestamp - withBlock:^(NSString *collection, NSString *key, BOOL *stop) { - TSInteraction *_Nullable interaction = - [TSInteraction anyFetchWithUniqueId:key transaction:transaction.asAnyRead]; - if ([interaction isKindOfClass:[TSIncomingMessage class]]) { - TSIncomingMessage *message = (TSIncomingMessage *)interaction; - - OWSAssertDebug(message.authorAddress.isValid); - - if ([message.authorAddress isEqualToAddress:address]) { - foundMessage = message; - } - } - } - usingTransaction:transaction]; - - return foundMessage; -} - - - (OWSInteractionType)interactionType { return OWSInteractionType_IncomingMessage; } -- (BOOL)shouldStartExpireTimerWithTransaction:(YapDatabaseReadTransaction *)transaction +- (BOOL)shouldStartExpireTimerWithTransaction:(SDSAnyReadTransaction *)transaction { for (NSString *attachmentId in self.attachmentIds) { - TSAttachment *_Nullable attachment = - [TSAttachment anyFetchWithUniqueId:attachmentId transaction:transaction.asAnyRead]; + TSAttachment *_Nullable attachment = [TSAttachment anyFetchWithUniqueId:attachmentId transaction:transaction]; if ([attachment isKindOfClass:[TSAttachmentPointer class]]) { return NO; } diff --git a/SignalServiceKit/src/Messages/Interactions/TSInfoMessage.m b/SignalServiceKit/src/Messages/Interactions/TSInfoMessage.m index 8d748a528c..c4e92df1fa 100644 --- a/SignalServiceKit/src/Messages/Interactions/TSInfoMessage.m +++ b/SignalServiceKit/src/Messages/Interactions/TSInfoMessage.m @@ -7,7 +7,6 @@ #import "SSKEnvironment.h" #import #import -#import NS_ASSUME_NONNULL_BEGIN diff --git a/SignalServiceKit/src/Messages/Interactions/TSMessage.h b/SignalServiceKit/src/Messages/Interactions/TSMessage.h index 3b62f05f67..4fb2fec1fc 100644 --- a/SignalServiceKit/src/Messages/Interactions/TSMessage.h +++ b/SignalServiceKit/src/Messages/Interactions/TSMessage.h @@ -110,7 +110,7 @@ NS_SWIFT_NAME(init(uniqueId:receivedAtTimestamp:sortId:timestamp:uniqueThreadId: - (nullable NSString *)oversizeTextWithTransaction:(SDSAnyReadTransaction *)transaction; - (nullable NSString *)bodyTextWithTransaction:(SDSAnyReadTransaction *)transaction; -- (BOOL)shouldStartExpireTimerWithTransaction:(YapDatabaseReadTransaction *)transaction; +- (BOOL)shouldStartExpireTimerWithTransaction:(SDSAnyReadTransaction *)transaction; - (BOOL)hasRenderableContent; diff --git a/SignalServiceKit/src/Messages/Interactions/TSMessage.m b/SignalServiceKit/src/Messages/Interactions/TSMessage.m index 9455c38d07..3cee256143 100644 --- a/SignalServiceKit/src/Messages/Interactions/TSMessage.m +++ b/SignalServiceKit/src/Messages/Interactions/TSMessage.m @@ -14,8 +14,6 @@ #import #import #import -#import -#import NS_ASSUME_NONNULL_BEGIN @@ -240,7 +238,7 @@ perMessageExpirationDurationSeconds:(unsigned int)perMessageExpirationDurationSe [self updateExpiresAt]; } -- (BOOL)shouldStartExpireTimerWithTransaction:(YapDatabaseReadTransaction *)transaction +- (BOOL)shouldStartExpireTimerWithTransaction:(SDSAnyReadTransaction *)transaction { return self.hasPerConversationExpiration; } @@ -467,16 +465,13 @@ perMessageExpirationDurationSeconds:(unsigned int)perMessageExpirationDurationSe return NSLocalizedString( @"STICKER_MESSAGE_PREVIEW", @"Preview text shown in notifications and home view for sticker messages."); } else { - if (transaction.transitional_yapReadTransaction) { - // some cases aren't yet handled by GRDB - OWSFailDebug(@"message has neither body nor attachment."); - } + OWSFailDebug(@"message has no renderable content."); // TODO: We should do better here. return @""; } } -// TODO: Convert to Any. +// GRDB TODO: Convert to Any. - (void)saveWithTransaction:(YapDatabaseReadWriteTransaction *)transaction { // StickerManager does reference counting of "known" sticker packs. @@ -492,7 +487,7 @@ perMessageExpirationDurationSeconds:(unsigned int)perMessageExpirationDurationSe [super saveWithTransaction:transaction]; } -// TODO: Convert to Any. +// GRDB TODO: Convert to Any. - (void)removeWithTransaction:(YapDatabaseReadWriteTransaction *)transaction { // StickerManager does reference counting of "known" sticker packs. diff --git a/SignalServiceKit/src/Messages/Interactions/TSOutgoingMessage.m b/SignalServiceKit/src/Messages/Interactions/TSOutgoingMessage.m index bb0ebdab06..059e4d3187 100644 --- a/SignalServiceKit/src/Messages/Interactions/TSOutgoingMessage.m +++ b/SignalServiceKit/src/Messages/Interactions/TSOutgoingMessage.m @@ -627,7 +627,7 @@ perMessageExpirationDurationSeconds:perMessageExpirationDurationSeconds _storedMessageState = self.messageState; } -- (BOOL)shouldStartExpireTimerWithTransaction:(YapDatabaseReadTransaction *)transaction +- (BOOL)shouldStartExpireTimerWithTransaction:(SDSAnyReadTransaction *)transaction { // It's not clear if we should wait until _all_ recipients have reached "sent or later" // (which could never occur if one group member is unregistered) or only wait until diff --git a/SignalServiceKit/src/Messages/InvalidKeyMessages/TSInvalidIdentityKeyReceivingErrorMessage.h b/SignalServiceKit/src/Messages/InvalidKeyMessages/TSInvalidIdentityKeyReceivingErrorMessage.h index d48ddfdea8..7a9923bcd0 100644 --- a/SignalServiceKit/src/Messages/InvalidKeyMessages/TSInvalidIdentityKeyReceivingErrorMessage.h +++ b/SignalServiceKit/src/Messages/InvalidKeyMessages/TSInvalidIdentityKeyReceivingErrorMessage.h @@ -50,7 +50,7 @@ NS_SWIFT_NAME(init(uniqueId:receivedAtTimestamp:sortId:timestamp:uniqueThreadId: #ifdef DEBUG + (nullable instancetype)untrustedKeyWithEnvelope:(SSKProtoEnvelope *)envelope - withTransaction:(YapDatabaseReadWriteTransaction *)transaction; + withTransaction:(SDSAnyWriteTransaction *)transaction; #endif @end diff --git a/SignalServiceKit/src/Messages/InvalidKeyMessages/TSInvalidIdentityKeyReceivingErrorMessage.m b/SignalServiceKit/src/Messages/InvalidKeyMessages/TSInvalidIdentityKeyReceivingErrorMessage.m index a1530f67d1..a1098dd5e2 100644 --- a/SignalServiceKit/src/Messages/InvalidKeyMessages/TSInvalidIdentityKeyReceivingErrorMessage.m +++ b/SignalServiceKit/src/Messages/InvalidKeyMessages/TSInvalidIdentityKeyReceivingErrorMessage.m @@ -37,10 +37,10 @@ __attribute__((deprecated)) @interface TSInvalidIdentityKeyReceivingErrorMessage // We no longer create these messages, but they might exist on legacy clients so it's useful to be able to // create them with the debug UI + (nullable instancetype)untrustedKeyWithEnvelope:(SSKProtoEnvelope *)envelope - withTransaction:(YapDatabaseReadWriteTransaction *)transaction + withTransaction:(SDSAnyWriteTransaction *)transaction { - TSContactThread *contactThread = [TSContactThread getOrCreateThreadWithContactAddress:envelope.sourceAddress - transaction:transaction.asAnyWrite]; + TSContactThread *contactThread = + [TSContactThread getOrCreateThreadWithContactAddress:envelope.sourceAddress transaction:transaction]; // Legit usage of senderTimestamp, references message which failed to decrypt TSInvalidIdentityKeyReceivingErrorMessage *errorMessage = diff --git a/SignalServiceKit/src/Messages/OWSDisappearingMessagesFinder.m b/SignalServiceKit/src/Messages/OWSDisappearingMessagesFinder.m index bd1e36128f..a12deb1c13 100644 --- a/SignalServiceKit/src/Messages/OWSDisappearingMessagesFinder.m +++ b/SignalServiceKit/src/Messages/OWSDisappearingMessagesFinder.m @@ -74,17 +74,14 @@ static NSString *const OWSDisappearingMessageFinderExpiresAtIndex = @"index_mess OWSAssertDebug([object isKindOfClass:[TSOutgoingMessage class]] || [object isKindOfClass:[TSIncomingMessage class]]); TSMessage *message = (TSMessage *)object; - if (transaction.transitional_yapReadTransaction) { - if ([message shouldStartExpireTimerWithTransaction: - transaction.transitional_yapReadTransaction]) { - if ([message isKindOfClass:[TSIncomingMessage class]]) { - TSIncomingMessage *incomingMessage = (TSIncomingMessage *)message; - if (!incomingMessage.wasRead) { - return; - } + if ([message shouldStartExpireTimerWithTransaction:transaction]) { + if ([message isKindOfClass:[TSIncomingMessage class]]) { + TSIncomingMessage *incomingMessage = (TSIncomingMessage *)message; + if (!incomingMessage.wasRead) { + return; } - [messageIds addObject:key]; } + [messageIds addObject:key]; } }]; @@ -178,11 +175,9 @@ static NSString *const OWSDisappearingMessageFinderExpiresAtIndex = @"index_mess continue; } - if (transaction.transitional_yapReadTransaction) { - if (![message shouldStartExpireTimerWithTransaction:transaction.transitional_yapReadTransaction]) { - OWSFailDebug(@"object: %@ shouldn't expire.", message); - continue; - } + if (![message shouldStartExpireTimerWithTransaction:transaction]) { + OWSFailDebug(@"object: %@ shouldn't expire.", message); + continue; } block(message); @@ -262,7 +257,7 @@ static NSString *const OWSDisappearingMessageFinderExpiresAtIndex = @"index_mess } TSMessage *message = (TSMessage *)object; - if (![message shouldStartExpireTimerWithTransaction:transaction]) { + if (![message shouldStartExpireTimerWithTransaction:transaction.asAnyRead]) { return; } diff --git a/SignalServiceKit/src/Messages/OWSMessageDecrypter.m b/SignalServiceKit/src/Messages/OWSMessageDecrypter.m index a6089120ae..d62fcc7cdd 100644 --- a/SignalServiceKit/src/Messages/OWSMessageDecrypter.m +++ b/SignalServiceKit/src/Messages/OWSMessageDecrypter.m @@ -610,32 +610,21 @@ NSError *EnsureDecryptError(NSError *_Nullable error, NSString *fallbackErrorDes return; } - if (!transaction.transitional_yapWriteTransaction) { - OWSFailDebug(@"GRDB TODO"); - return; - } - if ([exception.name isEqualToString:NoSessionException]) { OWSProdErrorWEnvelope([OWSAnalyticsEvents messageManagerErrorNoSession], envelope); - errorMessage = [TSErrorMessage missingSessionWithEnvelope:envelope - withTransaction:transaction.transitional_yapWriteTransaction]; + errorMessage = [TSErrorMessage missingSessionWithEnvelope:envelope withTransaction:transaction]; } else if ([exception.name isEqualToString:InvalidKeyException]) { OWSProdErrorWEnvelope([OWSAnalyticsEvents messageManagerErrorInvalidKey], envelope); - errorMessage = - [TSErrorMessage invalidKeyExceptionWithEnvelope:envelope - withTransaction:transaction.transitional_yapWriteTransaction]; + errorMessage = [TSErrorMessage invalidKeyExceptionWithEnvelope:envelope withTransaction:transaction]; } else if ([exception.name isEqualToString:InvalidKeyIdException]) { OWSProdErrorWEnvelope([OWSAnalyticsEvents messageManagerErrorInvalidKeyId], envelope); - errorMessage = - [TSErrorMessage invalidKeyExceptionWithEnvelope:envelope - withTransaction:transaction.transitional_yapWriteTransaction]; + errorMessage = [TSErrorMessage invalidKeyExceptionWithEnvelope:envelope withTransaction:transaction]; } else if ([exception.name isEqualToString:DuplicateMessageException]) { // Duplicate messages are silently discarded. return; } else if ([exception.name isEqualToString:InvalidVersionException]) { OWSProdErrorWEnvelope([OWSAnalyticsEvents messageManagerErrorInvalidMessageVersion], envelope); - errorMessage = [TSErrorMessage invalidVersionWithEnvelope:envelope - withTransaction:transaction.transitional_yapWriteTransaction]; + errorMessage = [TSErrorMessage invalidVersionWithEnvelope:envelope withTransaction:transaction]; } else if ([exception.name isEqualToString:UntrustedIdentityKeyException]) { // Should no longer get here, since we now record the new identity for incoming messages. OWSProdErrorWEnvelope([OWSAnalyticsEvents messageManagerErrorUntrustedIdentityKeyException], envelope); @@ -643,8 +632,7 @@ NSError *EnsureDecryptError(NSError *_Nullable error, NSString *fallbackErrorDes return; } else { OWSProdErrorWEnvelope([OWSAnalyticsEvents messageManagerErrorCorruptMessage], envelope); - errorMessage = [TSErrorMessage corruptedMessageWithEnvelope:envelope - withTransaction:transaction.transitional_yapWriteTransaction]; + errorMessage = [TSErrorMessage corruptedMessageWithEnvelope:envelope withTransaction:transaction]; } OWSAssertDebug(errorMessage); diff --git a/SignalServiceKit/src/Messages/OWSMessageUtils.h b/SignalServiceKit/src/Messages/OWSMessageUtils.h index f393a83200..7127e8510e 100644 --- a/SignalServiceKit/src/Messages/OWSMessageUtils.h +++ b/SignalServiceKit/src/Messages/OWSMessageUtils.h @@ -6,7 +6,6 @@ NS_ASSUME_NONNULL_BEGIN @class TSMessage; @class TSThread; -@class YapDatabaseReadTransaction; @interface OWSMessageUtils : NSObject diff --git a/SignalServiceKit/tests/Messages/Interactions/TSOutgoingMessageTest.m b/SignalServiceKit/tests/Messages/Interactions/TSOutgoingMessageTest.m index a4625e9170..42af51fa3f 100644 --- a/SignalServiceKit/tests/Messages/Interactions/TSOutgoingMessageTest.m +++ b/SignalServiceKit/tests/Messages/Interactions/TSOutgoingMessageTest.m @@ -44,7 +44,7 @@ NS_ASSUME_NONNULL_BEGIN quotedMessage:nil contactShare:nil linkPreview:nil]; - [self yapWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { + [self readWithBlock:^(SDSAnyReadTransaction *transaction) { XCTAssertFalse([message shouldStartExpireTimerWithTransaction:transaction]); }]; } @@ -63,7 +63,7 @@ NS_ASSUME_NONNULL_BEGIN quotedMessage:nil contactShare:nil linkPreview:nil]; - [self yapWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { + [self writeWithBlock:^(SDSAnyWriteTransaction *transaction) { [message updateWithSentRecipient:self.contactId wasSentByUD:NO transaction:transaction]; XCTAssertTrue([message shouldStartExpireTimerWithTransaction:transaction]); }]; @@ -83,7 +83,7 @@ NS_ASSUME_NONNULL_BEGIN quotedMessage:nil contactShare:nil linkPreview:nil]; - [self yapWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { + [self readWithBlock:^(SDSAnyReadTransaction *transaction) { XCTAssertFalse([message shouldStartExpireTimerWithTransaction:transaction]); }]; } @@ -102,7 +102,7 @@ NS_ASSUME_NONNULL_BEGIN quotedMessage:nil contactShare:nil linkPreview:nil]; - [self yapWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { + [self writeWithBlock:^(SDSAnyWriteTransaction *transaction) { [message updateWithMarkingAllUnsentRecipientsAsSendingWithTransaction:transaction]; XCTAssertFalse([message shouldStartExpireTimerWithTransaction:transaction]); }];