Пример #1
0
        /// <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);
            }
        }
Пример #2
0
        /// <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);
            }
        }
Пример #3
0
        /// <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);
            }
        }
Пример #4
0
        /// <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);
            }
        }