public XStorageObjectBase createXStorageObject(DomainObjectData obj) { XStorageObjectBase xobj; object vPropValue; if (obj.ToDelete) { xobj = new XStorageObjectToDelete(obj.TypeInfo, obj.ObjectID, obj.TS, true); } else { xobj = new XStorageObjectToSave(obj.TypeInfo, obj.ObjectID, obj.TS, obj.IsNew); ((XStorageObjectToSave)xobj).PropertiesWithChunkedData = obj.PropertiesWithChunkedData; } bool bNeedTrackUniqueIndexParticipation = xobj.TypeInfo.HasUniqueIndexes && xobj.TypeInfo.DeferrableIndexes && !obj.ToDelete; foreach (string sPropName in obj.UpdatedPropNames) { vPropValue = obj.GetUpdatedPropValue(sPropName); XPropInfoBase propInfo = obj.TypeInfo.GetProp(sPropName); if (propInfo is XPropInfoNumeric) { if (((XPropInfoSimpleEnumerable)propInfo).IsEnum) { // в качестве значения свойства может быть поcле перечисления, надо привести его в элементарному типу if (vPropValue.GetType().IsEnum) { if (propInfo.VarType == XPropType.vt_i4) { vPropValue = (Int32)vPropValue; } else if (propInfo.VarType == XPropType.vt_i2) { vPropValue = (Int16)vPropValue; } else // if (propInfo.VarType == XPropType.vt_ui1) { vPropValue = (byte)vPropValue; } } } } if (vPropValue != null) { xobj.Props[sPropName] = vPropValue; } // если свойство участвует в уникальном индексе, запомним это if (bNeedTrackUniqueIndexParticipation) { if (xobj.TypeInfo.IsPropIncludedIntoUniqueIndex(sPropName)) { ((XStorageObjectToSave)xobj).ParticipateInUniqueIndex = true; } } } return(xobj); }
public override void Merge(XStorageObjectBase p_xobj) { base.Merge(p_xobj); XStorageObjectToDelete xobj = p_xobj as XStorageObjectToDelete; if (xobj == null) { Debug.Fail("Некорректная реализация XStorageObjectBase::Merge"); throw new ArgumentException(); } }
/// <summary> /// Удаление множества объектов /// </summary> /// <param name="xs">XStorage</param> /// <param name="aDelObjects">Удаляемые объекты</param> /// <returns>Количество удаленных объектов</returns> public int Delete(XStorageConnection xs, IXObjectIdentity[] aDelObjects) { if (aDelObjects == null) { throw new ArgumentNullException("aDelObjects"); } if (aDelObjects.Length == 0) { return(0); } XStorageObjectToDelete[] aDelObjectsToDelete = new XStorageObjectToDelete[aDelObjects.Length]; int i = -1; foreach (IXObjectIdentity xobj in aDelObjects) { aDelObjectsToDelete[++i] = new XStorageObjectToDelete(xs.MetadataManager.GetTypeInfo(xobj.ObjectType), xobj.ObjectID, xobj.TS, true); } return(deleteObjectsFromDelete(xs, aDelObjectsToDelete)); }
public static XStorageObjectBase CreateXStorageObject(XmlElement xmlObject, XTypeInfo typeInfo) { XStorageObjectBase xobj; Guid oid = new Guid(xmlObject.GetAttribute("oid")); Int64 nTS; if (xmlObject.HasAttribute("ts")) { nTS = Int32.Parse(xmlObject.GetAttribute("ts")); } else { nTS = -1; } bool bIsNew = false; if (xmlObject.HasAttribute("delete")) { xobj = new XStorageObjectToDelete(typeInfo, oid, nTS, true); } else { bIsNew = xmlObject.HasAttribute("new"); xobj = new XStorageObjectToSave(typeInfo, oid, nTS, bIsNew); } bool bNeedTrackUniqueIndexParticipation = typeInfo.HasUniqueIndexes && typeInfo.DeferrableIndexes && xobj is XStorageObjectToSave; // по всем свойствам без признака loaded="0" foreach (XmlElement xmlProp in xmlObject.SelectNodes("*[not(@loaded)]")) { XPropInfoBase xprop = typeInfo.GetProp(xmlProp.LocalName); if (xprop == null) { continue; } // если на xml-свойстве неудаляемого объекта есть атрибут с идентификатором цепочки кусочных данных, то занесем его в специальный словарь if (xobj is XStorageObjectToSave && xmlProp.HasAttribute(ATTR_CHUNCK_CHAIN_ID)) { ((XStorageObjectToSave)xobj).PropertiesWithChunkedData.Add(xprop.Name, new Guid(xmlProp.GetAttribute(ATTR_CHUNCK_CHAIN_ID))); } // членство в массиве проигнорируем if (xprop is XPropInfoObjectArray) { if (((XPropInfoObjectArray)xprop).Capacity == XPropCapacity.ArrayMembership) { continue; } } // пустые массивные свойства новых объектов проигнорируем if (bIsNew) { if (xprop is XPropInfoObjectArray || xprop is XPropInfoObjectLink) { if (!xmlProp.HasChildNodes) { continue; } } } xobj.Props.Add(xprop.Name, getPropValue(xmlProp, xprop)); // если свойство участвует в уникальном индексе, запомним это if (bNeedTrackUniqueIndexParticipation) { if (typeInfo.IsPropIncludedIntoUniqueIndex(xprop.Name)) { ((XStorageObjectToSave)xobj).ParticipateInUniqueIndex = true; } } } return(xobj); }
/// <summary> /// Удаление множества объектов. Вызывается в рамках процедуры сохранения. /// </summary> /// <param name="xs">XStorageConnection</param> /// <param name="colObjectsToDelete">Коллекция объектов для удаления типа, производного от XObjectBase</param> /// <returns>Количество удаленных объектов</returns> protected int deleteObjectsFromSaveMethod(XStorageConnection xs, List <object> colObjectsToDelete) { XStorageObjectToDelete[] aDelObjectsToDelete = new XStorageObjectToDelete[colObjectsToDelete.Count]; colObjectsToDelete.CopyTo(aDelObjectsToDelete); return(internalDeleteObjects(xs, aDelObjectsToDelete)); }
/// <summary> /// Добавление объекта в коллекцию удаляемых объектов /// </summary> /// <param name="xobj"></param> public void AddDeleted(XStorageObjectToDelete xobj) { m_aObjectsToDelete.Add(xobj); m_hashObjectsToDelete.Add(getKey(xobj), xobj); }