174 lines
5.9 KiB
C#
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
|
|
}
|
|
} |