Esempio n. 1
0
        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");
        }
Esempio n. 2
0
        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);
            }
        }