Esempio n. 1
0
        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();
            }
        }
Esempio n. 2
0
        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();
            }
        }
Esempio n. 3
0
        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();
            }
        }
Esempio n. 4
0
 protected override void PutIntern(ILoadContainer loadContainer)
 {
     throw new NotSupportedException();
 }