public IList <ILoadContainer> GetEntities(IList <IObjRef> orisToLoad) { readLock.Lock(); try { List <ILoadContainer> loadContainers = new List <ILoadContainer>(); for (int a = orisToLoad.Count; a-- > 0;) { IObjRef oriToLoad = orisToLoad[a]; ILoadContainer loadContainer = DictionaryExtension.ValueOrDefault(refToObjectDict, oriToLoad); if (loadContainer != null) { loadContainers.Add(loadContainer); } } return(loadContainers); } finally { readLock.Unlock(); } }
public void ChangeObject(IObjRef objRef, IPrimitiveUpdateItem[] primitiveUpdates, IRelationUpdateItem[] relationUpdates, String changedBy, long changedOn) { writeLock.Lock(); try { ILoadContainer loadContainer = refToObjectDict[objRef]; IEntityMetaData metaData = EntityMetaDataProvider.GetMetaData(objRef.RealType); Object[] primitives = loadContainer.Primitives; if (loadContainer.Reference.Version == null) { if (metaData.CreatedByMember != null) { primitives[GetPrimitiveMemberIndex(metaData, metaData.CreatedByMember.Name)] = changedBy; } if (metaData.CreatedOnMember != null) { primitives[GetPrimitiveMemberIndex(metaData, metaData.CreatedOnMember.Name)] = changedOn; } } else { if (metaData.UpdatedByMember != null) { primitives[GetPrimitiveMemberIndex(metaData, metaData.UpdatedByMember.Name)] = changedBy; } if (metaData.UpdatedOnMember != null) { primitives[GetPrimitiveMemberIndex(metaData, metaData.UpdatedOnMember.Name)] = changedOn; } } loadContainer.Reference.Version = objRef.Version; if (primitiveUpdates != null) { PrimitiveMember[] primitiveMembers = metaData.PrimitiveMembers; for (int a = primitiveUpdates.Length; a-- > 0;) { IPrimitiveUpdateItem pui = primitiveUpdates[a]; Member member = metaData.GetMemberByName(pui.MemberName); for (int b = primitiveMembers.Length; b-- > 0;) { if (primitiveMembers[b] == member) { primitives[b] = pui.NewValue; break; } } } } if (relationUpdates != null) { IObjRef[][] relations = loadContainer.Relations; for (int a = relationUpdates.Length; a-- > 0;) { IRelationUpdateItem rui = relationUpdates[a]; int memberIndex = metaData.GetIndexByRelationName(rui.MemberName); IObjRef[] relation = relations[memberIndex]; List <IObjRef> newRelation = new List <IObjRef>(); if (relation != null) { for (int b = relation.Length; b-- > 0;) { newRelation.Add(relation[b]); } } if (rui.RemovedORIs != null) { for (int b = rui.RemovedORIs.Length; b-- > 0;) { newRelation.Remove(rui.RemovedORIs[b]); } } if (rui.AddedORIs != null) { for (int b = rui.AddedORIs.Length; b-- > 0;) { newRelation.Add(rui.AddedORIs[b]); } } if (newRelation.Count == 0) { relations[a] = ObjRef.EMPTY_ARRAY; } else { relations[memberIndex] = newRelation.ToArray(); } } } } finally { writeLock.Unlock(); } }
public void RemoveObject(IObjRef objRef) { writeLock.Lock(); try { ILoadContainer deletedContainer = refToObjectDict[objRef]; refToObjectDict.Remove(objRef); Type deletedType = objRef.RealType; IEntityMetaData metaData = EntityMetaDataProvider.GetMetaData(deletedType); if (metaData.TypesRelatingToThis.Length == 0) { return; } ISet <Type> typesRelatingToThis = new HashSet <Type>(metaData.TypesRelatingToThis); DictionaryExtension.Loop(refToObjectDict, delegate(IObjRef key, ILoadContainer value) { if (!typesRelatingToThis.Contains(key.RealType)) { // This object does not refer to instances of deleted type } IEntityMetaData typeRelatingMetaData = EntityMetaDataProvider.GetMetaData(key.RealType); RelationMember[] relationMembers = typeRelatingMetaData.RelationMembers; for (int a = relationMembers.Length; a-- > 0;) { RelationMember relationMember = relationMembers[a]; if (!deletedType.Equals(relationMember.ElementType)) { continue; } IObjRef[] relationsOfMember = value.Relations[a]; if (relationsOfMember.Length == 0) { continue; } bool contains = false; for (int b = relationsOfMember.Length; b-- > 0;) { IObjRef relationOfMember = relationsOfMember[b]; if (objRef.Equals(relationOfMember)) { contains = true; break; } } if (!contains) { continue; } if (relationsOfMember.Length == 1) { value.Relations[a] = ObjRef.EMPTY_ARRAY; continue; } List <IObjRef> newRelationsOfMember = new List <IObjRef>(); for (int b = relationsOfMember.Length; b-- > 0;) { IObjRef relationOfMember = relationsOfMember[b]; if (!objRef.Equals(relationOfMember)) { newRelationsOfMember.Add(relationOfMember); } } value.Relations[a] = newRelationsOfMember.ToArray(); } }); } finally { writeLock.Unlock(); } }
protected override void PutIntern(ILoadContainer loadContainer) { throw new NotSupportedException(); }