/// <summary> /// Возвращает журнал для указанного идентификатора сервиса. /// </summary> public List <JournalData> GetServiceJournal(Guid serviceID) { if (_servicesJournalsList.TryGetValue(serviceID, out var serviceJournal)) { var journalingManager = AppCore.Get <JournalingManager>(); using (var db = new Journaling.DB.DataContext()) { var query = journalingManager.DatabaseAccessor.CreateQueryJournalData(db). Where(x => x.JournalData.IdJournal == serviceJournal.IdJournal). OrderByDescending(x => x.JournalData.DateEvent); var data = journalingManager.DatabaseAccessor.FetchQueryJournalData(query); return(data); } } else { return(new List <JournalData>()); } }
internal static void CheckRemovedFiles() { // Не запускать не машине разработчика, иначе может быть так, что при подключении базе на удаленном сервере файлы физически останутся, а из базы будут удалены. if (Debug.IsDeveloper) { return; } if (!_servicesFlags.TryLock("CheckRemovedFiles")) { return; } bool isFinalized = false; int countFiles = 0; int checkRemovedFilesMax = 0; var startTime = DateTime.Now.Date.AddHours(3); try { if (_thisModule?.AppCore?.GetState() != CoreComponentState.Started) { return; } if (!_thisModule.GetConfiguration <FileManagerConfiguration>().IsCheckRemovedFiles) { return; } var journalResult = _thisModule.GetJournal(); if (!journalResult.IsSuccess) { Debug.WriteLine("Ошибка получения журнала файлового менеджера."); _thisModule?.RegisterEvent(EventType.Error, "Проверка удаленных файлов", $"Ошибка получения журнала файлового менеджера: {journalResult.Message}", null); return; } var dbAccessor = _thisModule.AppCore.Get <Journaling.DB.JournalingManagerDatabaseAccessor>(); using (var dbJournal = new Journaling.DB.DataContext()) { var range = new DateRange(DateTime.Now.Date, DateTime.Now.Date.AddDays(1)); var queryBase = dbAccessor.CreateQueryJournalData(dbJournal).Where(x => x.JournalName.IdJournal == journalResult.Result.IdJournal && x.JournalData.DateEvent >= range.Start && x.JournalData.DateEvent < range.End); if (queryBase.Where(x => x.JournalData.EventCode == EventCodeCheckRemovedFilesExecuted).Count() > 0) { return; } var lastRunInfo = queryBase.Where(x => x.JournalData.EventCode == EventCodeCheckRemovedFilesInfo).OrderByDescending(x => x.JournalData.IdJournalData).FirstOrDefault(); if (lastRunInfo == null) { if (DateTime.Now < startTime) { return; } _thisModule?.RegisterEvent(EventType.Info, "Проверка удаленных файлов", "Запуск регулярной задачи проверки файлов."); } else if (int.TryParse(lastRunInfo.JournalData.EventInfoDetailed, out int checkRemovedFilesMaxTmp)) { checkRemovedFilesMax = checkRemovedFilesMaxTmp; } } var executionTimeLimit = new TimeSpan(0, 4, 30); var dateStart = DateTime.Now; int idFileMax = checkRemovedFilesMax; var rootDirectory = _thisModule?.AppCore?.ApplicationWorkingFolder; using (var db = new Db.DataContext()) { while ((DateTime.Now - dateStart) < executionTimeLimit) { var filesQuery = db.File. AsNoTracking(). Where(x => !x.IsRemoved && !x.IsRemoving && x.IdFile > idFileMax). Select(x => new Db.File() { IdFile = x.IdFile, PathFile = x.PathFile, IsRemoving = x.IsRemoving, IsRemoved = x.IsRemoved }). OrderBy(x => x.IdFile). Take(5000); var filesList = filesQuery.ToList(); if (filesList.Count == 0) { isFinalized = true; break; } var updateList = new List <Db.File>(); filesList.ForEach(file => { try { if (!File.Exists(Path.Combine(rootDirectory, file.PathFile))) { file.IsRemoving = true; updateList.Add(file); } } catch (IOException) { return; } catch (UnauthorizedAccessException) { return; } catch { } idFileMax = file.IdFile; }); if (updateList.Count > 0) { using (var scope = db.CreateScope(TransactionScopeOption.RequiresNew)) { db.File. UpsertRange(updateList). AllowIdentityMatch(). On(x => x.IdFile). WhenMatched((xDb, xIns) => new Db.File() { IsRemoved = xIns.IsRemoved, IsRemoving = xIns.IsRemoving }). Run(); scope.Complete(); } countFiles += updateList.Count; } checkRemovedFilesMax = idFileMax; } } if (!isFinalized) { _thisModule?.RegisterEvent(EventType.Info, EventCodeCheckRemovedFilesInfo, "Проверка удаленных файлов", checkRemovedFilesMax.ToString()); } else { _thisModule?.RegisterEvent(EventType.Info, EventCodeCheckRemovedFilesExecuted, "Проверка удаленных файлов", "Удаление регулярной задачи проверки файлов."); } } catch (ThreadAbortException) { } catch (Exception ex) { _thisModule?.RegisterEvent(EventType.Error, "Проверка удаленных файлов", "Ошибка заполнения очереди удаления", ex); } finally { _servicesFlags.ReleaseLock("CheckRemovedFiles"); if (countFiles > 0) { _thisModule?.RegisterEvent(EventType.Info, "Проверка удаленных файлов", $"На удаление помечено {countFiles} файлов.", null); } } }