public DtDeviceFile CreateOrUpdateDtDeviceFile(DtDeviceFile inData) { if (_isThrowEx_CreateDtDeviceFile) { throw new RmsException("Error!"); } if (_iFailed_CreateDtDeviceFile) { return(null); } files.Add(inData); return(inData); }
/// <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); }
/// <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); } } }
/// <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); } }
/// <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); } }
/// <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); } }
/// <summary> /// 端末ファイルデータをテーブルに登録する /// </summary> /// <param name="inData">登録するデータ</param> /// <returns>処理結果</returns> public DtDeviceFile CreateOrUpdateDtDeviceFile(DtDeviceFile inData) { return(_repo.CreateOrUpdateDtDeviceFile(inData)); }