// -------------------------------------------------------------------- // 統計を必要に応じて更新 // -------------------------------------------------------------------- private static void UpdateExistStatisticsIfNeeded(TYukariStatistics existStatistics, TYukariRequest yukariRequest, DbSet <TFound> founds) { CopyYukariRequestToYukariStatistics(yukariRequest, existStatistics); CopyFoundToYukariStatisticsIfNeeded(founds, existStatistics); }
// -------------------------------------------------------------------- // TYukariRequest → TYukariStatistics へコピー // -------------------------------------------------------------------- private static void CopyYukariRequestToYukariStatistics(TYukariRequest yukariRequest, TYukariStatistics yukariStatistics) { // EF Core では、代入しても実際の値が更新されていなければ更新と判定されない(無駄な保存が発生しない)模様なので、プログラムでは更新チェックはせずに常に代入する // 途中で変わるものについては、変わったら Dirty フラグを立てる必要がある yukariStatistics.RequestId = yukariRequest.Id; yukariStatistics.RequestMoviePath = yukariRequest.Path; yukariStatistics.RequestSinger = yukariRequest.Singer; yukariStatistics.Dirty |= yukariStatistics.RequestComment != yukariRequest.Comment; yukariStatistics.RequestComment = yukariRequest.Comment; yukariStatistics.Dirty |= yukariStatistics.RequestOrder != yukariRequest.Order; yukariStatistics.RequestOrder = yukariRequest.Order; yukariStatistics.Dirty |= yukariStatistics.RequestKeyChange != yukariRequest.KeyChange; yukariStatistics.RequestKeyChange = yukariRequest.KeyChange; }
// -------------------------------------------------------------------- // TFound → TYukariStatistics へプロパティーを 1 つコピー(TFound と TYukariStatistics が異なる場合のみ) // -------------------------------------------------------------------- public static void CopyFoundToYukariStatisticsIfUpdated(TFound found, String foundPropertyName, TYukariStatistics yukariStatistics, String statisticsPropertyName) { Type foundType = typeof(TFound); PropertyInfo?foundPropertyInfo = foundType.GetProperty(foundPropertyName); Type statisticsType = typeof(TYukariStatistics); PropertyInfo?statisticsPropertyInfo = statisticsType.GetProperty(statisticsPropertyName); Debug.Assert(foundPropertyInfo != null && statisticsPropertyInfo != null, "CopyFoundToYukariStatisticsIfUpdated() bad propertyName"); Object?foundValue = foundPropertyInfo.GetValue(found); Object?statisticsValue = statisticsPropertyInfo.GetValue(yukariStatistics); if (foundPropertyInfo.PropertyType == typeof(String)) { // String の場合は null と String.Empty を同値扱い if (String.IsNullOrEmpty((String?)foundValue) && String.IsNullOrEmpty((String?)statisticsValue)) { return; } } if (foundValue == null && statisticsValue == null || foundValue?.Equals(statisticsValue) == true) { return; } // 異なるのでコピー Debug.WriteLine("CopyFoundToYukariStatisticsIfUpdated() copy " + yukariStatistics.Id + ", " + foundPropertyInfo.Name + ": " + foundValue); statisticsPropertyInfo.SetValue(yukariStatistics, foundValue); yukariStatistics.Dirty = true; }
// -------------------------------------------------------------------- // TFound → TYukariStatistics へコピー(ゆかり統計が属性確認済ではない場合のみ) // -------------------------------------------------------------------- private static void CopyFoundToYukariStatisticsIfNeeded(DbSet <TFound> founds, TYukariStatistics yukariStatistics) { if (yukariStatistics.AttributesDone) { return; } TFound?found = founds.FirstOrDefault(x => x.Path == yukariStatistics.RequestMoviePath); if (found == null) { Debug.WriteLine("CopyFoundToYukariStatisticsIfNeeded() 属性確認しようとしたが見つからない " + yukariStatistics.RequestMoviePath); return; } DbCommon.CopyFoundToYukariStatisticsIfAttributesPrepared(found, yukariStatistics); }
// -------------------------------------------------------------------- // TFound → TYukariStatistics へコピー(TFound の属性情報がある場合のみ) // -------------------------------------------------------------------- public static void CopyFoundToYukariStatisticsIfAttributesPrepared(TFound found, TYukariStatistics yukariStatistics) { if (found.FileSize < 0) { Debug.WriteLine("CopyFoundToYukariStatisticsIfAttributesPrepared() 属性確認しようとしたがまだ整理されていない " + yukariStatistics.RequestMoviePath); return; } yukariStatistics.Dirty |= !yukariStatistics.AttributesDone; yukariStatistics.AttributesDone = true; CopyFoundToYukariStatisticsIfUpdated(found, nameof(found.Worker), yukariStatistics, nameof(yukariStatistics.Worker)); CopyFoundToYukariStatisticsIfUpdated(found, nameof(found.SongReleaseDate), yukariStatistics, nameof(yukariStatistics.SongReleaseDate)); CopyFoundToYukariStatisticsIfUpdated(found, nameof(found.Category), yukariStatistics, nameof(yukariStatistics.CategoryName)); CopyFoundToYukariStatisticsIfUpdated(found, nameof(found.TieUpName), yukariStatistics, nameof(yukariStatistics.TieUpName)); CopyFoundToYukariStatisticsIfUpdated(found, nameof(found.TieUpAgeLimit), yukariStatistics, nameof(yukariStatistics.TieUpAgeLimit)); CopyFoundToYukariStatisticsIfUpdated(found, nameof(found.MakerName), yukariStatistics, nameof(yukariStatistics.MakerName)); CopyFoundToYukariStatisticsIfUpdated(found, nameof(found.TieUpGroupName), yukariStatistics, nameof(yukariStatistics.TieUpGroupName)); CopyFoundToYukariStatisticsIfUpdated(found, nameof(found.SongName), yukariStatistics, nameof(yukariStatistics.SongName)); CopyFoundToYukariStatisticsIfUpdated(found, nameof(found.SongOpEd), yukariStatistics, nameof(yukariStatistics.SongOpEd)); CopyFoundToYukariStatisticsIfUpdated(found, nameof(found.ArtistName), yukariStatistics, nameof(yukariStatistics.ArtistName)); CopyFoundToYukariStatisticsIfUpdated(found, nameof(found.LyristName), yukariStatistics, nameof(yukariStatistics.LyristName)); CopyFoundToYukariStatisticsIfUpdated(found, nameof(found.ComposerName), yukariStatistics, nameof(yukariStatistics.ComposerName)); CopyFoundToYukariStatisticsIfUpdated(found, nameof(found.ArrangerName), yukariStatistics, nameof(yukariStatistics.ArrangerName)); Debug.WriteLine("CopyFoundToYukariStatisticsIfAttributesPrepared() 属性確認実施 " + yukariStatistics.RequestMoviePath); }