Improved the performance of the dict population by using NSString keys rather than NSNumber ones. The discussion here "https://savannah.gnu.org/bugs/?37494" seems to indicate that this occurs only with old versions of GNUstep.

maint-2.0.2
Wolfgang Sourdeau 2012-10-03 11:25:47 -04:00
parent 034f2c8745
commit 1b02490e85
1 changed files with 27 additions and 25 deletions

View File

@ -52,29 +52,36 @@ static NSMutableDictionary *mappingRegistry = nil;
mappingRegistry = [NSMutableDictionary new];
}
static inline id
MAPIStoreMappingKeyFromId (uint64_t idNbr)
{
return [NSString stringWithFormat: @"0x%.16"PRIx64, idNbr];
}
static int
MAPIStoreMappingTDBTraverse (TDB_CONTEXT *ctx, TDB_DATA data1, TDB_DATA data2,
void *data)
{
NSMutableDictionary *mapping;
NSNumber *idNbr;
id idKey;
NSString *uri;
char *idStr, *uriStr;
uint64_t idVal;
uint64_t idNbr;
// get the key
// key examples : key(18) = "0x6900000000000001"
// key(31) = "SOFT_DELETED:0xb100020000000001"
//
idStr = (char *) data1.dptr;
idNbr = nil;
idKey = nil;
if (strncmp(idStr, "SOFT_DELETED:", 13) != 0)
{
// It's very important here to use strtoull and NOT strtoll as
// the latter will overflow a long long with typical key values.
idVal = strtoull(idStr, NULL, 0);
idNbr = [NSNumber numberWithUnsignedLongLong: idVal];
idNbr = strtoull(idStr, NULL, 0);
// idKey = [NSNumber numberWithUnsignedLongLong: idNbr];
idKey = MAPIStoreMappingKeyFromId(idNbr);
}
// get the value and null-terminate it
@ -86,9 +93,9 @@ MAPIStoreMappingTDBTraverse (TDB_CONTEXT *ctx, TDB_DATA data1, TDB_DATA data2,
mapping = data;
if (uri && idNbr)
if (uri && idKey)
{
[mapping setObject: uri forKey: idNbr];
[mapping setObject: uri forKey: idKey];
}
return 0;
@ -147,8 +154,7 @@ MAPIStoreMappingTDBTraverse (TDB_CONTEXT *ctx, TDB_DATA data1, TDB_DATA data2,
- (id) initForUsername: (NSString *) newUsername
withIndexing: (struct tdb_wrap *) newIndexing
{
NSNumber *idNbr;
NSString *uri;
NSString *idNbr, *uri;
NSArray *keys;
NSUInteger count, max;
@ -185,21 +191,17 @@ MAPIStoreMappingTDBTraverse (TDB_CONTEXT *ctx, TDB_DATA data1, TDB_DATA data2,
- (NSString *) urlFromID: (uint64_t) idNbr
{
NSNumber *key;
key = [NSNumber numberWithUnsignedLongLong: idNbr];
return [mapping objectForKey: key];
return [mapping objectForKey: MAPIStoreMappingKeyFromId (idNbr)];
}
- (uint64_t) idFromURL: (NSString *) url
{
NSNumber *idKey;
id key;
uint64_t idNbr;
idKey = [reverseMapping objectForKey: url];
if (idKey)
idNbr = [idKey unsignedLongLongValue];
key = [reverseMapping objectForKey: url];
if (key)
idNbr = [key unsignedLongLongValue];
else
idNbr = NSNotFound;
@ -212,7 +214,7 @@ MAPIStoreMappingTDBTraverse (TDB_CONTEXT *ctx, TDB_DATA data1, TDB_DATA data2,
NSArray *allKeys;
NSUInteger count, max;
NSString *currentKey, *newKey;
NSNumber *idKey;
id idKey;
TDB_DATA key, dbuf;
[oldURL retain];
@ -253,10 +255,10 @@ MAPIStoreMappingTDBTraverse (TDB_CONTEXT *ctx, TDB_DATA data1, TDB_DATA data2,
withURL: (NSString *) urlString
{
NSString *oldURL;
NSNumber *idKey;
id idKey;
TDB_DATA key, dbuf;
idKey = [NSNumber numberWithUnsignedLongLong: idNbr];
idKey = MAPIStoreMappingKeyFromId (idNbr);
oldURL = [mapping objectForKey: idKey];
if (oldURL)
{
@ -294,11 +296,11 @@ MAPIStoreMappingTDBTraverse (TDB_CONTEXT *ctx, TDB_DATA data1, TDB_DATA data2,
- (BOOL) registerURL: (NSString *) urlString
withID: (uint64_t) idNbr
{
NSNumber *idKey;
id idKey;
BOOL rc;
TDB_DATA key, dbuf;
idKey = [NSNumber numberWithUnsignedLongLong: idNbr];
idKey = MAPIStoreMappingKeyFromId (idNbr);
if ([mapping objectForKey: idKey]
|| [reverseMapping objectForKey: urlString])
{
@ -333,10 +335,10 @@ MAPIStoreMappingTDBTraverse (TDB_CONTEXT *ctx, TDB_DATA data1, TDB_DATA data2,
- (void) unregisterURLWithID: (uint64_t) idNbr
{
NSString *urlString;
NSNumber *idKey;
id idKey;
TDB_DATA key;
idKey = [NSNumber numberWithUnsignedLongLong: idNbr];
idKey = MAPIStoreMappingKeyFromId (idNbr);
urlString = [mapping objectForKey: idKey];
if (urlString)
{