コード例 #1
0
        public IList <ILoadContainer> GetEntities(IList <IObjRef> orisToLoad)
        {
            bool isTransaction = false;

            if (TransactionState != null)
            {
                isTransaction = TransactionState.IsTransactionActive;
            }
            List <ILoadContainer> result = new List <ILoadContainer>();

            if (!isTransaction)
            {
                // Allow committed root cache only OUT OF transactions to retrieve data by itself
                IList <Object> loadContainers = CommittedRootCache.GetObjects(orisToLoad, loadContainerResultCD);
                for (int a = loadContainers.Count; a-- > 0;)
                {
                    result.Add((ILoadContainer)loadContainers[a]);
                }
                InternStrings(result);
                return(result);
            }
            List <IObjRef> orisToLoadWithVersion = new List <IObjRef>();
            List <IObjRef> missedOris            = new List <IObjRef>();

            for (int i = orisToLoad.Count; i-- > 0;)
            {
                IObjRef ori = orisToLoad[i];
                if (ori.Version != null)
                {
                    orisToLoadWithVersion.Add(ori);
                }
                else
                {
                    missedOris.Add(ori);
                }
            }
            IList <Object> loadContainers2 = CommittedRootCache.GetObjects(orisToLoadWithVersion, committedRootCacheCD);

            for (int a = loadContainers2.Count; a-- > 0;)
            {
                ILoadContainer loadContainer = (ILoadContainer)loadContainers2[a];
                if (loadContainer == null)
                {
                    missedOris.Add(orisToLoadWithVersion[a]);
                }
                else
                {
                    result.Add(loadContainer);
                }
            }
            if (missedOris.Count > 0)
            {
                IList <ILoadContainer> uncommittedLoadContainer = UncommittedCacheRetriever.GetEntities(missedOris);
                result.AddRange(uncommittedLoadContainer);
            }
            InternStrings(result);
            return(result);
        }
コード例 #2
0
        public IList <IObjRelationResult> GetRelations(IList <IObjRelation> objRelations)
        {
            IList <IObjRelation> orelToLoadWithVersion = new List <IObjRelation>();
            IList <IObjRelation> missedOrels           = new List <IObjRelation>();

            for (int i = objRelations.Count; i-- > 0;)
            {
                IObjRelation orel = objRelations[i];
                if (orel.Version != null)
                {
                    orelToLoadWithVersion.Add(orel);
                }
                else
                {
                    missedOrels.Add(orel);
                }
            }
            IList <IObjRelationResult> relationResults = CommittedRootCache.GetObjRelations(orelToLoadWithVersion, committedRootCacheCD);
            List <IObjRelationResult>  result          = new List <IObjRelationResult>();

            for (int a = relationResults.Count; a-- > 0;)
            {
                IObjRelationResult relationResult = relationResults[a];
                if (relationResult == null)
                {
                    missedOrels.Add(orelToLoadWithVersion[a]);
                }
                else
                {
                    result.Add(relationResult);
                }
            }
            if (missedOrels.Count > 0)
            {
                IList <IObjRelationResult> uncommittedRelationResult = UncommittedCacheRetriever.GetRelations(missedOrels);
                result.AddRange(uncommittedRelationResult);
            }
            return(result);
        }
コード例 #3
0
        public void DisposeTransactionalRootCache(bool success)
        {
            transactionalRootCacheActiveTL.Value = false;

            DisposeCurrentRootCache(rootCacheTL);

            IRootCache rootCache = privilegedRootCacheTL.Value;

            if (rootCache == null)
            {
                DisposeCurrentRootCache(privilegedRootCacheTL);
                // This may happen if an exception occurs while committing and therefore calling a rollback
                return;
            }
            try
            {
                if (success)
                {
                    List <RootCacheValue> content = new List <RootCacheValue>();

                    // Save information into second level cache for committed data
                    rootCache.GetContent(delegate(Type entityType, sbyte idIndex, Object id, Object value)
                    {
                        content.Add((RootCacheValue)value);
                    }
                                         );
                    if (content.Count > 0)
                    {
                        rootCache.Clear();
                        CommittedRootCache.Put(content);
                    }
                }
            }
            finally
            {
                DisposeCurrentRootCache(privilegedRootCacheTL);
            }
        }