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); }
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(); } }