public async Task <int> CreateOrUpdateAuftrag(PrimaerdatenAuftrag auftrag) { using (var connection = new SqlConnection(connectionString)) { await connection.OpenAsync(); if (auftrag.PrimaerdatenAuftragId > 0) { await UpdateAuftrag(auftrag, connection); return(auftrag.PrimaerdatenAuftragId); } using (var tx = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled)) { var auftragId = await CreateAuftrag(auftrag, connection); await InsertAuftragLog(new PrimaerdatenAuftragLog { PrimaerdatenAuftragId = auftragId, Service = auftrag.Service, Status = AufbereitungsStatusEnum.Registriert }, connection); tx.Complete(); return(auftragId); } } }
/// <summary> /// Registers a preparation job in the queue. /// </summary> /// <param name="archiveRecordId">The archive record identifier.</param> public async Task <int> RegisterJobInPreparationQueue(string archiveRecordId, string packageId, AufbereitungsArtEnum aufbereitungsArt, AufbereitungsServices service, List <ElasticArchiveRecordPackage> primaryData, object workload) { var preperationTime = preparationCalculator.EstimatePreparationDuration(primaryData, aufbereitungsZeitSettings.KonvertierungsgeschwindigkeitAudio, aufbereitungsZeitSettings.KonvertierungsgeschwindigkeitVideo).TotalSeconds; var auftrag = new PrimaerdatenAuftrag { VeId = int.Parse(archiveRecordId), AufbereitungsArt = aufbereitungsArt, PackageId = packageId, Service = service, Status = AufbereitungsStatusEnum.Registriert, GroesseInBytes = primaryData.Sum(p => p.SizeInBytes), GeschaetzteAufbereitungszeit = Convert.ToInt32(preperationTime), Workload = JsonConvert.SerializeObject(workload), PackageMetadata = JsonConvert.SerializeObject(primaryData), PriorisierungsKategorie = GetPriorisierungskategorie(aufbereitungsArt, primaryData.Sum(p => p.SizeInBytes), workload) }; var auftragId = await auftragAccess.CreateOrUpdateAuftrag(auftrag); Log.Information("{METHOD} for VE {VEID} with {STATUS}. AuftragId is {auftragId}", nameof(RegisterJobInPreparationQueue), archiveRecordId, auftragId > 0 ? "SUCCEEDED" : "FAILED", auftragId); return(auftragId); }
private async Task <int> UpdateAuftrag(PrimaerdatenAuftrag auftrag, SqlConnection connection, bool skipMaxVarcharFields = false) { using (var cmd = connection.CreateCommand()) { cmd.CommandText = @" UPDATE PrimaerdatenAuftrag SET AufbereitungsArt = @AufbereitungsArt, GroesseInBytes = @GroesseInBytes, Verarbeitungskanal = @Verarbeitungskanal, PriorisierungsKategorie = @PriorisierungsKategorie, Status = @Status, Service = @Service, PackageId = @PackageId, {0} VeId = @VeId, Abgeschlossen = @Abgeschlossen, AbgeschlossenAm = @AbgeschlossenAm, GeschaetzteAufbereitungszeit = @GeschaetzteAufbereitungszeit, ErrorText = @ErrorText, ModifiedOn = @ModifiedOn WHERE PrimaerdatenAuftragId = @PrimaerdatenAuftragId " ; // We have noticed that the fields PackageMetadata and Workload can contain large amounts of data (70 MB and more) // in those cases updating those fields have led to timeout problems. // Not really sure if those fields are the cause, but in any case, we don't need to update those fields in any case cmd.CommandText = string.Format(cmd.CommandText, skipMaxVarcharFields ? "" : "PackageMetadata = @PackageMetadata, Workload = @Workload, "); #region parameters AppendParametersForAuftrag(auftrag, cmd, skipMaxVarcharFields); cmd.Parameters.Add(new SqlParameter { ParameterName = "ModifiedOn", Value = DateTime.Now, SqlDbType = SqlDbType.DateTime2 }); cmd.Parameters.Add(new SqlParameter { ParameterName = "PrimaerdatenAuftragId", Value = auftrag.PrimaerdatenAuftragId, SqlDbType = SqlDbType.Int }); #endregion try { var recordsAffected = await cmd.ExecuteNonQueryAsync(); return(recordsAffected); } catch (Exception ex) { Log.Error(ex, "Unexpected error when updating PrimaerdatenAuftrag with id {PrimaerdatenAuftragId} ", auftrag.PrimaerdatenAuftragId); throw; } } }
private async Task <PrimaerdatenAuftrag> GetPrimaerdatenAuftragInternal(int primaerdatenAuftragId, SqlConnection connection, bool loadLogEntries = false) { PrimaerdatenAuftrag retVal = null; using (var cmd = connection.CreateCommand()) { cmd.CommandText = "SELECT * FROM PrimaerdatenAuftrag WHERE primaerdatenAuftragId = @primaerdatenAuftragId "; cmd.Parameters.Add(new SqlParameter { ParameterName = "primaerdatenAuftragId", Value = primaerdatenAuftragId, SqlDbType = SqlDbType.Int }); using (var reader = await cmd.ExecuteReaderAsync()) { if (reader.HasRows) { await reader.ReadAsync(); retVal = PrimaerdatenAuftragFromReader(reader); } } } if (loadLogEntries && retVal != null) { using (var cmd = connection.CreateCommand()) { cmd.CommandText = "SELECT * FROM PrimaerdatenAuftragLog WHERE primaerdatenAuftragId = @primaerdatenAuftragId "; cmd.Parameters.Add(new SqlParameter { ParameterName = "primaerdatenAuftragId", Value = primaerdatenAuftragId, SqlDbType = SqlDbType.Int }); using (var reader = await cmd.ExecuteReaderAsync()) { while (reader.HasRows) { await reader.ReadAsync(); retVal.PrimaerdatenAuftragLogs.Add(PrimaerdatenAuftragLogFromReader(reader)); } } } } return(retVal); }
private async Task<int> UpdateAuftrag(PrimaerdatenAuftrag auftrag, SqlConnection connection) { using (var cmd = connection.CreateCommand()) { cmd.CommandText = @" UPDATE PrimaerdatenAuftrag SET AufbereitungsArt = @AufbereitungsArt, GroesseInBytes = @GroesseInBytes, Verarbeitungskanal = @Verarbeitungskanal, PriorisierungsKategorie = @PriorisierungsKategorie, Status = @Status, Service = @Service, PackageId = @PackageId, PackageMetadata = @PackageMetadata, VeId = @VeId, Abgeschlossen = @Abgeschlossen, AbgeschlossenAm = @AbgeschlossenAm, GeschaetzteAufbereitungszeit = @GeschaetzteAufbereitungszeit, ErrorText = @ErrorText, Workload = @Workload, ModifiedOn = @ModifiedOn WHERE PrimaerdatenAuftragId = @PrimaerdatenAuftragId "; #region parameters AppendParametersForAuftrag(auftrag, cmd); cmd.Parameters.Add(new SqlParameter { ParameterName = "ModifiedOn", Value = DateTime.Now, SqlDbType = SqlDbType.DateTime2 }); cmd.Parameters.Add(new SqlParameter { ParameterName = "PrimaerdatenAuftragId", Value = auftrag.PrimaerdatenAuftragId, SqlDbType = SqlDbType.Int }); #endregion try { var recordsAffected = await cmd.ExecuteNonQueryAsync(); return recordsAffected; } catch (Exception ex) { Log.Error(ex, "Unexpected error when updating PrimaerdatenAuftrag with id {PrimaerdatenAuftragId} ", auftrag.PrimaerdatenAuftragId); throw; } } }
private async Task <int> CreateAuftrag(PrimaerdatenAuftrag auftrag, SqlConnection connection) { using (var cmd = connection.CreateCommand()) { cmd.CommandText = @" INSERT INTO PrimaerdatenAuftrag (AufbereitungsArt, GroesseInBytes, Verarbeitungskanal, PriorisierungsKategorie, Status, Service, PackageId, PackageMetadata, VeId, Abgeschlossen, AbgeschlossenAm, GeschaetzteAufbereitungszeit, ErrorText, Workload, CreatedOn, ModifiedOn) OUTPUT INSERTED.PrimaerdatenAuftragId Values(@AufbereitungsArt, @GroesseInBytes, @Verarbeitungskanal, @PriorisierungsKategorie, @Status, @Service, @PackageId, @PackageMetadata, @VeId, @Abgeschlossen, @AbgeschlossenAm, @GeschaetzteAufbereitungszeit, @ErrorText, @Workload, @CreatedOn, @ModifiedOn) "; #region parameters AppendParametersForAuftrag(auftrag, cmd); cmd.Parameters.Add(new SqlParameter { ParameterName = "CreatedOn", Value = DateTime.Now, SqlDbType = SqlDbType.DateTime2 }); cmd.Parameters.Add(new SqlParameter { ParameterName = "ModifiedOn", Value = DBNull.Value, SqlDbType = SqlDbType.DateTime2 }); #endregion try { return(Convert.ToInt32(await cmd.ExecuteScalarAsync())); } catch (Exception ex) { Log.Error(ex, "Unexpected error when creating PrimaerdatenAuftrag for archive record with id {archiveRecordId}.", auftrag.VeId); throw; } } }
private static void AppendParametersForAuftrag(PrimaerdatenAuftrag auftrag, SqlCommand cmd) { cmd.Parameters.Add(new SqlParameter { ParameterName = "AufbereitungsArt", Value = auftrag.AufbereitungsArt.ToString().ToDbParameterValue(), SqlDbType = SqlDbType.NVarChar }); cmd.Parameters.Add(new SqlParameter { ParameterName = "GroesseInBytes", Value = auftrag.GroesseInBytes.ToDbParameterValue(), SqlDbType = SqlDbType.BigInt }); cmd.Parameters.Add(new SqlParameter { ParameterName = "Verarbeitungskanal", Value = auftrag.Verarbeitungskanal.ToDbParameterValue(), SqlDbType = SqlDbType.Int }); cmd.Parameters.Add(new SqlParameter { ParameterName = "PriorisierungsKategorie", Value = auftrag.PriorisierungsKategorie.ToDbParameterValue(), SqlDbType = SqlDbType.Int }); cmd.Parameters.Add(new SqlParameter { ParameterName = "Status", Value = auftrag.Status.ToString().ToDbParameterValue(), SqlDbType = SqlDbType.NVarChar }); cmd.Parameters.Add(new SqlParameter { ParameterName = "Service", Value = auftrag.Service.ToString().ToDbParameterValue(), SqlDbType = SqlDbType.NVarChar }); cmd.Parameters.Add(new SqlParameter { ParameterName = "PackageId", Value = auftrag.PackageId.ToDbParameterValue(), SqlDbType = SqlDbType.NVarChar }); cmd.Parameters.Add(new SqlParameter { ParameterName = "PackageMetadata", Value = auftrag.PackageMetadata.ToDbParameterValue(), SqlDbType = SqlDbType.NVarChar }); cmd.Parameters.Add(new SqlParameter { ParameterName = "VeId", Value = auftrag.VeId.ToDbParameterValue(), SqlDbType = SqlDbType.Int }); cmd.Parameters.Add(new SqlParameter { ParameterName = "Abgeschlossen", Value = auftrag.Abgeschlossen.ToDbParameterValue(), SqlDbType = SqlDbType.Bit }); cmd.Parameters.Add(new SqlParameter { ParameterName = "AbgeschlossenAm", Value = auftrag.AbgeschlossenAm.ToDbParameterValue(), SqlDbType = SqlDbType.DateTime2 }); cmd.Parameters.Add(new SqlParameter { ParameterName = "GeschaetzteAufbereitungszeit", Value = auftrag.GeschaetzteAufbereitungszeit.ToDbParameterValue(), SqlDbType = SqlDbType.Int }); cmd.Parameters.Add(new SqlParameter { ParameterName = "ErrorText", Value = auftrag.ErrorText.ToDbParameterValue(), SqlDbType = SqlDbType.NVarChar }); cmd.Parameters.Add(new SqlParameter { ParameterName = "Workload", Value = auftrag.Workload.ToDbParameterValue(), SqlDbType = SqlDbType.NVarChar }); }