public void BatchDelete(ISessionWrapper session, IEnumerable <SVR_GroupFilter> groupFilters) { if (session == null) { throw new ArgumentNullException(nameof(session)); } if (groupFilters == null) { throw new ArgumentNullException(nameof(groupFilters)); } lock (globalDBLock) { lock (Cache) { foreach (SVR_GroupFilter groupFilter in groupFilters) { lock (groupFilter) { try { session.Delete(groupFilter); Cache.Remove(groupFilter); } catch (Exception e) { logger.Error( $"Unable to delete group filter: {groupFilter.GroupFilterName}|{groupFilter.GroupFilterID}"); } } } } } }
/// <summary> /// Re-creates all AnimeGroups based on the existing AnimeSeries. /// </summary> /// <param name="session">The NHibernate session.</param> /// <exception cref="ArgumentNullException"><paramref name="session"/> is <c>null</c>.</exception> public void RecreateAllGroups(ISessionWrapper session) { if (session == null) { throw new ArgumentNullException(nameof(session)); } bool cmdProcGeneralPaused = ShokoService.CmdProcessorGeneral.Paused; bool cmdProcHasherPaused = ShokoService.CmdProcessorHasher.Paused; bool cmdProcImagesPaused = ShokoService.CmdProcessorImages.Paused; try { // Pause queues ShokoService.CmdProcessorGeneral.Paused = true; ShokoService.CmdProcessorHasher.Paused = true; ShokoService.CmdProcessorImages.Paused = true; _log.Info("Beginning re-creation of all groups"); IReadOnlyList <SVR_AnimeSeries> animeSeries = RepoFactory.AnimeSeries.GetAll(); IReadOnlyCollection <SVR_AnimeGroup> createdGroups = null; SVR_AnimeGroup tempGroup = null; using (ITransaction trans = session.BeginTransaction()) { tempGroup = CreateTempAnimeGroup(session); ClearGroupsAndDependencies(session, tempGroup.AnimeGroupID); trans.Commit(); } if (_autoGroupSeries) { createdGroups = AutoCreateGroupsWithRelatedSeries(session, animeSeries) .AsReadOnlyCollection(); } else // Standard group re-create { createdGroups = CreateGroupPerSeries(session, animeSeries) .AsReadOnlyCollection(); } using (ITransaction trans = session.BeginTransaction()) { UpdateAnimeSeriesContractsAndSave(session, animeSeries); session.Delete(tempGroup); // We should no longer need the temporary group we created earlier trans.Commit(); } // We need groups and series cached for updating of AnimeGroup contracts to work _animeGroupRepo.Populate(session, displayname: false); _animeSeriesRepo.Populate(session, displayname: false); using (ITransaction trans = session.BeginTransaction()) { UpdateAnimeGroupsAndTheirContracts(session, createdGroups); trans.Commit(); } // We need to update the AnimeGroups cache again now that the contracts have been saved // (Otherwise updating Group Filters won't get the correct results) _animeGroupRepo.Populate(session, displayname: false); _animeGroupUserRepo.Populate(session, displayname: false); _groupFilterRepo.Populate(session, displayname: false); using (ITransaction trans = session.BeginTransaction()) { UpdateGroupFilters(session); trans.Commit(); } _log.Info("Successfuly completed re-creating all groups"); } catch (Exception e) { _log.Error(e, "An error occurred while re-creating all groups"); try { // If an error occurs then chances are the caches are in an inconsistent state. So re-populate them _animeSeriesRepo.Populate(); _animeGroupRepo.Populate(); _groupFilterRepo.Populate(); _animeGroupUserRepo.Populate(); } catch (Exception ie) { _log.Warn(ie, "Failed to re-populate caches"); } throw; } finally { // Un-pause queues (if they were previously running) ShokoService.CmdProcessorGeneral.Paused = cmdProcGeneralPaused; ShokoService.CmdProcessorHasher.Paused = cmdProcHasherPaused; ShokoService.CmdProcessorImages.Paused = cmdProcImagesPaused; } }
/// <summary> /// Re-creates all AnimeGroups based on the existing AnimeSeries. /// </summary> /// <param name="session">The NHibernate session.</param> /// <exception cref="ArgumentNullException"><paramref name="session"/> is <c>null</c>.</exception> public void RecreateAllGroups(ISessionWrapper session) { if (session == null) throw new ArgumentNullException(nameof(session)); bool cmdProcGeneralPaused = JMMService.CmdProcessorGeneral.Paused; bool cmdProcHasherPaused = JMMService.CmdProcessorHasher.Paused; bool cmdProcImagesPaused = JMMService.CmdProcessorImages.Paused; try { // Pause queues JMMService.CmdProcessorGeneral.Paused = true; JMMService.CmdProcessorHasher.Paused = true; JMMService.CmdProcessorImages.Paused = true; _log.Info("Beginning re-creation of all groups"); IReadOnlyList<AnimeSeries> animeSeries = RepoFactory.AnimeSeries.GetAll(); IReadOnlyCollection<AnimeGroup> createdGroups = null; AnimeGroup tempGroup = null; using (ITransaction trans = session.BeginTransaction()) { tempGroup = CreateTempAnimeGroup(session); ClearGroupsAndDependencies(session, tempGroup.AnimeGroupID); trans.Commit(); } if (_autoGroupSeries) { createdGroups = AutoCreateGroupsWithRelatedSeries(session, animeSeries) .AsReadOnlyCollection(); } else // Standard group re-create { createdGroups = CreateGroupPerSeries(session, animeSeries) .AsReadOnlyCollection(); } using (ITransaction trans = session.BeginTransaction()) { UpdateAnimeSeriesContractsAndSave(session, animeSeries); session.Delete(tempGroup); // We should no longer need the temporary group we created earlier trans.Commit(); } // We need groups and series cached for updating of AnimeGroup contracts to work _animeGroupRepo.Populate(session, displayname: false); _animeSeriesRepo.Populate(session, displayname: false); using (ITransaction trans = session.BeginTransaction()) { UpdateAnimeGroupsAndTheirContracts(session, createdGroups); trans.Commit(); } // We need to update the AnimeGroups cache again now that the contracts have been saved // (Otherwise updating Group Filters won't get the correct results) _animeGroupRepo.Populate(session, displayname: false); _animeGroupUserRepo.Populate(session, displayname: false); _groupFilterRepo.Populate(session, displayname: false); using (ITransaction trans = session.BeginTransaction()) { UpdateGroupFilters(session); trans.Commit(); } _log.Info("Successfuly completed re-creating all groups"); } catch (Exception e) { _log.Error(e, "An error occurred while re-creating all groups"); try { // If an error occurs then chances are the caches are in an inconsistent state. So re-populate them _animeSeriesRepo.Populate(); _animeGroupRepo.Populate(); _groupFilterRepo.Populate(); _animeGroupUserRepo.Populate(); } catch (Exception ie) { _log.Warn(ie, "Failed to re-populate caches"); } throw; } finally { // Un-pause queues (if they were previously running) JMMService.CmdProcessorGeneral.Paused = cmdProcGeneralPaused; JMMService.CmdProcessorHasher.Paused = cmdProcHasherPaused; JMMService.CmdProcessorImages.Paused = cmdProcImagesPaused; } }