LevelOS-Core/DAL/DALLBackupService.cs

174 lines
5.9 KiB
C#

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
}
}