Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        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();
            }
        }
Ejemplo n.º 3
0
        /// <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));
        }
Ejemplo n.º 4
0
        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);
        }
Ejemplo n.º 5
0
 /// <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));
 }
Ejemplo n.º 6
0
 /// <summary>
 /// Добавление объекта в коллекцию удаляемых объектов
 /// </summary>
 /// <param name="xobj"></param>
 public void AddDeleted(XStorageObjectToDelete xobj)
 {
     m_aObjectsToDelete.Add(xobj);
     m_hashObjectsToDelete.Add(getKey(xobj), xobj);
 }