From a618386d5ecec5e13a5b37fa7583dd7f9a08fdbe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Enrique=20J=2E=20Hern=C3=A1ndez=20Blasco?= Date: Fri, 11 Dec 2015 11:38:21 +0100 Subject: [PATCH] oc-db: Store version number instead of CN To be able to search in this for every kind of operator. As we cannot do a migration, we have to add a new key to the property dictionary (@"version_number") which stores the version: version = exchange_globcnt(CN >> 16) Instead of the CN structure which is stored in @"version" key. This way we can do searches for CN to download only missing data from the given state of the client for this kind of messages. --- OpenChange/MAPIStoreDBMessage.m | 29 +++++++++++++++++++++------- OpenChange/MAPIStoreDBMessageTable.m | 9 +++++---- 2 files changed, 27 insertions(+), 11 deletions(-) diff --git a/OpenChange/MAPIStoreDBMessage.m b/OpenChange/MAPIStoreDBMessage.m index 836cfb4e1..98d357bf7 100644 --- a/OpenChange/MAPIStoreDBMessage.m +++ b/OpenChange/MAPIStoreDBMessage.m @@ -154,16 +154,25 @@ - (uint64_t) objectVersion { - NSNumber *versionNbr; + /* Return the global counter from CN structure. + See [MS-OXCFXICS] Section 2.2.2.1 */ + NSNumber *versionNbr, *cn; uint64_t objectVersion; [(SOGoMAPIDBMessage *) sogoObject reloadIfNeeded]; - versionNbr = [properties objectForKey: @"version"]; + versionNbr = [properties objectForKey: @"version_number"]; if (versionNbr) - objectVersion = (([versionNbr unsignedLongLongValue] >> 16) - & 0x0000ffffffffffffLL); + objectVersion = exchange_globcnt ([versionNbr unsignedLongLongValue]); else - objectVersion = ULLONG_MAX; + { + /* Old version which stored the CN structure not useful for searching */ + cn = [properties objectForKey: @"version"]; + if (cn) + objectVersion = (([cn unsignedLongLongValue] >> 16) + & 0x0000ffffffffffffLL); + else + objectVersion = ULLONG_MAX; + } return objectVersion; } @@ -326,13 +335,19 @@ [properties setObject: attachmentParts forKey: @"attachments"]; newVersion = [[self context] getNewChangeNumber]; + newVersion = exchange_globcnt ((newVersion >> 16) & 0x0000ffffffffffffLL); + [properties setObject: [NSNumber numberWithUnsignedLongLong: newVersion] - forKey: @"version"]; + forKey: @"version_number"]; + + /* Remove old version */ + [properties removeObjectForKey: @"version"]; /* Update PredecessorChangeList accordingly */ [self _updatePredecessorChangeList]; - [self logWithFormat: @"%d props in dict", [properties count]]; + // [self logWithFormat: @"Saving %@", [self description]]; + // [self logWithFormat: @"%d props in dict", [properties count]]; [sogoObject save]; } diff --git a/OpenChange/MAPIStoreDBMessageTable.m b/OpenChange/MAPIStoreDBMessageTable.m index de22e238e..a8c68abd1 100644 --- a/OpenChange/MAPIStoreDBMessageTable.m +++ b/OpenChange/MAPIStoreDBMessageTable.m @@ -61,14 +61,15 @@ static Class MAPIStoreDBMessageK = Nil; if ((uint32_t) res->ulPropTag == PidTagChangeNumber) { + SEL operator; + value = NSObjectFromMAPISPropValue (&res->lpProp); cVersion = exchange_globcnt (([value unsignedLongLongValue] >> 16) & 0x0000ffffffffffffLL); version = [NSNumber numberWithUnsignedLongLong: cVersion]; - //[self logWithFormat: @"change number from oxcfxics: %.16lx", [value unsignedLongLongValue]]; - [self logWithFormat: @" version: %.16lx", cVersion]; - *qualifier = [[EOKeyValueQualifier alloc] initWithKey: @"version" - operatorSelector: EOQualifierOperatorGreaterThanOrEqualTo + operator = [self operatorFromRestrictionOperator: res->relop]; + *qualifier = [[EOKeyValueQualifier alloc] initWithKey: @"version_number" + operatorSelector: operator value: version]; [*qualifier autorelease]; rc = MAPIRestrictionStateNeedsEval;