Add assert to ensure that we don't use write transactions before sync database view registration is complete.

// FREEBIE
pull/1/head
Matthew Chen 8 years ago
parent 9a045054e2
commit a9b55675cd

@ -33,6 +33,91 @@ static const NSString *const databaseName = @"Signal.sqlite";
static NSString *keychainService = @"TSKeyChainService";
static NSString *keychainDBPassAccount = @"TSDatabasePass";
static BOOL isDatabaseInitializedFlag = NO;
NSObject *isDatabaseInitializedFlagLock()
{
static NSObject *instance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
instance = [NSObject new];
});
return instance;
}
BOOL isDatabaseInitialized()
{
@synchronized(isDatabaseInitializedFlagLock())
{
return isDatabaseInitializedFlag;
}
}
void setDatabaseInitialized()
{
@synchronized(isDatabaseInitializedFlagLock())
{
isDatabaseInitializedFlag = YES;
}
}
#pragma mark -
@interface YapDatabaseConnection ()
- (id)initWithDatabase:(YapDatabase *)inDatabase;
@end
#pragma mark -
@interface OWSDatabaseConnection : YapDatabaseConnection
@end
#pragma mark -
@implementation OWSDatabaseConnection
- (void)readWriteWithBlock:(void (^)(YapDatabaseReadWriteTransaction *transaction))block
{
OWSAssert(isDatabaseInitialized());
[super readWriteWithBlock:block];
}
@end
#pragma mark -
@interface YapDatabase ()
- (void)addConnection:(YapDatabaseConnection *)connection;
@end
#pragma mark -
@interface OWSDatabase : YapDatabase
@end
#pragma mark -
@implementation OWSDatabase
- (YapDatabaseConnection *)newConnection
{
YapDatabaseConnection *connection = [[OWSDatabaseConnection alloc] initWithDatabase:self];
[self addConnection:connection];
return connection;
}
@end
#pragma mark -
@interface TSStorageManager ()
@property (nullable, atomic) YapDatabase *database;
@ -152,10 +237,18 @@ static NSString *keychainDBPassAccount = @"TSDatabasePass";
return databasePassword;
};
#ifdef DEBUG
_database = [[OWSDatabase alloc] initWithPath:[self dbPath]
serializer:NULL
deserializer:[[self class] logOnFailureDeserializer]
options:options];
#else
_database = [[YapDatabase alloc] initWithPath:[self dbPath]
serializer:NULL
deserializer:[[self class] logOnFailureDeserializer]
options:options];
#endif
if (!_database) {
return NO;
}
@ -198,6 +291,8 @@ static NSString *keychainDBPassAccount = @"TSDatabasePass";
[self.database registerExtension:[TSDatabaseSecondaryIndexes registerTimeStampIndex] withName:@"idx"];
[OWSMessageReceiver syncRegisterDatabaseExtension:self.database];
setDatabaseInitialized();
// Run the blocking migrations.
//
// These need to run _before_ the async registered database views or

Loading…
Cancel
Save