Esempio n. 1
0
        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);
                }
            }
        }
Esempio n. 2
0
        /// <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);
        }
Esempio n. 3
0
        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;
                }
            }
        }
Esempio n. 4
0
        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;
                }
            }
        }
Esempio n. 6
0
        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
     });
 }