示例#1
0
        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);
        }
示例#2
0
        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);
        }