Example #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(nameof(messages));
			if (rates == null)
				throw new ArgumentNullException(nameof(rates));
			if (messages.Length == 0 && rates.Length == 0)
				// Nothing to do
				return;

			context.LogInfo(Resources.ProcessMessages);

			var msgIds = Array<int>.Empty;
			// Затычка. Блокируем интерфейс на время обработки сообщений.
			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 = Array<int>.Empty;
					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)
												.FormatWith(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)
											.FormatWith(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);

					afterProcessInTxHandler?.Invoke(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
					.FormatWith(
						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);
		}
Example #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);
        }