From 137fe6fb8b94ee8b02c0d3c3a4373d3917187817 Mon Sep 17 00:00:00 2001 From: Matthew Chen Date: Mon, 18 Dec 2017 18:05:27 -0500 Subject: [PATCH] Pull out OWSStorage base class for TSStorageManager. --- .../src/ViewControllers/HomeViewController.m | 6 +- .../src/Messages/OWSBatchMessageProcessor.h | 4 +- .../src/Messages/OWSBatchMessageProcessor.m | 12 ++-- .../Messages/OWSDisappearingMessagesFinder.m | 22 ++++---- .../OWSFailedAttachmentDownloadsJob.m | 22 ++++---- .../src/Messages/OWSFailedMessagesJob.m | 22 ++++---- .../src/Messages/OWSMessageManager.m | 2 +- .../src/Messages/OWSMessageReceiver.h | 4 +- .../src/Messages/OWSMessageReceiver.m | 12 ++-- .../src/Storage/OWSIncomingMessageFinder.h | 4 +- .../src/Storage/OWSIncomingMessageFinder.m | 26 ++++----- SignalServiceKit/src/Storage/OWSStorage.h | 14 +++-- SignalServiceKit/src/Storage/OWSStorage.m | 56 +++++++------------ SignalServiceKit/src/Storage/TSDatabaseView.m | 15 +++-- .../src/Storage/TSStorageManager.h | 3 - .../src/Storage/TSStorageManager.m | 14 ++--- SignalServiceKit/src/Util/NSObject+OWS.h | 2 +- 17 files changed, 111 insertions(+), 129 deletions(-) diff --git a/Signal/src/ViewControllers/HomeViewController.m b/Signal/src/ViewControllers/HomeViewController.m index d4a1f60a1..6696521a9 100644 --- a/Signal/src/ViewControllers/HomeViewController.m +++ b/Signal/src/ViewControllers/HomeViewController.m @@ -914,10 +914,10 @@ typedef NS_ENUM(NSInteger, CellState) { kArchiveState, kInboxState }; - (YapDatabaseConnection *)uiDatabaseConnection { - NSAssert([NSThread isMainThread], @"Must access uiDatabaseConnection on main thread!"); + OWSAssert([NSThread isMainThread]); + if (!_uiDatabaseConnection) { - YapDatabase *database = TSStorageManager.sharedManager.database; - _uiDatabaseConnection = [database newConnection]; + _uiDatabaseConnection = [TSStorageManager.sharedManager newDatabaseConnection]; [_uiDatabaseConnection beginLongLivedReadTransaction]; } return _uiDatabaseConnection; diff --git a/SignalServiceKit/src/Messages/OWSBatchMessageProcessor.h b/SignalServiceKit/src/Messages/OWSBatchMessageProcessor.h index 220e493bc..7b6d06a31 100644 --- a/SignalServiceKit/src/Messages/OWSBatchMessageProcessor.h +++ b/SignalServiceKit/src/Messages/OWSBatchMessageProcessor.h @@ -5,7 +5,7 @@ NS_ASSUME_NONNULL_BEGIN @class OWSSignalServiceProtosEnvelope; -@class YapDatabase; +@class TSStorageManager; // 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:(YapDatabase *)database; ++ (void)syncRegisterDatabaseExtension:(TSStorageManager *)storageManager; - (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 d666098a1..c4461d5da 100644 --- a/SignalServiceKit/src/Messages/OWSBatchMessageProcessor.m +++ b/SignalServiceKit/src/Messages/OWSBatchMessageProcessor.m @@ -199,15 +199,15 @@ NSString *const OWSMessageContentJobFinderExtensionGroup = @"OWSMessageContentJo } -+ (void)syncRegisterDatabaseExtension:(YapDatabase *)database ++ (void)syncRegisterDatabaseExtension:(TSStorageManager *)storageManager { - YapDatabaseView *existingView = [database registeredExtension:OWSMessageContentJobFinderExtensionName]; + YapDatabaseView *existingView = [storageManager registeredExtension:OWSMessageContentJobFinderExtensionName]; if (existingView) { OWSFail(@"%@ was already initialized.", OWSMessageContentJobFinderExtensionName); // already initialized return; } - [database registerExtension:[self databaseExtension] withName:OWSMessageContentJobFinderExtensionName]; + [storageManager registerExtension:[self databaseExtension] withName:OWSMessageContentJobFinderExtensionName]; } #pragma mark Logging @@ -422,7 +422,7 @@ NSString *const OWSMessageContentJobFinderExtensionGroup = @"OWSMessageContentJo - (instancetype)initDefault { // For concurrency coherency we use the same dbConnection to persist and read the unprocessed envelopes - YapDatabaseConnection *dbConnection = [[TSStorageManager sharedManager].database newConnection]; + YapDatabaseConnection *dbConnection = [[TSStorageManager sharedManager] newDatabaseConnection]; OWSMessageManager *messagesManager = [OWSMessageManager sharedManager]; TSStorageManager *storageManager = [TSStorageManager sharedManager]; @@ -443,9 +443,9 @@ NSString *const OWSMessageContentJobFinderExtensionGroup = @"OWSMessageContentJo #pragma mark - class methods -+ (void)syncRegisterDatabaseExtension:(YapDatabase *)database ++ (void)syncRegisterDatabaseExtension:(TSStorageManager *)storageManager { - [OWSMessageContentJobFinder syncRegisterDatabaseExtension:database]; + [OWSMessageContentJobFinder syncRegisterDatabaseExtension:storageManager]; } #pragma mark - instance methods diff --git a/SignalServiceKit/src/Messages/OWSDisappearingMessagesFinder.m b/SignalServiceKit/src/Messages/OWSDisappearingMessagesFinder.m index e3f5540c9..ad6be5251 100644 --- a/SignalServiceKit/src/Messages/OWSDisappearingMessagesFinder.m +++ b/SignalServiceKit/src/Messages/OWSDisappearingMessagesFinder.m @@ -191,21 +191,21 @@ static NSString *const OWSDisappearingMessageFinderExpiresAtIndex = @"index_mess // Useful for tests, don't use in app startup path because it's slow. + (void)blockingRegisterDatabaseExtensions:(TSStorageManager *)storageManager { - [storageManager.database registerExtension:[self indexDatabaseExtension] - withName:OWSDisappearingMessageFinderExpiresAtIndex]; + [storageManager registerExtension:[self indexDatabaseExtension] + withName:OWSDisappearingMessageFinderExpiresAtIndex]; } + (void)asyncRegisterDatabaseExtensions:(TSStorageManager *)storageManager { - [storageManager.database 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); - } - }]; + [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); + } + }]; } @end diff --git a/SignalServiceKit/src/Messages/OWSFailedAttachmentDownloadsJob.m b/SignalServiceKit/src/Messages/OWSFailedAttachmentDownloadsJob.m index b3dd20369..ba9698066 100644 --- a/SignalServiceKit/src/Messages/OWSFailedAttachmentDownloadsJob.m +++ b/SignalServiceKit/src/Messages/OWSFailedAttachmentDownloadsJob.m @@ -121,21 +121,21 @@ static NSString *const OWSFailedAttachmentDownloadsJobAttachmentStateIndex = @"i // Useful for tests, don't use in app startup path because it's slow. - (void)blockingRegisterDatabaseExtensions { - [self.storageManager.database registerExtension:[self indexDatabaseExtension] - withName:OWSFailedAttachmentDownloadsJobAttachmentStateIndex]; + [self.storageManager registerExtension:[self indexDatabaseExtension] + withName:OWSFailedAttachmentDownloadsJobAttachmentStateIndex]; } - (void)asyncRegisterDatabaseExtensions { - [self.storageManager.database 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); - } - }]; + [self.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); + } + }]; } @end diff --git a/SignalServiceKit/src/Messages/OWSFailedMessagesJob.m b/SignalServiceKit/src/Messages/OWSFailedMessagesJob.m index d926145bf..a556a9524 100644 --- a/SignalServiceKit/src/Messages/OWSFailedMessagesJob.m +++ b/SignalServiceKit/src/Messages/OWSFailedMessagesJob.m @@ -130,21 +130,21 @@ static NSString *const OWSFailedMessagesJobMessageStateIndex = @"index_outoing_m // Useful for tests, don't use in app startup path because it's slow. - (void)blockingRegisterDatabaseExtensions { - [self.storageManager.database registerExtension:[self indexDatabaseExtension] - withName:OWSFailedMessagesJobMessageStateIndex]; + [self.storageManager registerExtension:[self indexDatabaseExtension] + withName:OWSFailedMessagesJobMessageStateIndex]; } - (void)asyncRegisterDatabaseExtensions { - [self.storageManager.database 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); - } - }]; + [self.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); + } + }]; } @end diff --git a/SignalServiceKit/src/Messages/OWSMessageManager.m b/SignalServiceKit/src/Messages/OWSMessageManager.m index 3c1c8d128..58d3449a6 100644 --- a/SignalServiceKit/src/Messages/OWSMessageManager.m +++ b/SignalServiceKit/src/Messages/OWSMessageManager.m @@ -109,7 +109,7 @@ NS_ASSUME_NONNULL_BEGIN _messageSender = messageSender; _dbConnection = storageManager.newDatabaseConnection; - _incomingMessageFinder = [[OWSIncomingMessageFinder alloc] initWithDatabase:storageManager.database]; + _incomingMessageFinder = [[OWSIncomingMessageFinder alloc] initWithStorageManager:storageManager]; _blockingManager = [OWSBlockingManager sharedManager]; OWSSingletonAssert(); diff --git a/SignalServiceKit/src/Messages/OWSMessageReceiver.h b/SignalServiceKit/src/Messages/OWSMessageReceiver.h index c73d500c8..d2b18a7af 100644 --- a/SignalServiceKit/src/Messages/OWSMessageReceiver.h +++ b/SignalServiceKit/src/Messages/OWSMessageReceiver.h @@ -5,7 +5,7 @@ NS_ASSUME_NONNULL_BEGIN @class OWSSignalServiceProtosEnvelope; -@class YapDatabase; +@class TSStorageManager; // 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:(YapDatabase *)database; ++ (void)syncRegisterDatabaseExtension:(TSStorageManager *)storageManager; - (void)handleReceivedEnvelope:(OWSSignalServiceProtosEnvelope *)envelope; - (void)handleAnyUnprocessedEnvelopesAsync; diff --git a/SignalServiceKit/src/Messages/OWSMessageReceiver.m b/SignalServiceKit/src/Messages/OWSMessageReceiver.m index fa718181a..c07e31586 100644 --- a/SignalServiceKit/src/Messages/OWSMessageReceiver.m +++ b/SignalServiceKit/src/Messages/OWSMessageReceiver.m @@ -189,17 +189,17 @@ NSString *const OWSMessageDecryptJobFinderExtensionGroup = @"OWSMessageProcessin }); } -+ (void)syncRegisterDatabaseExtension:(YapDatabase *)database ++ (void)syncRegisterDatabaseExtension:(TSStorageManager *)storageManager { [self registerLegacyClasses]; - YapDatabaseView *existingView = [database registeredExtension:OWSMessageDecryptJobFinderExtensionName]; + YapDatabaseView *existingView = [storageManager registeredExtension:OWSMessageDecryptJobFinderExtensionName]; if (existingView) { OWSFail(@"%@ was already initialized.", OWSMessageDecryptJobFinderExtensionName); // already initialized return; } - [database registerExtension:[self databaseExtension] withName:OWSMessageDecryptJobFinderExtensionName]; + [storageManager registerExtension:[self databaseExtension] withName:OWSMessageDecryptJobFinderExtensionName]; } @end @@ -399,7 +399,7 @@ NSString *const OWSMessageDecryptJobFinderExtensionGroup = @"OWSMessageProcessin - (instancetype)initDefault { // For concurrency coherency we use the same dbConnection to persist and read the unprocessed envelopes - YapDatabaseConnection *dbConnection = [[TSStorageManager sharedManager].database newConnection]; + YapDatabaseConnection *dbConnection = [[TSStorageManager sharedManager] newDatabaseConnection]; OWSMessageDecrypter *messageDecrypter = [OWSMessageDecrypter sharedManager]; OWSBatchMessageProcessor *batchMessageProcessor = [OWSBatchMessageProcessor sharedInstance]; @@ -422,9 +422,9 @@ NSString *const OWSMessageDecryptJobFinderExtensionGroup = @"OWSMessageProcessin #pragma mark - class methods -+ (void)syncRegisterDatabaseExtension:(YapDatabase *)database ++ (void)syncRegisterDatabaseExtension:(TSStorageManager *)storageManager { - [OWSMessageDecryptJobFinder syncRegisterDatabaseExtension:database]; + [OWSMessageDecryptJobFinder syncRegisterDatabaseExtension:storageManager]; } #pragma mark - instance methods diff --git a/SignalServiceKit/src/Storage/OWSIncomingMessageFinder.h b/SignalServiceKit/src/Storage/OWSIncomingMessageFinder.h index a75d43e44..6a5fb7794 100644 --- a/SignalServiceKit/src/Storage/OWSIncomingMessageFinder.h +++ b/SignalServiceKit/src/Storage/OWSIncomingMessageFinder.h @@ -4,12 +4,12 @@ NS_ASSUME_NONNULL_BEGIN -@class YapDatabase; +@class TSStorageManager; @class YapDatabaseReadTransaction; @interface OWSIncomingMessageFinder : NSObject -- (instancetype)initWithDatabase:(YapDatabase *)database NS_DESIGNATED_INITIALIZER; +- (instancetype)initWithStorageManager:(TSStorageManager *)storageManager NS_DESIGNATED_INITIALIZER; /** * Must be called before using this finder. diff --git a/SignalServiceKit/src/Storage/OWSIncomingMessageFinder.m b/SignalServiceKit/src/Storage/OWSIncomingMessageFinder.m index cea99647f..854b61989 100644 --- a/SignalServiceKit/src/Storage/OWSIncomingMessageFinder.m +++ b/SignalServiceKit/src/Storage/OWSIncomingMessageFinder.m @@ -18,7 +18,7 @@ NSString *const OWSIncomingMessageFinderColumnSourceDeviceId = @"OWSIncomingMess @interface OWSIncomingMessageFinder () -@property (nonatomic, readonly) YapDatabase *database; +@property (nonatomic, readonly) TSStorageManager *storageManager; @property (nonatomic, readonly) YapDatabaseConnection *dbConnection; @end @@ -31,19 +31,19 @@ NSString *const OWSIncomingMessageFinderColumnSourceDeviceId = @"OWSIncomingMess - (instancetype)init { - OWSAssert([TSStorageManager sharedManager].database != nil); + OWSAssert([TSStorageManager sharedManager]); - return [self initWithDatabase:[TSStorageManager sharedManager].database]; + return [self initWithStorageManager:[TSStorageManager sharedManager]]; } -- (instancetype)initWithDatabase:(YapDatabase *)database +- (instancetype)initWithStorageManager:(TSStorageManager *)storageManager { self = [super init]; if (!self) { return self; } - _database = database; + _storageManager = storageManager; return self; } @@ -54,7 +54,7 @@ NSString *const OWSIncomingMessageFinderColumnSourceDeviceId = @"OWSIncomingMess { @synchronized (self) { if (!_dbConnection) { - _dbConnection = self.database.newConnection; + _dbConnection = [self.storageManager newDatabaseConnection]; } } return _dbConnection; @@ -95,18 +95,18 @@ NSString *const OWSIncomingMessageFinderColumnSourceDeviceId = @"OWSIncomingMess - (void)asyncRegisterExtension { DDLogInfo(@"%@ registering async.", self.logTag); - [self.database asyncRegisterExtension:self.indexExtension - withName:OWSIncomingMessageFinderExtensionName - completionBlock:^(BOOL ready) { - DDLogInfo(@"%@ finished registering async.", self.logTag); - }]; + [self.storageManager 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. - (void)registerExtension { DDLogError(@"%@ registering SYNC. We should prefer async when possible.", self.logTag); - [self.database registerExtension:self.indexExtension withName:OWSIncomingMessageFinderExtensionName]; + [self.storageManager registerExtension:self.indexExtension withName:OWSIncomingMessageFinderExtensionName]; } #pragma mark - instance methods @@ -116,7 +116,7 @@ NSString *const OWSIncomingMessageFinderColumnSourceDeviceId = @"OWSIncomingMess sourceDeviceId:(uint32_t)sourceDeviceId transaction:(YapDatabaseReadTransaction *)transaction { - if (![self.database registeredExtension:OWSIncomingMessageFinderExtensionName]) { + if (![self.storageManager registeredExtension:OWSIncomingMessageFinderExtensionName]) { OWSFail(@"%@ in %s but extension is not registered", self.logTag, __PRETTY_FUNCTION__); // we should be initializing this at startup rather than have an unexpectedly slow lazy setup at random. diff --git a/SignalServiceKit/src/Storage/OWSStorage.h b/SignalServiceKit/src/Storage/OWSStorage.h index 8a777d3f7..98879f7cc 100644 --- a/SignalServiceKit/src/Storage/OWSStorage.h +++ b/SignalServiceKit/src/Storage/OWSStorage.h @@ -4,12 +4,6 @@ #import -// TODO: Remove this import. -#import "YapDatabaseConnection+OWS.h" - -// TODO: Remove this import. -#import - NS_ASSUME_NONNULL_BEGIN @protocol OWSDatabaseConnectionDelegate @@ -20,6 +14,8 @@ NS_ASSUME_NONNULL_BEGIN #pragma mark - +@class YapDatabaseExtension; + @interface OWSStorage : NSObject - (instancetype)init NS_UNAVAILABLE; @@ -36,6 +32,12 @@ NS_ASSUME_NONNULL_BEGIN @property (nullable, nonatomic, readonly) YapDatabaseConnection *dbReadConnection; @property (nullable, nonatomic, readonly) YapDatabaseConnection *dbReadWriteConnection; +- (BOOL)registerExtension:(YapDatabaseExtension *)extension withName:(NSString *)extensionName; +- (void)asyncRegisterExtension:(YapDatabaseExtension *)extension + withName:(NSString *)extensionName + completionBlock:(nullable void (^)(BOOL ready))completionBlock; +- (nullable id)registeredExtension:(NSString *)extensionName; + #pragma mark - Password /** diff --git a/SignalServiceKit/src/Storage/OWSStorage.m b/SignalServiceKit/src/Storage/OWSStorage.m index ac9cefb69..c7ec8b76a 100644 --- a/SignalServiceKit/src/Storage/OWSStorage.m +++ b/SignalServiceKit/src/Storage/OWSStorage.m @@ -5,28 +5,11 @@ #import "OWSStorage.h" #import "AppContext.h" #import "NSData+Base64.h" - -//#import "OWSAnalytics.h" -//#import "OWSBatchMessageProcessor.h" -//#import "OWSDisappearingMessagesFinder.h" -//#import "OWSFailedAttachmentDownloadsJob.h" -//#import "OWSFailedMessagesJob.h" -//#import "OWSFileSystem.h" -//#import "OWSIncomingMessageFinder.h" -//#import "OWSMessageReceiver.h" -//#import "SignalRecipient.h" #import "TSAttachmentStream.h" - -//#import "TSDatabaseSecondaryIndexes.h" -//#import "TSDatabaseView.h" -//#import "TSInteraction.h" -//#import "TSThread.h" #import "TSStorageManager.h" #import #import -//#import - NS_ASSUME_NONNULL_BEGIN NSString *const OWSStorageExceptionName_DatabasePasswordInaccessibleWhileBackgrounded @@ -34,10 +17,6 @@ NSString *const OWSStorageExceptionName_DatabasePasswordInaccessibleWhileBackgro NSString *const OWSStorageExceptionName_DatabasePasswordUnwritable = @"OWSStorageExceptionName_DatabasePasswordUnwritable"; NSString *const OWSStorageExceptionName_NoDatabase = @"OWSStorageExceptionName_NoDatabase"; -// NSString *const OWSStorageExceptionName_CouldNotMoveDatabaseFile -// = @"OWSStorageExceptionName_CouldNotMoveDatabaseFile"; -// NSString *const OWSStorageExceptionName_CouldNotCreateDatabaseDirectory -// = @"OWSStorageExceptionName_CouldNotCreateDatabaseDirectory"; static NSString *keychainService = @"TSKeyChainService"; static NSString *keychainDBPassAccount = @"TSDatabasePass"; @@ -145,7 +124,7 @@ static NSString *keychainDBPassAccount = @"TSDatabasePass"; - (instancetype)init NS_UNAVAILABLE; - (id)initWithPath:(NSString *)inPath - serializer:(YapDatabaseSerializer)inSerializer + serializer:(nullable YapDatabaseSerializer)inSerializer deserializer:(YapDatabaseDeserializer)inDeserializer options:(YapDatabaseOptions *)inOptions delegate:(id)delegate NS_DESIGNATED_INITIALIZER; @@ -157,7 +136,7 @@ static NSString *keychainDBPassAccount = @"TSDatabasePass"; @implementation OWSDatabase - (id)initWithPath:(NSString *)inPath - serializer:(YapDatabaseSerializer)inSerializer + serializer:(nullable YapDatabaseSerializer)inSerializer deserializer:(YapDatabaseDeserializer)inDeserializer options:(YapDatabaseOptions *)inOptions delegate:(id)delegate @@ -304,7 +283,7 @@ static NSString *keychainDBPassAccount = @"TSDatabasePass"; options.enableMultiProcessSupport = YES; OWSDatabase *database = [[OWSDatabase alloc] initWithPath:[self dbPath] - serializer:NULL + serializer:nil deserializer:[[self class] logOnFailureDeserializer] options:options delegate:self]; @@ -344,23 +323,28 @@ static NSString *keychainDBPassAccount = @"TSDatabasePass"; }; } -//+ (void)protectSignalFiles -//{ -// // The old database location was in the Document directory, -// // so protect the database files individually. -// [OWSFileSystem protectFolderAtPath:self.legacyDatabaseFilePath]; -// [OWSFileSystem protectFolderAtPath:self.legacyDatabaseFilePath_SHM]; -// [OWSFileSystem protectFolderAtPath:self.legacyDatabaseFilePath_WAL]; -// -// // Protect the entire new database directory. -// [OWSFileSystem protectFolderAtPath:self.sharedDataDatabaseDirPath]; -//} - - (nullable YapDatabaseConnection *)newDatabaseConnection { return self.database.newConnection; } +- (BOOL)registerExtension:(YapDatabaseExtension *)extension withName:(NSString *)extensionName +{ + return [self.database registerExtension:extension withName:extensionName]; +} + +- (void)asyncRegisterExtension:(YapDatabaseExtension *)extension + withName:(NSString *)extensionName + completionBlock:(nullable void (^)(BOOL ready))completionBlock +{ + [self.database asyncRegisterExtension:extension withName:extensionName completionBlock:completionBlock]; +} + +- (nullable id)registeredExtension:(NSString *)extensionName +{ + return [self.database registeredExtension:extensionName]; +} + #pragma mark - Password - (void)deleteDatabaseFile diff --git a/SignalServiceKit/src/Storage/TSDatabaseView.m b/SignalServiceKit/src/Storage/TSDatabaseView.m index 458005b63..3516608fd 100644 --- a/SignalServiceKit/src/Storage/TSDatabaseView.m +++ b/SignalServiceKit/src/Storage/TSDatabaseView.m @@ -95,7 +95,7 @@ NSString *const TSSecondaryDevicesDatabaseViewExtensionName = @"TSSecondaryDevic // so long as they don't conflict with any other extension names. YapDatabaseExtension *extension = [[YapDatabaseCrossProcessNotification alloc] initWithIdentifier:@"SignalCrossProcessNotifier"]; - [[TSStorageManager sharedManager].database registerExtension:extension withName:@"SignalCrossProcessNotifier"]; + [[TSStorageManager sharedManager] registerExtension:extension withName:@"SignalCrossProcessNotifier"]; } + (void)registerMessageDatabaseViewWithName:(NSString *)viewName @@ -107,7 +107,7 @@ NSString *const TSSecondaryDevicesDatabaseViewExtensionName = @"TSSecondaryDevic OWSAssert(viewName.length > 0); OWSAssert((viewGrouping)); - YapDatabaseView *existingView = [[TSStorageManager sharedManager].database registeredExtension:viewName]; + YapDatabaseView *existingView = [[TSStorageManager sharedManager] registeredExtension:viewName]; if (existingView) { OWSFail(@"Registered database view twice: %@", viewName); return; @@ -126,7 +126,7 @@ NSString *const TSSecondaryDevicesDatabaseViewExtensionName = @"TSSecondaryDevic options:options]; if (async) { - [[TSStorageManager sharedManager].database + [[TSStorageManager sharedManager] asyncRegisterExtension:view withName:viewName completionBlock:^(BOOL ready) { @@ -135,7 +135,7 @@ NSString *const TSSecondaryDevicesDatabaseViewExtensionName = @"TSSecondaryDevic DDLogInfo(@"%@ asyncRegisterExtension: %@ -> %d", self.logTag, viewName, ready); }]; } else { - [[TSStorageManager sharedManager].database registerExtension:view withName:viewName]; + [[TSStorageManager sharedManager] registerExtension:view withName:viewName]; } } @@ -239,7 +239,7 @@ NSString *const TSSecondaryDevicesDatabaseViewExtensionName = @"TSSecondaryDevic + (void)registerThreadDatabaseView { YapDatabaseView *threadView = - [[TSStorageManager sharedManager].database registeredExtension:TSThreadDatabaseViewExtensionName]; + [[TSStorageManager sharedManager] registeredExtension:TSThreadDatabaseViewExtensionName]; if (threadView) { OWSFail(@"Registered database view twice: %@", TSThreadDatabaseViewExtensionName); return; @@ -285,8 +285,7 @@ NSString *const TSSecondaryDevicesDatabaseViewExtensionName = @"TSSecondaryDevic YapDatabaseView *databaseView = [[YapDatabaseAutoView alloc] initWithGrouping:viewGrouping sorting:viewSorting versionTag:@"3" options:options]; - [[TSStorageManager sharedManager].database registerExtension:databaseView - withName:TSThreadDatabaseViewExtensionName]; + [[TSStorageManager sharedManager] registerExtension:databaseView withName:TSThreadDatabaseViewExtensionName]; } /** @@ -399,7 +398,7 @@ NSString *const TSSecondaryDevicesDatabaseViewExtensionName = @"TSSecondaryDevic YapDatabaseView *view = [[YapDatabaseAutoView alloc] initWithGrouping:viewGrouping sorting:viewSorting versionTag:@"3" options:options]; - [[TSStorageManager sharedManager].database + [[TSStorageManager sharedManager] asyncRegisterExtension:view withName:TSSecondaryDevicesDatabaseViewExtensionName completionBlock:^(BOOL ready) { diff --git a/SignalServiceKit/src/Storage/TSStorageManager.h b/SignalServiceKit/src/Storage/TSStorageManager.h index c3c3d11cc..38746d668 100644 --- a/SignalServiceKit/src/Storage/TSStorageManager.h +++ b/SignalServiceKit/src/Storage/TSStorageManager.h @@ -5,7 +5,6 @@ #import "OWSStorage.h" #import "TSStorageKeys.h" #import "YapDatabaseConnection+OWS.h" -#import @class ECKeyPair; @class PreKeyRecord; @@ -31,8 +30,6 @@ NS_ASSUME_NONNULL_BEGIN - (void)deleteThreadsAndMessages; -- (nullable YapDatabase *)database; - // TODO: Deprecate. + (YapDatabaseConnection *)dbReadConnection; + (YapDatabaseConnection *)dbReadWriteConnection; diff --git a/SignalServiceKit/src/Storage/TSStorageManager.m b/SignalServiceKit/src/Storage/TSStorageManager.m index 815f6f0d3..3e4fab5fc 100644 --- a/SignalServiceKit/src/Storage/TSStorageManager.m +++ b/SignalServiceKit/src/Storage/TSStorageManager.m @@ -34,11 +34,11 @@ NSString *const TSStorageManagerExceptionName_CouldNotCreateDatabaseDirectory static TSStorageManager *sharedManager = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ + sharedManager = [[self alloc] initStorage]; + #if TARGET_OS_IPHONE - [TSStorageManager protectSignalFiles]; + [TSStorageManager protectFiles]; #endif - - sharedManager = [[self alloc] initStorage]; }); return sharedManager; } @@ -50,9 +50,9 @@ NSString *const TSStorageManagerExceptionName_CouldNotCreateDatabaseDirectory [TSDatabaseView registerThreadInteractionsDatabaseView]; [TSDatabaseView registerThreadDatabaseView]; [TSDatabaseView registerUnreadDatabaseView]; - [self.database registerExtension:[TSDatabaseSecondaryIndexes registerTimeStampIndex] withName:@"idx"]; - [OWSMessageReceiver syncRegisterDatabaseExtension:self.database]; - [OWSBatchMessageProcessor syncRegisterDatabaseExtension:self.database]; + [self registerExtension:[TSDatabaseSecondaryIndexes registerTimeStampIndex] withName:@"idx"]; + [OWSMessageReceiver syncRegisterDatabaseExtension:self]; + [OWSBatchMessageProcessor syncRegisterDatabaseExtension:self]; // See comments on OWSDatabaseConnection. // @@ -94,7 +94,7 @@ NSString *const TSStorageManagerExceptionName_CouldNotCreateDatabaseDirectory [TSDatabaseView asyncRegistrationCompletion]; } -+ (void)protectSignalFiles ++ (void)protectFiles { // The old database location was in the Document directory, // so protect the database files individually. diff --git a/SignalServiceKit/src/Util/NSObject+OWS.h b/SignalServiceKit/src/Util/NSObject+OWS.h index 49ffe6b5a..624cfa741 100644 --- a/SignalServiceKit/src/Util/NSObject+OWS.h +++ b/SignalServiceKit/src/Util/NSObject+OWS.h @@ -8,7 +8,7 @@ NS_ASSUME_NONNULL_BEGIN #pragma mark - Logging -@property (nonatomic) NSString *logTag; +@property (nonatomic, readonly) NSString *logTag; + (NSString *)logTag;