Merge pull request #37 from WhisperSystems/mkirk/more-resilient-db-setup

more resilient db setup
pull/1/head
Michael Kirk 9 years ago committed by GitHub
commit cf035a597d

@ -21,8 +21,8 @@ typedef void (^failedBlock)(NSError *error);
* *
* @return registered or not * @return registered or not
*/ */
+ (BOOL)isRegistered; + (BOOL)isRegistered;
+ (void)runIfRegistered:(void (^)())block;
/** /**
* Returns registered number * Returns registered number

@ -40,6 +40,11 @@
return [TSStorageManager localNumber] ? YES : NO; return [TSStorageManager localNumber] ? YES : NO;
} }
+ (void)runIfRegistered:(void (^)())block
{
[[TSStorageManager sharedManager] runIfHasLocalNumber:block];
}
+ (void)didRegister { + (void)didRegister {
TSAccountManager *sharedManager = [self sharedInstance]; TSAccountManager *sharedManager = [self sharedInstance];
__strong NSString *phoneNumber = sharedManager.phoneNumberAwaitingVerification; __strong NSString *phoneNumber = sharedManager.phoneNumberAwaitingVerification;

@ -33,8 +33,8 @@
* *
* @return E164 string of the registered phone number * @return E164 string of the registered phone number
*/ */
+ (NSString *)localNumber; + (NSString *)localNumber;
- (void)runIfHasLocalNumber:(void (^)())block;
+ (void)storeServerToken:(NSString *)authToken signalingKey:(NSString *)signalingKey; + (void)storeServerToken:(NSString *)authToken signalingKey:(NSString *)signalingKey;

@ -14,6 +14,17 @@
return [[self sharedManager] stringForKey:TSStorageRegisteredNumberKey inCollection:TSStorageUserAccountCollection]; return [[self sharedManager] stringForKey:TSStorageRegisteredNumberKey inCollection:TSStorageUserAccountCollection];
} }
- (void)runIfHasLocalNumber:(void (^)())block
{
[self.newDatabaseConnection asyncReadWithBlock:^(YapDatabaseReadTransaction *_Nonnull transaction) {
if ([transaction objectForKey:TSStorageRegisteredNumberKey inCollection:TSStorageUserAccountCollection]) {
block();
} else {
DDLogDebug(@"%@ Skipping block since no local number is registered", self.tag);
}
}];
}
+ (NSString *)signalingKey { + (NSString *)signalingKey {
return [[self sharedManager] stringForKey:TSStorageServerSignalingKey inCollection:TSStorageUserAccountCollection]; return [[self sharedManager] stringForKey:TSStorageServerSignalingKey inCollection:TSStorageUserAccountCollection];
} }
@ -44,4 +55,16 @@
}]; }];
} }
#pragma mark - Logging
+ (NSString *)tag
{
return [NSString stringWithFormat:@"[%@]", self.class];
}
- (NSString *)tag
{
return self.class.tag;
}
@end @end

@ -32,19 +32,39 @@ static NSString *keychainDBPassAccount = @"TSDatabasePass";
@end @end
@implementation TSRecipient @interface OWSUnknownObject : NSObject <NSCoding>
@end
/**
* A default object to returned when we can't deserialize an object from YapDB. This can prevent crashes when
* old objects linger after their definition file is removed. The danger is that, the objects can lay in wait
* until the next time a DB extension is added and we necessarily enumerate the entire DB.
*/
@implementation OWSUnknownObject
- (instancetype)initWithCoder:(NSCoder *)aDecoder - (instancetype)initWithCoder:(NSCoder *)aDecoder
{ {
DDLogWarn(@"Ignoring decoding signal recipient with coder.");
self = [super init];
return nil; return nil;
} }
- (void)encodeWithCoder:(NSCoder *)aCoder - (void)encodeWithCoder:(NSCoder *)aCoder
{ {
DDLogWarn(@"Ignoring encoding signal recipient with coder.");
}
@end
@interface OWSUnarchiverDelegate : NSObject <NSKeyedUnarchiverDelegate>
@end
@implementation OWSUnarchiverDelegate
- (nullable Class)unarchiver:(NSKeyedUnarchiver *)unarchiver cannotDecodeObjectOfClassName:(NSString *)name originalClasses:(NSArray<NSString *> *)classNames
{
DDLogError(@"[OWSUnarchiverDelegate] Ignoring unknown class name: %@. Was the class definition deleted?", name);
return [OWSUnknownObject class];
} }
@end @end
@ -86,13 +106,17 @@ static NSString *keychainDBPassAccount = @"TSDatabasePass";
**/ **/
+ (YapDatabaseDeserializer)logOnFailureDeserializer + (YapDatabaseDeserializer)logOnFailureDeserializer
{ {
OWSUnarchiverDelegate *unarchiverDelegate = [OWSUnarchiverDelegate new];
return ^id(NSString __unused *collection, NSString __unused *key, NSData *data) { return ^id(NSString __unused *collection, NSString __unused *key, NSData *data) {
if (!data || data.length <= 0) { if (!data || data.length <= 0) {
return nil; return nil;
} }
@try { @try {
return [NSKeyedUnarchiver unarchiveObjectWithData:data]; NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
unarchiver.delegate = unarchiverDelegate;
return [unarchiver decodeObjectForKey:@"root"];
} @catch (NSException *exception) { } @catch (NSException *exception) {
// Sync log in case we bail. // Sync log in case we bail.
DDLogError(@"%@ Unarchiving key:%@ from collection:%@ and data %@ failed with error: %@", DDLogError(@"%@ Unarchiving key:%@ from collection:%@ and data %@ failed with error: %@",
@ -103,8 +127,6 @@ static NSString *keychainDBPassAccount = @"TSDatabasePass";
exception.reason); exception.reason);
DDLogError(@"%@ Raising exception.", self.tag); DDLogError(@"%@ Raising exception.", self.tag);
@throw exception; @throw exception;
// DDLogWarn(@"%@ Ignoring exception.", self.tag);
// return nil;
} }
}; };
} }

Loading…
Cancel
Save