Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   BackUp Restore Automático (https://www.clubdelphi.com/foros/showthread.php?t=3250)

jsanchez 29-08-2003 04:15:47

BackUp Restore Automático
 
Hola foro,

Mi consulta es la siguiente.

Se puede hacer una especie de utilitario para hacer un back up y Restore sobre una base de datos Interbase, desde Delphi?

Es decir, Cuáles son las ordenes en Delphi para hacer un back up y Restore desde una aplicación?


Muchas gracias

guillotmarc 29-08-2003 17:14:54

Hola.

Existen unos componentes IBX en la pestaña Interbase Admin para eso. Són el IBBackupService y IBRestoreService.

Aunque personalmente llamo al gbak desde la aplicación Delphi, pasandole los parámetros adecuados para que haga el Backup y el Restore, mediante un ShellExecute.

Saludos.

Onti 29-08-2003 18:00:48

Hola Guillomart:

Me sumo a la inquietud de jsanchez y me parece muy interesante la opcion de "llamar a gbak desde la aplicación Delphi, pasandole los parámetros adecuados para que haga el Backup y el Restore, mediante un ShellExecute."

Por favor podrias explicarnos un poco mas de este punto.

Muchas gracias

guillotmarc 29-08-2003 19:18:29

Hola.

Os envío el código que utilizo.

Código:

var RutaGbak, Params: String;
begin
  RutaGbak := ExtractFilePath(Application.ExeName) + 'Firebird\bin\gBak.exe';
  Params := AnsiQuotedStr(ExtractFilePath(Application.ExeName) + 'BBDD\Datos.gdb', '"');
  Params := Params + ' ' + AnsiQuotedStr(txtArchivo.Text, '"');
  Params := Params + ' -V -USER SYSDBA -PAS masterkey';
  FileExecuteWait(RutaGbak, Params, ExtractFilePath(Application.ExeName), esNormal);
  if not FileExists(txtArchivo.Text) then begin
    ShowMessage('No se ha podido realizar la Copia de Seguridad');
  end;
end;

TxtArchivo es un TextBox donde dejo que el Usuario introduzca la ubicación y nombre del archivo de copia de seguridad. El programa Gbak lo tengo en un subdirectorio de la aplicación, así como la base de datos, en vuestro caso teneis que inicializar las variables RutaGbak y Params con las rutas correspondientes donde teneis el Gbak y la base de datos.

Finalmente, en este caso utilizo la función FileExecuteWait que viene con las RxLib, porqué me es más cómoda que la función ShellExecute. Aunque si no teneis instaladas las RxLib, podeis utilizar perfectamente la función ShellExecute.

NOTA : El Restore es muy similar, solo hay que añadir un -R en los parámetros, y especificar primero el archivo de copia de seguridad y después el de base de datos.

Espero que esta muestra os sea de utilidad.

Saludos.

buitrago 10-09-2003 18:50:59

Es increhible, cuando veo los forums, me doy cuanta que este mundo no ta to perdió....

Gracias por el código, ha sido muy util.

Saludos
Fernando Buitrago

sowei 26-03-2013 18:39:57

Gracias !

Muy útil !

cesarsoftware 27-03-2013 21:01:01

Buenas, siguiendo a guillotmarc, añadir la que uso yo con la diferencia que no hace falta copiar el gbak sino que lo busca donde este instalado y ya de paso hace una restauracion porque gbak deja una copia comprimida. De paso os mando una funcion para ejecutar programas externos con un poco mas de control sobre la ejecucion.

Código Delphi [-]
function SacaRutaFireBird(): string;
var
  Reg: TRegistry;
  Resultado: string;
begin
  Resultado := '';
  Reg := Tregistry.Create;
  try
    Reg.RootKey := HKEY_LOCAL_MACHINE;
     if Reg.OpenKey(
       '\SOFTWARE\Firebird Project\Firebird Server\Instances', True) then
     begin
       Resultado := Reg.Readstring('DefaultInstance');
       Reg.CloseKey;
     end;
  finally
    Reg.Free;
  end;
  Result := Resultado;
end;

function Ejecuta(espera: boolean; directorio, programa, parametros: string): cardinal;
var
  Info: TShellExecuteInfo;
  pInfo: PShellExecuteInfo;
  WaitCode: DWord;
  Handle: THandle;
  msg: ansistring;
begin
  Handle := 0;
  {Puntero a Info}
  pInfo := @Info;
  {Rellenamos Info}
  with Info do
  begin
    cbSize := SizeOf(Info);
    fMask := SEE_MASK_NOCLOSEPROCESS;// + SEE_MASK_IDLIST +
    wnd := Handle;
    lpVerb := 'open';
    lpFile := PChar(programa);
    {Parametros al ejecutable}
    lpParameters := PChar(parametros);
    lpDirectory := PChar(directorio);
    nShow := SW_ShowNormal;
    hInstApp := 0;
    lpIDList := nil;
  end;
  {Ejecutamos}
  if ShellExecuteEx(pInfo) = True then
  begin
    Result := pInfo.hProcess;
    {Esperamos que termine}
    if espera = False then
      Exit;
    repeat
      WaitCode := WaitForSingleObject(Info.hProcess, 500);
      Application.ProcessMessages;
    until (WaitCode <> WAIT_TIMEOUT);
  end
  else
  begin
    case pInfo.hInstApp of
      ERROR_FILE_NOT_FOUND: msg := 'The specified file was not found.';
      ERROR_PATH_NOT_FOUND: msg := 'The specified path was not found.';
      ERROR_DDE_FAIL: msg := 'The Dynamic Data Exchange (DDE) transaction failed.';
      ERROR_NO_ASSOCIATION: msg := 'There is no application associated with the given file name extension.';
      ERROR_ACCESS_DENIED: msg := 'Access to the specified file is denied.';
      ERROR_DLL_NOT_FOUND: msg := 'One of the library files necessary to run the application can"t be found.';
      ERROR_CANCELLED: msg := 'The function prompted the user for additional information, but the user canceled the request.';
      ERROR_NOT_ENOUGH_MEMORY: msg := 'There is not enough memory to perform the specified action.';
      ERROR_SHARING_VIOLATION: msg := 'A sharing violation occurred.';
    end;
    Result := 0;
  end;
end;

procedure TFormCopiarConfig.CopiaBBDD();
var
  rutaFireBird, user, dirBBDD, copiaBBDD, restauraBBDD, cadena, fn, hn: string;
  programa, parametros: string;
begin
  rutaFireBird := SacaRutaFireBird();
  if rutaFireBird = '' then
  begin
    Application.MessageBox('No se ha localizado al motor FireBird',
                           'Atención', MB_ICONWARNING);
    Exit;
  end;
  LabelFile.Caption := 'Copiando Base de Datos, espera a que terminar.';
  LabelFile.Refresh;
  rutaFireBird := rutaFireBird + 'bin\';
  programa := 'gbak.exe';
  dirBBDD := ' "' + BBDDservidorBase + ':' + BBDDdataBase + '"';
  cadena := FechaNacional;
  fn := Copy(cadena, 7, 4) + Copy(cadena, 4, 2) + Copy(cadena, 1, 2);
  cadena := HoraNacional;
  hn := Copy(cadena, 1, 2) + Copy(cadena, 4, 2) + Copy(cadena, 7, 2);
  copiaBBDD := ' "' + EditDestino.Text + fn + '_' + hn + '_' + 'CSerp.fdb' + '"';
  user := ' -v -user SYSDBA -pas masterkey';
  parametros := ' -b ' + dirBBDD + copiaBBDD + user;
  Ejecuta(True, rutaFireBird, programa, parametros);
  LabelFile.Caption := 'Restaurando copia ...';
  LabelFile.Refresh;
  restauraBBDD := ' "' + EditDestino.Text + fn + '_' + hn + '_' + 'CSerp.fdb' + '"';
  parametros := ' -c ' + copiaBBDD + restauraBBDD + user;
  Ejecuta(True, rutaFireBird, programa, parametros);
  LabelFile.Caption := 'Copia terminada.';
  LabelFile.Refresh;
end;

De nada:)

Al González 28-03-2013 00:02:38

Cita:

Empezado por cesarsoftware (Mensaje 457686)
[...] os mando una funcion [...]
Código Delphi [-]
function SacaRutaFireBird(): string;
var
  Reg: TRegistry;
  Resultado: string;
begin
  Resultado := '';
  Reg := Tregistry.Create;
  try
    Reg.RootKey := HKEY_LOCAL_MACHINE;
     if Reg.OpenKey(
       '\SOFTWARE\Firebird Project\Firebird Server\Instances', True) then
     begin
       Resultado := Reg.Readstring('DefaultInstance');
       Reg.CloseKey;
     end;
  finally
    Reg.Free;
  end;
  Result := Resultado;
end;

[...]
De nada:)

Hola César.

Sin menoscabo de las útiles rutinas que nos regalas, viendo la primera de ellas me permito hacer una versión un poco mejorada:
Código Delphi [-]
Function FirebirdDir :String;
Begin
  With TRegistry.Create Do
    Try
      RootKey := HKey_Local_Machine;

      If OpenKeyReadOnly (
      '\Software\Firebird Project\Firebird Server\Instances') Then
        Result := ReadString ('DefaultInstance')
      Else
        Result := '';
    Finally
      Free;
    End;
End;
Saludos. :)

P.D. Aprovecho para saludar a Marc y Raúl (segundo y tercer mensaje), donde quiera que se encuentren después de tantos años de intenso Delphi. :)

cesarsoftware 28-03-2013 12:00:29

Hola Al, es cierto si se usa openkeyreadonly da menos problemas en caso de que el registro este bloqueado al usuario.

Saludos.


La franja horaria es GMT +2. Ahora son las 15:14:18.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi