public void TestDifference() { var mapCli = new NewsMap { channelIds = new[] { 1, 3 }, records = new[] { new NewsMapRecord(new DateTime(2013, 12, 2), 141), new NewsMapRecord(new DateTime(2013, 12, 3), 102), new NewsMapRecord(new DateTime(2013, 12, 4), 151), new NewsMapRecord(new DateTime(2013, 12, 5), 151), new NewsMapRecord(new DateTime(2013, 12, 6), 150), } }; var mapSrv = MakeTestMap(); NewsMap mapDiff = null; try { mapDiff = mapCli.MakeMapOfLackedNews(mapSrv); } catch (Exception ex) { Assert.Fail("Failed to make NewsMap diff: {0}", ex); } Assert.AreEqual(5, mapDiff.channelIds[0], "lacked channels"); Assert.AreEqual(3, mapDiff.records.Length, "records lacked - count is OK"); }
private void ActualizeSync(object accountIdObj) { var totalNews = 0; try { if (isTerminating) { return; } var accountId = (int)accountIdObj; if (accountId == 0) { var accountData = AccountStatus.Instance.AccountData; if (accountData != null) { accountId = accountData.ID; } if (accountId == 0) { return; } } // получить от сервера карту новостей NewsMap serverNewsMap = null; try { using (var proxy = new NewsStorageProxy(TerminalBindings.BindingNewsStorage)) { serverNewsMap = proxy.GetNewsMap(accountId); } } catch (Exception ex) { Logger.ErrorFormat("NewsCache({0}) - ошибка получения карты новостей: {1}", accountId, ex); } if (serverNewsMap == null) { return; } if (isTerminating) { return; } // сформировать список каналов / дат, на которые нужно подкачать новости var lackMap = map.MakeMapOfLackedNews(serverNewsMap); if (lackMap.records.Length == 0 || serverNewsMap.channelIds.Length == 0) { return; } // подкачать новости по указанным каналам за указанные даты var numFailsLeft = StopAskingServerAfterFails + 1; using (var proxy = new NewsStorageProxy(TerminalBindings.BindingNewsStorage)) foreach (var rec in lackMap.records) { if (isTerminating) { break; } try { var news = proxy.GetNews(accountId, rec.date, serverNewsMap.channelIds); if (news == null || news.Count == 0) { continue; } totalNews += news.Count; // обновить кеш новостей NewsLocalStorage.Instance.UpdateNews(news); } catch (Exception ex) { numFailsLeft--; if (numFailsLeft == 0) { break; } Logger.Error("Ошибка в NewsCache.ActualizeSync()", ex); } } // сохранить кешированные новости NewsLocalStorage.Instance.SaveNewsInFiles(); // обновить карту новостей map = NewsLocalStorage.Instance.MakeNewsMap(); //serverNewsMap; map.SaveInFile(mapPath); } finally { syncCompletedEvent.Set(); } if (actualizationCompleted != null && !isTerminating) { actualizationCompleted(totalNews); } }