unit HacerCopiaSeguridad;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, cxMemo, cxControls, cxContainer, cxEdit, cxTextEdit, cxMaskEdit,
  cxButtonEdit, StdCtrls, RdxBotones, RdxBarras, ExtCtrls, RdxPaneles,
  Configuracion, RdxShape, RdxFrame, IBServices, Entidades, cxProgressBar;

type
  TfrHacerCopiaSeguridad = class(TRdxFrame)
    Titulo: TRdxBarraSuperior;
    brInferior: TRdxBarraInferior;
    bCerrar: TRdxBoton;
    ArchivoCopiaSeguridad: TcxButtonEdit;
    Label3: TLabel;
    bBackup: TRdxBoton;
    eMensaje: TLabel;
    pnlAtencion: TRdxShape;
    Label1: TLabel;
    Label2: TLabel;
    SaveDialog1: TSaveDialog;
    IBBackupService1: TIBBackupService;
    cxProgressBar1: TcxProgressBar;
    procedure ArchivoCopiaSeguridadPropertiesButtonClick(Sender: TObject;
      AButtonIndex: Integer);
    procedure bCerrarClick(Sender: TObject);
    procedure bBackupClick(Sender: TObject);
    procedure ArchivoCopiaSeguridadExit(Sender: TObject);
  private
    procedure HacerBackup;
  protected
    function CambiarEntidad(EntidadAnterior, Entidad : TRdxEntidad): Boolean; override;    
  public
    constructor Create(AOwner : TComponent); override;
  end;

var
  frHacerCopiaSeguridad: TfrHacerCopiaSeguridad;

implementation

{$R *.dfm}

uses
  DateUtils, Math, Mensajes, StrFunc, BaseDatos;

procedure TfrHacerCopiaSeguridad.ArchivoCopiaSeguridadPropertiesButtonClick(
  Sender: TObject; AButtonIndex: Integer);
begin
  SaveDialog1.FileName := ArchivoCopiaSeguridad.Text;
  if SaveDialog1.Execute then
  begin
    ArchivoCopiaSeguridad.Text := SaveDialog1.FileName;
    bBackup.SetFocus;    
  end;
end;

procedure TfrHacerCopiaSeguridad.bCerrarClick(Sender: TObject);
begin
  CloseFrame;
end;

constructor TfrHacerCopiaSeguridad.Create(AOwner: TComponent);
var
  Cadena : String;
begin
  inherited;
  Cadena := GetCurrentDir + '\Copia-%s';
  Cadena := Format(Cadena, [FormatDateTime('yyyy-mm-dd', Date)]);
  Cadena := Cadena + '.gbk';
  ArchivoCopiaSeguridad.Text := Cadena;
end;

procedure TfrHacerCopiaSeguridad.bBackupClick(Sender: TObject);
begin
  if EsCadenaVacia(ArchivoCopiaSeguridad.Text) then
  begin
     VerMensaje('Debe indicar una ruta con un nombre de archivo para poder hacer la copia de seguridad.');
     ArchivoCopiaSeguridad.SetFocus;
     Exit;
  end;

{  if not DirectoryExists(ArchivoCopiaSeguridad.Text) then
  begin
    VerMensaje('Asegúrese de que ha escrito correctamente la ruta del archivo');
    ArchivoCopiaSeguridad.SetFocus;
    Exit;
  end;}
  HacerBackup;
end;

procedure TfrHacerCopiaSeguridad.ArchivoCopiaSeguridadExit(
  Sender: TObject);
begin
  if not EsCadenaVacia(ArchivoCopiaSeguridad.Text) then
  begin
    if Pos('.gbk', ArchivoCopiaSeguridad.Text) = 0 then
      ArchivoCopiaSeguridad.Text := ArchivoCopiaSeguridad.Text + '.gbk';

{    if ((FileExists(ArchivoCopiaSeguridad.Text)) and
        (VerMensajePreguntaFmt('%s ya existe. ¿Desea reemplazarlo?',
          [ArchivoCopiaSeguridad.Text]) <> IDOK)) then
        exit;}
  end;
end;

procedure TfrHacerCopiaSeguridad.HacerBackup;
begin
  with IBBackupService1 do
  begin
    LoginPrompt := False;
    Params.Add('user_name=sysdba');
    Params.Add('password=masterkey');
    DatabaseName := dmBaseDatos.RutaBD;
    Protocol := TCP;
    ServerName := dmBaseDatos.NombreServidor;
    BackupFile.Clear;
    BackupFile.Add(ArchivoCopiaSeguridad.Text);
    try
      Verbose := True;
      Active := True;
      ServiceStart;
      eMensaje.Visible := True;
      cxProgressBar1.Visible := True;
      cxProgressBar1.Position := 0;
      eMensaje.Caption := 'Espere, por favor...';
      eMensaje.Update;
      while not EOF do
      begin
        GetNextLine;
        cxProgressBar1.Position := cxProgressBar1.Position + 1;
      end;
      cxProgressBar1.Position := cxProgressBar1.Properties.Max;
      eMensaje.Caption := 'Copia de seguridad realizada correctamente.';
      VerMensaje('Copia de seguridad realizada correctamente.');
    finally
      Active := False;
      bCerrar.SetFocus;
    end;
  end;
end;

function TfrHacerCopiaSeguridad.CambiarEntidad(EntidadAnterior, Entidad: TRdxEntidad): Boolean;
begin
  inherited CambiarEntidad(EntidadAnterior, Entidad);
  ConfigurarFrame(Self, Self.Entidad);
end;

end.
