using System; using System.Data; using Microsoft.Data.SqlClient; namespace DALL { public class DALLBackupService { private readonly string _connectionString; public DALLBackupService(string connectionString) { _connectionString = connectionString; } // ============================================= // Backup FULL // ============================================= public BackupResult ExecutarBackupFull() { return ExecutarProcedure("sp_BackupFull", "FULL"); } // ============================================= // Backup DIFERENCIAL // ============================================= public BackupResult ExecutarBackupDiferencial() { return ExecutarProcedure("sp_BackupDiferencial", "DIFERENCIAL"); } // ============================================= // Limpeza de backups antigos // ============================================= public BackupResult ExecutarLimpeza() { return ExecutarProcedure("sp_LimpezaBackups", "LIMPEZA"); } // ============================================= // Restauração — FULL ou DIFERENCIAL // ============================================= public BackupResult RestaurarBackup(string caminhoArquivo, TipoRestauracao tipo) { var resultado = new BackupResult { Tipo = "RESTAURACAO", Inicio = DateTime.Now }; try { using var connection = new SqlConnection(_connectionString); connection.Open(); using var command = new SqlCommand("master.dbo.sp_RestaurarBackup", connection) { CommandType = CommandType.StoredProcedure, CommandTimeout = 3600 }; command.Parameters.AddWithValue("@Arquivo", caminhoArquivo); command.Parameters.AddWithValue("@Tipo", tipo == TipoRestauracao.Full ? "F" : "D"); connection.InfoMessage += (s, e) => resultado.Mensagens += e.Message + Environment.NewLine; command.ExecuteNonQuery(); resultado.Sucesso = true; resultado.Fim = DateTime.Now; } catch (Exception ex) { resultado.Sucesso = false; resultado.Erro = ex.Message; resultado.Fim = DateTime.Now; } return resultado; } // ============================================= // Lista backups disponíveis no histórico // ============================================= public DataTable ListarHistoricoBackups() { var tabela = new DataTable(); try { using var connection = new SqlConnection(_connectionString); connection.Open(); var query = @" SELECT CASE bs.type WHEN 'D' THEN 'FULL' WHEN 'I' THEN 'DIFERENCIAL' END AS Tipo, bmf.physical_device_name AS Arquivo, bs.backup_start_date AS Inicio, bs.backup_finish_date AS Fim, CAST(bs.backup_size / 1024.0 / 1024.0 AS DECIMAL(10,2)) AS TamanhoMB FROM msdb.dbo.backupset bs JOIN msdb.dbo.backupmediafamily bmf ON bs.media_set_id = bmf.media_set_id WHERE bs.database_name = 'Levelcode-LevelOS' ORDER BY bs.backup_finish_date DESC"; using var adapter = new SqlDataAdapter(query, connection); adapter.Fill(tabela); } catch (Exception ex) { Console.WriteLine($"Erro ao listar histórico: {ex.Message}"); } return tabela; } // ============================================= // Método interno reutilizável // ============================================= private BackupResult ExecutarProcedure(string procedure, string tipo) { var resultado = new BackupResult { Tipo = tipo, Inicio = DateTime.Now }; try { using var connection = new SqlConnection(_connectionString); connection.Open(); using var command = new SqlCommand($"[Levelcode-LevelOS].dbo.{procedure}", connection) { CommandType = CommandType.StoredProcedure, CommandTimeout = 3600 }; connection.InfoMessage += (s, e) => resultado.Mensagens += e.Message + Environment.NewLine; command.ExecuteNonQuery(); resultado.Sucesso = true; resultado.Fim = DateTime.Now; } catch (Exception ex) { resultado.Sucesso = false; resultado.Erro = ex.Message; resultado.Fim = DateTime.Now; } return resultado; } } // ============================================= // Modelos // ============================================= public class BackupResult { public string Tipo { get; set; } = string.Empty; public bool Sucesso { get; set; } public DateTime Inicio { get; set; } public DateTime Fim { get; set; } public string? Erro { get; set; } public string Mensagens { get; set; } = string.Empty; public TimeSpan Duracao => Fim - Inicio; } public enum TipoRestauracao { Full, Diferencial } }