using System; using System.Collections.Generic; using Npgsql; using PI_Assync_PLD.Models; using Windows.Devices.Sensors; public class PostgresRepository : IDataRepository { private readonly string _connectionString; public PostgresRepository(string environment) { _connectionString = environment == "dev" ? "Server=smart-energia-dev-pgsql.cykff7tj7mik.us-east-1.rds.amazonaws.com; Port=5432; Database=smartimptest; User Id=postgres; Password=VfHml#Z78!%kvvNM;" : "Server=smart-energia-dev-pgsql.cykff7tj7mik.us-east-1.rds.amazonaws.com; Port=5432; Database=smartenergiaprod; User Id=postgres; Password=VfHml#Z78!%kvvNM;"; } public DateTime ObterDataInicial() { using var conn = new NpgsqlConnection(_connectionString); conn.Open(); string query = "SELECT TO_DATE('1899-12-30', 'YYYY-MM-DD') + INTERVAL '1' DAY * MAX(dia_num) AS ultimo_dia FROM pld"; using var cmd = new NpgsqlCommand(query, conn); using var reader = cmd.ExecuteReader(); return reader.Read() && DateTime.TryParse(reader["ultimo_dia"]?.ToString(), out var data) ? data.AddDays(1) : DateTime.Now.AddYears(-2); } public void SalvarPLDs(List plds, DateTime ultimaData) { using var conn = new NpgsqlConnection(_connectionString); conn.Open(); // Filtrar apenas os PLDs mais recentes var novosPLDs = plds.FindAll(pld => pld.Dia >= ultimaData); if (novosPLDs.Count == 0) return; // Nenhum dado novo, então sair da função using var transaction = conn.BeginTransaction(); var sb = new System.Text.StringBuilder(); sb.Append("INSERT INTO pld (dia_num, hora, submercado, valor, mes_ref, dia_da_semana) VALUES "); var parametros = new List(); int count = 0; foreach (var pld in novosPLDs) { sb.Append($"(@Dia{count}, @Hora{count}, @Submercado{count}, @Valor{count}, @MesRef{count}, @DiaSemana{count}),"); parametros.Add(new NpgsqlParameter($"@Dia{count}", NpgsqlTypes.NpgsqlDbType.Integer) { Value = pld.Dia.ToOADate() }); parametros.Add(new NpgsqlParameter($"@Hora{count}", NpgsqlTypes.NpgsqlDbType.Integer) { Value = pld.Hora }); parametros.Add(new NpgsqlParameter($"@Submercado{count}", NpgsqlTypes.NpgsqlDbType.Text) { Value = pld.Submercado }); parametros.Add(new NpgsqlParameter($"@Valor{count}", NpgsqlTypes.NpgsqlDbType.Double) { Value = pld.Valor }); parametros.Add(new NpgsqlParameter($"@MesRef{count}", NpgsqlTypes.NpgsqlDbType.Text) { Value = pld.Mes }); parametros.Add(new NpgsqlParameter($"@DiaSemana{count}", NpgsqlTypes.NpgsqlDbType.Integer) { Value = pld.DiaSemana }); count++; } // Removemos a última vírgula da query sb.Length--; using var cmd = new NpgsqlCommand(sb.ToString(), conn, transaction); cmd.Parameters.AddRange(parametros.ToArray()); cmd.ExecuteNonQuery(); transaction.Commit(); } }