Example #1
0
            public DtDeviceFile CreateOrUpdateDtDeviceFile(DtDeviceFile inData)
            {
                if (_isThrowEx_CreateDtDeviceFile)
                {
                    throw new RmsException("Error!");
                }
                if (_iFailed_CreateDtDeviceFile)
                {
                    return(null);
                }

                files.Add(inData);
                return(inData);
            }
Example #2
0
        /// <summary>
        /// 変換する
        /// </summary>
        /// <param name="file">DtDeviceFile</param>
        /// <returns>ArchiveFile</returns>
        public static ArchiveFile From(DtDeviceFile file)
        {
            Assert.IfNull(file);
            var archiveFile = new ArchiveFile()
            {
                ContainerName = file.Container,
                FilePath      = file.FilePath
            };

            IDictionary <string, string> dic = new Dictionary <string, string>();

            foreach (var attribute in file.DtDeviceFileAttribute)
            {
                archiveFile.SetMetaData(attribute);
            }

            return(archiveFile);
        }
Example #3
0
        /// <summary>
        /// ファイル情報とファイルを削除する
        /// </summary>
        /// <param name="file">削除ファイル</param>
        /// <returns>true: 成功、false:失敗</returns>
        private bool DeleteFile(DtDeviceFile file)
        {
            DeleteFileStatus status = DeleteFileStatus.DeleteDtDeviceFile;

            try
            {
                // Sq1.2: 一定期間より古いファイル情報を削除する
                if (_dtDeviceFileRepository.DeleteDtDeviceFile(file.Sid) == null)
                {
                    // 削除対象を取得してから、削除するまでの間に、別口で削除された場合ここにくる。
                    // レアケースのため意図しないサーバーエラーとする。ただし何があったかは分かるように例外を入れておく。
                    _logger.Error(new RmsException(string.Format("削除対象のファイル情報が存在しません。(SID = {0})", file.Sid)), nameof(Resources.CO_BLC_BLC_001));
                    return(false);
                }

                status = DeleteFileStatus.Delete;

                var archiveFile = ArchiveFile.From(file);

                // Sq1.3: 一定期間より古いファイルを削除する
                _primaryBlobRepository.Delete(archiveFile);

                _logger.Info(nameof(Resources.CO_BLC_BLC_007), new object[] { file.Container, file.FilePath, file.UpdateDatetime });
                return(true);
            }
            catch (Exception e)
            {
                switch (status)
                {
                case DeleteFileStatus.DeleteDtDeviceFile:
                    // ログ出力して次ファイルを処理
                    _logger.Warn(e, nameof(Resources.CO_BLC_BLC_005), new object[] { file.Container, file.FilePath, file.UpdateDatetime });
                    return(false);

                case DeleteFileStatus.Delete:
                default:
                    // ログ出力して次ファイルを処理
                    // 削除に失敗した場合は、監視運用で処理する
                    _logger.Warn(e, nameof(Resources.CO_BLC_BLC_006), new object[] { file.Container, file.FilePath, file.UpdateDatetime });
                    return(false);
                }
            }
        }
Example #4
0
        /// <summary>
        /// DT_DEVICE_FILEテーブルからDtDeviceFileを削除する
        /// </summary>
        /// <param name="sid">削除するデータのSID</param>
        /// <returns>削除したデータ</returns>
        public DtDeviceFile DeleteDtDeviceFile(long sid)
        {
            DtDeviceFile model = null;

            try
            {
                _logger.Enter($"{nameof(sid)}={sid}");

                DBAccessor.Models.DtDeviceFile entity = new DBAccessor.Models.DtDeviceFile()
                {
                    Sid = sid
                };
                _dbPolly.Execute(() =>
                {
                    using (DBAccessor.Models.RmsDbContext db = new DBAccessor.Models.RmsDbContext(_appSettings))
                    {
                        db.DtDeviceFile.Attach(entity);
                        db.DtDeviceFile.Remove(entity);

                        if (db.SaveChanges() > 0)
                        {
                            model = entity.ToModel();
                        }
                    }
                });

                return(model);
            }
            catch (ValidationException e)
            {
                throw new RmsParameterException(e.ValidationResult.ErrorMessage, e);
            }
            catch (Exception e)
            {
                throw new RmsException("DT_DEVICE_FILEテーブルのDeleteに失敗しました。", e);
            }
            finally
            {
                _logger.LeaveJson("{0}", model);
            }
        }
Example #5
0
        /// <summary>
        /// DT_DEVICE_FILEテーブルからDtDeviceFileを取得する
        /// </summary>
        /// <param name="sid">取得するデータのSID</param>
        /// <returns>取得したデータ</returns>
        public DtDeviceFile ReadDtDeviceFile(long sid)
        {
            DtDeviceFile model = null;

            try
            {
                _logger.Enter($"{nameof(sid)}={sid}");

                DBAccessor.Models.DtDeviceFile entity = null;
                _dbPolly.Execute(() =>
                {
                    using (DBAccessor.Models.RmsDbContext db = new DBAccessor.Models.RmsDbContext(_appSettings))
                    {
                        entity = db.DtDeviceFile.Include(x => x.DeviceS).Include(x => x.DtDeviceFileAttribute).FirstOrDefault(x => x.Sid == sid);
                    }
                });

                if (entity != null)
                {
                    model = entity.ToModel();
                }

                return(model);
            }
            catch (ValidationException e)
            {
                throw new RmsParameterException(e.ValidationResult.ErrorMessage, e);
            }
            catch (Exception e)
            {
                throw new RmsException("DT_DELIVERY_FILEテーブルのSelectに失敗しました。", e);
            }
            finally
            {
                _logger.LeaveJson("{0}", model);
            }
        }
Example #6
0
        /// <summary>
        /// 引数に指定したDtDeviceFileをDT_DEVICE_FILEテーブルへ登録する
        /// 既にレコードが存在する場合は登録ではなく当該レコードの更新処理を行う
        /// また当該レコードに紐づいたDT_DEVICE_FILE_ATTRIBUTEテーブルの更新を行う
        /// </summary>
        /// <param name="inData">登録するデータ</param>
        /// <returns>処理結果</returns>
        public DtDeviceFile CreateOrUpdateDtDeviceFile(DtDeviceFile inData)
        {
            DtDeviceFile model = null;

            // 更新日時
            // DtDeviceFileAttribute更新時に明示的に日時データを渡す必要があるため、
            // レコード作成および更新日時はすべて明示的に設定する
            var now = _timePrivder.UtcNow;

            try
            {
                _logger.EnterJson("{0}", inData);

                _dbPolly.Execute(() =>
                {
                    using (DBAccessor.Models.RmsDbContext db = new DBAccessor.Models.RmsDbContext(_appSettings))
                        using (var tran = db.Database.BeginTransaction())
                        {
                            string container = inData.Container;
                            string filePath  = inData.FilePath;

                            var deviceFileModel = db.DtDeviceFile.FirstOrDefault(
                                x => x.Container.Equals(container, StringComparison.OrdinalIgnoreCase) &&
                                x.FilePath.Equals(filePath, StringComparison.OrdinalIgnoreCase));

                            DBAccessor.Models.DtDeviceFile entity;

                            if (deviceFileModel == null || deviceFileModel.Sid == 0)
                            {
                                inData.CreateDatetime = now;
                                inData.UpdateDatetime = now;
                                entity = new DBAccessor.Models.DtDeviceFile(inData);

                                // コンテナ名とファイルパスをキーにして見つからなければレコード追加
                                entity = db.DtDeviceFile.Add(entity).Entity;
                            }
                            else
                            {
                                // 端末ファイル更新
                                deviceFileModel.SourceEquipmentUid = inData.SourceEquipmentUid;
                                deviceFileModel.CollectDatetime    = inData.CollectDatetime;
                                deviceFileModel.UpdateDatetime     = now;

                                entity = deviceFileModel;

                                // コンテナ名とファイルパスをキーにしてレコードが見つかった場合は、
                                // 端末ファイルデータおよび紐づく端末ファイル属性レコードの更新を行う
                                // 端末ファイル属性については、以下の処理を行う
                                // ・同じNameを持つレコードが存在しない場合はレコード追加
                                // ・同じNameを持つレコードが存在する場合はレコードを更新
                                // ・既に存在するレコードのNameが追加するレコードの中に存在しない場合は、当該レコードを削除

                                // 端末ファイル属性
                                var inDeviceFileAttributeModel     = inData.DtDeviceFileAttribute;
                                var actualDeviceFileAttributeModel = db.DtDeviceFileAttribute.Where(x => x.DeviceFileSid == deviceFileModel.Sid);

                                // 端末ファイル属性テーブルに存在するが、追加するレコードの中に存在しないものは削除する
                                foreach (var attr in actualDeviceFileAttributeModel)
                                {
                                    var inAttrData = inDeviceFileAttributeModel.FirstOrDefault(x => x.Name.Equals(attr.Name, StringComparison.OrdinalIgnoreCase));
                                    if (inAttrData == null)
                                    {
                                        db.DtDeviceFileAttribute.Remove(attr);
                                    }
                                }

                                // 端末ファイル属性テーブルに存在しないものは追加、存在するものは更新
                                foreach (var attr in inDeviceFileAttributeModel)
                                {
                                    var found = actualDeviceFileAttributeModel.FirstOrDefault(x => x.Name.Equals(attr.Name, StringComparison.OrdinalIgnoreCase));
                                    DBAccessor.Models.DtDeviceFileAttribute deviceFileAttributeEntity;

                                    if (found == null || found.Sid == 0)
                                    {
                                        attr.DeviceFileSid        = deviceFileModel.Sid;
                                        attr.CreateDatetime       = now;
                                        attr.UpdateDatetime       = now;
                                        deviceFileAttributeEntity = new DBAccessor.Models.DtDeviceFileAttribute(attr);

                                        // レコード追加
                                        _ = db.DtDeviceFileAttribute.Add(deviceFileAttributeEntity).Entity;
                                    }
                                    else
                                    {
                                        // レコード更新
                                        found.Value          = attr.Value;
                                        found.UpdateDatetime = now;
                                    }
                                }
                            }

                            db.SaveChanges();
                            model = entity.ToModel();

                            // トランザクション終了
                            tran.Commit();
                        }
                });

                return(model);
            }
            catch (ValidationException e)
            {
                throw new RmsParameterException(e.ValidationResult.ErrorMessage, e);
            }
            catch (Exception e)
            {
                throw new RmsException("DT_DEVICE_FILEテーブルへのInsertに失敗しました。", e);
            }
            finally
            {
                _logger.LeaveJson("{0}", model);
            }
        }
Example #7
0
            /// <summary>
            /// 端末ファイルデータをテーブルに登録する
            /// </summary>
            /// <param name="inData">登録するデータ</param>
            /// <returns>処理結果</returns>

            public DtDeviceFile CreateOrUpdateDtDeviceFile(DtDeviceFile inData)
            {
                return(_repo.CreateOrUpdateDtDeviceFile(inData));
            }