public void Save(AnimeGroup grp, bool updategrpcontractstats, bool recursive, bool verifylockedFilters = true) { using (var session = JMMService.SessionFactory.OpenSession()) { HashSet <GroupFilterConditionType> types; lock (grp) { if (grp.AnimeGroupID == 0) //We are creating one, and we need the AnimeGroupID before Update the contracts { grp.Contract = null; using (var transaction = session.BeginTransaction()) { session.SaveOrUpdate(grp); transaction.Commit(); } } types = grp.UpdateContract(session, updategrpcontractstats); //Types will contains the affected GroupFilterConditionTypes using (var transaction = session.BeginTransaction()) { session.SaveOrUpdate(grp); transaction.Commit(); } Changes.AddOrUpdate(grp.AnimeGroupID); Cache.Update(grp); } if (verifylockedFilters) { GroupFilterRepository.CreateOrVerifyTagsAndYearsFilters(false, grp.Contract.Stat_AllTags, grp.Contract.Stat_AirDate_Min); //This call will create extra years or tags if the Group have a new year or tag grp.UpdateGroupFilters(types, null); } if (grp.AnimeGroupParentID.HasValue && recursive) { AnimeGroup pgroup = GetByID(session, grp.AnimeGroupParentID.Value); // This will avoid the recursive error that would be possible, it won't update it, but that would be // the least of the issues if (pgroup != null && pgroup.AnimeGroupParentID == grp.AnimeGroupID) { Save(pgroup, updategrpcontractstats, true, verifylockedFilters); } } } }
public void Save(AnimeSeries obj, bool updateGroups, bool onlyupdatestats, bool skipgroupfilters = false) { bool newSeries = false; AnimeGroup oldGroup = null; AnimeGroupRepository repGroups = new AnimeGroupRepository(); bool isMigrating = false; lock (obj) { if (obj.AnimeSeriesID == 0) { newSeries = true; // a new series } else { // get the old version from the DB AnimeSeries oldSeries; using (var session = JMMService.SessionFactory.OpenSession()) { oldSeries = session.Get <AnimeSeries>(obj.AnimeSeriesID); } if (oldSeries != null) { // means we are moving series to a different group if (oldSeries.AnimeGroupID != obj.AnimeGroupID) { oldGroup = repGroups.GetByID(oldSeries.AnimeGroupID); AnimeGroup newGroup = repGroups.GetByID(obj.AnimeGroupID); if (newGroup != null && newGroup.GroupName.Equals("AAA Migrating Groups AAA")) { isMigrating = true; } newSeries = true; } } } if (newSeries && !isMigrating) { using (var session = JMMService.SessionFactory.OpenSession()) { obj.Contract = null; // populate the database using (var transaction = session.BeginTransaction()) { session.SaveOrUpdate(obj); transaction.Commit(); } } } HashSet <GroupFilterConditionType> types = obj.UpdateContract(onlyupdatestats); using (var session = JMMService.SessionFactory.OpenSession()) { // populate the database using (var transaction = session.BeginTransaction()) { session.SaveOrUpdate(obj); transaction.Commit(); } } if (!skipgroupfilters && !isMigrating) { GroupFilterRepository.CreateOrVerifyTagsAndYearsFilters(false, obj.Contract?.AniDBAnime?.AniDBAnime?.AllTags, obj.Contract?.AniDBAnime?.AniDBAnime?.AirDate); //This call will create extra years or tags if the Group have a new year or tag obj.UpdateGroupFilters(types, null); } Cache.Update(obj); Changes.AddOrUpdate(obj.AnimeSeriesID); } if (updateGroups && !isMigrating) { if (newSeries) { logger.Trace("Updating group stats by series from AnimeSeriesRepository.Save: {0}", obj.AnimeSeriesID); AnimeGroup grp = repGroups.GetByID(obj.AnimeGroupID); if (grp != null) { repGroups.Save(grp, true, true); } } if (oldGroup != null) { logger.Trace("Updating group stats by group from AnimeSeriesRepository.Save: {0}", oldGroup.AnimeGroupID); repGroups.Save(oldGroup, true, true); } } }