Use NSString instances for representing change numbers, rather than NSNumber

pull/5/head
Wolfgang Sourdeau 2012-10-13 09:59:13 -04:00
parent 1e92fe0395
commit dec64722c8
3 changed files with 21 additions and 15 deletions

View File

@ -43,8 +43,8 @@
- (BOOL) synchroniseCache; - (BOOL) synchroniseCache;
- (void) updateVersionsForMessageWithKey: (NSString *) messageKey - (void) updateVersionsForMessageWithKey: (NSString *) messageKey
withChangeKey: (NSData *) newChangeKey; withChangeKey: (NSData *) newChangeKey;
- (NSNumber *) lastModifiedFromMessageChangeNumber: (NSNumber *) changeNum; - (NSNumber *) lastModifiedFromMessageChangeNumber: (NSString *) changeNumber;
- (NSNumber *) changeNumberForMessageWithKey: (NSString *) messageKey; - (NSString *) changeNumberForMessageWithKey: (NSString *) messageKey;
- (NSData *) changeKeyForMessageWithKey: (NSString *) messageKey; - (NSData *) changeKeyForMessageWithKey: (NSString *) messageKey;
- (NSData *) predecessorChangeListForMessageWithKey: (NSString *) messageKey; - (NSData *) predecessorChangeListForMessageWithKey: (NSString *) messageKey;

View File

@ -24,6 +24,7 @@
#import <Foundation/NSDictionary.h> #import <Foundation/NSDictionary.h>
#import <Foundation/NSException.h> #import <Foundation/NSException.h>
#import <NGExtensions/NSObject+Logs.h> #import <NGExtensions/NSObject+Logs.h>
#import <NGExtensions/NSObject+Values.h>
#import <EOControl/EOQualifier.h> #import <EOControl/EOQualifier.h>
#import <EOControl/EOFetchSpecification.h> #import <EOControl/EOFetchSpecification.h>
#import <EOControl/EOSortOrdering.h> #import <EOControl/EOSortOrdering.h>
@ -328,9 +329,8 @@ static Class NSNumberK;
BOOL rc = YES, foundChange = NO; BOOL rc = YES, foundChange = NO;
uint64_t newChangeNum; uint64_t newChangeNum;
NSData *changeKey; NSData *changeKey;
NSString *cName; NSString *cName, *changeNumber;
NSNumber *ti, *changeNumber, *lastModificationDate, *cVersion, NSNumber *ti, *lastModificationDate, *cVersion, *cLastModified, *cDeleted;
*cLastModified, *cDeleted;
EOFetchSpecification *fs; EOFetchSpecification *fs;
EOQualifier *searchQualifier, *fetchQualifier; EOQualifier *searchQualifier, *fetchQualifier;
NSUInteger count, max; NSUInteger count, max;
@ -342,6 +342,11 @@ static Class NSNumberK;
static NSArray *fields = nil; static NSArray *fields = nil;
static EOSortOrdering *sortOrdering = 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) if (!fields)
fields = [[NSArray alloc] fields = [[NSArray alloc]
initWithObjects: @"c_name", @"c_version", @"c_lastmodified", initWithObjects: @"c_name", @"c_version", @"c_lastmodified",
@ -429,7 +434,7 @@ static Class NSNumberK;
foundChange = YES; foundChange = YES;
newChangeNum = [[self context] getNewChangeNumber]; newChangeNum = [[self context] getNewChangeNumber];
changeNumber = [NSNumber numberWithUnsignedLongLong: newChangeNum]; changeNumber = [NSString stringWithUnsignedLongLong: newChangeNum];
[messageEntry setObject: cLastModified forKey: @"c_lastmodified"]; [messageEntry setObject: cLastModified forKey: @"c_lastmodified"];
[messageEntry setObject: cVersion forKey: @"c_version"]; [messageEntry setObject: cVersion forKey: @"c_version"];
@ -485,21 +490,21 @@ static Class NSNumberK;
} }
} }
- (NSNumber *) lastModifiedFromMessageChangeNumber: (NSNumber *) changeNum - (NSNumber *) lastModifiedFromMessageChangeNumber: (NSString *) changeNumber
{ {
NSDictionary *mapping; NSDictionary *mapping;
NSNumber *modseq; NSNumber *modseq;
mapping = [[versionsMessage properties] objectForKey: @"VersionMapping"]; mapping = [[versionsMessage properties] objectForKey: @"VersionMapping"];
modseq = [mapping objectForKey: changeNum]; modseq = [mapping objectForKey: changeNumber];
return modseq; return modseq;
} }
- (NSNumber *) changeNumberForMessageWithKey: (NSString *) messageKey - (NSString *) changeNumberForMessageWithKey: (NSString *) messageKey
{ {
NSDictionary *messages; NSDictionary *messages;
NSNumber *changeNumber; NSString *changeNumber;
messages = [[versionsMessage properties] objectForKey: @"Messages"]; messages = [[versionsMessage properties] objectForKey: @"Messages"];
changeNumber = [[messages objectForKey: messageKey] changeNumber = [[messages objectForKey: messageKey]
@ -574,8 +579,8 @@ static Class NSNumberK;
inTableType: (uint8_t) tableType inTableType: (uint8_t) tableType
{ {
NSArray *deletedKeys, *deletedCNames, *records; NSArray *deletedKeys, *deletedCNames, *records;
NSNumber *changeNumNbr, *lastModified; NSNumber *lastModified;
NSString *cName; NSString *cName, *changeNumber;
NSDictionary *versionProperties, *messageEntry; NSDictionary *versionProperties, *messageEntry;
NSMutableDictionary *messages; NSMutableDictionary *messages;
uint64_t maxChangeNum = changeNum, currentChangeNum; uint64_t maxChangeNum = changeNum, currentChangeNum;
@ -589,8 +594,8 @@ static Class NSNumberK;
{ {
deletedKeys = [NSMutableArray array]; deletedKeys = [NSMutableArray array];
changeNumNbr = [NSNumber numberWithUnsignedLongLong: changeNum]; changeNumber = [NSString stringWithUnsignedLongLong: changeNum];
lastModified = [self lastModifiedFromMessageChangeNumber: changeNumNbr]; lastModified = [self lastModifiedFromMessageChangeNumber: changeNumber];
if (lastModified) if (lastModified)
{ {
versionProperties = [versionsMessage properties]; versionProperties = [versionsMessage properties];

View File

@ -25,6 +25,7 @@
#import <Foundation/NSValue.h> #import <Foundation/NSValue.h>
#import <NGObjWeb/SoSecurityManager.h> #import <NGObjWeb/SoSecurityManager.h>
#import <NGExtensions/NSObject+Logs.h> #import <NGExtensions/NSObject+Logs.h>
#import <NGExtensions/NSObject+Values.h>
#import <SOGo/SOGoContentObject.h> #import <SOGo/SOGoContentObject.h>
#import <SOGo/SOGoPermissions.h> #import <SOGo/SOGoPermissions.h>
#import <SOGo/SOGoUser.h> #import <SOGo/SOGoUser.h>
@ -178,7 +179,7 @@
- (uint64_t) objectVersion - (uint64_t) objectVersion
{ {
uint64_t version = ULLONG_MAX; uint64_t version = ULLONG_MAX;
NSNumber *changeNumber; NSString *changeNumber;
if (!isNew) if (!isNew)
{ {