Tool Backup, Clone e Restauração de Bancos de dados HFSQL
// Summary: <specify the procedure action>
// Syntax:
//Evento_Backup_Agendar (<Base_Atual>, <Destino_Backup>, <Agendar_Data_Hora>)
//
// Parameters:
// Base_Atual:
// Destino_Backup: <specify the role of Destino_Backup>
// Agendar_Data_Hora: <specify the role of Agendar_Data_Hora>
// Example:
// <Specify a usage example>
//
PROCEDURE Evento_Backup_Agendar(Base_Atual, Destino_Backup, Agendar_Data_Hora)
HourGlass(True)
BaseAtual is string = Base_Atual
IF Base_Atual = "*"
Base_Atual = "Todos"
END
IF BaseAtual = "" THEN
Info("Importante informar qual base ou * se for todos os bancos")
END
IF Destino_Backup = "" THEN
Info("Importante informar o diretório destino do backup","Exemplo: C:\HFSQLserver\backup\")
END
IF bConectado = False THEN
Error("Você deve primeiro se conectar a um servidor HFSQL.")
RETURN
END
IF Base_Atual <> "" AND BaseAtual <> "" AND Agendar_Data_Hora <> ""
Backup is hBackupDescription
Backup.Source = BaseAtual+"\*" // todas as tabelas
Backup.Description = "Backup_"+BaseAtual+"_"+DateSys()+TimeSys() //nome do backup
Backup.Compression = zipFormatZIP
Backup.WithIndex = True
Backup.Enabled = True
Backup.Destination = Destino_Backup+"\"+Backup.Description
Backup.SchedulingFull.Hour = Middle(Agendar_Data_Hora,9,2)
Backup.SchedulingFull.Minute = Middle(Agendar_Data_Hora,11,2)
Backup.SchedulingFull.DayOfMonth = Middle(Agendar_Data_Hora,7,2)
bFazendoBackup = True
res is int = 0
IF BaseAtual <> "*" AND Destino_Backup <> ""
res = HBackup(myconnect, Backup)
// Verifica se o backup foi finalizado ou não, caso contrário aguardamos
IF res <> 0 THEN
sEtat = ExtractString(HInfoBackup(myconnect), 6)
WHILE Val(sEtat) = 0
Multitask(-2)
sEtat = ExtractString(HInfoBackup(myconnect), 6)
END
ELSE
Error(StringBuild("A cópia de segurança terminou de forma anormal: % 1",HErrorInfo()))
END
IF res = 0 OR fDirectoryExist(Destino_Backup)= False
Info("Não criou o backup, algo deu errado: ")
END
IF res = 0 THEN
Info(ErrorInfo(),HErrorInfo())
ELSE
Info("Backup realizado com sucesso")
Evento_Listar_Backups(Destino_Backup)
END
ELSE
x is int
Banco is string = ""
ListDatabase is string = HListDatabase(myconnect,hLstNormal)
IF StringCount(ListDatabase,TAB,IgnoreCase) = 0 THEN
ListDatabase = ListDatabase + TAB
END
TotalBases is int = StringCount(ListDatabase,TAB,IgnoreCase) +1
LOOP(TotalBases)
x++
res = 0
Banco = NoSpace(ExtractString(ListDatabase,x,TAB,FromBeginning))
Trace(Banco)
Backup.Source = Banco+"\*" // todas as tabelas
Backup.Description = "Backup_"+Banco+"_"+DateSys()+TimeSys() //nome do backup
Backup.Compression = zipFormatZIP
Backup.WithIndex = True
Backup.Enabled = True
Backup.Destination = Destino_Backup+"\"+Backup.Description
Backup.SchedulingFull.Hour = Middle(Agendar_Data_Hora,9,2)
Backup.SchedulingFull.Minute = Middle(Agendar_Data_Hora,11,2)
Backup.SchedulingFull.DayOfMonth = Middle(Agendar_Data_Hora,7,2)
res = HBackup(myconnect, Backup)
// Verifica se o backup foi finalizado ou não, caso contrário aguardamos
IF res <> 0 THEN
sEtat = ExtractString(HInfoBackup(myconnect), 6)
WHILE Val(sEtat) = 0
Multitask(-2)
sEtat = ExtractString(HInfoBackup(myconnect), 6)
END
ELSE
Error(StringBuild("A cópia de segurança terminou de forma anormal: % 1",HErrorInfo()))
END
IF res = 0 OR fDirectoryExist(Destino_Backup) = False THEN
Info("Não criou o backup, algo deu errado: ",res,ErrorInfo(),HErrorInfo())
END
END
IF res = 0 // SE ZERO NAO CRIOU O BKP
Info(res,ErrorInfo(),HErrorInfo())
ELSE
Info("Backup realizado com sucesso")
Evento_Listar_Backups(Destino_Backup)
Info(res,ErrorInfo(),HErrorInfo())
END
END
ELSE
Info("Informe uma Base clicando sobre ela e uma data e hora para executar")
END
bFazendoBackup = False
HourGlass(False)
//-------------------------------------------------
// Summary: <specify the procedure action>
// Syntax:
//Evento_Backup_Agora (<Base_Atual>)
//
// Parameters:
// Base_Atual:
// Example:
// <Specify a usage example>
//
// Usuario: <specify the role of Usuario>
PROCEDURE Evento_Backup_Agora(Base_Atual, Destino_Backup)
HourGlass(True)
BaseAtual is string = Base_Atual
IF Base_Atual = "*"
Base_Atual = "Todos"
END
IF BaseAtual = "" THEN
Info("Importante informar qual base ou * se for todos os bancos")
END
IF Destino_Backup = "" THEN
Info("Importante informar o diretório destino do backup","Exemplo: C:\HFSQLserver\backup\")
END
IF bConectado = False THEN
Error("Você deve primeiro se conectar a um servidor HFSQL.")
RETURN
END
IF Base_Atual <> "" AND BaseAtual <> ""
Backup is hBackupDescription
Backup.Source = BaseAtual+"\*" // todas as tabelas
Backup.Description = "Backup_"+BaseAtual+"_"+DateSys()+TimeSys() //nome do backup
Backup.Compression = zipFormatZIP
Backup.WithIndex = True
Backup.Enabled = True
Backup.Destination = Destino_Backup+"\"+Backup.Description
bFazendoBackup = True
res is int = 0
IF BaseAtual <> "*" AND Destino_Backup <> ""
res = HBackup(myconnect, Backup)
// Verifica se o backup foi finalizado ou não, caso contrário aguardamos
IF res <> 0 THEN
sEtat = ExtractString(HInfoBackup(myconnect), 6)
WHILE Val(sEtat) = 0
Multitask(-2)
sEtat = ExtractString(HInfoBackup(myconnect), 6)
END
ELSE
Error(StringBuild("A cópia de segurança terminou de forma anormal: % 1",HErrorInfo()))
END
IF res = 0 OR fDirectoryExist(Destino_Backup)= False
Info("Não criou o backup, algo deu errado: ")
END
IF res = 0 THEN
Info(ErrorInfo(),HErrorInfo())
ELSE
Info("Backup realizado com sucesso")
Evento_Listar_Backups(Destino_Backup)
END
ELSE
x is int
Banco is string = ""
ListDatabase is string = HListDatabase(myconnect,hLstNormal)
IF StringCount(ListDatabase,TAB,IgnoreCase) = 0 THEN
ListDatabase = ListDatabase + TAB
END
TotalBases is int = StringCount(ListDatabase,TAB,IgnoreCase) +1
LOOP(TotalBases)
x++
res = 0
Banco = NoSpace(ExtractString(ListDatabase,x,TAB,FromBeginning))
Trace(Banco)
Backup.Source = Banco+"\*" // todas as tabelas
Backup.Description = "Backup_"+Banco+"_"+DateSys()+TimeSys() //nome do backup
Backup.Compression = zipFormatZIP
Backup.WithIndex = True
Backup.Enabled = True
Backup.Destination = Destino_Backup+"\"+Backup.Description
res = HBackup(myconnect, Backup)
// Verifica se o backup foi finalizado ou não, caso contrário aguardamos
IF res <> 0 THEN
sEtat = ExtractString(HInfoBackup(myconnect), 6)
WHILE Val(sEtat) = 0
Multitask(-2)
sEtat = ExtractString(HInfoBackup(myconnect), 6)
END
ELSE
Error(StringBuild("A cópia de segurança terminou de forma anormal: % 1",HErrorInfo()))
END
IF res = 0 OR fDirectoryExist(Destino_Backup) = False THEN
Info("Não criou o backup, algo deu errado: ",res,ErrorInfo(),HErrorInfo())
END
END
IF res = 0 // SE ZERO NAO CRIOU O BKP
Info(res,ErrorInfo(),HErrorInfo())
ELSE
Info("Backup realizado com sucesso")
Evento_Listar_Backups(Destino_Backup)
Info(res,ErrorInfo(),HErrorInfo())
END
END
ELSE
Info("Informe uma Base clicando sobre ela")
END
bFazendoBackup = False
HourGlass(False)
//-----------------------------------------------------------------------
// Summary: <specify the procedure action>
// Syntax:
//Evento_Conectar (<Server_Ip_DNS>, <Porta>, <Usuario>, <Senha>)
//
// Parameters:
// Server_Ip_DNS:
// Porta: <specify the role of EDT_Porta>
// Usuario: <specify the role of EDT_Usuário>
// Senha: <specify the role of EDT_Senha>
// Example:
// <Specify a usage example>
//
PROCEDURE Evento_Conectar(Server_Ip_DNS,Porta,Base,Usuario,Senha)
IF Server_Ip_DNS <> "" AND Porta <> "" AND Usuario <> "" AND Senha <> "" THEN
myconnect..Provider = hAccessHFClientServer
myconnect..Server = Server_Ip_DNS
myconnect..Source = Server_Ip_DNS +":"+ Porta
myconnect..User = Usuario
myconnect..Password = Senha
myconnect..Database = Base
myconnect..Access = hOReadWrite
myconnect.CursorOptions = hClientCursor
IF HOpenConnection(myconnect) = True THEN
IF HChangeConnection("*",myconnect) = True THEN
bConectado = True
ToastDisplay("Conexão com sucesso",toastLong,vaMiddle,haCenter)
Evento_Listar_Bases()
GR_CAMPOS_BACKUP..State = Active
ELSE
Error(ErrorInfo(),HErrorInfo())
END
ELSE
Error(ErrorInfo(),HErrorInfo())
END
END
//---------------------------------------------------------------------------------------------
// Summary: <specify the procedure action>
// Syntax:
// Evento_Desconectar ()
//
// Parameters:
// None
// Return value:
// None
//
// Example:
// <Specify a usage example>
//
PROCEDURE Evento_Desconectar()
GR_CAMPOS_BACKUP..State = Grayed
HCloseConnection(myconnect)
TableDeleteAll(TABLE_Bancos)
TableDisplay(TABLE_Bancos,taInit)
bConectado = False
//------------------------------------------------------------------------
// Summary: <specify the procedure action>
// Syntax:
//Evento_Listar_Backups (<Diretorio_Backup>)
//
// Parameters:
// Diretorio_Backup:
// Example:
// <Specify a usage example>
//
PROCEDURE Evento_Listar_Backups(Diretorio_Backup)
TableDeleteAll(TABLE_Diretorio_Backup)
x is int
Nome_Backup is string = ""
listaArquivos is string = fListFile(Diretorio_Backup+"\*.zip",frRecursive)
IF StringCount(listaArquivos,CR,IgnoreCase)=0 THEN
listaArquivos = listaArquivos+CR
END
TotalBackups is int = StringCount(listaArquivos,CR,IgnoreCase) +1
Trace(TotalBackups)
LOOP(TotalBackups)
x++
Nome_Backup = NoSpace(ExtractString(listaArquivos,x,CR,FromBeginning))
IF Nome_Backup <> "" THEN
Trace(Nome_Backup)
TableAdd(TABLE_Diretorio_Backup,x +TAB+ Nome_Backup)
END
END
Trace("Total de Backups: "+x)
TableDisplay(TABLE_Diretorio_Backup,taReExecuteQuery)
TableDisplay(TABLE_Diretorio_Backup,taInit)
//-------------------------------------------------------------------------
// Summary: <specify the procedure action>
// Syntax:
//Evento_Listar_Bases ()
//
// Parameters:
// None
// Example:
// <Specify a usage example>
//
// Return value:
PROCEDURE Evento_Listar_Bases()
TableDeleteAll(TABLE_Bancos)
TableDeleteAll(TABLE_Diretorio_Backup)
x is int
Banco is string = ""
ListDatabase is string = HListDatabase(myconnect,hLstNormal)
IF StringCount(ListDatabase,TAB,IgnoreCase)=0 THEN
ListDatabase = ListDatabase+TAB
END
TotalBases is int = StringCount(ListDatabase,TAB,IgnoreCase) +1
LOOP(TotalBases)
x++
Banco = NoSpace(ExtractString(ListDatabase,x,TAB,FromBeginning))
TableAdd(TABLE_Bancos,Banco)
END
TableDisplay(TABLE_Bancos,taReExecuteQuery)
TableDisplay(TABLE_Bancos,taInit)
//----------------------------------------------------------------------------
// Summary: <specify the procedure action>
// Syntax:
//Evento_Progress ()
//
// Parameters:
// None
// Example:
// <Specify a usage example>
//// Automatic procedure:
// The procedure is executed manually, during a call in the code
// It will be run in a secure thread (without calling ThreadExecute), without using HFSQL
// It will be repeated in a loop, with a timeout set to 1 second between each call
//
PROCEDURE Evento_Progress()
IF bFazendoBackup = True THEN
IF PROGBAR_01 > 100 THEN
PROGBAR_01 = 0
END
PROGBAR_01 += 10
END
//-----------------------------------------------------------------------
// Summary: <specify the procedure action>
// Syntax:
// Evento_Restaurar_Duplicar ()
//
// Parameters:
// None
// Return value:
// None
//
// Example:
// <Specify a usage example>
//
PROCEDURE Evento_Restaurar_Duplicar()
//1 : Sim
//2 : Não
SWITCH Dialog("Deseja restaurar o Backup?")
// Sim
CASE 1
nID is int
Base_Atual_Restaurado is string = EDT_Base_Atual +"_Copia_"+DateSys()+TimeSys()
IF EDT_Diretório_Destino ~= "" THEN
Error("Você deve primeiro especificar um diretório temporário.")
RETURN
END
IF Base_Atual_Restaurado ~= "" THEN
Error("Você deve primeiro indicar o nome do banco de dados duplicado.")
RETURN
END
IF bConectado = False THEN
Error("Você deve primeiro se conectar a um servidor HFSQL.")
RETURN
END
PROGBAR_01.Visible = True
nID = HBackup(myconnect,EDT_Base_Atual+"/*",EDT_Diretório_Destino,True,"Copia"+ DateSys(),PROGBAR_01)
IF nID <> 0 THEN
sEtat = ExtractString(HInfoBackup(myconnect), 6)
WHILE Val(sEtat) = 0
Multitask(-2)
sEtat = ExtractString(HInfoBackup(myconnect), 6)
END
ELSE
Error(StringBuild("A cópia de segurança terminou de forma anormal: % 1",HErrorInfo()))
END
// Duplication de la base
IF Val(sEtat) = 1 THEN
HRestoreBackup(myconnect,EDT_Base_Atual+"/"+nID,EDT_Base_Atual,Base_Atual_Restaurado,PROGBAR_01)
IF ErrorOccurred THEN
Error(StringBuild("Não foi possível duplicar a base: % 1",ErrorInfo()))
ELSE
Info("Duplicação concluída")
END
// Re-Alimentation de la liste des bases
Evento_Listar_Bases()
ELSE
Error(StringBuild("A cópia de segurança terminou de forma anormal: % 1",HErrorInfo()))
END
// Não
CASE 2
END
CASE ERROR:
Error(ErrorInfo(errMessage))
CASE EXCEPTION:
Error(ExceptionInfo(errMessage))