public void ProcessPendingUpdates() { DDPImportHelper helper = new DDPImportHelper(); using (TransactionScope ts = new TransactionScope(TransactionScopeOption.RequiresNew, TimeSpan.FromMinutes(10))) { try { var ddpvermgr = new DDPVersionManager(); var pendings = PendingUpdateManager.GetPendingUpdates(); foreach (var pending in pendings) { DDPVersion ver = null; if (pending.type == 0) { ver = ddpvermgr.GetInmediateDDPVersion(pending.targetVersion); } else { ver = ddpvermgr.GetRegularDDPVersion(pending.targetVersion); } if (ver != null) { log.Info(string.Format("ProcessPendingUpdates: version {0} already exists skping ...", pending.targetVersion)); continue; } helper.UpdateIncrementalOrRegular(pending); } using (var d = new PendingUpdatesDataAccess()) { d.Remove(pendings); } } catch (Exception ex) { log.Error("ProcessPendingUpdates: error!", ex); } ts.Complete(); } }
public void UpdateIncrementalOrRegular(PendingDDPUpdate pending) { XmlDocument newdoc = new XmlDocument(); ICSharpCode.SharpZipLib.Zip.ZipFile zipFile = new ICSharpCode.SharpZipLib.Zip.ZipFile(new MemoryStream(pending.DDPUpdate.DDPFile.ToArray())); Stream stream = zipFile.GetInputStream(0); newdoc.Load(stream); //--------------------------------------------------- XmlNamespaceManager nsmanager = new XmlNamespaceManager(newdoc.NameTable); nsmanager.AddNamespace("lr", "http://gisis.imo.org/XML/LRIT/ddp/2008"); //--------------------------------------------------- XmlNode root = newdoc.SelectSingleNode("/lr:DataDistributionPlan-IncrementalUpdate", nsmanager); //Get ddp to modify var verman = new DDPVersionManager(); //Just get what is ready from the XML string qstr = string.Format("/lr:DataDistributionPlan-IncrementalUpdate/lr:{0}[@base{0}VersionNum='{1}' and @target{0}VersionNum='{2}']", pending.type == 0?"Immediate":"Regular", pending.baseVersion, pending.targetVersion); //Ontener el nodo "inmediate" o "regular" XmlNode inmediate = newdoc.SelectSingleNode(qstr, nsmanager); string baseVer = inmediate.Attributes[pending.type == 0 ? "baseImmediateVersionNum" : "baseRegularVersionNum"].Value; string targetVer = inmediate.Attributes[pending.type == 0 ? "targetImmediateVersionNum" : "targetRegularVersionNum"].Value; DateTime targetImplementationAt = DateTime.Parse(inmediate.Attributes["targetImplementationAt"].Value); var ddpver = pending.type == 0 ? verman.GetInmediateDDPVersion(baseVer) : verman.GetRegularDDPVersion(baseVer); if (ddpver == null) { log.Error(string.Format("UpdateIncrementalOrRegular: Unable to get old DDP file with version {1} type:{0}--> aborting", baseVer, pending.type)); return; } byte[] rawbuffer = ddpver.DDPFile.ToArray(); MemoryStream xms = new MemoryStream(rawbuffer); XmlDocument olddoc = new XmlDocument(); if (rawbuffer[0] == 0x50 && rawbuffer[1] == 0x4b) { ICSharpCode.SharpZipLib.Zip.ZipFile zipFile0 = new ICSharpCode.SharpZipLib.Zip.ZipFile(xms); Stream s = zipFile0.GetInputStream(0); olddoc.Load(s); } else { olddoc.Load(xms); } //Generar nueva version del xml mezclando los dos docuemtnos; var theNewXml = MixDocs(inmediate, olddoc, nsmanager); string newver = ddpver.regularVer + ":" + targetVer; if (pending.type != 0) { newver = targetVer + ":" + ddpver.inmediateVer; } var ms = new MemoryStream(300000); theNewXml.Save(ms); var raw = ms.ToArray(); File.WriteAllBytes(@"c:\" + newver.Split(':')[0] + "x" + newver.Split(':')[1] + ".textos", raw); Import(theNewXml, DDPManager.InsertCompleteDDP(newver, targetImplementationAt, raw)); log.Info("UpdateIncrementalOrRegular: New version ready => " + newver); stream.Close(); }