From 15b8e583249976a2e474348e61602ff5d37caf8d Mon Sep 17 00:00:00 2001 From: Matthew Chen Date: Thu, 11 Jan 2018 09:56:38 -0500 Subject: [PATCH] Retain changes from session database branch. --- .../ConversationViewController.m | 4 +- .../MessageDetailViewController.swift | 4 +- .../OWSLinkedDevicesTableViewController.m | 6 +- SignalMessaging/Views/ThreadViewHelper.m | 10 ++- .../src/Messages/OWSBatchMessageProcessor.h | 6 +- .../src/Messages/OWSBatchMessageProcessor.m | 12 +-- .../Messages/OWSDisappearingMessagesFinder.h | 9 +- .../Messages/OWSDisappearingMessagesFinder.m | 27 +++--- .../OWSFailedAttachmentDownloadsJob.h | 5 +- .../OWSFailedAttachmentDownloadsJob.m | 20 ++--- .../src/Messages/OWSFailedMessagesJob.h | 5 +- .../src/Messages/OWSFailedMessagesJob.m | 22 ++--- .../src/Messages/OWSIdentityManager.h | 3 +- .../src/Messages/OWSMessageManager.m | 6 +- .../src/Messages/OWSMessageReceiver.h | 6 +- .../src/Messages/OWSMessageReceiver.m | 12 +-- .../src/Storage/OWSIncomingMessageFinder.h | 5 +- .../src/Storage/OWSIncomingMessageFinder.m | 14 ++-- SignalServiceKit/src/Storage/OWSStorage.h | 3 + SignalServiceKit/src/Storage/OWSStorage.m | 7 ++ SignalServiceKit/src/Storage/TSDatabaseView.h | 19 +++-- SignalServiceKit/src/Storage/TSDatabaseView.m | 83 ++++++++++--------- .../src/Storage/TSStorageManager.h | 6 +- .../src/Storage/TSStorageManager.m | 76 ++++++++++------- 24 files changed, 204 insertions(+), 166 deletions(-) diff --git a/Signal/src/ViewControllers/ConversationView/ConversationViewController.m b/Signal/src/ViewControllers/ConversationView/ConversationViewController.m index caf084ff5..bf4d52ea8 100644 --- a/Signal/src/ViewControllers/ConversationView/ConversationViewController.m +++ b/Signal/src/ViewControllers/ConversationView/ConversationViewController.m @@ -295,11 +295,11 @@ typedef NS_ENUM(NSInteger, MessagesRangeSizeMode) { [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(yapDatabaseModified:) name:YapDatabaseModifiedNotification - object:nil]; + object:TSStorageManager.sharedManager.dbNotificationObject]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(yapDatabaseModifiedExternally:) name:YapDatabaseModifiedExternallyNotification - object:nil]; + object:TSStorageManager.sharedManager.dbNotificationObject]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationWillEnterForeground:) name:OWSApplicationWillEnterForegroundNotification diff --git a/Signal/src/ViewControllers/MessageDetailViewController.swift b/Signal/src/ViewControllers/MessageDetailViewController.swift index 7b740f5fc..cf9aeb38a 100644 --- a/Signal/src/ViewControllers/MessageDetailViewController.swift +++ b/Signal/src/ViewControllers/MessageDetailViewController.swift @@ -1,5 +1,5 @@ // -// Copyright (c) 2017 Open Whisper Systems. All rights reserved. +// Copyright (c) 2018 Open Whisper Systems. All rights reserved. // import Foundation @@ -82,7 +82,7 @@ class MessageDetailViewController: OWSViewController, UIScrollViewDelegate { NotificationCenter.default.addObserver(self, selector: #selector(yapDatabaseModified), name: NSNotification.Name.YapDatabaseModified, - object: nil) + object: TSStorageManager.shared().dbNotificationObject) } override func viewWillAppear(_ animated: Bool) { diff --git a/Signal/src/ViewControllers/OWSLinkedDevicesTableViewController.m b/Signal/src/ViewControllers/OWSLinkedDevicesTableViewController.m index f708fb824..d2db0eed7 100644 --- a/Signal/src/ViewControllers/OWSLinkedDevicesTableViewController.m +++ b/Signal/src/ViewControllers/OWSLinkedDevicesTableViewController.m @@ -1,5 +1,5 @@ // -// Copyright (c) 2017 Open Whisper Systems. All rights reserved. +// Copyright (c) 2018 Open Whisper Systems. All rights reserved. // #import "OWSLinkedDevicesTableViewController.h" @@ -65,11 +65,11 @@ int const OWSLinkedDevicesTableViewControllerSectionAddDevice = 1; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(yapDatabaseModified:) name:YapDatabaseModifiedNotification - object:nil]; + object:TSStorageManager.sharedManager.dbNotificationObject]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(yapDatabaseModifiedExternally:) name:YapDatabaseModifiedExternallyNotification - object:nil]; + object:TSStorageManager.sharedManager.dbNotificationObject]; self.refreshControl = [UIRefreshControl new]; [self.refreshControl addTarget:self action:@selector(refreshDevices) forControlEvents:UIControlEventValueChanged]; diff --git a/SignalMessaging/Views/ThreadViewHelper.m b/SignalMessaging/Views/ThreadViewHelper.m index d765c5478..db3b710a5 100644 --- a/SignalMessaging/Views/ThreadViewHelper.m +++ b/SignalMessaging/Views/ThreadViewHelper.m @@ -100,16 +100,18 @@ NS_ASSUME_NONNULL_BEGIN [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(yapDatabaseModified:) name:YapDatabaseModifiedNotification - object:nil]; + object:TSStorageManager.sharedManager.dbNotificationObject]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(yapDatabaseModifiedExternally:) name:YapDatabaseModifiedExternallyNotification - object:nil]; + object:TSStorageManager.sharedManager.dbNotificationObject]; } else { - [[NSNotificationCenter defaultCenter] removeObserver:self name:YapDatabaseModifiedNotification object:nil]; + [[NSNotificationCenter defaultCenter] removeObserver:self + name:YapDatabaseModifiedNotification + object:TSStorageManager.sharedManager.dbNotificationObject]; [[NSNotificationCenter defaultCenter] removeObserver:self name:YapDatabaseModifiedExternallyNotification - object:nil]; + object:TSStorageManager.sharedManager.dbNotificationObject]; } } diff --git a/SignalServiceKit/src/Messages/OWSBatchMessageProcessor.h b/SignalServiceKit/src/Messages/OWSBatchMessageProcessor.h index 7b6d06a31..9dc9d1737 100644 --- a/SignalServiceKit/src/Messages/OWSBatchMessageProcessor.h +++ b/SignalServiceKit/src/Messages/OWSBatchMessageProcessor.h @@ -1,11 +1,11 @@ // -// Copyright (c) 2017 Open Whisper Systems. All rights reserved. +// Copyright (c) 2018 Open Whisper Systems. All rights reserved. // NS_ASSUME_NONNULL_BEGIN @class OWSSignalServiceProtosEnvelope; -@class TSStorageManager; +@class OWSStorage; // This class is used to write incoming (decrypted, unprocessed) // messages to a durable queue and then process them in batches, @@ -13,7 +13,7 @@ NS_ASSUME_NONNULL_BEGIN @interface OWSBatchMessageProcessor : NSObject + (instancetype)sharedInstance; -+ (void)syncRegisterDatabaseExtension:(TSStorageManager *)storageManager; ++ (void)syncRegisterDatabaseExtension:(OWSStorage *)storage; - (void)enqueueEnvelopeData:(NSData *)envelopeData plaintextData:(NSData *_Nullable)plaintextData; - (void)handleAnyUnprocessedEnvelopesAsync; diff --git a/SignalServiceKit/src/Messages/OWSBatchMessageProcessor.m b/SignalServiceKit/src/Messages/OWSBatchMessageProcessor.m index e98377dde..8ff5b3a41 100644 --- a/SignalServiceKit/src/Messages/OWSBatchMessageProcessor.m +++ b/SignalServiceKit/src/Messages/OWSBatchMessageProcessor.m @@ -1,5 +1,5 @@ // -// Copyright (c) 2017 Open Whisper Systems. All rights reserved. +// Copyright (c) 2018 Open Whisper Systems. All rights reserved. // #import "OWSBatchMessageProcessor.h" @@ -200,15 +200,15 @@ NSString *const OWSMessageContentJobFinderExtensionGroup = @"OWSMessageContentJo } -+ (void)syncRegisterDatabaseExtension:(TSStorageManager *)storageManager ++ (void)syncRegisterDatabaseExtension:(OWSStorage *)storage { - YapDatabaseView *existingView = [storageManager registeredExtension:OWSMessageContentJobFinderExtensionName]; + YapDatabaseView *existingView = [storage registeredExtension:OWSMessageContentJobFinderExtensionName]; if (existingView) { OWSFail(@"%@ was already initialized.", OWSMessageContentJobFinderExtensionName); // already initialized return; } - [storageManager registerExtension:[self databaseExtension] withName:OWSMessageContentJobFinderExtensionName]; + [storage registerExtension:[self databaseExtension] withName:OWSMessageContentJobFinderExtensionName]; } #pragma mark Logging @@ -443,9 +443,9 @@ NSString *const OWSMessageContentJobFinderExtensionGroup = @"OWSMessageContentJo #pragma mark - class methods -+ (void)syncRegisterDatabaseExtension:(TSStorageManager *)storageManager ++ (void)syncRegisterDatabaseExtension:(OWSStorage *)storage { - [OWSMessageContentJobFinder syncRegisterDatabaseExtension:storageManager]; + [OWSMessageContentJobFinder syncRegisterDatabaseExtension:storage]; } #pragma mark - instance methods diff --git a/SignalServiceKit/src/Messages/OWSDisappearingMessagesFinder.h b/SignalServiceKit/src/Messages/OWSDisappearingMessagesFinder.h index c7e3e0909..6c0314d0a 100644 --- a/SignalServiceKit/src/Messages/OWSDisappearingMessagesFinder.h +++ b/SignalServiceKit/src/Messages/OWSDisappearingMessagesFinder.h @@ -1,11 +1,12 @@ // -// Copyright (c) 2017 Open Whisper Systems. All rights reserved. +// Copyright (c) 2018 Open Whisper Systems. All rights reserved. // NS_ASSUME_NONNULL_BEGIN -@class TSStorageManager; +@class OWSStorage; @class TSMessage; +@class TSStorageManager; @class TSThread; @class YapDatabaseReadTransaction; @@ -27,12 +28,12 @@ NS_ASSUME_NONNULL_BEGIN /** * Database extensions required for class to work. */ -+ (void)asyncRegisterDatabaseExtensions:(TSStorageManager *)storageManager; ++ (void)asyncRegisterDatabaseExtensions:(OWSStorage *)storage; /** * Only use the sync version for testing, generally we'll want to register extensions async */ -+ (void)blockingRegisterDatabaseExtensions:(TSStorageManager *)storageManager; ++ (void)blockingRegisterDatabaseExtensions:(OWSStorage *)storage; @end diff --git a/SignalServiceKit/src/Messages/OWSDisappearingMessagesFinder.m b/SignalServiceKit/src/Messages/OWSDisappearingMessagesFinder.m index 906bd4201..db68b9182 100644 --- a/SignalServiceKit/src/Messages/OWSDisappearingMessagesFinder.m +++ b/SignalServiceKit/src/Messages/OWSDisappearingMessagesFinder.m @@ -1,5 +1,5 @@ // -// Copyright (c) 2017 Open Whisper Systems. All rights reserved. +// Copyright (c) 2018 Open Whisper Systems. All rights reserved. // #import "OWSDisappearingMessagesFinder.h" @@ -189,23 +189,22 @@ static NSString *const OWSDisappearingMessageFinderExpiresAtIndex = @"index_mess } // Useful for tests, don't use in app startup path because it's slow. -+ (void)blockingRegisterDatabaseExtensions:(TSStorageManager *)storageManager ++ (void)blockingRegisterDatabaseExtensions:(OWSStorage *)storage { - [storageManager registerExtension:[self indexDatabaseExtension] - withName:OWSDisappearingMessageFinderExpiresAtIndex]; + [storage registerExtension:[self indexDatabaseExtension] withName:OWSDisappearingMessageFinderExpiresAtIndex]; } -+ (void)asyncRegisterDatabaseExtensions:(TSStorageManager *)storageManager ++ (void)asyncRegisterDatabaseExtensions:(OWSStorage *)storage { - [storageManager asyncRegisterExtension:[self indexDatabaseExtension] - withName:OWSDisappearingMessageFinderExpiresAtIndex - completionBlock:^(BOOL ready) { - if (ready) { - DDLogDebug(@"%@ completed registering extension async.", self.logTag); - } else { - DDLogError(@"%@ failed registering extension async.", self.logTag); - } - }]; + [storage asyncRegisterExtension:[self indexDatabaseExtension] + withName:OWSDisappearingMessageFinderExpiresAtIndex + completionBlock:^(BOOL ready) { + if (ready) { + DDLogDebug(@"%@ completed registering extension async.", self.logTag); + } else { + DDLogError(@"%@ failed registering extension async.", self.logTag); + } + }]; } @end diff --git a/SignalServiceKit/src/Messages/OWSFailedAttachmentDownloadsJob.h b/SignalServiceKit/src/Messages/OWSFailedAttachmentDownloadsJob.h index a727f1656..5ad34d21d 100644 --- a/SignalServiceKit/src/Messages/OWSFailedAttachmentDownloadsJob.h +++ b/SignalServiceKit/src/Messages/OWSFailedAttachmentDownloadsJob.h @@ -1,9 +1,10 @@ // -// Copyright (c) 2017 Open Whisper Systems. All rights reserved. +// Copyright (c) 2018 Open Whisper Systems. All rights reserved. // NS_ASSUME_NONNULL_BEGIN +@class OWSStorage; @class TSStorageManager; @interface OWSFailedAttachmentDownloadsJob : NSObject @@ -16,7 +17,7 @@ NS_ASSUME_NONNULL_BEGIN /** * Database extensions required for class to work. */ -+ (void)asyncRegisterDatabaseExtensionsWithStorageManager:(TSStorageManager *)storageManager; ++ (void)asyncRegisterDatabaseExtensionsWithStorageManager:(OWSStorage *)storage; /** * Only use the sync version for testing, generally we'll want to register extensions async diff --git a/SignalServiceKit/src/Messages/OWSFailedAttachmentDownloadsJob.m b/SignalServiceKit/src/Messages/OWSFailedAttachmentDownloadsJob.m index 56ccb8fa0..b3c675672 100644 --- a/SignalServiceKit/src/Messages/OWSFailedAttachmentDownloadsJob.m +++ b/SignalServiceKit/src/Messages/OWSFailedAttachmentDownloadsJob.m @@ -124,17 +124,17 @@ static NSString *const OWSFailedAttachmentDownloadsJobAttachmentStateIndex = @"i withName:OWSFailedAttachmentDownloadsJobAttachmentStateIndex]; } -+ (void)asyncRegisterDatabaseExtensionsWithStorageManager:(TSStorageManager *)storageManager ++ (void)asyncRegisterDatabaseExtensionsWithStorageManager:(OWSStorage *)storage { - [storageManager asyncRegisterExtension:[self indexDatabaseExtension] - withName:OWSFailedAttachmentDownloadsJobAttachmentStateIndex - completionBlock:^(BOOL ready) { - if (ready) { - DDLogDebug(@"%@ completed registering extension async.", self.logTag); - } else { - DDLogError(@"%@ failed registering extension async.", self.logTag); - } - }]; + [storage asyncRegisterExtension:[self indexDatabaseExtension] + withName:OWSFailedAttachmentDownloadsJobAttachmentStateIndex + completionBlock:^(BOOL ready) { + if (ready) { + DDLogDebug(@"%@ completed registering extension async.", self.logTag); + } else { + DDLogError(@"%@ failed registering extension async.", self.logTag); + } + }]; } @end diff --git a/SignalServiceKit/src/Messages/OWSFailedMessagesJob.h b/SignalServiceKit/src/Messages/OWSFailedMessagesJob.h index 29b8761bf..fc3ca6fca 100644 --- a/SignalServiceKit/src/Messages/OWSFailedMessagesJob.h +++ b/SignalServiceKit/src/Messages/OWSFailedMessagesJob.h @@ -1,9 +1,10 @@ // -// Copyright (c) 2017 Open Whisper Systems. All rights reserved. +// Copyright (c) 2018 Open Whisper Systems. All rights reserved. // NS_ASSUME_NONNULL_BEGIN +@class OWSStorage; @class TSStorageManager; @interface OWSFailedMessagesJob : NSObject @@ -16,7 +17,7 @@ NS_ASSUME_NONNULL_BEGIN /** * Database extensions required for class to work. */ -+ (void)asyncRegisterDatabaseExtensionsWithStorageManager:(TSStorageManager *)storageManager; ++ (void)asyncRegisterDatabaseExtensionsWithStorageManager:(OWSStorage *)storage; /** * Only use the sync version for testing, generally we'll want to register extensions async diff --git a/SignalServiceKit/src/Messages/OWSFailedMessagesJob.m b/SignalServiceKit/src/Messages/OWSFailedMessagesJob.m index 4c39906e2..6adf44d8a 100644 --- a/SignalServiceKit/src/Messages/OWSFailedMessagesJob.m +++ b/SignalServiceKit/src/Messages/OWSFailedMessagesJob.m @@ -1,5 +1,5 @@ // -// Copyright (c) 2017 Open Whisper Systems. All rights reserved. +// Copyright (c) 2018 Open Whisper Systems. All rights reserved. // #import "OWSFailedMessagesJob.h" @@ -134,17 +134,17 @@ static NSString *const OWSFailedMessagesJobMessageStateIndex = @"index_outoing_m withName:OWSFailedMessagesJobMessageStateIndex]; } -+ (void)asyncRegisterDatabaseExtensionsWithStorageManager:(TSStorageManager *)storageManager ++ (void)asyncRegisterDatabaseExtensionsWithStorageManager:(OWSStorage *)storage { - [storageManager asyncRegisterExtension:[self indexDatabaseExtension] - withName:OWSFailedMessagesJobMessageStateIndex - completionBlock:^(BOOL ready) { - if (ready) { - DDLogDebug(@"%@ completed registering extension async.", self.logTag); - } else { - DDLogError(@"%@ failed registering extension async.", self.logTag); - } - }]; + [storage asyncRegisterExtension:[self indexDatabaseExtension] + withName:OWSFailedMessagesJobMessageStateIndex + completionBlock:^(BOOL ready) { + if (ready) { + DDLogDebug(@"%@ completed registering extension async.", self.logTag); + } else { + DDLogError(@"%@ failed registering extension async.", self.logTag); + } + }]; } @end diff --git a/SignalServiceKit/src/Messages/OWSIdentityManager.h b/SignalServiceKit/src/Messages/OWSIdentityManager.h index cd634b1b4..51e94150b 100644 --- a/SignalServiceKit/src/Messages/OWSIdentityManager.h +++ b/SignalServiceKit/src/Messages/OWSIdentityManager.h @@ -1,5 +1,5 @@ // -// Copyright (c) 2017 Open Whisper Systems. All rights reserved. +// Copyright (c) 2018 Open Whisper Systems. All rights reserved. // #import "OWSRecipientIdentity.h" @@ -18,6 +18,7 @@ extern const NSUInteger kIdentityKeyLength; @class OWSRecipientIdentity; @class OWSSignalServiceProtosVerified; +@class OWSStorage; // This class can be safely accessed and used from any thread. @interface OWSIdentityManager : NSObject diff --git a/SignalServiceKit/src/Messages/OWSMessageManager.m b/SignalServiceKit/src/Messages/OWSMessageManager.m index bc3a64da6..dc1f142e8 100644 --- a/SignalServiceKit/src/Messages/OWSMessageManager.m +++ b/SignalServiceKit/src/Messages/OWSMessageManager.m @@ -1,5 +1,5 @@ // -// Copyright (c) 2017 Open Whisper Systems. All rights reserved. +// Copyright (c) 2018 Open Whisper Systems. All rights reserved. // #import "OWSMessageManager.h" @@ -126,11 +126,11 @@ NS_ASSUME_NONNULL_BEGIN [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(yapDatabaseModified:) name:YapDatabaseModifiedNotification - object:nil]; + object:TSStorageManager.sharedManager.dbNotificationObject]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(yapDatabaseModified:) name:YapDatabaseModifiedExternallyNotification - object:nil]; + object:TSStorageManager.sharedManager.dbNotificationObject]; } - (void)yapDatabaseModified:(NSNotification *)notification diff --git a/SignalServiceKit/src/Messages/OWSMessageReceiver.h b/SignalServiceKit/src/Messages/OWSMessageReceiver.h index d2b18a7af..a49ace41f 100644 --- a/SignalServiceKit/src/Messages/OWSMessageReceiver.h +++ b/SignalServiceKit/src/Messages/OWSMessageReceiver.h @@ -1,11 +1,11 @@ // -// Copyright (c) 2017 Open Whisper Systems. All rights reserved. +// Copyright (c) 2018 Open Whisper Systems. All rights reserved. // NS_ASSUME_NONNULL_BEGIN @class OWSSignalServiceProtosEnvelope; -@class TSStorageManager; +@class OWSStorage; // This class is used to write incoming (encrypted, unprocessed) // messages to a durable queue and then decrypt them in the order @@ -14,7 +14,7 @@ NS_ASSUME_NONNULL_BEGIN @interface OWSMessageReceiver : NSObject + (instancetype)sharedInstance; -+ (void)syncRegisterDatabaseExtension:(TSStorageManager *)storageManager; ++ (void)syncRegisterDatabaseExtension:(OWSStorage *)storage; - (void)handleReceivedEnvelope:(OWSSignalServiceProtosEnvelope *)envelope; - (void)handleAnyUnprocessedEnvelopesAsync; diff --git a/SignalServiceKit/src/Messages/OWSMessageReceiver.m b/SignalServiceKit/src/Messages/OWSMessageReceiver.m index 93151e9fa..f1aff98f4 100644 --- a/SignalServiceKit/src/Messages/OWSMessageReceiver.m +++ b/SignalServiceKit/src/Messages/OWSMessageReceiver.m @@ -1,5 +1,5 @@ // -// Copyright (c) 2017 Open Whisper Systems. All rights reserved. +// Copyright (c) 2018 Open Whisper Systems. All rights reserved. // #import "OWSMessageReceiver.h" @@ -190,17 +190,17 @@ NSString *const OWSMessageDecryptJobFinderExtensionGroup = @"OWSMessageProcessin }); } -+ (void)syncRegisterDatabaseExtension:(TSStorageManager *)storageManager ++ (void)syncRegisterDatabaseExtension:(OWSStorage *)storage { [self registerLegacyClasses]; - YapDatabaseView *existingView = [storageManager registeredExtension:OWSMessageDecryptJobFinderExtensionName]; + YapDatabaseView *existingView = [storage registeredExtension:OWSMessageDecryptJobFinderExtensionName]; if (existingView) { OWSFail(@"%@ was already initialized.", OWSMessageDecryptJobFinderExtensionName); // already initialized return; } - [storageManager registerExtension:[self databaseExtension] withName:OWSMessageDecryptJobFinderExtensionName]; + [storage registerExtension:[self databaseExtension] withName:OWSMessageDecryptJobFinderExtensionName]; } @end @@ -422,9 +422,9 @@ NSString *const OWSMessageDecryptJobFinderExtensionGroup = @"OWSMessageProcessin #pragma mark - class methods -+ (void)syncRegisterDatabaseExtension:(TSStorageManager *)storageManager ++ (void)syncRegisterDatabaseExtension:(OWSStorage *)storage { - [OWSMessageDecryptJobFinder syncRegisterDatabaseExtension:storageManager]; + [OWSMessageDecryptJobFinder syncRegisterDatabaseExtension:storage]; } #pragma mark - instance methods diff --git a/SignalServiceKit/src/Storage/OWSIncomingMessageFinder.h b/SignalServiceKit/src/Storage/OWSIncomingMessageFinder.h index d4a1e3028..7a914838c 100644 --- a/SignalServiceKit/src/Storage/OWSIncomingMessageFinder.h +++ b/SignalServiceKit/src/Storage/OWSIncomingMessageFinder.h @@ -1,9 +1,10 @@ // -// Copyright (c) 2017 Open Whisper Systems. All rights reserved. +// Copyright (c) 2018 Open Whisper Systems. All rights reserved. // NS_ASSUME_NONNULL_BEGIN +@class OWSStorage; @class TSStorageManager; @class YapDatabaseReadTransaction; @@ -14,7 +15,7 @@ NS_ASSUME_NONNULL_BEGIN /** * Must be called before using this finder. */ -+ (void)asyncRegisterExtensionWithStorageManager:(TSStorageManager *)storageManager; ++ (void)asyncRegisterExtensionWithStorageManager:(OWSStorage *)storage; /** * Detects existance of a duplicate incoming message. diff --git a/SignalServiceKit/src/Storage/OWSIncomingMessageFinder.m b/SignalServiceKit/src/Storage/OWSIncomingMessageFinder.m index 77492524a..d41afd241 100644 --- a/SignalServiceKit/src/Storage/OWSIncomingMessageFinder.m +++ b/SignalServiceKit/src/Storage/OWSIncomingMessageFinder.m @@ -1,5 +1,5 @@ // -// Copyright (c) 2017 Open Whisper Systems. All rights reserved. +// Copyright (c) 2018 Open Whisper Systems. All rights reserved. // #import "OWSIncomingMessageFinder.h" @@ -92,14 +92,14 @@ NSString *const OWSIncomingMessageFinderColumnSourceDeviceId = @"OWSIncomingMess return [[YapDatabaseSecondaryIndex alloc] initWithSetup:setup handler:handler]; } -+ (void)asyncRegisterExtensionWithStorageManager:(TSStorageManager *)storageManager ++ (void)asyncRegisterExtensionWithStorageManager:(OWSStorage *)storage { DDLogInfo(@"%@ registering async.", self.logTag); - [storageManager asyncRegisterExtension:self.indexExtension - withName:OWSIncomingMessageFinderExtensionName - completionBlock:^(BOOL ready) { - DDLogInfo(@"%@ finished registering async.", self.logTag); - }]; + [storage asyncRegisterExtension:self.indexExtension + withName:OWSIncomingMessageFinderExtensionName + completionBlock:^(BOOL ready) { + DDLogInfo(@"%@ finished registering async.", self.logTag); + }]; } // We should not normally hit this, as we should have prefer registering async, but it is useful for testing. diff --git a/SignalServiceKit/src/Storage/OWSStorage.h b/SignalServiceKit/src/Storage/OWSStorage.h index 684bb9dc4..067b6a625 100644 --- a/SignalServiceKit/src/Storage/OWSStorage.h +++ b/SignalServiceKit/src/Storage/OWSStorage.h @@ -19,6 +19,9 @@ extern NSString *const StorageIsReadyNotification; // sync _AND_ async view registrations. + (BOOL)isStorageReady; +// This object can be used to filter database notifications. +@property (nonatomic, readonly, nullable) id dbNotificationObject; + /** * The safeBlockingMigrationsBlock block will * run any outstanding version migrations that are a) blocking and b) safe diff --git a/SignalServiceKit/src/Storage/OWSStorage.m b/SignalServiceKit/src/Storage/OWSStorage.m index 1f37c9a28..9ffdbdc9f 100644 --- a/SignalServiceKit/src/Storage/OWSStorage.m +++ b/SignalServiceKit/src/Storage/OWSStorage.m @@ -286,6 +286,13 @@ static NSString *keychainDBPassAccount = @"TSDatabasePass"; [[NSNotificationCenter defaultCenter] removeObserver:self]; } +- (nullable id)dbNotificationObject +{ + OWSAssert(self.database); + + return self.database; +} + - (BOOL)areAsyncRegistrationsComplete { OWS_ABSTRACT_METHOD(); diff --git a/SignalServiceKit/src/Storage/TSDatabaseView.h b/SignalServiceKit/src/Storage/TSDatabaseView.h index c3871659e..b18f54560 100644 --- a/SignalServiceKit/src/Storage/TSDatabaseView.h +++ b/SignalServiceKit/src/Storage/TSDatabaseView.h @@ -1,7 +1,8 @@ // -// Copyright (c) 2017 Open Whisper Systems. All rights reserved. +// Copyright (c) 2018 Open Whisper Systems. All rights reserved. // +#import "OWSStorage.h" #import extern NSString *const TSInboxGroup; @@ -20,27 +21,27 @@ extern NSString *const TSSecondaryDevicesDatabaseViewExtensionName; - (instancetype)init NS_UNAVAILABLE; -+ (void)registerCrossProcessNotifier; ++ (void)registerCrossProcessNotifier:(OWSStorage *)storage; // This method must be called _AFTER_ registerThreadInteractionsDatabaseView. -+ (void)registerThreadDatabaseView; ++ (void)registerThreadDatabaseView:(OWSStorage *)storage; -+ (void)registerThreadInteractionsDatabaseView; -+ (void)asyncRegisterThreadOutgoingMessagesDatabaseView; ++ (void)registerThreadInteractionsDatabaseView:(OWSStorage *)storage; ++ (void)asyncRegisterThreadOutgoingMessagesDatabaseView:(OWSStorage *)storage; // Instances of OWSReadTracking for wasRead is NO and shouldAffectUnreadCounts is YES. // // Should be used for "unread message counts". -+ (void)registerUnreadDatabaseView; ++ (void)registerUnreadDatabaseView:(OWSStorage *)storage; // Should be used for "unread indicator". // // Instances of OWSReadTracking for wasRead is NO. -+ (void)asyncRegisterUnseenDatabaseView; ++ (void)asyncRegisterUnseenDatabaseView:(OWSStorage *)storage; -+ (void)asyncRegisterThreadSpecialMessagesDatabaseView; ++ (void)asyncRegisterThreadSpecialMessagesDatabaseView:(OWSStorage *)storage; -+ (void)asyncRegisterSecondaryDevicesDatabaseView; ++ (void)asyncRegisterSecondaryDevicesDatabaseView:(OWSStorage *)storage; // Returns the "unseen" database view if it is ready; // otherwise it returns the "unread" database view. diff --git a/SignalServiceKit/src/Storage/TSDatabaseView.m b/SignalServiceKit/src/Storage/TSDatabaseView.m index b913b2468..0ceeb5c4a 100644 --- a/SignalServiceKit/src/Storage/TSDatabaseView.m +++ b/SignalServiceKit/src/Storage/TSDatabaseView.m @@ -1,5 +1,5 @@ // -// Copyright (c) 2017 Open Whisper Systems. All rights reserved. +// Copyright (c) 2018 Open Whisper Systems. All rights reserved. // #import "TSDatabaseView.h" @@ -8,7 +8,6 @@ #import "TSIncomingMessage.h" #import "TSInvalidIdentityKeyErrorMessage.h" #import "TSOutgoingMessage.h" -#import "TSStorageManager.h" #import "TSThread.h" #import #import @@ -32,25 +31,29 @@ NSString *const TSSecondaryDevicesDatabaseViewExtensionName = @"TSSecondaryDevic @implementation TSDatabaseView -+ (void)registerCrossProcessNotifier ++ (void)registerCrossProcessNotifier:(OWSStorage *)storage { + OWSAssert(storage); + // I don't think the identifier and name of this extension matter for our purposes, // so long as they don't conflict with any other extension names. YapDatabaseExtension *extension = [[YapDatabaseCrossProcessNotification alloc] initWithIdentifier:@"SignalCrossProcessNotifier"]; - [[TSStorageManager sharedManager] registerExtension:extension withName:@"SignalCrossProcessNotifier"]; + [storage registerExtension:extension withName:@"SignalCrossProcessNotifier"]; } + (void)registerMessageDatabaseViewWithName:(NSString *)viewName viewGrouping:(YapDatabaseViewGrouping *)viewGrouping version:(NSString *)version async:(BOOL)async + storage:(OWSStorage *)storage { OWSAssertIsOnMainThread(); OWSAssert(viewName.length > 0); OWSAssert((viewGrouping)); + OWSAssert(storage); - YapDatabaseView *existingView = [[TSStorageManager sharedManager] registeredExtension:viewName]; + YapDatabaseView *existingView = [storage registeredExtension:viewName]; if (existingView) { OWSFail(@"Registered database view twice: %@", viewName); return; @@ -69,20 +72,19 @@ NSString *const TSSecondaryDevicesDatabaseViewExtensionName = @"TSSecondaryDevic options:options]; if (async) { - [[TSStorageManager sharedManager] - asyncRegisterExtension:view - withName:viewName - completionBlock:^(BOOL ready) { - OWSCAssert(ready); - - DDLogInfo(@"%@ asyncRegisterExtension: %@ -> %d", self.logTag, viewName, ready); - }]; + [storage asyncRegisterExtension:view + withName:viewName + completionBlock:^(BOOL ready) { + OWSCAssert(ready); + + DDLogInfo(@"%@ asyncRegisterExtension: %@ -> %d", self.logTag, viewName, ready); + }]; } else { - [[TSStorageManager sharedManager] registerExtension:view withName:viewName]; + [storage registerExtension:view withName:viewName]; } } -+ (void)registerUnreadDatabaseView ++ (void)registerUnreadDatabaseView:(OWSStorage *)storage { YapDatabaseViewGrouping *viewGrouping = [YapDatabaseViewGrouping withObjectBlock:^NSString *( YapDatabaseReadTransaction *transaction, NSString *collection, NSString *key, id object) { @@ -98,10 +100,11 @@ NSString *const TSSecondaryDevicesDatabaseViewExtensionName = @"TSSecondaryDevic [self registerMessageDatabaseViewWithName:TSUnreadDatabaseViewExtensionName viewGrouping:viewGrouping version:@"1" - async:NO]; + async:NO + storage:storage]; } -+ (void)asyncRegisterUnseenDatabaseView ++ (void)asyncRegisterUnseenDatabaseView:(OWSStorage *)storage { YapDatabaseViewGrouping *viewGrouping = [YapDatabaseViewGrouping withObjectBlock:^NSString *( YapDatabaseReadTransaction *transaction, NSString *collection, NSString *key, id object) { @@ -117,10 +120,11 @@ NSString *const TSSecondaryDevicesDatabaseViewExtensionName = @"TSSecondaryDevic [self registerMessageDatabaseViewWithName:TSUnseenDatabaseViewExtensionName viewGrouping:viewGrouping version:@"1" - async:YES]; + async:YES + storage:storage]; } -+ (void)asyncRegisterThreadSpecialMessagesDatabaseView ++ (void)asyncRegisterThreadSpecialMessagesDatabaseView:(OWSStorage *)storage { YapDatabaseViewGrouping *viewGrouping = [YapDatabaseViewGrouping withObjectBlock:^NSString *( YapDatabaseReadTransaction *transaction, NSString *collection, NSString *key, id object) { @@ -144,10 +148,11 @@ NSString *const TSSecondaryDevicesDatabaseViewExtensionName = @"TSSecondaryDevic [self registerMessageDatabaseViewWithName:TSThreadSpecialMessagesDatabaseViewExtensionName viewGrouping:viewGrouping version:@"1" - async:YES]; + async:YES + storage:storage]; } -+ (void)registerThreadInteractionsDatabaseView ++ (void)registerThreadInteractionsDatabaseView:(OWSStorage *)storage { YapDatabaseViewGrouping *viewGrouping = [YapDatabaseViewGrouping withObjectBlock:^NSString *( YapDatabaseReadTransaction *transaction, NSString *collection, NSString *key, id object) { @@ -160,10 +165,11 @@ NSString *const TSSecondaryDevicesDatabaseViewExtensionName = @"TSSecondaryDevic [self registerMessageDatabaseViewWithName:TSMessageDatabaseViewExtensionName viewGrouping:viewGrouping version:@"1" - async:NO]; + async:NO + storage:storage]; } -+ (void)asyncRegisterThreadOutgoingMessagesDatabaseView ++ (void)asyncRegisterThreadOutgoingMessagesDatabaseView:(OWSStorage *)storage { YapDatabaseViewGrouping *viewGrouping = [YapDatabaseViewGrouping withObjectBlock:^NSString *( YapDatabaseReadTransaction *transaction, NSString *collection, NSString *key, id object) { @@ -176,13 +182,13 @@ NSString *const TSSecondaryDevicesDatabaseViewExtensionName = @"TSSecondaryDevic [self registerMessageDatabaseViewWithName:TSThreadOutgoingMessageDatabaseViewExtensionName viewGrouping:viewGrouping version:@"2" - async:YES]; + async:YES + storage:storage]; } -+ (void)registerThreadDatabaseView ++ (void)registerThreadDatabaseView:(OWSStorage *)storage { - YapDatabaseView *threadView = - [[TSStorageManager sharedManager] registeredExtension:TSThreadDatabaseViewExtensionName]; + YapDatabaseView *threadView = [storage registeredExtension:TSThreadDatabaseViewExtensionName]; if (threadView) { OWSFail(@"Registered database view twice: %@", TSThreadDatabaseViewExtensionName); return; @@ -228,7 +234,7 @@ NSString *const TSSecondaryDevicesDatabaseViewExtensionName = @"TSSecondaryDevic YapDatabaseView *databaseView = [[YapDatabaseAutoView alloc] initWithGrouping:viewGrouping sorting:viewSorting versionTag:@"3" options:options]; - [[TSStorageManager sharedManager] registerExtension:databaseView withName:TSThreadDatabaseViewExtensionName]; + [storage registerExtension:databaseView withName:TSThreadDatabaseViewExtensionName]; } /** @@ -296,7 +302,7 @@ NSString *const TSSecondaryDevicesDatabaseViewExtensionName = @"TSSecondaryDevic }]; } -+ (void)asyncRegisterSecondaryDevicesDatabaseView ++ (void)asyncRegisterSecondaryDevicesDatabaseView:(OWSStorage *)storage { YapDatabaseViewGrouping *viewGrouping = [YapDatabaseViewGrouping withObjectBlock:^NSString *_Nullable(YapDatabaseReadTransaction *_Nonnull transaction, @@ -341,16 +347,15 @@ NSString *const TSSecondaryDevicesDatabaseViewExtensionName = @"TSSecondaryDevic YapDatabaseView *view = [[YapDatabaseAutoView alloc] initWithGrouping:viewGrouping sorting:viewSorting versionTag:@"3" options:options]; - [[TSStorageManager sharedManager] - asyncRegisterExtension:view - withName:TSSecondaryDevicesDatabaseViewExtensionName - completionBlock:^(BOOL ready) { - if (ready) { - DDLogDebug(@"%@ Successfully set up extension: %@", self.logTag, TSSecondaryDevicesGroup); - } else { - DDLogError(@"%@ Unable to setup extension: %@", self.logTag, TSSecondaryDevicesGroup); - } - }]; + [storage asyncRegisterExtension:view + withName:TSSecondaryDevicesDatabaseViewExtensionName + completionBlock:^(BOOL ready) { + if (ready) { + DDLogDebug(@"%@ Successfully set up extension: %@", self.logTag, TSSecondaryDevicesGroup); + } else { + DDLogError(@"%@ Unable to setup extension: %@", self.logTag, TSSecondaryDevicesGroup); + } + }]; } + (id)unseenDatabaseViewExtension:(YapDatabaseReadTransaction *)transaction diff --git a/SignalServiceKit/src/Storage/TSStorageManager.h b/SignalServiceKit/src/Storage/TSStorageManager.h index 9b34d0654..b8b294401 100644 --- a/SignalServiceKit/src/Storage/TSStorageManager.h +++ b/SignalServiceKit/src/Storage/TSStorageManager.h @@ -1,11 +1,15 @@ // -// Copyright (c) 2017 Open Whisper Systems. All rights reserved. +// Copyright (c) 2018 Open Whisper Systems. All rights reserved. // #import "OWSStorage.h" NS_ASSUME_NONNULL_BEGIN +void runSyncRegistrationsForPrimaryStorage(OWSStorage *storage); +void runAsyncRegistrationsForPrimaryStorage(OWSStorage *storage); + +// TODO: Rename to OWSPrimaryStorage? @interface TSStorageManager : OWSStorage - (instancetype)init NS_UNAVAILABLE; diff --git a/SignalServiceKit/src/Storage/TSStorageManager.m b/SignalServiceKit/src/Storage/TSStorageManager.m index 1b230c54e..154e32ca9 100644 --- a/SignalServiceKit/src/Storage/TSStorageManager.m +++ b/SignalServiceKit/src/Storage/TSStorageManager.m @@ -3,6 +3,7 @@ // #import "TSStorageManager.h" +#import "AppContext.h" #import "OWSAnalytics.h" #import "OWSBatchMessageProcessor.h" #import "OWSDisappearingMessagesFinder.h" @@ -22,8 +23,41 @@ NSString *const TSStorageManagerExceptionName_CouldNotMoveDatabaseFile NSString *const TSStorageManagerExceptionName_CouldNotCreateDatabaseDirectory = @"TSStorageManagerExceptionName_CouldNotCreateDatabaseDirectory"; -#pragma mark - +void runSyncRegistrationsForPrimaryStorage(OWSStorage *storage) +{ + OWSCAssert(storage); + + // Synchronously register extensions which are essential for views. + [TSDatabaseView registerCrossProcessNotifier:storage]; + [TSDatabaseView registerThreadInteractionsDatabaseView:storage]; + [TSDatabaseView registerThreadDatabaseView:storage]; + [TSDatabaseView registerUnreadDatabaseView:storage]; + [storage registerExtension:[TSDatabaseSecondaryIndexes registerTimeStampIndex] withName:@"idx"]; + [OWSMessageReceiver syncRegisterDatabaseExtension:storage]; + [OWSBatchMessageProcessor syncRegisterDatabaseExtension:storage]; +} + +void runAsyncRegistrationsForPrimaryStorage(OWSStorage *storage) +{ + OWSCAssert(storage); + // Asynchronously register other extensions. + // + // All sync registrations must be done before all async registrations, + // or the sync registrations will block on the async registrations. + [TSDatabaseView asyncRegisterUnseenDatabaseView:storage]; + [TSDatabaseView asyncRegisterThreadOutgoingMessagesDatabaseView:storage]; + [TSDatabaseView asyncRegisterThreadSpecialMessagesDatabaseView:storage]; + + // Register extensions which aren't essential for rendering threads async. + [OWSIncomingMessageFinder asyncRegisterExtensionWithStorageManager:storage]; + [TSDatabaseView asyncRegisterSecondaryDevicesDatabaseView:storage]; + [OWSDisappearingMessagesFinder asyncRegisterDatabaseExtensions:storage]; + [OWSFailedMessagesJob asyncRegisterDatabaseExtensionsWithStorageManager:storage]; + [OWSFailedAttachmentDownloadsJob asyncRegisterDatabaseExtensionsWithStorageManager:storage]; +} + +#pragma mark - @interface TSStorageManager () @property (nonatomic, readonly, nullable) YapDatabaseConnection *dbReadConnection; @@ -75,14 +109,7 @@ NSString *const TSStorageManagerExceptionName_CouldNotCreateDatabaseDirectory - (void)runSyncRegistrations { - // Synchronously register extensions which are essential for views. - [TSDatabaseView registerCrossProcessNotifier]; - [TSDatabaseView registerThreadInteractionsDatabaseView]; - [TSDatabaseView registerThreadDatabaseView]; - [TSDatabaseView registerUnreadDatabaseView]; - [self registerExtension:[TSDatabaseSecondaryIndexes registerTimeStampIndex] withName:@"idx"]; - [OWSMessageReceiver syncRegisterDatabaseExtension:self]; - [OWSBatchMessageProcessor syncRegisterDatabaseExtension:self]; + runSyncRegistrationsForPrimaryStorage(self); // See comments on OWSDatabaseConnection. // @@ -98,29 +125,18 @@ NSString *const TSStorageManagerExceptionName_CouldNotCreateDatabaseDirectory { OWSAssert(completion); - // Asynchronously register other extensions. - // - // All sync registrations must be done before all async registrations, - // or the sync registrations will block on the async registrations. - [TSDatabaseView asyncRegisterUnseenDatabaseView]; - [TSDatabaseView asyncRegisterThreadOutgoingMessagesDatabaseView]; - [TSDatabaseView asyncRegisterThreadSpecialMessagesDatabaseView]; - - // Register extensions which aren't essential for rendering threads async. - [OWSIncomingMessageFinder asyncRegisterExtensionWithStorageManager:self]; - [TSDatabaseView asyncRegisterSecondaryDevicesDatabaseView]; - [OWSDisappearingMessagesFinder asyncRegisterDatabaseExtensions:self]; - [OWSFailedMessagesJob asyncRegisterDatabaseExtensionsWithStorageManager:self]; - [OWSFailedAttachmentDownloadsJob asyncRegisterDatabaseExtensionsWithStorageManager:self]; + runAsyncRegistrationsForPrimaryStorage(self); // Block until all async registrations are complete. - [self.newDatabaseConnection asyncReadWriteWithBlock:^(YapDatabaseReadWriteTransaction *_Nonnull transaction) { - OWSAssert(!self.areAsyncRegistrationsComplete); + YapDatabaseConnection *dbConnection = self.newDatabaseConnection; + [dbConnection flushTransactionsWithCompletionQueue:dispatch_get_main_queue() + completionBlock:^{ + OWSAssert(!self.areAsyncRegistrationsComplete); - self.areAsyncRegistrationsComplete = YES; + self.areAsyncRegistrationsComplete = YES; - completion(); - }]; + completion(); + }]; } + (void)protectFiles @@ -135,10 +151,6 @@ NSString *const TSStorageManagerExceptionName_CouldNotCreateDatabaseDirectory [OWSFileSystem protectFileOrFolderAtPath:self.sharedDataDatabaseDirPath]; } -- (BOOL)userSetPassword { - return FALSE; -} - + (NSString *)legacyDatabaseDirPath { return [OWSFileSystem appDocumentDirectoryPath];