Example #1
0
        public override void Merge(XStorageObjectBase p_xobj)
        {
            base.Merge(p_xobj);
            XStorageObjectToSave xobj = p_xobj as XStorageObjectToSave;

            if (xobj == null)
            {
                Debug.Fail("Некорректная реализация XStorageObjectBase::Merge");
                throw new ArgumentException();
            }
            UpdateTS = UpdateTS | xobj.UpdateTS;
            if (xobj.IsToInsert)
            {
                m_state = XStorageObjectState.ToInsert;
            }
            foreach (string sPropName in xobj.Props.Keys)
            {
                if (!Props.Contains(sPropName))
                {
                    // свойства не было - добавим
                    Props[sPropName] = xobj.Props[sPropName];
                }
                else
                {
                    XStorageObjectPropMergeModes mergeModeThis    = GetPropMergeMode(sPropName);
                    XStorageObjectPropMergeModes mergeModeForeign = xobj.GetPropMergeMode(sPropName);
                    // если хотя бы для одного свойства стоит флаг "слабой" проверки, то отключаем проверку на совпадание значений свойств
                    if (mergeModeThis == XStorageObjectPropMergeModes.Replace)
                    {
                        Debug.Assert(mergeModeForeign != XStorageObjectPropMergeModes.Replace, "Два свойства с признаком перезаписи - это некорректная ситуация");
                        // у текущего св-ва задан атрибут перезаписи, поэтому оставляем его в неприкосновенности (даже проверки не делаем)
                    }
                    else if (mergeModeForeign == XStorageObjectPropMergeModes.Replace)
                    {
                        Props[sPropName] = xobj.Props[sPropName];
                    }
                    else
                    {
                        if (!isPropsEquals(Props[sPropName], xobj.Props[sPropName]))
                        {
                            throw new XMergeConflictException("Значения свойста " + sPropName + " отличаются: '" + Props[sPropName] + "' и '" + xobj.Props[sPropName] + "'");
                        }
                    }
                }
            }

            // смерджим словарь свойств, данные которых загружены механизмом кусочного сохранения
            if (xobj.PropertiesWithChunkedData.Count > 0)
            {
                foreach (string sPropName in xobj.PropertiesWithChunkedData.Keys)
                {
                    PropertiesWithChunkedData[sPropName] = xobj.PropertiesWithChunkedData[sPropName];
                }
            }

            ParticipateInUniqueIndex = xobj.ParticipateInUniqueIndex | ParticipateInUniqueIndex;
        }
Example #2
0
        public IDictionary GetPropsByCapacity(params XPropCapacity[] propCapacities)
        {
            XPropInfoObject[] propInfos = TypeInfo.GetPropsByCapacities(propCapacities);
            HybridDictionary  props     = new HybridDictionary(propInfos.Length);

            foreach (XPropInfoObject propInfo in propInfos)
            {
                if (Props.Contains(propInfo.Name))
                {
                    props.Add(propInfo.Name, Props[propInfo.Name]);
                }
            }
            return(props);
        }
Example #3
0
        public IDictionary GetPropsByType(params XPropType[] propTypes)
        {
            HybridDictionary props = new HybridDictionary();

            foreach (XPropInfoBase propInfo in TypeInfo.Properties)
            {
                foreach (XPropType propType in propTypes)
                {
                    if (propType == propInfo.VarType)
                    {
                        if (Props.Contains(propInfo.Name))
                        {
                            props.Add(propInfo.Name, Props[propInfo.Name]);
                        }
                        break;
                    }
                }
            }
            return(props);
        }