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); }
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); }