/// <summary> /// DT_DELIVERY_GROUPテーブルからDtDeliveryGroupを取得する /// </summary> /// <param name="sid">取得するデータのSID</param> /// <returns>取得したデータ</returns> public DtDeliveryGroup ReadDtDeliveryGroup(long sid) { DtDeliveryGroup model = null; try { _logger.Enter($"{nameof(sid)}={sid}"); DBAccessor.Models.DtDeliveryGroup entity = null; _dbPolly.Execute(() => { using (DBAccessor.Models.RmsDbContext db = new DBAccessor.Models.RmsDbContext(_appSettings)) { entity = db.DtDeliveryGroup.Include(x => x.DtDeliveryResult).FirstOrDefault(x => x.Sid == sid); } }); if (entity != null) { model = entity.ToModel(); } return(model); } catch (Exception e) { throw new RmsException("DT_DELIVERY_GROUPテーブルのSelectに失敗しました。", e); } finally { _logger.LeaveJson("{0}", model); } }
/// <summary> /// 引数に指定したDtDeliveryGroupをDT_DELIVERY_GROUPテーブルへ登録する /// </summary> /// <param name="inData">登録するデータ</param> /// <returns>処理結果</returns> public DtDeliveryGroup CreateDtDeliveryGroup(DtDeliveryGroup inData) { DtDeliveryGroup model = null; try { _logger.EnterJson("{0}", inData); DBAccessor.Models.DtDeliveryGroup entity = new DBAccessor.Models.DtDeliveryGroup(inData); _dbPolly.Execute(() => { using (DBAccessor.Models.RmsDbContext db = new DBAccessor.Models.RmsDbContext(_appSettings)) { var statusNotStart = db.MtDeliveryGroupStatus.FirstOrDefault(x => x.Code.Equals(Const.DeliveryGroupStatus.NotStarted)); if (statusNotStart == null) { return; } entity.DeliveryGroupStatusSid = statusNotStart.Sid; var dbdata = db.DtDeliveryGroup.Add(entity).Entity; db.SaveChanges(_timePrivder); model = dbdata.ToModel(); } }); return(model); } catch (ValidationException e) { throw new RmsParameterException(e.ValidationResult.ErrorMessage, e); } catch (Exception e) { throw new RmsException("DT_DELIVERY_GROUPテーブルへのInsertに失敗しました。", e); } finally { _logger.LeaveJson("{0}", model); } }
/// <summary> /// データの削除 /// </summary> /// <param name="sid">削除するデータのSID</param> /// <param name="rowVersion">rowversion</param> /// <returns>削除したデータ</returns> public DtDeliveryGroup DeleteDtDeliveryGroup(long sid, byte[] rowVersion) { DtDeliveryGroup model = null; try { _logger.Enter($"{nameof(sid)}={sid} {nameof(rowVersion)}={rowVersion}"); DBAccessor.Models.DtDeliveryGroup entity = new DBAccessor.Models.DtDeliveryGroup() { Sid = sid, RowVersion = rowVersion }; _dbPolly.Execute(() => { using (DBAccessor.Models.RmsDbContext db = new DBAccessor.Models.RmsDbContext(_appSettings)) { // 指定した配信ステータスSIDを検索し、未配信状態であるかチェックする // 備考:該当する配信グループが0個(Whereの結果が空のリスト)の場合、Allは必ずtrueを返す // そのためすべての配信ステータスが未配信状態であると見なされ、isNotStart=trueとなることに注意 var isNotStart = db.DtDeliveryGroup .Where(x => x.Sid == sid) .Include(x => x.DeliveryGroupStatusS) .All(x => x.DeliveryGroupStatusS.Code.Equals(Utility.Const.DeliveryGroupStatus.NotStarted)); if (!isNotStart) { throw new RmsCannotChangeDeliveredFileException(string.Format("配信前状態ではないDT_DELIVERY_GROUPテーブルのレコードをDeleteしようとしました。(DT_DELIVERY_GROUP.SID = {0})", sid)); } // SIDが一致するレコードが存在しない場合はDeleteを実行しない // (存在しないSIDに対してDeleteを実行してしまうと、DbUpdateConcurrencyExceptionが発生してしまい、 // RowVersion競合とNot Foundとの区別ができないため) if (db.DtDeliveryGroup.Any(x => x.Sid == sid)) { db.DtDeliveryGroup.Attach(entity); db.DtDeliveryGroup.Remove(entity); if (db.SaveChanges() > 0) { model = entity.ToModel(); } } } }); return(model); } catch (DbUpdateConcurrencyException e) { // RowVersion衝突が起きた throw new RmsConflictException("DT_DELIVERY_GROUPテーブルのDeleteで競合が発生しました。", e); } catch (RmsException) { throw; } catch (Exception e) { throw new RmsException("DT_DELIVERY_GROUPテーブルのDeleteに失敗しました。", e); } finally { _logger.LeaveJson("{0}", model); } }
/// <summary> /// 引数に指定したDtInstallResultをDT_INSTALL_RESULTテーブルへ登録する /// </summary> /// <param name="inData">登録するデータ</param> /// <param name="state">状態。適用結果ステータスマスタテーブルのコード値が入る。</param> /// <returns>追加したデータ。配信グループデータテーブルの更新に失敗した場合はnullを返す。</returns> /// <remarks> /// すべての処理に成功した場合には適用結果データテーブルに登録したデータを返す。 /// 配信グループデータテーブルの更新に失敗した場合はnullを返す。 /// 適用結果データテーブルへの登録に失敗した場合には、例外を投げる。 /// </remarks> public DtInstallResult CreateDtInstallResultIfAlreadyMessageThrowEx(DtInstallResult inData, string state) { DtInstallResult model = null; try { _logger.EnterJson("{0}", inData); // グループステータス更新失敗フラグ bool failedToUpdateGroupStatus = false; DBAccessor.Models.DtDeliveryGroup deliveryGroupEntity = new DBAccessor.Models.DtDeliveryGroup { DeliveryGroupStatusSid = 0 }; _dbPolly.Execute(() => { // メッセージIDがなければ追加 using (DBAccessor.Models.RmsDbContext db = new DBAccessor.Models.RmsDbContext(_appSettings)) { // マスタテーブルから適用結果ステータスSIDを取得 var installResultStatus = db.MtInstallResultStatus.FirstOrDefault(x => x.Code == state); if (installResultStatus == null || installResultStatus.Sid == 0) { throw new RmsException(string.Format("状態[{0}]がマスタテーブルに存在しません。", state)); } var addedAlready = db.DtInstallResult.FirstOrDefault(x => x.MessageId == inData.MessageId); if (addedAlready != null) { throw new RmsAlreadyExistException(string.Format("MessageId [{0}] はすでに追加済みです。", inData.MessageId)); } // 適用結果データテーブルの更新処理 DBAccessor.Models.DtInstallResult dbdata; { // 適用結果ステータスSIDを設定 inData.InstallResultStatusSid = installResultStatus.Sid; DBAccessor.Models.DtInstallResult entity = new DBAccessor.Models.DtInstallResult(inData); // メッセージを適用結果データテーブルに保存 // 適用結果データテーブルの更新は、配信グループデータテーブル更新の成功/失敗に依存しない仕様のため、先にDB保存処理を呼ぶ dbdata = db.DtInstallResult.Add(entity).Entity; db.SaveChanges(_timePrivder); } // 配信グループデータテーブルの更新処理 { // 適用結果ステータスマスタテーブルから"completed"に該当するSIDを取得する long completedStatusSid = db.MtDeliveryGroupStatus.FirstOrDefault(x => x.Code == Const.DeliveryGroupStatus.Completed).Sid; // 更新された配信グループデータテーブルのレコード数 int affectedRows = 0; // 適用結果データテーブルの配信結果SIDから配信結果データテーブルのレコードを抽出 var deliveryResult = db.DtDeliveryResult.FirstOrDefault(x => x.Sid == inData.DeliveryResultSid); if (deliveryResult != null) { // メッセージが所属する配信グループのSID long targetDeliveryGroupSid = deliveryResult.DeliveryGroupSid; // SQL文を発行する var sqlParamForSid = new SqlParameter(SqlKeyForSid, targetDeliveryGroupSid); var sqlParamForGroupStatusSid = new SqlParameter(SqlKeyForGroupStatusSid, completedStatusSid); var sqlParams = new[] { sqlParamForGroupStatusSid, sqlParamForSid }; try { affectedRows = db.Database.ExecuteSqlCommand(SqlCommandToUpdateDeliveryGroupStatus, sqlParams); if (affectedRows <= 0) { _logger.Debug(string.Format("メッセージ[{0}]が所属する配信グループIDのステータスに変更はありませんでした。", inData.MessageId)); } } catch (Exception) { // 配信グループデータ更新失敗フラグを立てる failedToUpdateGroupStatus = true; _logger.Debug(string.Format("メッセージ[{0}]が所属する配信グループIDのステータス更新に失敗しました。", inData.MessageId)); } } else { // 配信結果はメッセージの定義上null許可のため、配信結果が存在しないケースがある _logger.Debug(string.Format("メッセージ[{0}]が所属する配信グループIDがnullであるため配信グループデータテーブルは更新しませんでした。", inData.MessageId)); } db.SaveChanges(_timePrivder); } model = dbdata.ToModel(); } }); if (failedToUpdateGroupStatus) { // 配信グループデータ更新失敗時にはnullを返す return(null); } return(model); } catch (RmsAlreadyExistException) { // メッセージ追加済みエラー throw; } catch (RmsException) { throw; } catch (ValidationException e) { throw new RmsParameterException(e.ValidationResult.ErrorMessage, e); } catch (Exception e) { throw new RmsException("DT_INSTALL_RESULTテーブルへのInsertまたはDT_DELIVERY_GROUPのUpdateに失敗しました。", e); } finally { _logger.LeaveJson("{0}", model); } }