Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 29-08-2003
jsanchez jsanchez is offline
Miembro
 
Registrado: may 2003
Posts: 90
Poder: 21
jsanchez Va por buen camino
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
Responder Con Cita
  #2  
Antiguo 29-08-2003
Avatar de guillotmarc
guillotmarc guillotmarc is offline
Miembro
 
Registrado: may 2003
Ubicación: Huelva
Posts: 2.638
Poder: 23
guillotmarc Va por buen camino
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.
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no).
Responder Con Cita
  #3  
Antiguo 29-08-2003
Avatar de Onti
Onti Onti is offline
Miembro
 
Registrado: jul 2003
Ubicación: La Paz - Bolivia
Posts: 500
Poder: 21
Onti Va por buen camino
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
Responder Con Cita
  #4  
Antiguo 29-08-2003
Avatar de guillotmarc
guillotmarc guillotmarc is offline
Miembro
 
Registrado: may 2003
Ubicación: Huelva
Posts: 2.638
Poder: 23
guillotmarc Va por buen camino
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.
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no).

Última edición por guillotmarc fecha: 10-09-2003 a las 22:18:23.
Responder Con Cita
  #5  
Antiguo 10-09-2003
buitrago buitrago is offline
Miembro
 
Registrado: sep 2003
Posts: 156
Poder: 21
buitrago Va por buen camino
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
Responder Con Cita
  #6  
Antiguo 26-03-2013
sowei sowei is offline
Miembro
 
Registrado: abr 2010
Posts: 21
Poder: 0
sowei Va por buen camino
Gracias !

Muy útil !
Responder Con Cita
  #7  
Antiguo 27-03-2013
Avatar de cesarsoftware
cesarsoftware cesarsoftware is offline
Miembro
 
Registrado: nov 2006
Posts: 241
Poder: 18
cesarsoftware Va por buen camino
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
__________________
Disfruta de la vida ahora, vas a estar muerto mucho tiempo.

Última edición por cesarsoftware fecha: 27-03-2013 a las 22:04:52.
Responder Con Cita
  #8  
Antiguo 28-03-2013
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 29
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Cita:
Empezado por cesarsoftware Ver Mensaje
[...] 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.

Última edición por Al González fecha: 28-03-2013 a las 01:06:29.
Responder Con Cita
  #9  
Antiguo 28-03-2013
Avatar de cesarsoftware
cesarsoftware cesarsoftware is offline
Miembro
 
Registrado: nov 2006
Posts: 241
Poder: 18
cesarsoftware Va por buen camino
Hola Al, es cierto si se usa openkeyreadonly da menos problemas en caso de que el registro este bloqueado al usuario.

Saludos.
__________________
Disfruta de la vida ahora, vas a estar muerto mucho tiempo.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 21:14:57.


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
Copyright 1996-2007 Club Delphi