From 67f1bb3ca6c114aadaa320dddd3c8073a224a97b Mon Sep 17 00:00:00 2001 From: Wolfgang Sourdeau Date: Fri, 7 Oct 2011 15:47:13 +0000 Subject: [PATCH 1/5] Monotone-Parent: ae0c0cd3dbc947562a3dbd28f513f46bcd28a5b4 Monotone-Revision: 9d3573216e60e7dd9cd8ed6a20ed05126c35cc55 Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2011-10-07T15:47:13 Monotone-Branch: ca.inverse.sogo --- OpenChange/MAPIStoreMailFolder.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenChange/MAPIStoreMailFolder.m b/OpenChange/MAPIStoreMailFolder.m index 5b9ace633..1de4bfe69 100644 --- a/OpenChange/MAPIStoreMailFolder.m +++ b/OpenChange/MAPIStoreMailFolder.m @@ -938,7 +938,7 @@ _parseCOPYUID (NSString *line, NSArray **destUIDsP) /* Registration of target messages */ // - // We use the UIDPLUS IMAP extension here in order to speedup UID retreival + // We use the UIDPLUS IMAP extension here in order to speedup UID retrieval // If supported by the server, we'll get something like: COPYUID 1315425789 1 8 // // Sometimes COPYUID isn't returned at all by Cyrus or in case the server doesn't From 453b24037764ab92815e374fa576eb3aa6f2fcff Mon Sep 17 00:00:00 2001 From: Wolfgang Sourdeau Date: Fri, 7 Oct 2011 20:58:08 +0000 Subject: [PATCH 2/5] Monotone-Parent: 9d3573216e60e7dd9cd8ed6a20ed05126c35cc55 Monotone-Revision: 0ba3fa1a82dc1f0c5096914a7415602564beb50e Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2011-10-07T20:58:08 Monotone-Branch: ca.inverse.sogo --- ChangeLog | 6 ++++ OpenChange/MAPIStoreMailFolder.m | 54 +++++++++++++++++--------------- OpenChange/MAPIStoreMapping.m | 8 ++--- 3 files changed, 38 insertions(+), 30 deletions(-) diff --git a/ChangeLog b/ChangeLog index fd0368327..1b3bf46d1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2011-10-07 Wolfgang Sourdeau + + * OpenChange/MAPIStoreMailFolder.m (-synchroniseCache) + (-getDeletedKeysFromChangeNumber:andCN:inTableType:): attempt to + fix the leak of version numbers. + 2011-10-06 Francis Lachapelle * UI/WebServerResources/generic.js (getListIndexForFolder): the diff --git a/OpenChange/MAPIStoreMailFolder.m b/OpenChange/MAPIStoreMailFolder.m index 1de4bfe69..cedc8d503 100644 --- a/OpenChange/MAPIStoreMailFolder.m +++ b/OpenChange/MAPIStoreMailFolder.m @@ -469,7 +469,8 @@ _compareFetchResultsByMODSEQ (id entry1, id entry2, void *data) { BOOL rc = YES; uint64_t newChangeNum; - NSNumber *ti, *changeNumber, *modseq, *lastModseq, *nextModseq, *uid; + NSNumber *ti, *changeNumber, *modseq, *lastModseq, *nextModseq, + *lastDeletedModseq, *uid; uint64_t lastModseqNbr; EOQualifier *searchQualifier; NSArray *uids; @@ -566,16 +567,22 @@ _compareFetchResultsByMODSEQ (id entry1, id entry2, void *data) ldb_transaction_commit([[self context] connectionInfo]->oc_ctx); foundChange = YES; + [currentProperties setObject: lastModseq forKey: @"SyncLastModseq"]; } - if (lastModseq) + lastDeletedModseq + = [currentProperties objectForKey: @"SyncLastDeletedModseq"]; + if (lastDeletedModseq) { - /* FIXME: the problem here is that if a delete is the last operation - performed on a folder, the SyncLastSynchronisationDate will continuously - get updated until a new modseq shows up */ - foundChange |= [[(SOGoMailFolder *) sogoObject - fetchUIDsOfVanishedItems: lastModseqNbr] - count] > 0; + lastModseqNbr = [lastDeletedModseq unsignedLongLongValue]; + uids = [(SOGoMailFolder *) sogoObject + fetchUIDsOfVanishedItems: lastModseqNbr]; + if ([uids count] > 0) + { + foundChange = YES; + [currentProperties setObject: uids + forKey: @"SyncLastDeletedUIDs"]; + } } if (foundChange) @@ -583,7 +590,6 @@ _compareFetchResultsByMODSEQ (id entry1, id entry2, void *data) ti = [NSNumber numberWithDouble: [now timeIntervalSince1970]]; [currentProperties setObject: ti forKey: @"SyncLastSynchronisationDate"]; - [currentProperties setObject: lastModseq forKey: @"SyncLastModseq"]; [versionsMessage appendProperties: currentProperties]; [versionsMessage save]; } @@ -726,8 +732,7 @@ _compareFetchResultsByMODSEQ (id entry1, id entry2, void *data) NSArray *deletedKeys, *deletedUIDs; NSNumber *changeNumNbr; uint64_t modseq; - NSDictionary *versionProperties; // , *status; - NSMutableDictionary *messages, *mapping; + NSMutableDictionary *currentProperties, *messages; NSNumber *newChangeNumNbr; // , *highestModseq; uint64_t newChangeNum; NSUInteger count, max; @@ -739,28 +744,25 @@ _compareFetchResultsByMODSEQ (id entry1, id entry2, void *data) unsignedLongLongValue]; if (modseq > 0) { - // status - // = [sogoObject - // statusForFlags: [NSArray arrayWithObject: @"HIGHESTMODSEQ"]]; - // highestModseq = [status objectForKey: @"highestmodseq"]; - - versionProperties = [versionsMessage properties]; - messages = [versionProperties objectForKey: @"Messages"]; - deletedUIDs = [(SOGoMailFolder *) sogoObject - fetchUIDsOfVanishedItems: modseq]; - deletedKeys = [deletedUIDs stringsWithFormat: @"%@.eml"]; - max = [deletedUIDs count]; - if (max > 0) + currentProperties = [[versionsMessage properties] mutableCopy]; + deletedUIDs = [currentProperties objectForKey: @"SyncLastDeletedUIDs"]; + if ([deletedUIDs count] > 0) { + [currentProperties removeObjectForKey: @"SyncLastDeletedUIDs"]; + [currentProperties setObject: changeNumNbr + forKey: @"SyncLastDeletedModseq"]; + messages = [currentProperties objectForKey: @"Messages"]; [messages removeObjectsForKeys: deletedUIDs]; - mapping = [versionProperties objectForKey: @"VersionsMapping"]; + [versionsMessage appendProperties: currentProperties]; + [versionsMessage save]; + + deletedKeys = [deletedUIDs stringsWithFormat: @"%@.eml"]; + max = [deletedKeys count]; for (count = 0; count < max; count++) newChangeNum = [[self context] getNewChangeNumber]; newChangeNumNbr = [NSNumber numberWithUnsignedLongLong: newChangeNum]; *cnNbr = newChangeNumNbr; - [mapping setObject: newChangeNumNbr forKey: @"SyncLastModseq"]; - [versionsMessage save]; } } else diff --git a/OpenChange/MAPIStoreMapping.m b/OpenChange/MAPIStoreMapping.m index e38efc69b..02746a891 100644 --- a/OpenChange/MAPIStoreMapping.m +++ b/OpenChange/MAPIStoreMapping.m @@ -223,8 +223,8 @@ MAPIStoreMappingTDBTraverse (TDB_CONTEXT *ctx, TDB_DATA data1, TDB_DATA data2, [mapping setObject: urlString forKey: idKey]; [reverseMapping setObject: idKey forKey: urlString]; rc = YES; - // [self logWithFormat: @"registered url '%@' with id %lld (0x%.16"PRIx64")", - // urlString, idNbr, idNbr]; + [self logWithFormat: @"registered url '%@' with id %lld (0x%.16"PRIx64")", + urlString, idNbr, idNbr]; /* Add the record given its fid and mapistore_uri */ key.dptr = (unsigned char *) talloc_asprintf(NULL, "0x%.16"PRIx64, idNbr); @@ -250,8 +250,8 @@ MAPIStoreMappingTDBTraverse (TDB_CONTEXT *ctx, TDB_DATA data1, TDB_DATA data2, urlString = [mapping objectForKey: idKey]; if (urlString) { - // [self logWithFormat: @"unregistering url '%@' with id %lld (0x%.16"PRIx64")", - // urlString, idNbr, idNbr]; + [self logWithFormat: @"unregistering url '%@' with id %lld (0x%.16"PRIx64")", + urlString, idNbr, idNbr]; [reverseMapping removeObjectForKey: urlString]; [mapping removeObjectForKey: idKey]; From 286b4429be72a127e49caa93dea86744dc8acaf5 Mon Sep 17 00:00:00 2001 From: Wolfgang Sourdeau Date: Sun, 9 Oct 2011 17:50:13 +0000 Subject: [PATCH 3/5] Monotone-Parent: b7121103b5c83ec9a9fc4addad1f568b80aee426 Monotone-Revision: 34674c4b324f4c4e34c785d128cd8d8916743871 Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2011-10-09T17:50:13 Monotone-Branch: ca.inverse.sogo --- OpenChange/MAPIStoreMapping.m | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/OpenChange/MAPIStoreMapping.m b/OpenChange/MAPIStoreMapping.m index 02746a891..e38efc69b 100644 --- a/OpenChange/MAPIStoreMapping.m +++ b/OpenChange/MAPIStoreMapping.m @@ -223,8 +223,8 @@ MAPIStoreMappingTDBTraverse (TDB_CONTEXT *ctx, TDB_DATA data1, TDB_DATA data2, [mapping setObject: urlString forKey: idKey]; [reverseMapping setObject: idKey forKey: urlString]; rc = YES; - [self logWithFormat: @"registered url '%@' with id %lld (0x%.16"PRIx64")", - urlString, idNbr, idNbr]; + // [self logWithFormat: @"registered url '%@' with id %lld (0x%.16"PRIx64")", + // urlString, idNbr, idNbr]; /* Add the record given its fid and mapistore_uri */ key.dptr = (unsigned char *) talloc_asprintf(NULL, "0x%.16"PRIx64, idNbr); @@ -250,8 +250,8 @@ MAPIStoreMappingTDBTraverse (TDB_CONTEXT *ctx, TDB_DATA data1, TDB_DATA data2, urlString = [mapping objectForKey: idKey]; if (urlString) { - [self logWithFormat: @"unregistering url '%@' with id %lld (0x%.16"PRIx64")", - urlString, idNbr, idNbr]; + // [self logWithFormat: @"unregistering url '%@' with id %lld (0x%.16"PRIx64")", + // urlString, idNbr, idNbr]; [reverseMapping removeObjectForKey: urlString]; [mapping removeObjectForKey: idKey]; From 64d8402fe2768e8c0927447e0ce2366c54eb9db6 Mon Sep 17 00:00:00 2001 From: Wolfgang Sourdeau Date: Sun, 9 Oct 2011 17:50:47 +0000 Subject: [PATCH 4/5] Monotone-Parent: 34674c4b324f4c4e34c785d128cd8d8916743871 Monotone-Revision: 204093991ba2b93a87ca4679f958553358ef7abe Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2011-10-09T17:50:47 Monotone-Branch: ca.inverse.sogo --- ChangeLog | 6 ---- OpenChange/MAPIStoreMailFolder.m | 54 +++++++++++++++----------------- 2 files changed, 26 insertions(+), 34 deletions(-) diff --git a/ChangeLog b/ChangeLog index 204c593c8..bc7c53d97 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,9 +1,3 @@ -2011-10-07 Wolfgang Sourdeau - - * OpenChange/MAPIStoreMailFolder.m (-synchroniseCache) - (-getDeletedKeysFromChangeNumber:andCN:inTableType:): attempt to - fix the leak of version numbers. - 2011-10-07 Francis Lachapelle * UI/WebServerResources/UIxPreferences.js diff --git a/OpenChange/MAPIStoreMailFolder.m b/OpenChange/MAPIStoreMailFolder.m index cedc8d503..1de4bfe69 100644 --- a/OpenChange/MAPIStoreMailFolder.m +++ b/OpenChange/MAPIStoreMailFolder.m @@ -469,8 +469,7 @@ _compareFetchResultsByMODSEQ (id entry1, id entry2, void *data) { BOOL rc = YES; uint64_t newChangeNum; - NSNumber *ti, *changeNumber, *modseq, *lastModseq, *nextModseq, - *lastDeletedModseq, *uid; + NSNumber *ti, *changeNumber, *modseq, *lastModseq, *nextModseq, *uid; uint64_t lastModseqNbr; EOQualifier *searchQualifier; NSArray *uids; @@ -567,22 +566,16 @@ _compareFetchResultsByMODSEQ (id entry1, id entry2, void *data) ldb_transaction_commit([[self context] connectionInfo]->oc_ctx); foundChange = YES; - [currentProperties setObject: lastModseq forKey: @"SyncLastModseq"]; } - lastDeletedModseq - = [currentProperties objectForKey: @"SyncLastDeletedModseq"]; - if (lastDeletedModseq) + if (lastModseq) { - lastModseqNbr = [lastDeletedModseq unsignedLongLongValue]; - uids = [(SOGoMailFolder *) sogoObject - fetchUIDsOfVanishedItems: lastModseqNbr]; - if ([uids count] > 0) - { - foundChange = YES; - [currentProperties setObject: uids - forKey: @"SyncLastDeletedUIDs"]; - } + /* FIXME: the problem here is that if a delete is the last operation + performed on a folder, the SyncLastSynchronisationDate will continuously + get updated until a new modseq shows up */ + foundChange |= [[(SOGoMailFolder *) sogoObject + fetchUIDsOfVanishedItems: lastModseqNbr] + count] > 0; } if (foundChange) @@ -590,6 +583,7 @@ _compareFetchResultsByMODSEQ (id entry1, id entry2, void *data) ti = [NSNumber numberWithDouble: [now timeIntervalSince1970]]; [currentProperties setObject: ti forKey: @"SyncLastSynchronisationDate"]; + [currentProperties setObject: lastModseq forKey: @"SyncLastModseq"]; [versionsMessage appendProperties: currentProperties]; [versionsMessage save]; } @@ -732,7 +726,8 @@ _compareFetchResultsByMODSEQ (id entry1, id entry2, void *data) NSArray *deletedKeys, *deletedUIDs; NSNumber *changeNumNbr; uint64_t modseq; - NSMutableDictionary *currentProperties, *messages; + NSDictionary *versionProperties; // , *status; + NSMutableDictionary *messages, *mapping; NSNumber *newChangeNumNbr; // , *highestModseq; uint64_t newChangeNum; NSUInteger count, max; @@ -744,25 +739,28 @@ _compareFetchResultsByMODSEQ (id entry1, id entry2, void *data) unsignedLongLongValue]; if (modseq > 0) { - currentProperties = [[versionsMessage properties] mutableCopy]; - deletedUIDs = [currentProperties objectForKey: @"SyncLastDeletedUIDs"]; - if ([deletedUIDs count] > 0) + // status + // = [sogoObject + // statusForFlags: [NSArray arrayWithObject: @"HIGHESTMODSEQ"]]; + // highestModseq = [status objectForKey: @"highestmodseq"]; + + versionProperties = [versionsMessage properties]; + messages = [versionProperties objectForKey: @"Messages"]; + deletedUIDs = [(SOGoMailFolder *) sogoObject + fetchUIDsOfVanishedItems: modseq]; + deletedKeys = [deletedUIDs stringsWithFormat: @"%@.eml"]; + max = [deletedUIDs count]; + if (max > 0) { - [currentProperties removeObjectForKey: @"SyncLastDeletedUIDs"]; - [currentProperties setObject: changeNumNbr - forKey: @"SyncLastDeletedModseq"]; - messages = [currentProperties objectForKey: @"Messages"]; [messages removeObjectsForKeys: deletedUIDs]; - [versionsMessage appendProperties: currentProperties]; - [versionsMessage save]; - - deletedKeys = [deletedUIDs stringsWithFormat: @"%@.eml"]; - max = [deletedKeys count]; + mapping = [versionProperties objectForKey: @"VersionsMapping"]; for (count = 0; count < max; count++) newChangeNum = [[self context] getNewChangeNumber]; newChangeNumNbr = [NSNumber numberWithUnsignedLongLong: newChangeNum]; *cnNbr = newChangeNumNbr; + [mapping setObject: newChangeNumNbr forKey: @"SyncLastModseq"]; + [versionsMessage save]; } } else From 18d7070c4a44a8437eb1e47615db9506548eef83 Mon Sep 17 00:00:00 2001 From: Wolfgang Sourdeau Date: Mon, 10 Oct 2011 04:01:35 +0000 Subject: [PATCH 5/5] Monotone-Parent: 204093991ba2b93a87ca4679f958553358ef7abe Monotone-Revision: 4aa646b0faf339f31cde63a356f16e3c5e98e28a Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2011-10-10T04:01:35 Monotone-Branch: ca.inverse.sogo --- ChangeLog | 15 ++++++ OpenChange/MAPIStoreMailFolder.m | 85 ++++++++++++++++++-------------- 2 files changed, 62 insertions(+), 38 deletions(-) diff --git a/ChangeLog b/ChangeLog index bc7c53d97..df4e3f35d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,18 @@ +2011-10-09 Wolfgang Sourdeau + + * OpenChange/MAPIStoreMailFolder.m (-synchroniseCache): improved + method to only fetch non-deleted messages in part 1, and to + automatically remove message records in part 2, so that we know + when a delete message has already been taken into account with + regards to version numbers. The version number generation having + been moved from getDeletedKeysFromChangeNumber:andCN:inTableType:. + This also fixes the case where the last modification date was + increased when any deleted message was found, because "known + deleted messages" are now ignored. + (-getDeletedKeysFromChangeNumber:andCN:inTableType:) Simplified + method by moving most of it into -synchroniseCache and by + returning the highest deleted modseq reported by the latter. + 2011-10-07 Francis Lachapelle * UI/WebServerResources/UIxPreferences.js diff --git a/OpenChange/MAPIStoreMailFolder.m b/OpenChange/MAPIStoreMailFolder.m index 1de4bfe69..483e12011 100644 --- a/OpenChange/MAPIStoreMailFolder.m +++ b/OpenChange/MAPIStoreMailFolder.m @@ -469,9 +469,10 @@ _compareFetchResultsByMODSEQ (id entry1, id entry2, void *data) { BOOL rc = YES; uint64_t newChangeNum; - NSNumber *ti, *changeNumber, *modseq, *lastModseq, *nextModseq, *uid; + NSNumber *ti, *changeNumber, *modseq, *initialLastModseq, *lastModseq, + *nextModseq, *uid; uint64_t lastModseqNbr; - EOQualifier *searchQualifier; + EOQualifier *kvQualifier, *searchQualifier; NSArray *uids; NSUInteger count, max; NSArray *fetchResults; @@ -504,14 +505,19 @@ _compareFetchResultsByMODSEQ (id entry1, id entry2, void *data) } lastModseq = [currentProperties objectForKey: @"SyncLastModseq"]; + initialLastModseq = lastModseq; if (lastModseq) { lastModseqNbr = [lastModseq unsignedLongLongValue]; nextModseq = [NSNumber numberWithUnsignedLongLong: lastModseqNbr + 1]; - searchQualifier = [[EOKeyValueQualifier alloc] + kvQualifier = [[EOKeyValueQualifier alloc] initWithKey: @"modseq" operatorSelector: EOQualifierOperatorGreaterThanOrEqualTo value: nextModseq]; + searchQualifier = [[EOAndQualifier alloc] + initWithQualifiers: + kvQualifier, [self nonDeletedQualifier], nil]; + [kvQualifier release]; [searchQualifier autorelease]; } else @@ -520,6 +526,7 @@ _compareFetchResultsByMODSEQ (id entry1, id entry2, void *data) searchQualifier = [self nonDeletedQualifier]; } + /* 1. we fetch modified or added uids */ uids = [sogoObject fetchUIDsMatchingQualifier: searchQualifier sortOrdering: nil]; max = [uids count]; @@ -543,7 +550,6 @@ _compareFetchResultsByMODSEQ (id entry1, id entry2, void *data) result = [fetchResults objectAtIndex: count]; uid = [result objectForKey: @"uid"]; modseq = [result objectForKey: @"modseq"]; - [self logWithFormat: @"uid '%@' has modseq '%@'", uid, modseq]; newChangeNum = [[self context] getNewChangeNumber]; changeNumber = [NSNumber numberWithUnsignedLongLong: newChangeNum]; @@ -554,6 +560,9 @@ _compareFetchResultsByMODSEQ (id entry1, id entry2, void *data) [messageEntry setObject: modseq forKey: @"modseq"]; [messageEntry setObject: changeNumber forKey: @"version"]; + [self logWithFormat: @"added message entry for uid %@, modseq %@," + @" version %@", uid, modseq, changeNumber]; + changeKey = [self getReplicaKeyFromGlobCnt: newChangeNum >> 16]; [self _setChangeKey: changeKey forMessageEntry: messageEntry]; @@ -565,17 +574,34 @@ _compareFetchResultsByMODSEQ (id entry1, id entry2, void *data) } ldb_transaction_commit([[self context] connectionInfo]->oc_ctx); + [currentProperties setObject: lastModseq forKey: @"SyncLastModseq"]; foundChange = YES; } - if (lastModseq) + /* 2. we synchronise deleted UIDs */ + if (initialLastModseq) { - /* FIXME: the problem here is that if a delete is the last operation - performed on a folder, the SyncLastSynchronisationDate will continuously - get updated until a new modseq shows up */ - foundChange |= [[(SOGoMailFolder *) sogoObject - fetchUIDsOfVanishedItems: lastModseqNbr] - count] > 0; + fetchResults = [(SOGoMailFolder *) sogoObject + fetchUIDsOfVanishedItems: lastModseqNbr]; + max = [fetchResults count]; + changeNumber = nil; + for (count = 0; count < max; count++) + { + uid = [fetchResults objectAtIndex: count]; + if ([messages objectForKey: uid]) + { + newChangeNum = [[self context] getNewChangeNumber]; + changeNumber = [NSNumber numberWithUnsignedLongLong: newChangeNum]; + [messages removeObjectForKey: uid]; + [self logWithFormat: @"removed message entry for uid %@", uid]; + } + } + if (changeNumber) + { + [currentProperties setObject: changeNumber + forKey: @"SyncLastDeleteChangeNumber"]; + foundChange = YES; + } } if (foundChange) @@ -583,7 +609,6 @@ _compareFetchResultsByMODSEQ (id entry1, id entry2, void *data) ti = [NSNumber numberWithDouble: [now timeIntervalSince1970]]; [currentProperties setObject: ti forKey: @"SyncLastSynchronisationDate"]; - [currentProperties setObject: lastModseq forKey: @"SyncLastModseq"]; [versionsMessage appendProperties: currentProperties]; [versionsMessage save]; } @@ -724,42 +749,26 @@ _compareFetchResultsByMODSEQ (id entry1, id entry2, void *data) inTableType: (uint8_t) tableType { NSArray *deletedKeys, *deletedUIDs; - NSNumber *changeNumNbr; + NSNumber *changeNumber; uint64_t modseq; - NSDictionary *versionProperties; // , *status; - NSMutableDictionary *messages, *mapping; - NSNumber *newChangeNumNbr; // , *highestModseq; - uint64_t newChangeNum; - NSUInteger count, max; + NSDictionary *versionProperties; if (tableType == MAPISTORE_MESSAGE_TABLE) { - changeNumNbr = [NSNumber numberWithUnsignedLongLong: changeNum]; - modseq = [[self modseqFromMessageChangeNumber: changeNumNbr] + changeNumber = [NSNumber numberWithUnsignedLongLong: changeNum]; + modseq = [[self modseqFromMessageChangeNumber: changeNumber] unsignedLongLongValue]; if (modseq > 0) { - // status - // = [sogoObject - // statusForFlags: [NSArray arrayWithObject: @"HIGHESTMODSEQ"]]; - // highestModseq = [status objectForKey: @"highestmodseq"]; - - versionProperties = [versionsMessage properties]; - messages = [versionProperties objectForKey: @"Messages"]; deletedUIDs = [(SOGoMailFolder *) sogoObject - fetchUIDsOfVanishedItems: modseq]; + fetchUIDsOfVanishedItems: modseq]; deletedKeys = [deletedUIDs stringsWithFormat: @"%@.eml"]; - max = [deletedUIDs count]; - if (max > 0) + if ([deletedUIDs count] > 0) { - [messages removeObjectsForKeys: deletedUIDs]; - - mapping = [versionProperties objectForKey: @"VersionsMapping"]; - for (count = 0; count < max; count++) - newChangeNum = [[self context] getNewChangeNumber]; - newChangeNumNbr = [NSNumber numberWithUnsignedLongLong: newChangeNum]; - *cnNbr = newChangeNumNbr; - [mapping setObject: newChangeNumNbr forKey: @"SyncLastModseq"]; + versionProperties = [versionsMessage properties]; + changeNumber = [versionProperties + objectForKey: @"SyncLastDeleteChangeNumber"]; + *cnNbr = changeNumber; [versionsMessage save]; } }