private void ConflictDetection() { using (Folder folder = Folder.Bind(this.storeSession, this.FolderId)) { SortBy[] sorts = new SortBy[] { new SortBy(InternalSchema.LastModifiedTime, SortOrder.Ascending), new SortBy(InternalSchema.CreationTime, SortOrder.Ascending), new SortBy(InternalSchema.MID, SortOrder.Ascending) }; IList <IStorePropertyBag> list = UserConfiguration.QueryConfigurations(folder, sorts, this.configName, UserConfigurationSearchFlags.FullString, 2, new PropertyDefinition[0]); if (list.Count <= 0) { ExTraceGlobals.UserConfigurationTracer.TraceDebug((long)this.GetHashCode(), "UserConfiguration::ConflictDetection. The object I just created cannot be found."); } else { VersionedId versionedId = (VersionedId)list[0][InternalSchema.ItemId]; if (list.Count >= 1 && !this.id.Equals(versionedId.ObjectId)) { this.Dispose(); AggregateOperationResult aggregateOperationResult = this.storeSession.Delete(DeleteItemFlags.SoftDelete, new StoreId[] { this.id }); if (aggregateOperationResult.OperationResult != OperationResult.Succeeded) { ExTraceGlobals.UserConfigurationTracer.TraceDebug <UserConfigurationName>((long)this.GetHashCode(), "UserConfiguration::ConflictResolution. Failed to delete configuration item. ConfigName = {0}.", this.configName); } ExTraceGlobals.StorageTracer.TraceError <string>((long)this.GetHashCode(), "UserConfiguration::Save. The same configuration object was created by someone prio to the current one. ConfigName = {0}.", this.configName.Name); throw new ObjectExistedException(ServerStrings.ExConfigExisted(this.configName.Name)); } } } }
internal static void Delete(Folder folder, string searchString, UserConfigurationSearchFlags searchFlags) { EnumValidator.AssertValid <UserConfigurationSearchFlags>(searchFlags); if (searchFlags != UserConfigurationSearchFlags.SubString && searchFlags != UserConfigurationSearchFlags.FullString && searchFlags != UserConfigurationSearchFlags.Prefix) { ExTraceGlobals.StorageTracer.TraceError <UserConfigurationSearchFlags>(0L, "UserConfiguration::FindItems. The search flag is not supported. searchFlags = {0}.", searchFlags); throw new NotSupportedException(); } IList <IStorePropertyBag> list = null; try { list = UserConfiguration.QueryConfigurations(folder, null, new UserConfigurationName(searchString, ConfigurationNameKind.PartialName), searchFlags, StorageLimits.Instance.UserConfigurationMaxSearched, new PropertyDefinition[0]); } catch (InvalidOperationException innerException) { throw new InvalidOperationException(ServerStrings.ExCannotQueryAssociatedTable, innerException); } List <VersionedId> list2 = new List <VersionedId>(); for (int i = 0; i < list.Count; i++) { list2.Add((VersionedId)list[i][InternalSchema.ItemId]); if (i == list.Count - 1 || list2.Count > 100) { AggregateOperationResult result = folder.Session.Delete(DeleteItemFlags.SoftDelete, list2.ToArray()); UserConfiguration.CheckOperationResults(result, "Delete"); list2.Clear(); } } }
internal static ICollection <UserConfiguration> Find(Folder folder, string searchString, UserConfigurationSearchFlags searchFlags) { EnumValidator.AssertValid <UserConfigurationSearchFlags>(searchFlags); List <UserConfiguration> list = new List <UserConfiguration>(); if (searchFlags != UserConfigurationSearchFlags.SubString && searchFlags != UserConfigurationSearchFlags.FullString && searchFlags != UserConfigurationSearchFlags.Prefix) { ExTraceGlobals.StorageTracer.TraceError <UserConfigurationSearchFlags>(0L, "UserConfiguration::FindItems. The search flag is not supported. searchFlags = {0}.", searchFlags); throw new NotSupportedException(ServerStrings.ExNotSupportedConfigurationSearchFlags(searchFlags.ToString())); } IList <IStorePropertyBag> list2 = null; try { list2 = UserConfiguration.QueryConfigurations(folder, null, new UserConfigurationName(searchString, ConfigurationNameKind.PartialName), searchFlags, StorageLimits.Instance.UserConfigurationMaxSearched + 1, new PropertyDefinition[0]); } catch (InvalidOperationException innerException) { throw new InvalidOperationException(ServerStrings.ExCannotQueryAssociatedTable, innerException); } if (list2.Count > StorageLimits.Instance.UserConfigurationMaxSearched) { ExTraceGlobals.StorageTracer.TraceError <int, int>(0L, "UserConfiguration::FindItems. There are too many user configuration objects created with the same name. Max. = {0}, Find = {1}.", StorageLimits.Instance.UserConfigurationMaxSearched, list2.Count); throw new TooManyConfigurationObjectsException(ServerStrings.ExTooManyObjects(searchString, list2.Count, StorageLimits.Instance.UserConfigurationMaxSearched)); } if (list2.Count > 0) { UserConfiguration.BuildConfigurationsFromFilterQuery(list2, folder, list); } return(list); }
public static UserConfiguration Create(Folder folder, UserConfigurationName configurationName, UserConfigurationTypes type) { EnumValidator.ThrowIfInvalid <UserConfigurationTypes>(type, "type"); IList <IStorePropertyBag> list = null; try { list = UserConfiguration.QueryConfigurations(folder, null, configurationName, UserConfigurationSearchFlags.FullString, 1, new PropertyDefinition[0]); } catch (InvalidOperationException innerException) { throw new InvalidOperationException(ServerStrings.ExCannotQueryAssociatedTable, innerException); } if (list.Count > 0) { ExTraceGlobals.StorageTracer.TraceError <UserConfigurationName>(0L, "UserConfiguration::Create. The configuration object has existed. ConfigName = {0}.", configurationName); throw new ObjectExistedException(ServerStrings.ExConfigExisted(configurationName.Name)); } ConfigurationItem configurationItem = null; bool flag = false; UserConfiguration result; try { configurationItem = ItemBuilder.CreateNewItem <ConfigurationItem>(folder.Session, folder.Id, ItemCreateInfo.ConfigurationItemInfo, CreateMessageType.Associated); bool openMode = false; UserConfiguration userConfiguration = new UserConfiguration(configurationItem, folder.StoreObjectId, configurationName, type, openMode); flag = true; result = userConfiguration; } finally { if (!flag) { Util.DisposeIfPresent(configurationItem); } } return(result); }
internal static UserConfiguration GetIgnoringCache(UserConfigurationManager manager, Folder folder, UserConfigurationName configurationName, UserConfigurationTypes freefetchType) { EnumValidator.AssertValid <UserConfigurationTypes>(freefetchType); UserConfiguration userConfiguration = null; PropertyDefinition[] columns; if ((freefetchType & UserConfigurationTypes.Dictionary) > (UserConfigurationTypes)0) { columns = new PropertyDefinition[] { InternalSchema.UserConfigurationDictionary }; } else { columns = UserConfiguration.ZeroProperties; } SortBy[] sorts = new SortBy[] { new SortBy(InternalSchema.CreationTime, SortOrder.Ascending), new SortBy(InternalSchema.MID, SortOrder.Ascending) }; IList <IStorePropertyBag> list = null; try { ExTraceGlobals.UserConfigurationTracer.TraceDebug <UserConfigurationName>(0L, "UserConfiguration::GetIgnoringCache. Hit Query. ConfigName = {0}.", configurationName); list = UserConfiguration.QueryConfigurations(folder, sorts, configurationName, UserConfigurationSearchFlags.FullString, 2, columns); } catch (InvalidOperationException innerException) { throw new InvalidOperationException(ServerStrings.ExCannotQueryAssociatedTable, innerException); } if (list.Count <= 0) { ExTraceGlobals.StorageTracer.TraceError <UserConfigurationName, UserConfigurationTypes>(0L, "UserConfiguration::GetIgnoringCache. The configuration object was not found. Name = {0}, type = {1}.", configurationName, freefetchType); throw new ObjectNotFoundException(ServerStrings.ExConfigurationNotFound(configurationName.Name)); } ExTraceGlobals.UserConfigurationTracer.TraceDebug <UserConfigurationName>(0L, "UserConfiguration::GetIgnoringCache. Find the config item and build user config object from it. ConfigName = {0}.", configurationName); bool flag = false; UserConfiguration result2; try { userConfiguration = UserConfiguration.BuildConfigurationFromQueryItem(folder, list[0], (freefetchType & UserConfigurationTypes.Dictionary) > (UserConfigurationTypes)0); if (list.Count > 1) { ExTraceGlobals.UserConfigurationTracer.TraceDebug <UserConfigurationName>(0L, "UserConfiguration::GetIgnoringCache. Found duplicate items. Conflict resolution. ConfigName = {0}.", configurationName); List <VersionedId> list2 = new List <VersionedId>(); list = UserConfiguration.QueryConfigurations(folder, sorts, configurationName, UserConfigurationSearchFlags.FullString, 100, new PropertyDefinition[0]); for (int i = 1; i < list.Count; i++) { list2.Add((VersionedId)list[i][InternalSchema.ItemId]); } if (list2.Count > 0) { AggregateOperationResult result = folder.Session.Delete(DeleteItemFlags.HardDelete, list2.ToArray()); UserConfiguration.CheckOperationResults(result, "DeleteDuplicates"); } } flag = true; result2 = userConfiguration; } finally { if (!flag && userConfiguration != null) { userConfiguration.Dispose(); } } return(result2); }