Пример #1
0
 public static void AddNewMessages(
     ISyncContext context,
     JanusMessageInfo[] messages,
     JanusRatingInfo[] rates,
     JanusModerateInfo[] moderatorials,
     int selfID)
 {
     AddNewMessages(
         context,
         messages,
         rates,
         moderatorials,
         null,
         selfID);
 }
Пример #2
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);
        }
Пример #3
0
        /// <summary>
        /// Добавление сообшений полученыых с сервера в базу
        /// </summary>
        /// <param name="provider"></param>
        /// <param name="db"></param>
        /// <param name="messages">Добавляемые сообщения</param>
        /// <param name="selfid"></param>
        /// <param name="progressHandler">обработчик прогресса обработки сообщений</param>
        /// <param name="updatedTopicIds">Какие топики были обновлены.</param>
        /// <param name="updatedMessageIds">Какие сообщения были добавлены.</param>
        private static void AddMessages(
            [NotNull] IServiceProvider provider,
            IDataContext db,
            JanusMessageInfo[] messages,
            int selfid,
            Action<int, int> progressHandler,
            out int[] updatedTopicIds,
            out int[] updatedMessageIds)
        {
            if (db == null)
                throw new ArgumentNullException("db");
            if (messages == null)
                throw new ArgumentNullException("messages");

            var msgIds = new List<int>();
            var topicIds = new List<int>();
            var processed = 0;
            foreach (var msg in messages)
            {
                if (ForumsSubscriptionHelper.IsTrashForum(msg.forumId))
                    try
                    {
                        var mid = msg.messageId;
                        db.TopicInfos(ti => ti.MessageID == mid).Delete();
                        db.Messages(m => m.ID == mid).Delete();
                    }
                    catch (Exception)
                    {
                        provider.LogError(Resources.ErrorOnMessageDelete + msg.messageId);
                    }
                else
                {
                    var updatedTid = db.Message(msg.messageId, m => (int?) m.TopicID);

                    if (msg.message.IsNullOrEmpty())
                        msg.message = "<none>";

                    var lastModerated =
                        msg.lastModerated == DateTime.MinValue
                            ? null
                            : (DateTime?) msg.lastModerated;
                    try
                    {
                        if (!updatedTid.HasValue)
                        {
                            var markRead = false;
                            if (msg.parentId != 0)
                                markRead = db.Message(msg.parentId, m => m.ReadReplies);

                            var isRead =
                                msg.userId == selfid
                                    ? provider.GetRequiredService<IRsdnSyncConfigService>().GetConfig().MarkOwnMessages
                                    : markRead;

                            db
                                .Messages()
                                .Value(_ => _.ID, msg.messageId)
                                .Value(_ => _.ForumID, msg.forumId)
                                .Value(_ => _.TopicID, msg.topicId)
                                .Value(_ => _.ParentID, msg.parentId)
                                .Value(_ => _.Date, msg.messageDate)
                                .Value(_ => _.UserNick, msg.userNick)
                                .Value(_ => _.Subject, msg.subject)
                                .Value(_ => _.Message, msg.message)
                                .Value(_ => _.UserClass, ToJanusUserClass(msg.userRole))
                                .Value(_ => _.IsRead, isRead)
                                .Value(_ => _.UserID, msg.userId)
                                .Value(_ => _.ArticleId, msg.articleId)
                                .Value(_ => _.ReadReplies, markRead)
                                .Value(_ => _.Name, msg.messageName)
                                .Value(_ => _.LastModerated, lastModerated)
                                .Value(_ => _.Closed, msg.closed)
                                .Insert();

                            msgIds.Add(msg.messageId);
                        }
                        else
                        {
                            var locMsg = msg;
                            db
                                .Messages(m => m.ID == locMsg.messageId)
                                .Set(_ => _.ForumID, msg.forumId)
                                .Set(_ => _.TopicID, msg.topicId)
                                .Set(_ => _.ParentID, msg.parentId)
                                .Set(_ => _.Date, msg.messageDate)
                                .Set(_ => _.UserID, msg.userId)
                                .Set(_ => _.UserNick, msg.userNick)
                                .Set(_ => _.Subject, msg.subject)
                                .Set(_ => _.Message, msg.message)
                                .Set(_ => _.UserClass, ToJanusUserClass(msg.userRole))
                                .Set(_ => _.ArticleId, msg.articleId)
                                .Set(_ => _.LastModerated, lastModerated)
                                .Set(_ => _.Name, msg.messageName)
                                .Set(_ => _.Closed, msg.closed)
                                .Update();
                            topicIds.Add(updatedTid.Value == 0 ? msg.messageId : updatedTid.Value);
                        }
                    }
                    catch (Exception e)
                    {
                        // Какая ....!
                        provider.LogError(
                            string.Format(
                                "{0}{1} : {2}",
                                Resources.ErrorOnMessageProcessing,
                                msg.messageId,
                                e.Message));
                    }
                }

                processed++;
                if (progressHandler != null)
                    progressHandler(messages.Length, processed);
            }

            db
                .SubscribedForums()
                .Set(_ => _.LastSync, 1)
                .Update();
            updatedTopicIds = topicIds.ToArray();
            updatedMessageIds = msgIds.ToArray();
        }