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