Ejemplo n.º 1
0
 public void SetPropMergeMode(string sPropName, XStorageObjectPropMergeModes mergeMode)
 {
     if (m_propsMergeModes == null)
     {
         m_propsMergeModes = new HybridDictionary(1);
     }
     m_propsMergeModes[sPropName] = mergeMode;
 }
Ejemplo n.º 2
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;
        }