Fjalapeno has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/206987

Change subject: Bug T96605 - fixing saves of the history
......................................................................

Bug T96605 - fixing saves of the history

Another case of throwing exceptions in the data layer.
This patch adds support for NSErrors in place of exceptions.
To do this required changing the save method to use one that produces an error, 
and
making changes to some method signatures to bubble the errors up.
Also, changed the flow of the saves a bit, instead of passing a save block,
methods just need to convert the object into NSData before writing to disk.

Change-Id: I1e6fb1fad6b93277268a6c7c7df42424c80fa83d
---
M MediaWikiKit/MediaWikiKit/MWKDataStore.h
M MediaWikiKit/MediaWikiKit/MWKDataStore.m
M MediaWikiKit/MediaWikiKit/MWKUserDataStore.h
M MediaWikiKit/MediaWikiKit/MWKUserDataStore.m
4 files changed, 55 insertions(+), 50 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/apps/ios/wikipedia 
refs/changes/87/206987/1

diff --git a/MediaWikiKit/MediaWikiKit/MWKDataStore.h 
b/MediaWikiKit/MediaWikiKit/MWKDataStore.h
index f29ee6d..1ce9782 100644
--- a/MediaWikiKit/MediaWikiKit/MWKDataStore.h
+++ b/MediaWikiKit/MediaWikiKit/MWKDataStore.h
@@ -67,7 +67,7 @@
 - (void)saveSectionText:(NSString*)html section:(MWKSection*)section;
 - (void)saveImage:(MWKImage*)image;
 - (void)saveImageData:(NSData*)data image:(MWKImage*)image;
-- (void)saveHistoryList:(MWKHistoryList*)list;
+- (BOOL)saveHistoryList:(MWKHistoryList*)list error:(NSError**)error;
 - (void)saveSavedPageList:(MWKSavedPageList*)list;
 - (void)saveRecentSearchList:(MWKRecentSearchList*)list;
 - (void)saveImageList:(MWKImageList*)imageList;
diff --git a/MediaWikiKit/MediaWikiKit/MWKDataStore.m 
b/MediaWikiKit/MediaWikiKit/MWKDataStore.m
index c81901b..f1b4ff5 100644
--- a/MediaWikiKit/MediaWikiKit/MWKDataStore.m
+++ b/MediaWikiKit/MediaWikiKit/MWKDataStore.m
@@ -135,58 +135,51 @@
 
 #pragma mark - save methods
 
+- (BOOL)ensurePathExists:(NSString*)path error:(NSError**)error {
+    return [[NSFileManager defaultManager] createDirectoryAtPath:path
+                                     withIntermediateDirectories:YES
+                                                      attributes:nil
+                                                           error:error];
+}
+
 - (void)ensurePathExists:(NSString*)path {
-    NSError* err;
-    [[NSFileManager defaultManager] createDirectoryAtPath:path
-                              withIntermediateDirectories:YES
-                                               attributes:nil
-                                                    error:&err];
-    if (err) {
-        @throw [NSException exceptionWithName:@"MWKDataStoreException"
-                                       reason:@"path creation failure"
-                                     userInfo:@{@"path": path, @"error": err}];
-    }
+    [self ensurePathExists:path error:NULL];
 }
 
-- (void)saveFile:(NSString*)filename atPath:(NSString*)path 
byPerforming:(NSError*(^)(NSString*))saveBlock {
-    [self ensurePathExists:path];
+- (BOOL)saveData:(NSData*)data toFile:(NSString*)filename 
atPath:(NSString*)path error:(NSError**)error {
+    [self ensurePathExists:path error:error];
     NSString* absolutePath = [path stringByAppendingPathComponent:filename];
-    NSError* error         = saveBlock(absolutePath);
-    if (error) {
-        @throw [NSException exceptionWithName:@"MWKDataStoreException"
-                                       reason:[NSString 
stringWithFormat:@"Failed to save %@ in %@.", filename, path]
-                                     
userInfo:NSDictionaryOfVariableBindings(error)];
-    }
-}
-
-- (void)saveArray:(NSArray*)array path:(NSString*)path name:(NSString*)name {
-    [self saveFile:name atPath:path byPerforming:^NSError*(NSString* absPath) {
-        return [array writeToFile:absPath atomically:YES] ?
-        nil : [NSError 
errorWithDomain:@"MWKDataStoreArrayWriteToFileFailedException" code:1 
userInfo:nil];
-    }];
-}
-
-- (void)saveDictionary:(NSDictionary*)dict path:(NSString*)path 
name:(NSString*)name {
-    [self saveFile:name atPath:path byPerforming:^NSError*(NSString* absPath) {
-        return [dict writeToFile:absPath atomically:YES] ?
-        nil : [NSError 
errorWithDomain:@"MWKDataStoreDictWriteToFileFailedException" code:1 
userInfo:nil];
-    }];
-}
-
-- (void)saveString:(NSString*)string path:(NSString*)path name:(NSString*)name 
{
-    [self saveFile:name atPath:path byPerforming:^NSError*(NSString* absPath) {
-        NSError* err = nil;
-        [string writeToFile:absPath atomically:YES 
encoding:NSUTF8StringEncoding error:&err];
-        return err;
-    }];
+    return [data writeToFile:absolutePath options:NSDataWritingAtomic 
error:error];
 }
 
 - (void)saveData:(NSData*)data path:(NSString*)path name:(NSString*)name {
-    [self saveFile:name atPath:path byPerforming:^NSError*(NSString* absPath) {
-        NSError* err = nil;
-        [data writeToFile:absPath options:NSDataWritingAtomic error:&err];
-        return err;
-    }];
+    [self saveData:data toFile:name atPath:path error:NULL];
+}
+
+- (BOOL)saveArray:(NSArray*)array path:(NSString*)path name:(NSString*)name 
error:(NSError**)error {
+    NSData* data = [NSPropertyListSerialization dataWithPropertyList:array 
format:NSPropertyListXMLFormat_v1_0 options:0 error:error];
+    return [self saveData:data toFile:name atPath:path error:error];
+}
+
+- (void)saveArray:(NSArray*)array path:(NSString*)path name:(NSString*)name {
+    [self saveArray:array path:path name:name error:NULL];
+}
+
+- (BOOL)saveDictionary:(NSDictionary*)dict path:(NSString*)path 
name:(NSString*)name error:(NSError**)error {
+    NSData* data = [NSPropertyListSerialization dataWithPropertyList:dict 
format:NSPropertyListXMLFormat_v1_0 options:0 error:error];
+    return [self saveData:data toFile:name atPath:path error:error];
+}
+
+- (void)saveDictionary:(NSDictionary*)dict path:(NSString*)path 
name:(NSString*)name {
+    [self saveDictionary:dict path:path name:name error:NULL];
+}
+
+- (BOOL)saveString:(NSString*)string path:(NSString*)path name:(NSString*)name 
error:(NSError**)error {
+    return [self saveData:[string dataUsingEncoding:NSUTF8StringEncoding] 
toFile:name atPath:path error:error];
+}
+
+- (void)saveString:(NSString*)string path:(NSString*)path name:(NSString*)name 
{
+    [self saveString:string path:path name:name error:NULL];
 }
 
 - (void)saveArticle:(MWKArticle*)article {
@@ -221,10 +214,10 @@
     [self saveImage:image];
 }
 
-- (void)saveHistoryList:(MWKHistoryList*)list {
+- (BOOL)saveHistoryList:(MWKHistoryList*)list error:(NSError**)error {
     NSString* path       = self.basePath;
     NSDictionary* export = [list dataExport];
-    [self saveDictionary:export path:path name:@"History.plist"];
+    return [self saveDictionary:export path:path name:@"History.plist" 
error:error];
 }
 
 - (void)saveSavedPageList:(MWKSavedPageList*)list {
diff --git a/MediaWikiKit/MediaWikiKit/MWKUserDataStore.h 
b/MediaWikiKit/MediaWikiKit/MWKUserDataStore.h
index 2065e46..fa1071c 100644
--- a/MediaWikiKit/MediaWikiKit/MWKUserDataStore.h
+++ b/MediaWikiKit/MediaWikiKit/MWKUserDataStore.h
@@ -22,11 +22,14 @@
 
 - (instancetype)initWithDataStore:(MWKDataStore*)dataStore;
 
+- (BOOL)save:(NSError**)error;
 - (void)save;
+
 - (void)reset;
 
 - (void)updateHistory:(MWKTitle*)title 
discoveryMethod:(MWKHistoryDiscoveryMethod)discoveryMethod;
 - (void)savePage:(MWKTitle*)title;
 - (void)unsavePage:(MWKTitle*)title;
 
+
 @end
diff --git a/MediaWikiKit/MediaWikiKit/MWKUserDataStore.m 
b/MediaWikiKit/MediaWikiKit/MWKUserDataStore.m
index 587d31a..e4c5c84 100644
--- a/MediaWikiKit/MediaWikiKit/MWKUserDataStore.m
+++ b/MediaWikiKit/MediaWikiKit/MWKUserDataStore.m
@@ -14,9 +14,12 @@
     MWKRecentSearchList* _recentSearchList;
 }
 
-- (void)save {
+- (BOOL)save:(NSError**)error {
+    BOOL success = YES;
+
     if (_historyList && _historyList.dirty) {
-        [self.dataStore saveHistoryList:_historyList];
+        success = [self.dataStore saveHistoryList:_historyList error:error];
+        NSAssert(success, @"Error saving history: %@", [*error 
localizedDescription]);
     }
     if (_savedPageList && _savedPageList.dirty) {
         [self.dataStore saveSavedPageList:_savedPageList];
@@ -24,6 +27,12 @@
     if (_recentSearchList && _recentSearchList.dirty) {
         [self.dataStore saveRecentSearchList:_recentSearchList];
     }
+
+    return success;
+}
+
+- (void)save {
+    [self save:NULL];
 }
 
 /// Clear out any currently loaded data and force it to be reloaded on next use

-- 
To view, visit https://gerrit.wikimedia.org/r/206987
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I1e6fb1fad6b93277268a6c7c7df42424c80fa83d
Gerrit-PatchSet: 1
Gerrit-Project: apps/ios/wikipedia
Gerrit-Branch: master
Gerrit-Owner: Fjalapeno <[email protected]>
Gerrit-Reviewer: jenkins-bot <>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to