public static void AddNewMessages( ISyncContext context, JanusMessageInfo[] messages, JanusRatingInfo[] rates, JanusModerateInfo[] moderatorials, int selfID) { AddNewMessages( context, messages, rates, moderatorials, null, selfID); }
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); }
/// <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(); }