aboutsummaryrefslogtreecommitdiffhomepage
path: root/Firebase/Database
diff options
context:
space:
mode:
authorGravatar Sebastian Schmidt <mrschmidt@google.com>2017-07-26 13:50:34 -0700
committerGravatar GitHub <noreply@github.com>2017-07-26 13:50:34 -0700
commit4a22dc2a180eb0f7a6b19ff79cadd71f82cd7f12 (patch)
treece7cf2f18f174d59e0a628e4d892ffe105c4a5b7 /Firebase/Database
parentf7fc2bb573564aae1d5f0a9d4b354ea348e3a601 (diff)
Purge persistence cache if we can't load from it (#153)
* Purge persistence cache if we can't load from it * Adding unit test * Review comments
Diffstat (limited to 'Firebase/Database')
-rw-r--r--Firebase/Database/Persistence/FLevelDBStorageEngine.h2
-rw-r--r--Firebase/Database/Persistence/FLevelDBStorageEngine.m40
2 files changed, 30 insertions, 12 deletions
diff --git a/Firebase/Database/Persistence/FLevelDBStorageEngine.h b/Firebase/Database/Persistence/FLevelDBStorageEngine.h
index 059a071..84f3864 100644
--- a/Firebase/Database/Persistence/FLevelDBStorageEngine.h
+++ b/Firebase/Database/Persistence/FLevelDBStorageEngine.h
@@ -29,6 +29,8 @@
@interface FLevelDBStorageEngine : NSObject<FStorageEngine>
++ (NSString *) firebaseDir;
+
- (id)initWithPath:(NSString *)path;
- (void)runLegacyMigration:(FRepoInfo *)info;
diff --git a/Firebase/Database/Persistence/FLevelDBStorageEngine.m b/Firebase/Database/Persistence/FLevelDBStorageEngine.m
index 22d67ad..3a63319 100644
--- a/Firebase/Database/Persistence/FLevelDBStorageEngine.m
+++ b/Firebase/Database/Persistence/FLevelDBStorageEngine.m
@@ -180,17 +180,21 @@ static NSString* trackedQueryKeysKey(NSUInteger trackedQueryId, NSString *key) {
self.writesDB = [self createDB:kFWritesDBPath];
}
+- (void)purgeDatabase:(NSString*) dbPath {
+ NSString *path = [self.basePath stringByAppendingPathComponent:dbPath];
+ NSError *error;
+ FFWarn(@"I-RDB076009", @"Deleting database at path %@", path);
+ BOOL success = [[NSFileManager defaultManager] removeItemAtPath:path error:&error];
+ if (!success) {
+ [NSException raise:NSInternalInconsistencyException format:@"Failed to delete database files: %@", error];
+ }
+}
+
- (void)purgeEverything {
[self close];
[@[kFServerDBPath, kFWritesDBPath]
enumerateObjectsUsingBlock:^(NSString *dbPath, NSUInteger idx, BOOL *stop) {
- NSString *path = [self.basePath stringByAppendingPathComponent:dbPath];
- NSError *error;
- FFDebug(@"I-RDB076009", @"Deleting database at path %@", path);
- BOOL success = [[NSFileManager defaultManager] removeItemAtPath:path error:&error];
- if (!success) {
- [NSException raise:NSInternalInconsistencyException format:@"Failed to delete database files: %@", error];
- }
+ [self purgeDatabase:dbPath];
}];
[self openDatabases];
@@ -216,14 +220,26 @@ static NSString* trackedQueryKeysKey(NSUInteger trackedQueryId, NSString *key) {
#endif
}
-- (APLevelDB *)createDB:(NSString *)name {
+- (APLevelDB *)createDB:(NSString *)dbName {
NSError *err = nil;
- NSString *path = [self.basePath stringByAppendingPathComponent:name];
+ NSString *path = [self.basePath stringByAppendingPathComponent:dbName];
APLevelDB *db = [APLevelDB levelDBWithPath:path error:&err];
- if(err) {
- NSString *reason = [NSString stringWithFormat:@"Error initializing persistence: %@", [err description]];
- @throw [NSException exceptionWithName:@"FirebaseDatabasePersistenceFailure" reason:reason userInfo:nil];
+
+ if (err) {
+ FFWarn(@"I-RDB076036", @"Failed to read database persistence file '%@': %@",
+ dbName, [err localizedDescription]);
+ err = nil;
+
+ // Delete the database and try again.
+ [self purgeDatabase:dbName];
+ db = [APLevelDB levelDBWithPath:path error:&err];
+
+ if (err) {
+ NSString *reason = [NSString stringWithFormat:@"Error initializing persistence: %@", [err description]];
+ @throw [NSException exceptionWithName:@"FirebaseDatabasePersistenceFailure" reason:reason userInfo:nil];
+ }
}
+
return db;
}