From daae31d30e06af5ba0e0d6dadf0bdac5ac02520b Mon Sep 17 00:00:00 2001 From: Matthew Chen Date: Wed, 5 Jul 2017 16:58:39 -0400 Subject: [PATCH] Modify TSStorageManager to use separate shared read and write connections. // FREEBIE --- src/Contacts/Contact.m | 13 +++--- src/Contacts/ContactsUpdater.m | 39 +++++++++-------- src/Contacts/SignalRecipient.m | 2 +- src/Contacts/TSThread.m | 10 ++--- src/Contacts/Threads/TSContactThread.m | 2 +- src/Contacts/Threads/TSGroupThread.m | 2 +- src/Devices/OWSReadReceipt.m | 6 ++- src/Devices/OWSReadReceiptsProcessor.m | 3 +- src/Messages/Attachments/TSAttachmentStream.m | 4 +- src/Messages/Interactions/TSIncomingMessage.m | 2 +- src/Messages/Interactions/TSOutgoingMessage.m | 14 +++---- src/Messages/OWSIdentityManager.m | 7 ++-- src/Messages/TSCall.m | 2 +- src/Messages/TSMessagesManager.m | 2 +- src/Security/OWSRecipientIdentity.m | 2 +- .../TSStorageManager+SignedPreKeyStore.m | 2 +- src/Storage/OWSOrphanedDataCleaner.m | 6 ++- src/Storage/TSStorageManager+keyingMaterial.m | 15 ++++--- src/Storage/TSStorageManager.h | 3 +- src/Storage/TSStorageManager.m | 36 ++++++++-------- src/Storage/TSYapDatabaseObject.h | 8 ++-- src/Storage/TSYapDatabaseObject.m | 42 +++++++++++++------ 22 files changed, 123 insertions(+), 99 deletions(-) diff --git a/src/Contacts/Contact.m b/src/Contacts/Contact.m index b941b8279..532b544c6 100644 --- a/src/Contacts/Contact.m +++ b/src/Contacts/Contact.m @@ -244,13 +244,12 @@ NS_ASSUME_NONNULL_BEGIN - (NSArray *)textSecureIdentifiers { __block NSMutableArray *identifiers = [NSMutableArray array]; - [[TSStorageManager sharedManager] - .dbConnection readWithBlock:^(YapDatabaseReadTransaction *transaction) { - for (PhoneNumber *number in self.parsedPhoneNumbers) { - if ([SignalRecipient recipientWithTextSecureIdentifier:number.toE164 withTransaction:transaction]) { - [identifiers addObject:number.toE164]; - } - } + [[TSStorageManager sharedManager].dbReadConnection readWithBlock:^(YapDatabaseReadTransaction *transaction) { + for (PhoneNumber *number in self.parsedPhoneNumbers) { + if ([SignalRecipient recipientWithTextSecureIdentifier:number.toE164 withTransaction:transaction]) { + [identifiers addObject:number.toE164]; + } + } }]; return [identifiers copy]; } diff --git a/src/Contacts/ContactsUpdater.m b/src/Contacts/ContactsUpdater.m index 788de45ba..cf1be99e5 100644 --- a/src/Contacts/ContactsUpdater.m +++ b/src/Contacts/ContactsUpdater.m @@ -122,11 +122,11 @@ NS_ASSUME_NONNULL_BEGIN } NSMutableSet *recipientIds = [NSMutableSet set]; - [[TSStorageManager sharedManager] - .dbConnection readWithBlock:^(YapDatabaseReadTransaction *_Nonnull transaction) { - NSArray *allRecipientKeys = [transaction allKeysInCollection:[SignalRecipient collection]]; - [recipientIds addObjectsFromArray:allRecipientKeys]; - }]; + [[TSStorageManager sharedManager].dbReadConnection + readWithBlock:^(YapDatabaseReadTransaction *_Nonnull transaction) { + NSArray *allRecipientKeys = [transaction allKeysInCollection:[SignalRecipient collection]]; + [recipientIds addObjectsFromArray:allRecipientKeys]; + }]; NSMutableSet *allContacts = [[abPhoneNumbers setByAddingObjectsFromSet:recipientIds] mutableCopy]; @@ -135,7 +135,7 @@ NS_ASSUME_NONNULL_BEGIN [recipientIds minusSet:matchedIds]; // Cleaning up unregistered identifiers - [[TSStorageManager sharedManager].dbConnection + [[TSStorageManager sharedManager].dbReadWriteConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { for (NSString *identifier in recipientIds) { SignalRecipient *recipient = @@ -185,23 +185,22 @@ NS_ASSUME_NONNULL_BEGIN } // Insert or update contact attributes - [[TSStorageManager sharedManager] - .dbConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { - for (NSString *identifier in attributesForIdentifier) { - SignalRecipient *recipient = - [SignalRecipient recipientWithTextSecureIdentifier:identifier withTransaction:transaction]; - if (!recipient) { - recipient = [[SignalRecipient alloc] initWithTextSecureIdentifier:identifier - relay:nil]; - } + [[TSStorageManager sharedManager].dbReadWriteConnection + readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { + for (NSString *identifier in attributesForIdentifier) { + SignalRecipient *recipient = + [SignalRecipient recipientWithTextSecureIdentifier:identifier withTransaction:transaction]; + if (!recipient) { + recipient = [[SignalRecipient alloc] initWithTextSecureIdentifier:identifier relay:nil]; + } - NSDictionary *attributes = [attributesForIdentifier objectForKey:identifier]; + NSDictionary *attributes = [attributesForIdentifier objectForKey:identifier]; - recipient.relay = attributes[@"relay"]; + recipient.relay = attributes[@"relay"]; - [recipient saveWithTransaction:transaction]; - } - }]; + [recipient saveWithTransaction:transaction]; + } + }]; success([NSSet setWithArray:attributesForIdentifier.allKeys]); } diff --git a/src/Contacts/SignalRecipient.m b/src/Contacts/SignalRecipient.m index 079489466..68c6e313c 100644 --- a/src/Contacts/SignalRecipient.m +++ b/src/Contacts/SignalRecipient.m @@ -37,7 +37,7 @@ NS_ASSUME_NONNULL_BEGIN + (nullable instancetype)recipientWithTextSecureIdentifier:(NSString *)textSecureIdentifier { __block SignalRecipient *recipient; - [self.dbConnection readWithBlock:^(YapDatabaseReadTransaction *_Nonnull transaction) { + [self.dbReadConnection readWithBlock:^(YapDatabaseReadTransaction *_Nonnull transaction) { recipient = [self recipientWithTextSecureIdentifier:textSecureIdentifier withTransaction:transaction]; }]; return recipient; diff --git a/src/Contacts/TSThread.m b/src/Contacts/TSThread.m index 8715f8f0a..371b21f18 100644 --- a/src/Contacts/TSThread.m +++ b/src/Contacts/TSThread.m @@ -131,7 +131,7 @@ NS_ASSUME_NONNULL_BEGIN */ - (void)enumerateInteractionsUsingBlock:(void (^)(TSInteraction *interaction))block { - [self.dbConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { + [self.dbReadWriteConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { [self enumerateInteractionsWithTransaction:transaction usingBlock:^( TSInteraction *interaction, YapDatabaseReadTransaction *transaction) { @@ -172,7 +172,7 @@ NS_ASSUME_NONNULL_BEGIN - (NSUInteger)numberOfInteractions { __block NSUInteger count; - [[self dbConnection] readWithBlock:^(YapDatabaseReadTransaction *_Nonnull transaction) { + [[self dbReadConnection] readWithBlock:^(YapDatabaseReadTransaction *_Nonnull transaction) { YapDatabaseViewTransaction *interactionsByThread = [transaction ext:TSMessageDatabaseViewExtensionName]; count = [interactionsByThread numberOfItemsInGroup:self.uniqueId]; }]; @@ -237,7 +237,7 @@ NS_ASSUME_NONNULL_BEGIN - (TSInteraction *) lastInteraction { __block TSInteraction *last; - [TSStorageManager.sharedManager.dbConnection readWithBlock:^(YapDatabaseReadTransaction *transaction){ + [TSStorageManager.sharedManager.dbReadConnection readWithBlock:^(YapDatabaseReadTransaction *transaction) { last = [[transaction ext:TSMessageDatabaseViewExtensionName] lastObjectInGroup:self.uniqueId]; }]; return last; @@ -246,7 +246,7 @@ NS_ASSUME_NONNULL_BEGIN - (TSInteraction *)lastInteractionForInbox { __block TSInteraction *last = nil; - [TSStorageManager.sharedManager.dbConnection readWithBlock:^(YapDatabaseReadTransaction *transaction) { + [TSStorageManager.sharedManager.dbReadConnection readWithBlock:^(YapDatabaseReadTransaction *transaction) { [[transaction ext:TSMessageDatabaseViewExtensionName] enumerateRowsInGroup:self.uniqueId withOptions:NSEnumerationReverse @@ -397,7 +397,7 @@ NS_ASSUME_NONNULL_BEGIN - (void)updateWithMutedUntilDate:(NSDate *)mutedUntilDate { - [self.dbConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { + [self.dbReadWriteConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { [self applyChangeToSelfAndLatestThread:transaction changeBlock:^(TSThread *thread) { [thread setMutedUntilDate:mutedUntilDate]; diff --git a/src/Contacts/Threads/TSContactThread.m b/src/Contacts/Threads/TSContactThread.m index e49616cc4..58b4401de 100644 --- a/src/Contacts/Threads/TSContactThread.m +++ b/src/Contacts/Threads/TSContactThread.m @@ -76,7 +76,7 @@ NS_ASSUME_NONNULL_BEGIN OWSAssert(contactId.length > 0); __block TSContactThread *thread; - [[self dbConnection] readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { + [[self dbReadWriteConnection] readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { thread = [self getOrCreateThreadWithContactId:contactId transaction:transaction]; }]; diff --git a/src/Contacts/Threads/TSGroupThread.m b/src/Contacts/Threads/TSGroupThread.m index ac48250d8..d5448c731 100644 --- a/src/Contacts/Threads/TSGroupThread.m +++ b/src/Contacts/Threads/TSGroupThread.m @@ -91,7 +91,7 @@ NS_ASSUME_NONNULL_BEGIN OWSAssert(groupModel.groupId.length > 0); __block TSGroupThread *thread; - [[self dbConnection] readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { + [[self dbReadWriteConnection] readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { thread = [self getOrCreateThreadWithGroupModel:groupModel transaction:transaction]; }]; return thread; diff --git a/src/Devices/OWSReadReceipt.m b/src/Devices/OWSReadReceipt.m index e6a2bbcfb..280d07abe 100644 --- a/src/Devices/OWSReadReceipt.m +++ b/src/Devices/OWSReadReceipt.m @@ -1,4 +1,6 @@ -// Copyright © 2016 Open Whisper Systems. All rights reserved. +// +// Copyright (c) 2017 Open Whisper Systems. All rights reserved. +// #import "OWSReadReceipt.h" #import @@ -104,7 +106,7 @@ NSString *const OWSReadReceiptColumnSenderId = @"senderId"; stringWithFormat:@"WHERE %@ = ? AND %@ = ?", OWSReadReceiptColumnSenderId, OWSReadReceiptColumnTimestamp]; YapDatabaseQuery *query = [YapDatabaseQuery queryWithFormat:queryFormat, senderId, @(timestamp)]; - [[self dbConnection] readWithBlock:^(YapDatabaseReadTransaction *_Nonnull transaction) { + [[self dbReadConnection] readWithBlock:^(YapDatabaseReadTransaction *_Nonnull transaction) { [[transaction ext:OWSReadReceiptIndexOnSenderIdAndTimestamp] enumerateKeysAndObjectsMatchingQuery:query usingBlock:^(NSString *collection, NSString *key, id object, BOOL *stop) { diff --git a/src/Devices/OWSReadReceiptsProcessor.m b/src/Devices/OWSReadReceiptsProcessor.m index 1d2f92d88..dd31e8285 100644 --- a/src/Devices/OWSReadReceiptsProcessor.m +++ b/src/Devices/OWSReadReceiptsProcessor.m @@ -94,7 +94,8 @@ NSString *const OWSReadReceiptsProcessorMarkedMessageAsReadNotification = // Always mark the message specified by the read receipt as read. [interactionsToMarkAsRead addObject:message]; - [self.storageManager.dbConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { + [self.storageManager.dbReadWriteConnection readWriteWithBlock:^( + YapDatabaseReadWriteTransaction *transaction) { [[TSDatabaseView unseenDatabaseViewExtension:transaction] enumerateRowsInGroup:message.uniqueThreadId usingBlock:^(NSString *collection, diff --git a/src/Messages/Attachments/TSAttachmentStream.m b/src/Messages/Attachments/TSAttachmentStream.m index 27ad97922..8951cdff3 100644 --- a/src/Messages/Attachments/TSAttachmentStream.m +++ b/src/Messages/Attachments/TSAttachmentStream.m @@ -387,7 +387,7 @@ NS_ASSUME_NONNULL_BEGIN if (transaction) { updateDataStore(transaction); } else { - [self.dbConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { + [self.dbReadWriteConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { updateDataStore(transaction); }]; } @@ -458,7 +458,7 @@ NS_ASSUME_NONNULL_BEGIN if (transaction) { updateDataStore(transaction); } else { - [self.dbConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { + [self.dbReadWriteConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { updateDataStore(transaction); }]; } diff --git a/src/Messages/Interactions/TSIncomingMessage.m b/src/Messages/Interactions/TSIncomingMessage.m index eb3f2d2c4..240065142 100644 --- a/src/Messages/Interactions/TSIncomingMessage.m +++ b/src/Messages/Interactions/TSIncomingMessage.m @@ -78,7 +78,7 @@ NSString *const TSIncomingMessageWasReadOnThisDeviceNotification = @"TSIncomingM + (nullable instancetype)findMessageWithAuthorId:(NSString *)authorId timestamp:(uint64_t)timestamp { __block TSIncomingMessage *foundMessage; - [self.dbConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { + [self.dbReadWriteConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { // 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 diff --git a/src/Messages/Interactions/TSOutgoingMessage.m b/src/Messages/Interactions/TSOutgoingMessage.m index 909c88328..bfbb17390 100644 --- a/src/Messages/Interactions/TSOutgoingMessage.m +++ b/src/Messages/Interactions/TSOutgoingMessage.m @@ -245,7 +245,7 @@ NSString *const kTSOutgoingMessageSentRecipientAll = @"kTSOutgoingMessageSentRec { OWSAssert(error); - [self.dbConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { + [self.dbReadWriteConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { [self applyChangeToSelfAndLatestOutgoingMessage:transaction changeBlock:^(TSOutgoingMessage *message) { [message setMessageState:TSOutgoingMessageStateUnsent]; @@ -256,7 +256,7 @@ NSString *const kTSOutgoingMessageSentRecipientAll = @"kTSOutgoingMessageSentRec - (void)updateWithMessageState:(TSOutgoingMessageState)messageState { - [self.dbConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { + [self.dbReadWriteConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { [self updateWithMessageState:messageState transaction:transaction]; }]; } @@ -274,7 +274,7 @@ NSString *const kTSOutgoingMessageSentRecipientAll = @"kTSOutgoingMessageSentRec - (void)updateWithHasSyncedTranscript:(BOOL)hasSyncedTranscript { - [self.dbConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { + [self.dbReadWriteConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { [self applyChangeToSelfAndLatestOutgoingMessage:transaction changeBlock:^(TSOutgoingMessage *message) { [message setHasSyncedTranscript:hasSyncedTranscript]; @@ -295,7 +295,7 @@ NSString *const kTSOutgoingMessageSentRecipientAll = @"kTSOutgoingMessageSentRec - (void)updateWithCustomMessage:(NSString *)customMessage { - [self.dbConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { + [self.dbReadWriteConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { [self updateWithCustomMessage:customMessage transaction:transaction]; }]; } @@ -312,14 +312,14 @@ NSString *const kTSOutgoingMessageSentRecipientAll = @"kTSOutgoingMessageSentRec - (void)updateWithWasDelivered { - [self.dbConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { + [self.dbReadWriteConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { [self updateWithWasDeliveredWithTransaction:transaction]; }]; } - (void)updateWithWasSentAndDelivered { - [self.dbConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { + [self.dbReadWriteConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { [self applyChangeToSelfAndLatestOutgoingMessage:transaction changeBlock:^(TSOutgoingMessage *message) { [message setMessageState:TSOutgoingMessageStateSentToService]; @@ -397,7 +397,7 @@ NSString *const kTSOutgoingMessageSentRecipientAll = @"kTSOutgoingMessageSentRec - (void)updateWithSentRecipient:(NSString *)contactId { - [self.dbConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { + [self.dbReadWriteConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { [self updateWithSentRecipient:contactId transaction:transaction]; }]; } diff --git a/src/Messages/OWSIdentityManager.m b/src/Messages/OWSIdentityManager.m index 9949e3cfb..d79913a04 100644 --- a/src/Messages/OWSIdentityManager.m +++ b/src/Messages/OWSIdentityManager.m @@ -423,7 +423,7 @@ NSString *const kNSNotificationName_IdentityStateDidChange = @"kNSNotificationNa [messages addObject:[TSErrorMessage nonblockingIdentityChangeInThread:groupThread recipientId:recipientId]]; } - [self.storageManager.dbConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { + [self.storageManager.dbReadWriteConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { for (TSMessage *message in messages) { [message saveWithTransaction:transaction]; } @@ -452,7 +452,8 @@ NSString *const kNSNotificationName_IdentityStateDidChange = @"kNSNotificationNa @synchronized(self) { NSMutableArray *recipientIds = [NSMutableArray new]; - [self.storageManager.dbConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { + [self.storageManager.dbReadWriteConnection readWriteWithBlock:^( + YapDatabaseReadWriteTransaction *transaction) { [transaction enumerateKeysAndObjectsInCollection:OWSIdentityManager_QueuedVerificationStateSyncMessages usingBlock:^(NSString *_Nonnull recipientId, id _Nonnull object, @@ -731,7 +732,7 @@ NSString *const kNSNotificationName_IdentityStateDidChange = @"kNSNotificationNa isLocalChange:isLocalChange]]; } - [self.storageManager.dbConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { + [self.storageManager.dbReadWriteConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { for (TSMessage *message in messages) { [message saveWithTransaction:transaction]; } diff --git a/src/Messages/TSCall.m b/src/Messages/TSCall.m index ff517fe69..2b54a5c7a 100644 --- a/src/Messages/TSCall.m +++ b/src/Messages/TSCall.m @@ -116,7 +116,7 @@ NSUInteger TSCallCurrentSchemaVersion = 1; _callType = callType; - [self.dbConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *_Nonnull transaction) { + [self.dbReadWriteConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *_Nonnull transaction) { [self saveWithTransaction:transaction]; // redraw any thread-related unread count UI. diff --git a/src/Messages/TSMessagesManager.m b/src/Messages/TSMessagesManager.m index 57851df8f..2a8568f96 100644 --- a/src/Messages/TSMessagesManager.m +++ b/src/Messages/TSMessagesManager.m @@ -525,7 +525,7 @@ NS_ASSUME_NONNULL_BEGIN NSString *recipientId = incomingEnvelope.source; __block TSThread *thread; - [[TSStorageManager sharedManager].dbConnection + [[TSStorageManager sharedManager].dbReadWriteConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { thread = [TSContactThread getOrCreateThreadWithContactId:recipientId transaction:transaction]; }]; diff --git a/src/Security/OWSRecipientIdentity.m b/src/Security/OWSRecipientIdentity.m index d6c81d074..ef61800af 100644 --- a/src/Security/OWSRecipientIdentity.m +++ b/src/Security/OWSRecipientIdentity.m @@ -91,7 +91,7 @@ OWSSignalServiceProtosVerifiedState OWSVerificationStateToProtoState(OWSVerifica { changeBlock(self); - [[self class].dbConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *_Nonnull transaction) { + [[self class].dbReadWriteConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *_Nonnull transaction) { OWSRecipientIdentity *latest = [[self class] fetchObjectWithUniqueID:self.uniqueId transaction:transaction]; if (latest == nil) { [self saveWithTransaction:transaction]; diff --git a/src/Storage/AxolotlStore/TSStorageManager+SignedPreKeyStore.m b/src/Storage/AxolotlStore/TSStorageManager+SignedPreKeyStore.m index 7cc78403c..32cbdbbf9 100644 --- a/src/Storage/AxolotlStore/TSStorageManager+SignedPreKeyStore.m +++ b/src/Storage/AxolotlStore/TSStorageManager+SignedPreKeyStore.m @@ -148,7 +148,7 @@ NSString *const TSStorageManagerKeyPrekeyCurrentSignedPrekeyId = @"currentSigned NSDate *firstPrekeyUpdateFailureDate = [self firstPrekeyUpdateFailureDate]; NSUInteger prekeyUpdateFailureCount = [self prekeyUpdateFailureCount]; - [self.dbConnection readWithBlock:^(YapDatabaseReadTransaction *_Nonnull transaction) { + [self.dbReadConnection readWithBlock:^(YapDatabaseReadTransaction *_Nonnull transaction) { __block int i = 0; DDLogInfo(@"%@ SignedPreKeys Report:", tag); diff --git a/src/Storage/OWSOrphanedDataCleaner.m b/src/Storage/OWSOrphanedDataCleaner.m index 969b547ca..d0072969c 100644 --- a/src/Storage/OWSOrphanedDataCleaner.m +++ b/src/Storage/OWSOrphanedDataCleaner.m @@ -1,4 +1,6 @@ -// Copyright (c) 2016 Open Whisper Systems. All rights reserved. +// +// Copyright (c) 2017 Open Whisper Systems. All rights reserved. +// #import "OWSOrphanedDataCleaner.h" #import "TSAttachmentStream.h" @@ -32,7 +34,7 @@ - (NSArray *)orphanedInteractionIds { NSMutableArray *interactionIds = [NSMutableArray new]; - [[TSInteraction dbConnection] readWithBlock:^(YapDatabaseReadTransaction *_Nonnull transaction) { + [[TSInteraction dbReadConnection] readWithBlock:^(YapDatabaseReadTransaction *_Nonnull transaction) { [TSInteraction enumerateCollectionObjectsWithTransaction:transaction usingBlock:^(TSInteraction *interaction, BOOL *stop) { TSThread *thread = [TSThread diff --git a/src/Storage/TSStorageManager+keyingMaterial.m b/src/Storage/TSStorageManager+keyingMaterial.m index b12728ad9..b85fa7f2d 100644 --- a/src/Storage/TSStorageManager+keyingMaterial.m +++ b/src/Storage/TSStorageManager+keyingMaterial.m @@ -53,7 +53,7 @@ - (void)storePhoneNumber:(NSString *)phoneNumber { - [self.dbConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { + [self.dbReadWriteConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { [transaction setObject:phoneNumber forKey:TSStorageRegisteredNumberKey inCollection:TSStorageUserAccountCollection]; @@ -61,13 +61,12 @@ } + (void)storeServerToken:(NSString *)authToken signalingKey:(NSString *)signalingKey { - YapDatabaseConnection *dbConn = [[self sharedManager] dbConnection]; - - [dbConn readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { - [transaction setObject:authToken forKey:TSStorageServerAuthToken inCollection:TSStorageUserAccountCollection]; - [transaction setObject:signalingKey - forKey:TSStorageServerSignalingKey - inCollection:TSStorageUserAccountCollection]; + TSStorageManager *sharedManager = self.sharedManager; + [sharedManager.dbReadWriteConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { + [transaction setObject:authToken forKey:TSStorageServerAuthToken inCollection:TSStorageUserAccountCollection]; + [transaction setObject:signalingKey + forKey:TSStorageServerSignalingKey + inCollection:TSStorageUserAccountCollection]; }]; } diff --git a/src/Storage/TSStorageManager.h b/src/Storage/TSStorageManager.h index 91be8f0bf..6c39745ec 100644 --- a/src/Storage/TSStorageManager.h +++ b/src/Storage/TSStorageManager.h @@ -61,7 +61,8 @@ NS_ASSUME_NONNULL_BEGIN - (nullable SignedPreKeyRecord *)signedPreKeyRecordForKey:(NSString *)key inCollection:(NSString *)collection; - (void)purgeCollection:(NSString *)collection; -@property (nullable, nonatomic, readonly) YapDatabaseConnection *dbConnection; +@property (nullable, nonatomic, readonly) YapDatabaseConnection *dbReadConnection; +@property (nullable, nonatomic, readonly) YapDatabaseConnection *dbReadWriteConnection; @end diff --git a/src/Storage/TSStorageManager.m b/src/Storage/TSStorageManager.m index c429b12f0..18969ae7c 100644 --- a/src/Storage/TSStorageManager.m +++ b/src/Storage/TSStorageManager.m @@ -156,7 +156,8 @@ static NSString *keychainDBPassAccount = @"TSDatabasePass"; if (!_database) { return NO; } - _dbConnection = self.newDatabaseConnection; + _dbReadConnection = self.newDatabaseConnection; + _dbReadWriteConnection = self.newDatabaseConnection; return YES; } @@ -388,19 +389,19 @@ static NSString *keychainDBPassAccount = @"TSDatabasePass"; #pragma mark - convenience methods - (void)purgeCollection:(NSString *)collection { - [self.dbConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { - [transaction removeAllObjectsInCollection:collection]; + [self.dbReadWriteConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { + [transaction removeAllObjectsInCollection:collection]; }]; } - (void)setObject:(id)object forKey:(NSString *)key inCollection:(NSString *)collection { - [self.dbConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { - [transaction setObject:object forKey:key inCollection:collection]; + [self.dbReadWriteConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { + [transaction setObject:object forKey:key inCollection:collection]; }]; } - (void)removeObjectForKey:(NSString *)string inCollection:(NSString *)collection { - [self.dbConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { + [self.dbReadWriteConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { [transaction removeObjectForKey:string inCollection:collection]; }]; } @@ -408,8 +409,8 @@ static NSString *keychainDBPassAccount = @"TSDatabasePass"; - (id)objectForKey:(NSString *)key inCollection:(NSString *)collection { __block NSString *object; - [self.dbConnection readWithBlock:^(YapDatabaseReadTransaction *transaction) { - object = [transaction objectForKey:key inCollection:collection]; + [self.dbReadConnection readWithBlock:^(YapDatabaseReadTransaction *transaction) { + object = [transaction objectForKey:key inCollection:collection]; }]; return object; @@ -419,8 +420,8 @@ static NSString *keychainDBPassAccount = @"TSDatabasePass"; { __block NSDictionary *object; - [self.dbConnection readWithBlock:^(YapDatabaseReadTransaction *transaction) { - object = [transaction objectForKey:key inCollection:collection]; + [self.dbReadConnection readWithBlock:^(YapDatabaseReadTransaction *transaction) { + object = [transaction objectForKey:key inCollection:collection]; }]; return object; @@ -479,7 +480,7 @@ static NSString *keychainDBPassAccount = @"TSDatabasePass"; - (int)incrementIntForKey:(NSString *)key inCollection:(NSString *)collection { __block int value = 0; - [self.dbConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { + [self.dbReadWriteConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { value = [[transaction objectForKey:key inCollection:collection] intValue]; value++; [transaction setObject:@(value) forKey:key inCollection:collection]; @@ -503,11 +504,11 @@ static NSString *keychainDBPassAccount = @"TSDatabasePass"; } - (void)deleteThreadsAndMessages { - [self.dbConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { - [transaction removeAllObjectsInCollection:[TSThread collection]]; - [transaction removeAllObjectsInCollection:[SignalRecipient collection]]; - [transaction removeAllObjectsInCollection:[TSInteraction collection]]; - [transaction removeAllObjectsInCollection:[TSAttachment collection]]; + [self.dbReadWriteConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { + [transaction removeAllObjectsInCollection:[TSThread collection]]; + [transaction removeAllObjectsInCollection:[SignalRecipient collection]]; + [transaction removeAllObjectsInCollection:[TSInteraction collection]]; + [transaction removeAllObjectsInCollection:[TSAttachment collection]]; }]; [TSAttachmentStream deleteAttachments]; } @@ -529,7 +530,8 @@ static NSString *keychainDBPassAccount = @"TSDatabasePass"; - (void)resetSignalStorage { self.database = nil; - _dbConnection = nil; + _dbReadConnection = nil; + _dbReadWriteConnection = nil; [self deletePasswordFromKeychain]; diff --git a/src/Storage/TSYapDatabaseObject.h b/src/Storage/TSYapDatabaseObject.h index f13e47ef7..8158a18bc 100644 --- a/src/Storage/TSYapDatabaseObject.h +++ b/src/Storage/TSYapDatabaseObject.h @@ -58,10 +58,12 @@ usingBlock:(void (^)(id object, BOOL *stop))block; /** - * @return A shared database connection. + * @return Shared database connections for reading and writing. */ -- (YapDatabaseConnection *)dbConnection; -+ (YapDatabaseConnection *)dbConnection; +- (YapDatabaseConnection *)dbReadConnection; ++ (YapDatabaseConnection *)dbReadConnection; +- (YapDatabaseConnection *)dbReadWriteConnection; ++ (YapDatabaseConnection *)dbReadWriteConnection; - (TSStorageManager *)storageManager; + (TSStorageManager *)storageManager; diff --git a/src/Storage/TSYapDatabaseObject.m b/src/Storage/TSYapDatabaseObject.m index 591bf7deb..ef8740157 100644 --- a/src/Storage/TSYapDatabaseObject.m +++ b/src/Storage/TSYapDatabaseObject.m @@ -1,5 +1,6 @@ -// Created by Frederic Jacobs on 16/11/14. -// Copyright (c) 2014 Open Whisper Systems. All rights reserved. +// +// Copyright (c) 2017 Open Whisper Systems. All rights reserved. +// #import "TSYapDatabaseObject.h" #import "TSStorageManager.h" @@ -31,7 +32,7 @@ - (void)save { - [[self dbConnection] readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { + [[self dbReadWriteConnection] readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { [self saveWithTransaction:transaction]; }]; } @@ -43,7 +44,7 @@ - (void)touch { - [[self dbConnection] readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { + [[self dbReadWriteConnection] readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { [self touchWithTransaction:transaction]; }]; } @@ -55,14 +56,19 @@ - (void)remove { - [[self dbConnection] readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { + [[self dbReadWriteConnection] readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { [self removeWithTransaction:transaction]; }]; } -- (YapDatabaseConnection *)dbConnection +- (YapDatabaseConnection *)dbReadConnection { - return [[self class] dbConnection]; + return [[self class] dbReadConnection]; +} + +- (YapDatabaseConnection *)dbReadWriteConnection +{ + return [[self class] dbReadWriteConnection]; } - (TSStorageManager *)storageManager @@ -72,9 +78,19 @@ #pragma mark Class Methods -+ (YapDatabaseConnection *)dbConnection ++ (YapDatabaseConnection *)dbReadConnection +{ + // We use TSStorageManager's dbReadWriteConnection (not its dbReadConnection) + // for consistency, since we tend to [TSYapDatabaseObject save] and want to + // write to the same connection we read from. To get true consistency, we'd + // want to update entities by reading & writing from within the same + // transaction, but that'll be a big refactor. + return [self storageManager].dbReadWriteConnection; +} + ++ (YapDatabaseConnection *)dbReadWriteConnection { - return [self storageManager].dbConnection; + return [self storageManager].dbReadWriteConnection; } + (TSStorageManager *)storageManager @@ -90,7 +106,7 @@ + (NSUInteger)numberOfKeysInCollection { __block NSUInteger count; - [[self dbConnection] readWithBlock:^(YapDatabaseReadTransaction *transaction) { + [[self dbReadConnection] readWithBlock:^(YapDatabaseReadTransaction *transaction) { count = [self numberOfKeysInCollectionWithTransaction:transaction]; }]; return count; @@ -112,7 +128,7 @@ + (void)enumerateCollectionObjectsUsingBlock:(void (^)(id object, BOOL *stop))block { - [[self dbConnection] readWithBlock:^(YapDatabaseReadTransaction *transaction) { + [[self dbReadConnection] readWithBlock:^(YapDatabaseReadTransaction *transaction) { [self enumerateCollectionObjectsWithTransaction:transaction usingBlock:block]; }]; } @@ -131,7 +147,7 @@ + (void)removeAllObjectsInCollection { - [[self dbConnection] readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { + [[self dbReadWriteConnection] readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { [transaction removeAllObjectsInCollection:[self collection]]; }]; } @@ -144,7 +160,7 @@ + (instancetype)fetchObjectWithUniqueID:(NSString *)uniqueID { __block id object; - [[self dbConnection] readWithBlock:^(YapDatabaseReadTransaction *transaction) { + [[self dbReadConnection] readWithBlock:^(YapDatabaseReadTransaction *transaction) { object = [transaction objectForKey:uniqueID inCollection:[self collection]]; }]; return object;