Ejemplo n.º 1
0
        protected override void CacheValueHasBeenAdded(sbyte idIndex, Object id, IEntityMetaData metaData, Object[] primitives, IObjRef[][] relations, Object cacheValueR)
        {
            base.CacheValueHasBeenAdded(idIndex, id, metaData, primitives, relations, cacheValueR);

            Type entityType = metaData.EntityType;

            CacheKey[] oldAlternateCacheKeys = (CacheKey[])keyToAlternateIdsMap.Get(entityType, idIndex, id);
            if (oldAlternateCacheKeys != null)
            {
                for (int a = oldAlternateCacheKeys.Length; a-- > 0;)
                {
                    CacheKey alternateCacheKey = oldAlternateCacheKeys[a];
                    if (alternateCacheKey != null)
                    {
                        RemoveKeyFromCache(alternateCacheKey);
                    }
                }
            }
            CacheKey[] newAlternateCacheKeys = oldAlternateCacheKeys;
            if (newAlternateCacheKeys == null)
            {
                // Allocate new array to hold alternate ids
                newAlternateCacheKeys = ExtractAlternateCacheKeys(metaData, primitives);
                if (newAlternateCacheKeys.Length > 0)
                {
                    keyToAlternateIdsMap.Put(entityType, idIndex, id, newAlternateCacheKeys);
                }
            }
            else
            {
                // reuse existing array for new alternate id-values
                ExtractAlternateCacheKeys(metaData, primitives, newAlternateCacheKeys);
            }
            PutAlternateCacheKeysToCache(metaData, newAlternateCacheKeys, cacheValueR);
        }
Ejemplo n.º 2
0
        public override void GetContent(HandleContentDelegate handleContentDelegate)
        {
            CheckNotDisposed();
            CacheHashMap keyToInstanceMap = new CacheHashMap(CacheMapEntryTypeProvider);
            Lock         writeLock        = this.WriteLock;

            writeLock.Lock();
            try
            {
                foreach (CacheMapEntry entry in keyToCacheValueDict)
                {
                    Object cacheValue = GetCacheValueFromReference(entry.GetValue());
                    if (cacheValue == null)
                    {
                        continue;
                    }
                    keyToInstanceMap.Put(entry.EntityType, entry.IdIndex, entry.Id, cacheValue);
                }
                foreach (CacheMapEntry entry in keyToInstanceMap)
                {
                    sbyte idIndex = entry.IdIndex;
                    if (idIndex == ObjRef.PRIMARY_KEY_INDEX)
                    {
                        handleContentDelegate(entry.EntityType, idIndex, entry.Id, entry.GetValue());
                    }
                }
            }
            finally
            {
                writeLock.Unlock();
            }
        }