public XmlNode SerializeToXmlNode(XmlDocument xmlDoc, MarshalUnitOfWork marshalUnitOfWork) { XmlNode xml = xmlDoc.CreateElement("unit-of-work"); XmlNode xmlSub; xmlSub = xmlDoc.CreateElement("insert"); xml.AppendChild(xmlSub); foreach (MarshalObject mo in marshalUnitOfWork.InsertObjects) { xmlSub.AppendChild(SerializeToXmlNode(xmlDoc, mo)); } xmlSub = xmlDoc.CreateElement("update"); xml.AppendChild(xmlSub); foreach (MarshalObject mo in marshalUnitOfWork.UpdateObjects) { xmlSub.AppendChild(SerializeToXmlNode(xmlDoc, mo)); } xmlSub = xmlDoc.CreateElement("remove"); xml.AppendChild(xmlSub); foreach (MarshalObject mo in marshalUnitOfWork.RemoveObjects) { xmlSub.AppendChild(SerializeToXmlNode(xmlDoc, mo)); } return(xml); }
private MarshalUnitOfWork ToMarshalUnitOfWork(XmlNode xmlUnitOfWork) { MarshalUnitOfWork muow = new MarshalUnitOfWork(); XmlNode xmlListNode; XmlNodeList xmlNodeList; xmlListNode = xmlUnitOfWork.SelectSingleNode("insert"); if (xmlListNode != null) { xmlNodeList = xmlListNode.SelectNodes("object"); foreach (XmlNode xmlObj in xmlNodeList) { muow.InsertObjects.Add(ToMarshalObject(xmlObj)); } } xmlListNode = xmlUnitOfWork.SelectSingleNode("update"); if (xmlListNode != null) { xmlNodeList = xmlListNode.SelectNodes("object"); foreach (XmlNode xmlObj in xmlNodeList) { muow.UpdateObjects.Add(ToMarshalObject(xmlObj)); } } xmlListNode = xmlUnitOfWork.SelectSingleNode("remove"); if (xmlListNode != null) { xmlNodeList = xmlListNode.SelectNodes("object"); foreach (XmlNode xmlObj in xmlNodeList) { muow.RemoveObjects.Add(ToMarshalObject(xmlObj)); } } return(muow); }
public override void Commit(bool recursive) { if (this.url.Length < 1) { throw new NPersistException("You must specify an url to your NPersist Web Service in your WebServiceRemotingEngine!"); } MarshalUnitOfWork muow = GetUnitOfWork(); RemotingService rs = new RemotingService(this.Context, url); string xmlUoW = (string)Formatter.Serialize(muow); if (useCompression && this.compressor != null) { xmlUoW = this.compressor.Compress(xmlUoW); } bool doUseCompression = this.useCompression; if (this.compressor == null) { doUseCompression = false; } string result = rs.CommitUnitOfWork(xmlUoW, this.domainKey, doUseCompression); if (useCompression && this.compressor != null) { result = this.compressor.Decompress(result); } MarshalObjectList mol = (MarshalObjectList)Formatter.Deserialize(result, typeof(MarshalObjectList)); UpdateSourceAssigned(mol); ClearUnitOfWork(); }
public virtual MarshalUnitOfWork GetUnitOfWork() { MarshalUnitOfWork muow = new MarshalUnitOfWork(); IMarshalingTransformer transformer = new MarshalingTransformer(Context); MarshalObject mo; foreach (object obj in listInsert) { mo = transformer.FromObject(obj, true); muow.InsertObjects.Add(mo); } foreach (object obj in listUpdate) { mo = transformer.FromObject(obj); muow.UpdateObjects.Add(mo); } foreach (object obj in listRemove) { mo = transformer.FromObject(obj); muow.RemoveObjects.Add(mo); } return(muow); }
public object CommitUnitOfWork(object obj, string domainKey) { if (useCompression && this.compressor != null) { obj = this.compressor.Decompress((string)obj); //domainKey = this.compressor.Decompress(domainKey); } IContext ctx = contextFactory.GetContext(domainKey); MarshalingTransformer transformer = new MarshalingTransformer(ctx); //Deserialize the uow MarshalUnitOfWork muow = (MarshalUnitOfWork)formater.Deserialize(obj, typeof(MarshalUnitOfWork)); string identity; string serialized = ""; IClassMap classMap; Type realType; object ro; MarshalObjectList mol = new MarshalObjectList(); Hashtable insertedRealObjects = new Hashtable(); ITransaction tx = null; try { tx = ctx.BeginTransaction(); foreach (MarshalObject mo in muow.RemoveObjects) { identity = transformer.GetIdentity(mo); classMap = ctx.DomainMap.MustGetClassMap(mo.Type); realType = ctx.AssemblyManager.MustGetTypeFromClassMap(classMap); ro = ctx.GetObjectById(identity, realType); transformer.ToObject(mo, ref ro, 0, RefreshBehaviorType.OverwriteLoaded); ctx.UnitOfWork.RegisterDeleted(ro); } foreach (MarshalObject mo in muow.UpdateObjects) { identity = transformer.GetIdentity(mo); classMap = ctx.DomainMap.MustGetClassMap(mo.Type); realType = ctx.AssemblyManager.MustGetTypeFromClassMap(classMap); ro = ctx.GetObjectById(identity, realType); transformer.ToObject(mo, ref ro, 0, RefreshBehaviorType.OverwriteLoaded); ctx.UnitOfWork.RegisterDirty(ro); } foreach (MarshalObject mo in muow.InsertObjects) { classMap = ctx.DomainMap.MustGetClassMap(mo.Type); realType = ctx.AssemblyManager.MustGetTypeFromClassMap(classMap); if (mo.TempId.Length > 0) { ro = ctx.CreateObject(realType); } else { identity = transformer.GetIdentity(mo); ro = ctx.CreateObject(identity, realType); } insertedRealObjects[mo] = ro; transformer.ToObject(mo, ref ro, 0, RefreshBehaviorType.OverwriteDirty); } //Commit transaction tx.Commit(); } catch (Exception ex) { if (tx != null) { tx.Rollback(); } ctx.Dispose(); throw ex; } foreach (MarshalObject mo in muow.InsertObjects) { classMap = ctx.DomainMap.MustGetClassMap(mo.Type); if (classMap.HasAssignedBySource()) { foreach (IPropertyMap propertyMap in classMap.GetAllPropertyMaps()) { if (propertyMap.GetIsAssignedBySource()) { MarshalProperty mp = mo.GetProperty(propertyMap.Name); if (mp == null) { mp = new MarshalProperty(); mp.Name = propertyMap.Name; mo.Properties.Add(mp); } ro = insertedRealObjects[mo]; mp.Value = transformer.FromPropertyValue(ro, ctx.ObjectManager.GetPropertyValue(ro, propertyMap.Name), propertyMap); mol.Objects.Add(mo); } } } } ctx.Dispose(); serialized = (string)formater.Serialize(mol); if (useCompression && this.compressor != null) { return(this.compressor.Compress(serialized)); } else { return(serialized); } }