Пример #1
0
        public static void AddNewMessages(
            ISyncContext context,
            JanusMessageInfo[] messages,
            JanusRatingInfo[] rates,
            JanusModerateInfo[] moderatorials,
            Action<IDataContext> afterProcessInTxHandler,
            int selfID)
        {
            if (messages == null)
                throw new ArgumentNullException("messages");
            if (rates == null)
                throw new ArgumentNullException("rates");
            if (messages.Length == 0 && rates.Length == 0)
                // Nothing to do
                return;

            context.LogInfo(Resources.ProcessMessages);

            var msgIds = EmptyArray<int>.Value;
            // Затычка. Блокируем интерфейс на время обработки сообщений.
            using (context.GetRequiredService<IUIShell>().FreezeUI(context))
            using (context.GetRequiredService<IJanusDatabaseManager>().GetLock().GetWriterLock())
            {
                var dbMgr = context.GetRequiredService<IJanusDatabaseManager>();
                using (var db = dbMgr.CreateDBContext())
                using (var tx = db.BeginTransaction())
                {
                    var tids = new HashSet<int>();
                    var pgSvc = context.GetService<ISyncProgressVisualizer>();

                    var topicIds = EmptyArray<int>.Value;
                    if (messages.Length > 0)
                        AddMessages(
                            context,
                            db,
                            messages,
                            selfID,
                            pgSvc != null
                                ? (total, current) =>
                                    {
                                        pgSvc.ReportProgress(total, current);
                                        pgSvc.SetProgressText(
                                            current.GetDeclension(
                                                Resources.NewMsgProcessingProgressText1,
                                                Resources.NewMsgProcessingProgressText2,
                                                Resources.NewMsgProcessingProgressText5)
                                                .FormatStr(current));
                                    }
                                : (Action<int, int>) null,
                            out topicIds,
                            out msgIds);
                    foreach (var msg in messages)
                        tids.Add(msg.topicId != 0 ? msg.topicId : msg.messageId);
                    foreach (var id in topicIds)
                        tids.Add(id);

                    AddNewRates(
                        db,
                        rates,
                        pgSvc != null
                            ? (total, current) =>
                                {
                                    pgSvc.ReportProgress(total, current);
                                    pgSvc.SetProgressText(
                                        current.GetDeclension(
                                            Resources.NewRatesProcessingProgress1,
                                            Resources.NewRatesProcessingProgress2,
                                            Resources.NewRatesProcessingProgress5)
                                            .FormatStr(current));
                                }
                            : (Action<int, int>) null);
                    foreach (var rate in rates)
                        tids.Add(rate.topicId != 0 ? rate.topicId : rate.messageId);

                    AddModeratorials(db, moderatorials);

                    // Вариант с получением топиков с сервера
                    foreach (var tid in moderatorials.Select(
                        mod => mod.topicId == 0 ? mod.messageId : mod.topicId))
                        tids.Add(tid);

                    context.GetRequiredService<IRsdnForumService>().UpdateForumAggregates(context, db, tids);

                    if (afterProcessInTxHandler != null)
                        afterProcessInTxHandler(db);

                    tx.Commit();
                    GC.KeepAlive(db);
                }
            }

            AddBrokenTopicRequests(context, messages);

            var searchSvc = context.GetRequiredService<ISearchService>();
            var addedCount =
                searchSvc.AddMessagesToIndex(
                    messages.Select(
                        svcMsg =>
                            new MessageSearchInfo(
                                svcMsg.messageId,
                                svcMsg.messageDate,
                                svcMsg.subject,
                                svcMsg.message,
                                svcMsg.forumId,
                                svcMsg.userId,
                                svcMsg.userNick)));
            context.StatisticsContainer.AddValue(JanusATInfo.IndexedMessagesStats, addedCount);

            context.LogInfo(
                Resources.DownloadTopicsStat
                    .FormatStr(
                        msgIds.Length,
                        msgIds.Length.GetDeclension(
                            Resources.Messages1,
                            Resources.Messages2,
                            Resources.Messages5)));

            context.StatisticsContainer.AddValue(JanusATInfo.MessagesStats, messages.Length);
            context.StatisticsContainer.AddValue(JanusATInfo.RatesStats, rates.Length);
            context.StatisticsContainer.AddValue(JanusATInfo.ModeratorialsStats, moderatorials.Length);
        }