/// <summary>Update pois information retrived by the provider.</summary> protected void UpdateSites(IEnumerable<SiteInfo> sites, IEnumerable<Operator> operators) { var msg = new UpdateGridSites(); msg.Sites.AddRange(sites); msg.Operators.AddRange(operators); Services.Invoke(msg); }
internal void Handle(UpdateGridSites input) { Log.Trace("Processing {0} OPCOs", input.Operators.Count); if (input.Operators.Count == 0) { Log.Trace("No OPCOs to process, exiting"); Reply(true); return; } Log.Trace("Store {0} public sites", input.Sites.Count); using (var dbConn = DatabaseManager.DbConn()) { var dbSites = new List<SiteInfo>(); foreach (var op in input.Operators) { dbSites.AddRange(dbConn.ExecuteBpl(new SiteGetByOwnerId { OwnerId = op.Id })); } var toUpdate = new List<SiteInfo>(); var toAdd = new List<SiteInfo>(); toAdd.AddRange(input.Sites); var toDelete = new List<SiteInfo>(); toDelete.AddRange(dbSites); foreach (var iSite in input.Sites) { foreach (var dSite in dbSites) { if (iSite.SiteId == dSite.SiteId) { toAdd.Remove(iSite); toDelete.Remove(dSite); var iWriter = new BplBinaryWriter(); iWriter.Serialize(iSite); var iBytes = iWriter.ToByteArray(); var dWriter = new BplBinaryWriter(); dWriter.Serialize(dSite); var dBytes = dWriter.ToByteArray(); if (iBytes.Length != dBytes.Length) { toUpdate.Add(iSite); } else { for (var i = 0; i < iBytes.Length; i++) { if (iBytes[i] != dBytes[i]) { toUpdate.Add(iSite); break; } } } break; } } } dbConn.BeginTransaction(this); foreach (var s in toUpdate) { dbConn.ExecuteBpl(new SiteSave { i = s }); } foreach (var s in toAdd) { dbConn.ExecuteBpl(new SiteSave { i = s }); dbConn.ExecuteBpl(new SiteOwnerAdd { SiteId = s.SiteId, OwnerId = s.Operator.Id }); } foreach (var s in toDelete) { dbConn.ExecuteBpl(new SiteDeleteBySiteIdOwnerId { SiteId = s.SiteId, OwnerId = s.Operator.Id }); } dbConn.CommitTransaction(); } Reply(true); }