Пример #1
0
 public IPrimitiveUpdateItem[] GetEnsureFullPUIs(IEntityMetaData metaData, IMap <Type, IPrimitiveUpdateItem[]> entityTypeToFullPuis)
 {
     IPrimitiveUpdateItem[] fullPuis = entityTypeToFullPuis.Get(metaData.EntityType);
     if (fullPuis == null)
     {
         fullPuis = new IPrimitiveUpdateItem[metaData.PrimitiveMembers.Length];
         entityTypeToFullPuis.Put(metaData.EntityType, fullPuis);
     }
     return(fullPuis);
 }
Пример #2
0
        protected void WritePUI(IPrimitiveUpdateItem pui, IWriter writer)
        {
            if (pui == null)
            {
                return;
            }
            Object newValue = pui.NewValue;

            writer.WriteStartElement(pui.MemberName);

            String sValue = ConversionHelper.ConvertValueToType <String>(newValue);

            writer.WriteAttribute("value", sValue == null ? "null" : sValue.Length > 256 ? "[[skipped " + sValue.Length + " chars]]" : sValue);
            writer.WriteEndElement();
        }
Пример #3
0
        protected bool EqualsPUI(CUDResultDiff cudResultDiff, IPrimitiveUpdateItem left, IPrimitiveUpdateItem right)
        {
            if (Object.Equals(left.NewValue, right.NewValue))
            {
                return(true);
            }
            if (!cudResultDiff.doFullDiff)
            {
                return(false);
            }
            CreateOrUpdateContainerBuild containerBuild = cudResultDiff.UpdateContainerBuild();

            containerBuild.AddPrimitive(right);
            return(false);
        }
Пример #4
0
 public IPrimitiveUpdateItem[] CompactPUIs(IPrimitiveUpdateItem[] fullPUIs, int puiCount)
 {
     if (puiCount == 0)
     {
         return(null);
     }
     IPrimitiveUpdateItem[] puis = new IPrimitiveUpdateItem[puiCount];
     for (int a = fullPUIs.Length; a-- > 0;)
     {
         IPrimitiveUpdateItem pui = fullPUIs[a];
         if (pui == null)
         {
             continue;
         }
         fullPUIs[a]      = null;
         puis[--puiCount] = pui;
     }
     return(puis);
 }
Пример #5
0
        public void AddPrimitive(IPrimitiveUpdateItem pui)
        {
            IPrimitiveUpdateItem[] fullPUIs = this.fullPUIs;
            if (fullPUIs == null)
            {
                fullPUIs      = new IPrimitiveUpdateItem[primitiveNameToIndexMap.Count];
                this.fullPUIs = fullPUIs;
            }
            int?indexR = primitiveNameToIndexMap.Get(pui.MemberName);

            if (!indexR.HasValue)
            {
                throw new Exception("No primitive member " + Reference.RealType.FullName + "." + pui.MemberName + " defined");
            }
            int index = indexR.Value;

            if (fullPUIs[index] == null)
            {
                puiCount++;
            }
            fullPUIs[index] = pui;
        }
Пример #6
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();
            }
        }
Пример #7
0
        protected bool EqualsPUIs(CUDResultDiff cudResultDiff, IPrimitiveUpdateItem[] left, IPrimitiveUpdateItem[] right)
        {
            if (left == null || left.Length == 0)
            {
                if (right == null || right.Length == 0)
                {
                    return(true);
                }
                if (!cudResultDiff.doFullDiff)
                {
                    return(false);
                }
                CreateOrUpdateContainerBuild containerBuild = cudResultDiff.UpdateContainerBuild();
                foreach (IPrimitiveUpdateItem rightPui in right)
                {
                    containerBuild.AddPrimitive(rightPui);
                }
                return(false);
            }
            if (right == null || right.Length == 0)
            {
                throw new Exception("Must never happen");
            }
            if (left.Length != right.Length)
            {
                if (!cudResultDiff.doFullDiff)
                {
                    return(false);
                }
                int leftIndex = left.Length - 1;
                for (int rightIndex = right.Length; rightIndex-- > 0;)
                {
                    IPrimitiveUpdateItem leftPui  = leftIndex >= 0 ? left[leftIndex] : null;
                    IPrimitiveUpdateItem rightPui = right[rightIndex];
                    if (leftPui == null || !leftPui.MemberName.Equals(rightPui.MemberName))
                    {
                        CreateOrUpdateContainerBuild containerBuild = cudResultDiff.UpdateContainerBuild();
                        containerBuild.AddPrimitive(rightPui);
                        continue;
                    }
                    if (!EqualsPUI(cudResultDiff, leftPui, rightPui))
                    {
                        if (!cudResultDiff.doFullDiff)
                        {
                            return(false);
                        }
                        CreateOrUpdateContainerBuild containerBuild = cudResultDiff.UpdateContainerBuild();
                        containerBuild.AddPrimitive(rightPui);
                    }
                    leftIndex--;
                }
                return(false);
            }
            bool isEqual = true;

            for (int a = left.Length; a-- > 0;)
            {
                IPrimitiveUpdateItem rightPui = right[a];
                if (!EqualsPUI(cudResultDiff, left[a], rightPui))
                {
                    if (!cudResultDiff.doFullDiff)
                    {
                        return(false);
                    }
                    CreateOrUpdateContainerBuild containerBuild = cudResultDiff.UpdateContainerBuild();
                    containerBuild.AddPrimitive(rightPui);
                    isEqual = false;
                }
            }
            return(isEqual);
        }