From b29ae2e3d38b4300cf01b08ff9d09d8512f65e7b Mon Sep 17 00:00:00 2001 From: Adriano Serighelli Date: Tue, 7 Jan 2025 17:35:00 -0300 Subject: [PATCH] =?UTF-8?q?altera=C3=A7=C3=A3o=20da=20fun=C3=A7=C3=A3o=20d?= =?UTF-8?q?e=20upload=20e=20insert=20do=20location=20status.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Webhook 4docs/Program.cs | 204 ++++++++++++++++++++++++++------------- 1 file changed, 137 insertions(+), 67 deletions(-) diff --git a/Webhook 4docs/Program.cs b/Webhook 4docs/Program.cs index 6c1133c..b6e5d8d 100644 --- a/Webhook 4docs/Program.cs +++ b/Webhook 4docs/Program.cs @@ -235,73 +235,41 @@ namespace Webhook_4docs break; } - int test = await UpdateErrorIdStatusAsync(CaminhoDB, JsonBody.GetProperty("locationID").GetInt64(), errorID, JsonBody.GetProperty("systemText").ToString()); + int test = await UpdateErrorIdStatusAsync(CaminhoDB, JsonBody.GetProperty("locationID").GetInt64(), errorID, JsonBody.GetProperty("systemText").ToString(), logger); if (test == 0) { - InsertErrorIdStatus(CaminhoDB, errorID, requestBody); + await InsertErrorIdStatusAsync(CaminhoDB, errorID, requestBody, logger); } } }); }); app.Run(); } - public static async void InsertErrorIdStatus(string CaminhoDB, double errorID, string requestBody) + public static async Task InsertErrorIdStatusAsync(string CaminhoDB, double errorID, string requestBody, ILogger logger) { var JsonBody = JsonDocument.Parse(requestBody).RootElement; - double locationID = JsonBody.GetProperty("locationID").GetInt64() ; - string accountID = JsonBody.GetProperty("accountID").ToString() ; - string deliveryTimeStamp = JsonBody.GetProperty("deliveryTimestamp").ToString() ; - string provider = JsonBody.GetProperty("provider").ToString() ; - string accessPoint = JsonBody.GetProperty("accessPoint").ToString() ; - string slaStatus = JsonBody.GetProperty("slaStatus").ToString() ; - string healthy = JsonBody.GetProperty("healthy").ToString() ; - string blame = JsonBody.GetProperty("blame").ToString() ; - string lastSuccess = JsonBody.GetProperty("lastSuccess").ToString() ; - string active = JsonBody.GetProperty("active").ToString() ; - string blacklistStatus = JsonBody.GetProperty("blacklistStatus").ToString() ; - string lastActivated = JsonBody.GetProperty("lastActivated").ToString() ; - string lastDeactivated = JsonBody.GetProperty("lastDeactivated").ToString() ; - string lastDeactivatedBy = JsonBody.GetProperty("lastDeactivatedBy").ToString() ; + // Extração dos valores do JSON + double locationID = JsonBody.GetProperty("locationID").GetInt64(); + string accountID = JsonBody.GetProperty("accountID").ToString(); + string deliveryTimeStamp = JsonBody.GetProperty("deliveryTimestamp").ToString(); + string provider = JsonBody.GetProperty("provider").ToString(); + string accessPoint = JsonBody.GetProperty("accessPoint").ToString(); + string slaStatus = JsonBody.GetProperty("slaStatus").ToString(); + string healthy = JsonBody.GetProperty("healthy").ToString(); + string blame = JsonBody.GetProperty("blame").ToString(); + string lastSuccess = JsonBody.GetProperty("lastSuccess").ToString(); + string active = JsonBody.GetProperty("active").ToString(); + string blacklistStatus = JsonBody.GetProperty("blacklistStatus").ToString(); + string lastActivated = JsonBody.GetProperty("lastActivated").ToString(); + string lastDeactivated = JsonBody.GetProperty("lastDeactivated").ToString(); + string lastDeactivatedBy = JsonBody.GetProperty("lastDeactivatedBy").ToString(); - int test = 0; + int maxRetries = 3; + int attempt = 0; - bool completed = false; - - while (!completed) - { - var connLease = await connRateLimiter.AcquireAsync(); - - if (connLease.IsAcquired) - { - using (OleDbConnection conn = new(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + CaminhoDB + ";Jet OLEDB:Database Password=gds21")) - { - if (conn != null) - { - if (conn.State == System.Data.ConnectionState.Closed) - { - await conn.OpenAsync(); - } - } - - using OleDbCommand cmd = new($"INSERT INTO AgVirtual4DocsErros (locationID, accountID, errorID, deliveryTimeStamp, provider, accessPoint, slaStatus, healthy, blame, lastSuccess, active, blacklistStatus, lastActivated, lastDeactivated, lastDeactivatedBy) VALUES ({locationID}, {accountID}, {errorID}, \'{deliveryTimeStamp}\', \'{provider}\', \'{accessPoint}\', \'{slaStatus}\', \'{healthy}\', \'{blame}\', \'{lastSuccess}\', \'{active}\', \'{blacklistStatus}\', \'{lastActivated}\', \'{lastDeactivated}\', \'{lastDeactivatedBy}\')", conn); - //cmd.Parameters.AddWithValue("@location_id", location_id); - //cmd.Parameters.AddWithValue("@errorID", errorID); - test = await cmd.ExecuteNonQueryAsync(); - } - completed = true; - connLease.Dispose(); - } - } - } - public static async Task UpdateErrorIdStatusAsync(string CaminhoDB, double location_id, double errorID, string systemText) - { - int test = 0; - - bool completed = false; - - while (!completed) + while (attempt < maxRetries) { var connLease = await connRateLimiter.AcquireAsync(); @@ -309,30 +277,132 @@ namespace Webhook_4docs { try { - using (OleDbConnection conn = new(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + CaminhoDB + ";Jet OLEDB:Database Password=gds21")) + using (OleDbConnection conn = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + CaminhoDB + ";Jet OLEDB:Database Password=gds21")) { - if (conn != null) + await conn.OpenAsync(); + + using (OleDbCommand cmd = new OleDbCommand( + @"INSERT INTO AgVirtual4DocsErros ( + locationID, accountID, errorID, deliveryTimeStamp, provider, accessPoint, slaStatus, + healthy, blame, lastSuccess, active, blacklistStatus, lastActivated, lastDeactivated, lastDeactivatedBy + ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", conn)) { - if (conn.State == System.Data.ConnectionState.Closed) - { - await conn.OpenAsync(); - } - - using (OleDbCommand cmd = new($"UPDATE AgVirtual4Docs SET AgVirtual4Docs.errorID = {errorID}, AgVirtual4Docs.status = \"{systemText}\"\r\nWHERE (((AgVirtual4Docs.location_id)={location_id}));\r\n", conn)) - { - //cmd.Parameters.AddWithValue("@errorID", errorID); - //cmd.Parameters.AddWithValue("@location_id", location_id); - test = await cmd.ExecuteNonQueryAsync(); - } + // Adiciona parâmetros de forma segura + cmd.Parameters.AddWithValue("@locationID", locationID); + cmd.Parameters.AddWithValue("@accountID", accountID); + cmd.Parameters.AddWithValue("@errorID", errorID); + cmd.Parameters.AddWithValue("@deliveryTimeStamp", deliveryTimeStamp); + cmd.Parameters.AddWithValue("@provider", provider); + cmd.Parameters.AddWithValue("@accessPoint", accessPoint); + cmd.Parameters.AddWithValue("@slaStatus", slaStatus); + cmd.Parameters.AddWithValue("@healthy", healthy); + cmd.Parameters.AddWithValue("@blame", blame); + cmd.Parameters.AddWithValue("@lastSuccess", lastSuccess); + cmd.Parameters.AddWithValue("@active", active); + cmd.Parameters.AddWithValue("@blacklistStatus", blacklistStatus); + cmd.Parameters.AddWithValue("@lastActivated", lastActivated); + cmd.Parameters.AddWithValue("@lastDeactivated", lastDeactivated); + cmd.Parameters.AddWithValue("@lastDeactivatedBy", lastDeactivatedBy); + // Executa o comando + await cmd.ExecuteNonQueryAsync(); } } + + break; // Sai do loop em caso de sucesso + } + catch (OleDbException ex) + { + // Registra o erro + logger.LogInformation($"Erro no OleDb insert: {ex.Message} (Tentativa {attempt + 1} de {maxRetries})"); + + if (attempt < maxRetries - 1) + { + // Aguarda antes de tentar novamente + await Task.Delay(1000 * (int)Math.Pow(2, attempt)); // Retry com Backoff Exponencial + } + else + { + // Propaga a exceção na última tentativa + throw; + } } finally { - completed = true; connLease.Dispose(); } + + attempt++; // Incrementa a tentativa após adquirir o lease, mesmo que falhe + } + else + { + // Aguarda um curto período antes de tentar novamente se não conseguiu adquirir o lease + await Task.Delay(200); + } + } + } + public static async Task UpdateErrorIdStatusAsync(string CaminhoDB, double location_id, double errorID, string systemText, ILogger logger) + { + int test = 0; + int maxRetries = 3; + int attempt = 0; + + while (attempt < maxRetries) + { + var connLease = await connRateLimiter.AcquireAsync(); + + if (connLease.IsAcquired) + { + try + { + using (OleDbConnection conn = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + CaminhoDB + ";Jet OLEDB:Database Password=gds21")) + { + await conn.OpenAsync(); + + using (OleDbCommand cmd = new OleDbCommand( + @"UPDATE AgVirtual4Docs + SET errorID = ?, status = ? + WHERE location_id = ?", conn)) + { + // Adiciona parâmetros de forma segura + cmd.Parameters.AddWithValue("@errorID", errorID); + cmd.Parameters.AddWithValue("@status", systemText); + cmd.Parameters.AddWithValue("@location_id", location_id); + + // Executa o comando e captura o resultado + test = await cmd.ExecuteNonQueryAsync(); + } + } + + break; // Sai do loop em caso de sucesso + } + catch (OleDbException ex) + { + // Registra o erro + logger.LogInformation($"Erro no OleDb update: {ex.Message} (Tentativa {attempt + 1} de {maxRetries})"); + + if (attempt < maxRetries - 1) + { + // Aguarda antes de tentar novamente + await Task.Delay(1000 * (int)Math.Pow(2, attempt)); // Retry com Backoff Exponencial + } + else + { + // Propaga a exceção na última tentativa + throw; + } + } + finally + { + connLease.Dispose(); + } + + attempt++; // Incrementa a tentativa após adquirir o lease, mesmo que falhe + } + else + { + // Aguarda um curto período antes de tentar novamente se não conseguiu adquirir o lease + await Task.Delay(200); } }