private VersionedId Update(MailboxSession itemStore, bool getExisting, SingleInstanceItemHandler.ContentUpdater updater) { int i = 0; while (i < 5) { i++; try { return(this.UpdateRetryable(itemStore, getExisting, updater)); } catch (MapiExceptionObjectChanged arg) { SingleInstanceItemHandler.Tracer.TraceError <SingleInstanceItemHandler, IExchangePrincipal, MapiExceptionObjectChanged>((long)this.GetHashCode(), "{0}: Exception updating item: Mailbox = {1}, exception = {2}, retrying", this, itemStore.MailboxOwner, arg); if (i == 5) { throw; } } catch (ObjectNotFoundException arg2) { SingleInstanceItemHandler.Tracer.TraceError <SingleInstanceItemHandler, IExchangePrincipal, ObjectNotFoundException>((long)this.GetHashCode(), "{0}: Exception updating item: Mailbox = {1}, exception = {2}, retrying", this, itemStore.MailboxOwner, arg2); if (i == 5) { throw; } } catch (SaveConflictException arg3) { SingleInstanceItemHandler.Tracer.TraceError <SingleInstanceItemHandler, IExchangePrincipal, SaveConflictException>((long)this.GetHashCode(), "{0}: Exception updating item: Mailbox = {1}, exception = {2}, retrying", this, itemStore.MailboxOwner, arg3); if (i == 5) { throw; } } } return(null); }
public void UpdateItemContent(MailboxSession itemStore, SingleInstanceItemHandler.ContentUpdater updater) { this.Update(itemStore, true, updater); }
private VersionedId UpdateRetryable(MailboxSession itemStore, bool getExisting, SingleInstanceItemHandler.ContentUpdater updater) { List <object[]> list = this.QueryItems(itemStore); VersionedId versionedId = this.GetMostRecentItem(list); if (versionedId == null) { try { using (Folder folder = Folder.Bind(itemStore, this.defaultFolder)) { using (Item item = MessageItem.Create(itemStore, folder.Id)) { item.ClassName = this.messageClass; using (TextWriter textWriter = item.Body.OpenTextWriter(BodyFormat.TextPlain)) { textWriter.Write(updater(null)); } ConflictResolutionResult conflictResolutionResult = item.Save(SaveMode.ResolveConflicts); if (conflictResolutionResult.SaveStatus == SaveResult.IrresolvableConflict) { throw new SaveConflictException(ServerStrings.ExSaveFailedBecauseOfConflicts(item.Id), conflictResolutionResult); } item.Load(); versionedId = item.Id; } } SingleInstanceItemHandler.Tracer.TraceDebug <SingleInstanceItemHandler, VersionedId, IExchangePrincipal>((long)this.GetHashCode(), "{0}: Created new item itemId={1} on mailbox {2}", this, versionedId, itemStore.MailboxOwner); goto IL_1CD; } catch (ObjectNotFoundException ex) { SingleInstanceItemHandler.Tracer.TraceError <SingleInstanceItemHandler, IExchangePrincipal, ObjectNotFoundException>((long)this.GetHashCode(), "{0}: bind to folder failed on mailbox {1}. Exception={2}", this, itemStore.MailboxOwner, ex); throw new SingleInstanceItemHandlerPermanentException(Strings.FailedToGetItem(this.messageClass, this.defaultFolder.ToString()), ex); } } using (Item item2 = MessageItem.Bind(itemStore, versionedId)) { string existingContent = null; if (getExisting) { using (TextReader textReader = item2.Body.OpenTextReader(BodyFormat.TextPlain)) { existingContent = textReader.ReadToEnd(); } } using (TextWriter textWriter2 = item2.Body.OpenTextWriter(BodyFormat.TextPlain)) { textWriter2.Write(updater(existingContent)); } ConflictResolutionResult conflictResolutionResult2 = item2.Save(SaveMode.ResolveConflicts); if (conflictResolutionResult2.SaveStatus == SaveResult.IrresolvableConflict) { throw new SaveConflictException(ServerStrings.ExSaveFailedBecauseOfConflicts(item2.Id), conflictResolutionResult2); } } SingleInstanceItemHandler.Tracer.TraceDebug <SingleInstanceItemHandler, VersionedId, IExchangePrincipal>((long)this.GetHashCode(), "{0}: Updated item itemId={1} on mailbox {2}", this, versionedId, itemStore.MailboxOwner); IL_1CD: using (IEnumerator <object[]> enumerator = list.GetEnumerator()) { List <VersionedId> list2 = new List <VersionedId>(); for (;;) { bool flag = enumerator.MoveNext(); if ((!flag || list2.Count == 100) && list2.Count > 0) { try { itemStore.Delete(DeleteItemFlags.HardDelete, list2.ToArray()); } catch (ObjectNotFoundException) { SingleInstanceItemHandler.Tracer.TraceError <SingleInstanceItemHandler, IExchangePrincipal>((long)this.GetHashCode(), "{0}: ObjectNotFoundException encountred while trying to delete duplicate item on mailbox {1}", this, itemStore.MailboxOwner); } list2.Clear(); } if (!flag) { break; } VersionedId versionedId2 = (VersionedId)enumerator.Current[0]; if (versionedId != versionedId2) { list2.Add(versionedId2); SingleInstanceItemHandler.Tracer.TraceDebug <SingleInstanceItemHandler, VersionedId, IExchangePrincipal>((long)this.GetHashCode(), "{0}: Deleting extra item {1} on mailbox {2}", this, versionedId2, itemStore.MailboxOwner); } } } return(versionedId); }