diff --git a/OpenChange/MAPIStoreGCSFolder.h b/OpenChange/MAPIStoreGCSFolder.h index 1f48e034a..d4e3660f1 100644 --- a/OpenChange/MAPIStoreGCSFolder.h +++ b/OpenChange/MAPIStoreGCSFolder.h @@ -43,8 +43,8 @@ - (BOOL) synchroniseCache; - (void) updateVersionsForMessageWithKey: (NSString *) messageKey withChangeKey: (NSData *) newChangeKey; -- (NSNumber *) lastModifiedFromMessageChangeNumber: (NSNumber *) changeNum; -- (NSNumber *) changeNumberForMessageWithKey: (NSString *) messageKey; +- (NSNumber *) lastModifiedFromMessageChangeNumber: (NSString *) changeNumber; +- (NSString *) changeNumberForMessageWithKey: (NSString *) messageKey; - (NSData *) changeKeyForMessageWithKey: (NSString *) messageKey; - (NSData *) predecessorChangeListForMessageWithKey: (NSString *) messageKey; diff --git a/OpenChange/MAPIStoreGCSFolder.m b/OpenChange/MAPIStoreGCSFolder.m index 655e921e6..14fe6ec19 100644 --- a/OpenChange/MAPIStoreGCSFolder.m +++ b/OpenChange/MAPIStoreGCSFolder.m @@ -24,6 +24,7 @@ #import #import #import +#import #import #import #import @@ -328,9 +329,8 @@ static Class NSNumberK; BOOL rc = YES, foundChange = NO; uint64_t newChangeNum; NSData *changeKey; - NSString *cName; - NSNumber *ti, *changeNumber, *lastModificationDate, *cVersion, - *cLastModified, *cDeleted; + NSString *cName, *changeNumber; + NSNumber *ti, *lastModificationDate, *cVersion, *cLastModified, *cDeleted; EOFetchSpecification *fs; EOQualifier *searchQualifier, *fetchQualifier; NSUInteger count, max; @@ -342,6 +342,11 @@ static Class NSNumberK; static NSArray *fields = nil; static EOSortOrdering *sortOrdering = nil; + /* NOTE: we are using NSString instance for "changeNumber" because + NSNumber proved to give very bad performances when used as NSDictionary + keys with GNUstep 1.22.1. The bug seems to be solved with 1.24 but many + distros still ship an older version. */ + if (!fields) fields = [[NSArray alloc] initWithObjects: @"c_name", @"c_version", @"c_lastmodified", @@ -429,7 +434,7 @@ static Class NSNumberK; foundChange = YES; newChangeNum = [[self context] getNewChangeNumber]; - changeNumber = [NSNumber numberWithUnsignedLongLong: newChangeNum]; + changeNumber = [NSString stringWithUnsignedLongLong: newChangeNum]; [messageEntry setObject: cLastModified forKey: @"c_lastmodified"]; [messageEntry setObject: cVersion forKey: @"c_version"]; @@ -485,21 +490,21 @@ static Class NSNumberK; } } -- (NSNumber *) lastModifiedFromMessageChangeNumber: (NSNumber *) changeNum +- (NSNumber *) lastModifiedFromMessageChangeNumber: (NSString *) changeNumber { NSDictionary *mapping; NSNumber *modseq; mapping = [[versionsMessage properties] objectForKey: @"VersionMapping"]; - modseq = [mapping objectForKey: changeNum]; + modseq = [mapping objectForKey: changeNumber]; return modseq; } -- (NSNumber *) changeNumberForMessageWithKey: (NSString *) messageKey +- (NSString *) changeNumberForMessageWithKey: (NSString *) messageKey { NSDictionary *messages; - NSNumber *changeNumber; + NSString *changeNumber; messages = [[versionsMessage properties] objectForKey: @"Messages"]; changeNumber = [[messages objectForKey: messageKey] @@ -574,8 +579,8 @@ static Class NSNumberK; inTableType: (uint8_t) tableType { NSArray *deletedKeys, *deletedCNames, *records; - NSNumber *changeNumNbr, *lastModified; - NSString *cName; + NSNumber *lastModified; + NSString *cName, *changeNumber; NSDictionary *versionProperties, *messageEntry; NSMutableDictionary *messages; uint64_t maxChangeNum = changeNum, currentChangeNum; @@ -589,8 +594,8 @@ static Class NSNumberK; { deletedKeys = [NSMutableArray array]; - changeNumNbr = [NSNumber numberWithUnsignedLongLong: changeNum]; - lastModified = [self lastModifiedFromMessageChangeNumber: changeNumNbr]; + changeNumber = [NSString stringWithUnsignedLongLong: changeNum]; + lastModified = [self lastModifiedFromMessageChangeNumber: changeNumber]; if (lastModified) { versionProperties = [versionsMessage properties]; diff --git a/OpenChange/MAPIStoreGCSMessage.m b/OpenChange/MAPIStoreGCSMessage.m index 143f9ef19..7ab05e5f1 100644 --- a/OpenChange/MAPIStoreGCSMessage.m +++ b/OpenChange/MAPIStoreGCSMessage.m @@ -25,6 +25,7 @@ #import #import #import +#import #import #import #import @@ -178,7 +179,7 @@ - (uint64_t) objectVersion { uint64_t version = ULLONG_MAX; - NSNumber *changeNumber; + NSString *changeNumber; if (!isNew) {