oc: sync old messages as last resort if there are not in cache

This is happening when the lastModSeq is greater than the modseq
from an old message and that message is not in cache.

This is used as last resort before crashing and it is only used
in objectVersion as it is the first place to call on sync. Other
related properties would work.
This commit is contained in:
Enrique J. Hernández Blasco
2014-11-19 00:23:16 +01:00
committed by Julio García
parent ef7b919175
commit a8b716fbaa
3 changed files with 79 additions and 2 deletions

View File

@@ -734,6 +734,70 @@ _compareFetchResultsByMODSEQ (id entry1, id entry2, void *data)
talloc_free(local_mem_ctx);
}
- (BOOL) synchroniseCacheForUID: (NSString *) messageUID
{
/* Try to synchronise old UIDs in versions.plist cache using an
specific UID. It returns a boolean indicating if the
synchronisation were done.
It should be used as last resort, keeping synchroniseCache to main
sync entry point.
*/
NSMutableDictionary *currentProperties, *messages, *messageEntry, *mapping;
NSArray *fetchResults;
uint64_t changeNumber;
NSDictionary *result;
NSNumber *modseq;
NSString *changeNumberStr;
NSData *changeKey;
[versionsMessage reloadIfNeeded];
currentProperties = [versionsMessage properties];
messages = [currentProperties objectForKey: @"Messages"];
messageEntry = [messages objectForKey: messageUID];
if (!messageEntry)
{
[messages removeObjectForKey: messageUID];
changeNumber = [[self context] getNewChangeNumber];
fetchResults = [(NSDictionary *) [sogoObject fetchUIDs: [NSArray arrayWithObject: messageUID]
parts: [NSArray arrayWithObject: @"modseq"]]
objectForKey: @"fetch"];
if ([fetchResults count] == 1)
{
result = [fetchResults objectAtIndex: 0];
modseq = [result objectForKey: @"modseq"];
changeNumberStr = [NSString stringWithUnsignedLongLong: changeNumber];
/* Create new message entry in Messages dict */
messageEntry = [NSMutableDictionary new];
[messages setObject: messageEntry forKey: messageUID];
[messageEntry release];
/* Store the modseq and change number */
[messageEntry setObject: modseq forKey: @"modseq"];
[messageEntry setObject: changeNumberStr forKey: @"version"];
/* Store the change key */
changeKey = [self getReplicaKeyFromGlobCnt: changeNumber >> 16];
[self _setChangeKey: changeKey forMessageEntry: messageEntry];
/* Store the changeNumber -> modseq mapping */
mapping = [currentProperties objectForKey: @"VersionMapping"];
[mapping setObject: modseq forKey: changeNumberStr];
/* Save the message */
[versionsMessage save];
return YES;
}
else
{
return NO;
}
}
/* If message entry exists, then synchroniseCache did its job */
return YES;
}
- (NSNumber *) modseqFromMessageChangeNumber: (NSString *) changeNum
{
NSDictionary *mapping;