public static SearchFolder CreateOrOpenOwaFilteredViewSearchFolder(MailboxSession mailboxSession, OwaSearchContext searchContext, StoreId searchFoldersRootId, SearchFolderCriteria searchFolderCriteria, bool flushStaleFolders = true) { ExTraceGlobals.StorageTracer.TraceDebug <OwaViewFilter>(0L, "[OwaFilterState::CreateOrOpenOwaFilteredViewSearchFolder] Create or open the specified filtered view: {0}", searchContext.ViewFilter); SearchFolder searchFolder = null; bool flag = true; searchContext.ViewFilterActions = ViewFilterActions.None; try { searchContext.ClientSearchFolderIdentity = OwaFilterState.GetOwaFilteredViewSearchFolderName(mailboxSession, searchContext); if (searchContext.SearchFolderId == null && OwaFilterState.FilterToLinkPropertyDefinitionsMap.ContainsKey(searchContext.ViewFilter)) { StoreObjectId defaultFolderId = mailboxSession.GetDefaultFolderId(DefaultFolderType.Inbox); if (defaultFolderId.Equals(searchContext.FolderIdToSearch)) { searchContext.SearchFolderId = OwaFilterState.GetLinkedFolderIdForFilteredView(mailboxSession, searchContext.FolderIdToSearch, searchContext.ViewFilter); } } if (searchContext.SearchFolderId != null) { searchContext.ViewFilterActions |= ViewFilterActions.BindToExisting; searchFolder = OwaFilterState.BindAndUpdateExistingFilteredViewSearchFolder(mailboxSession, searchContext); } if (searchFolder == null) { searchContext.ViewFilterActions |= ViewFilterActions.FindExisting; searchFolder = OwaFilterState.GetFilteredView(mailboxSession, searchContext, searchFoldersRootId, flushStaleFolders); } if (searchContext.IsSearchFailed && searchFolder != null) { ExTraceGlobals.StorageTracer.TraceError <string, StoreId>(0L, "[OwaFilterState::CreateOrOpenOwaFilteredViewSearchFolder] deleting search folder: {0} using searchContext.SearchFolderId: {1}", searchContext.ClientSearchFolderIdentity, searchContext.SearchFolderId); searchContext.ViewFilterActions |= ViewFilterActions.DeleteInvalidSearchFolder; mailboxSession.Delete(DeleteItemFlags.HardDelete, new StoreId[] { searchContext.SearchFolderId }); searchContext.SearchFolderId = null; searchContext.IsSearchFailed = false; searchFolder.Dispose(); searchFolder = null; } if (searchFolder == null) { searchContext.ViewFilterActions |= ViewFilterActions.CreateFilter; searchFolder = OwaFilterState.CreateAndUpdateFilteredViewSearchFolder(mailboxSession, searchContext, searchFoldersRootId, searchFolderCriteria); } ExTraceGlobals.StorageTracer.TraceDebug(0L, string.Format("{0}_{1}", searchContext.ClientSearchFolderIdentity, (int)searchContext.ViewFilterActions)); flag = false; } finally { if (flag) { ExTraceGlobals.StorageTracer.TraceError(0L, "[OwaFilterState::CreateOrOpenOwaFilteredViewSearchFolder] Creating/Opening of dynamic search folder failed. Setting search folder to null and disposing it"); if (searchFolder != null) { searchFolder.Dispose(); searchFolder = null; } } } return(searchFolder); }
private static SearchFolder GetFilteredView(MailboxSession mailboxSession, OwaSearchContext searchContext, StoreId searchFoldersRootId, bool flushStaleFolders) { ExTraceGlobals.StorageTracer.TraceDebug <OwaViewFilter>(0L, "[OwaFilterState::GetFilteredView] Get the specified filtered view: {0}", searchContext.ViewFilter); StoreObjectId defaultFolderId = mailboxSession.GetDefaultFolderId(DefaultFolderType.Inbox); OwaFilterState newFilterState = new OwaFilterState(searchContext.FolderIdToSearch, searchContext.ViewFilter, searchContext.FromFilter); int num = 0; StoreObjectId storeObjectId = null; List <StoreId> list = new List <StoreId>(); SearchFolder result = null; using (Folder folder = Folder.Bind(mailboxSession, searchFoldersRootId)) { List <object[]> list2 = new List <object[]>(); using (QueryResult queryResult = folder.FolderQuery(FolderQueryFlags.None, null, null, OwaFilterState.FolderQueryProperties)) { list2 = OwaFilterState.FetchRowsFromQueryResult(queryResult, 10000); } int num2 = OwaFilterState.FilterSearchFolderPropertyIndexes[FolderSchema.Id]; int num3 = OwaFilterState.FilterSearchFolderPropertyIndexes[FolderSchema.SearchFolderAllowAgeout]; int num4 = OwaFilterState.FilterSearchFolderPropertyIndexes[StoreObjectSchema.LastModifiedTime]; int num5 = OwaFilterState.FilterSearchFolderPropertyIndexes[OwaFilteredViewProperties.FilteredViewLabel]; ExDateTime other = ExDateTime.MaxValue; for (int i = 0; i < list2.Count; i++) { OwaFilterState owaFilterState = OwaFilterState.ParseFromPropertyValue(list2[i][num5]); if (owaFilterState != null) { if (OwaFilterState.AreEqual(newFilterState, owaFilterState)) { searchContext.ViewFilterActions |= ViewFilterActions.FilterFound; searchContext.SearchFolderId = (list2[i][num2] as VersionedId).ObjectId; result = OwaFilterState.BindAndUpdateExistingFilteredViewSearchFolder(mailboxSession, searchContext); break; } if (list2[i][num3] is bool && (bool)list2[i][num3]) { if (!owaFilterState.IsCurrentVersion && flushStaleFolders) { list.Add((StoreId)list2[i][num2]); } else { num++; ExDateTime exDateTime = ExDateTime.MinValue; if (!(list2[i][num4] is PropertyError)) { exDateTime = (ExDateTime)list2[i][num4]; } if (exDateTime.CompareTo(other) < 0) { StoreObjectId objectId = (list2[i][num2] as VersionedId).ObjectId; if (!defaultFolderId.Equals(owaFilterState.SourceFolderId)) { other = exDateTime; storeObjectId = objectId; } } } } } } } if (num >= searchContext.MaximumTemporaryFilteredViewPerUser && flushStaleFolders && storeObjectId != null) { ExTraceGlobals.StorageTracer.TraceDebug <int>(0L, "[OwaFilterState::GetFilteredView] Delete LRU filtered view search folder at hitting max filtered views: {0}", searchContext.MaximumTemporaryFilteredViewPerUser); list.Add(storeObjectId); } if (list.Count > 0) { ExTraceGlobals.StorageTracer.TraceDebug(0L, "[OwaFilterState::GetFilteredView] deleting LRU / non current version of filtered views count: " + list.Count); mailboxSession.Delete(DeleteItemFlags.HardDelete, list.ToArray()); } return(result); }