Um dos problemas que muitos enfrentam atualmente no uso do FireBird/InterBase é uma ferramenta de Backup que seja automatizada, possibilitando múltiplos backup’s sem a intervenção do usuário, e partindo da dificuldade de encontrar uma ferramenta que atendesse as minhas necessidades desenvolvi um sistema chamado GRMonitor, de propriedade da Grafcenter Informática LTDA, e decidi compartilhar meus conhecimentos aplicados no mesmo com a comunidade.
O Sistema que demonstrado aqui é um exemplo de como se começar a fazer um projeto de automação de Backup, sendo possível adicionar funcionalidades para torna-lo adequado a cada caso, até mesmo compactação de arquivo e cópia para outros locais. Foi usado para desenvolvimento desse exemplo o Delphi 6.0/IBX, mas poderão ser utilizadas outras versões do mesmo, desde que se adapte aos recursos disponíveis.
O Sistema de Backup está dividido em dois módulos:
O Configurador gera os parâmetros para que se defina a sistemática de Backup da base de dados, como:
O Monitor executa os Backup’s nos dias e horários programados pelo Configurador.
Sem prolongar muito vamos ao que interessa...
A primeira coisa a se fazer é abrir o Delphi, criar um novo Projeto e salvar, nesse projeto são usados:
São utilizados também outros componentes como disposto na figura:
No evento OnCreate do FPrincipal temos:
procedure TFPrincipal.FormCreate(Sender: TObject); var reg: TRegistry; i: integer; begin reg := TRegistry.Create; try reg.RootKey := HKEY_LOCAL_MACHINE; if reg.OpenKey('\Software\FireBackup', false) then begin eBase.Text := reg.ReadString('Base'); eDirBackup.Text := reg.ReadString('BackupDir'); for i := Low(Dia) to High(Dia) do begin try clbSemana.Checked[i] := reg.ReadBool(Dia[i]); except end; end; if reg.OpenKey('\Software\FireBackup\Horarios', false) then begin try for i := 0 to (clbHorarios.Items.Count - 1) do begin try clbHorarios.Checked[i] := reg.ReadBool(FormatFloat('00', i) + ':00'); except end; end; except end; end; end; finally reg.CloseKey; reg.Free; end; end;
O Evento OnCreate foi utilizado para fazer a carga dos dados já configurados no Registro do Windows, podendo ser utilizados outros métodos para gravação, como Banco de Dados, arquivos, etc.
Explicando as linhas acima:
No nosso formulário temos os botões de Ok que faz a gravação dos dados no registro, e o de Cancelar para fechar o Configurador.
No botão de Ok, inserimos o código abaixo no evento OnClick:
procedure TFPrincipal.sbOkClick(Sender: TObject); var reg: TRegistry; i: integer; begin reg := TRegistry.Create; try reg.RootKey := HKEY_LOCAL_MACHINE; if reg.OpenKey('\Software\FireBackup', true) then begin reg.WriteString('Base', eBase.Text); reg.WriteString('BackupDir', eDirBackup.Text); for i := Low(Dia) to High(Dia) do reg.WriteBool(Dia[i], clbSemana.Checked[i]); if reg.OpenKey('\Software\FireBackup\Horarios', true) then begin for i := 0 to (clbHorarios.Items.Count - 1) do begin try reg.WriteBool(FormatFloat('00', i) + ':00', clbHorarios.Checked[i]); except end; end; end; end; finally reg.CloseKey; reg.Free; end; Close; end;
Nas linhas acima é feita uma varredura pelos itens dos dias da semana e dos horários e fazendo a gravação dos mesmos no registro.
O botão Cancelar somente faz o fechamento da aplicação.
No botão sbBuscaBase(o que tem o desenho de uma lupa), são inseridas as seguintes linhas de código no evento OnClick:
procedure TFPrincipal.sbBuscaBaseClick(Sender: TObject); begin with TOpenDialog.Create(Self) do begin Filter := 'FireBird/InterBase Database(*.gdb)|*.gdb'; if Execute then eBase.Text := FileName; end; end;
O botão BuscaBase, cria uma janela para buscar a base de dados que se deseja que o Backup seja efetuado.
Procedemos da mesma forma da criação do Configurador, e usamos as definições:
Neste projeto são usados os componentes a seguir:
No Evento OnShow do FPrincipal, usamos:
procedure TFPrincipal.FormCreate(Sender: TObject); var reg: TRegistry; DiaBackup: Boolean; i: integer; begin reg := TRegistry.Create; try reg.RootKey := HKEY_LOCAL_MACHINE; if not reg.OpenKey('\Software\FireBackup', false) then begin MessageBox(Handle, PChar('Não existem configurações definidas!'), PChar('Erro'), MB_OK or MB_ICONWARNING); PostMessage(Application.Handle, WM_CLOSE, 0, 0); end else begin try DiaBackup := reg.ReadBool(Dia[DayOfWeek(date)]); except DiaBackup := false; end; if not DiaBackup or not reg.OpenKey('\Software\FireBackup\Horarios', false) then AddStatusLine('Não existe Backup agendado para hoje...', clMaroon, 12) else begin AddStatusLine(Format('FireBackup inicializado às %s horas', [FormatDateTime('hh:nn:ss', now)]), clNavy, 12); for i := low(Horarios) to high(Horarios) do begin Horarios[i].Hora := I; Horarios[i].Agendado := reg.ReadBool(FormatFloat('00', i) + ':00'); end; Timer.Enabled := true; end; end; finally reg.CloseKey; end; end;
Neste evento do Form, fazemos a verificação se existem configurações, caso hão existam é postada uma mensagem à aplicação que se feche após o processo de inicialização.
No caso da existência de configurações, é preenchido o vetor de horários agendados, o mesmo é definido da seguinte forma:
THorario = packed record Hora: TTime; Feito: Boolean; Agendado: Boolean; end; private Horarios: array[0..23] of THorario;
No componente Backup são definidas as configurações:
Options: [NoGarbageCollection];
Params
user_name=SYSDBA
password=masterkey
No evento OnTimer do Timer, temos a codificação responsável pela execução do Backup:
procedure TFPrincipal.TimerTimer(Sender: TObject); var i: integer; begin for i := low(Horarios) to High(Horarios) do begin if (Horarios[i].Agendado) and (not Horarios[i].Feito) and (Horarios[i].Hora = HourOf(now)) then begin Timer.Enabled := false; Horarios[i].Feito := DoBackup; Timer.Enabled := true; Break; end; end; end;
A cada ciclo do Timer, é verificado no vetor de horários, se há algum agendamento para àquela hora, caso haja é executado o Backup(DoBackup) e ajustado os parâmetros no vetor, para que não haja substituição do Backup Atual.
A função DoBackup, disparada no evento OnTimer do Timer, é responsável pelo acionamento do serviço de backup do FireBird/InterBase:
function TFPrincipal.DoBackup: Boolean; var reg: TRegistry; begin Result := true; reg := TRegistry.Create; try reg.RootKey := HKEY_LOCAL_MACHINE; if reg.OpenKey('\Software\FireBackup', false) then begin try ForceDirectories(reg.ReadString('BackupDir')); Backup.DatabaseName := reg.ReadString('Base'); Backup.BackupFile.Clear; Backup.BackupFile.Add(ChangeFileExt(reg.ReadString('BackupDir') + '\' + FormatDateTime('yyyymmddnnhh', now), '.gbk')); Backup.Active := true; AddStatusLine(Format('Backup Iniciado às %s horas', [FormatDateTime('hh:nn:ss', now)]), clGreen); AddStatusLine('Não serão apresentadas linhas de Status, o modo Verbose está desligado!', clNavy); Backup.ServiceStart; Backup.Active := false; except Result := false; end; end; finally reg.CloseKey; reg.Free; end; end;
A procedure AddStatusLine é usada para adicionar linhas ao componente seStatus, tendo a sua condificação definida a seguir:
procedure TFPrincipal.AddStatusLine(S: string; Cor: TColor; Tamanho: byte); begin reStatus.SelAttributes.Color := Cor; reStatus.SelAttributes.Size := Tamanho; reStatus.Lines.Add(S); end;
Em ambos projetos, há uma constante chamada Dia, essa constante armazena um array de string’s onde estão armazenados os dias da semana, sendo definida assim:
const Dia: array[1..7] of string = ('Domingo', 'Segunda', 'Terça', 'Quarta', 'Quinta', 'Sexta', 'Sábado');
Obs.: As nomenclaturas, identação dos fontes, figuras, componentes que foram podem ser facilmente substituídos para maior adaptação do Projeto para as necessidades de cada um.
Click aqui para baixar o código dos programas.
Autor : Julio Cesar
(julio_gyn@yahoo.com.br)
Analista/Programador
Grafcenter Informática
LTDA.
Publicado no site Interbase-BR