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