Реалізація резервного копіювання

Delphi site: daily Delphi-news, documentation, articles, review, interview, computer humor.

Переходимо на вкладку Win32 Палітри компонентів, знаходимо та встановлюємо на форму компонент PageControl (кожне завдання буде на своїй вкладці). Перейменуємо отриманий PageControll в PC1 для стислості коду, а властивості Align надамо значення alClient.

Зразковий вид вкладки дивіться на малюнку:

реалізація

У правій частині панелі розмістіть компонент Label. Щоб компонент міг містити багаторядковий текст, властивості AutoSize переведіть в False, а властивість WordWrap - в True. У якості Caption напишіть текст "Час запуску автоматичного резервного копіювання:", і налаштуйте розміри, як на малюнку.

Під панеллю встановіть Memo. Властивість Align встановіть alClient, властивість ScrollBars в ssVertical, і не забудьте очистити від тексту властивість Lines.

Компонент IBBackupService призначений створення резервних копій бази даних InterBase. Цей компонент дозволяє виконувати різні налаштування резервного копіювання залежно від того, які параметри у властивості Options включені.

Для цього в розділі Private модуля головної форми опишемо функцію GetName:

Встановіть курсор на назву функції і натисніть , щоб створити саму функцію. Ось її код:

function TfMain.GetName: String;

ye, mo, da: Word; //для дати ho, mi, se, ms: Word; //Для часу st: String[2]; //для додавання нуля, наприклад, 05 begin

DecodeDate(Date, ye, mo, da); //декодуємо на складові дату

DecodeTime(Time, ho, mi, se, ms); //декодуємо час

//тепер збираємо рядок:

Result:= IntToStr(ye); //додали рік

//отримуємо і додаємо місяць:

if Length(st) = 1 then st:= '0' + st; //якщо 1символ, додамо спереду 0 Result: = Result + st; //отримуємо і додаємо день: st: = IntToStr (da);

if Length(st) = 1 then st:= '0' + st;

Result := Result + st +

//тепер отримуємо і додаємо годину:

if Length(st) = 1 then st:= '0' + st;

Result: = Result + st; //отримуємо і додаємо хвилини: st:= IntToStr(mi);

if Length(st) = 1 then st:= '0' + st;

Result: = Result + st; //отримуємо і додаємо секунди: st:= IntToStr(se);

if Length(st) = 1 then st:= '0' + st; Result: = Result + st + '_';

//Тепер функція поверне префікс імені файлу, наприклад: //20100205_010012_end;

Тут ми декодували на складові дату і час. Рік уже має 4 цифри, тож його додатково обробляти не потрібно. А ось місяць, день, година, хвилина чи секунда можуть складатися з однієї цифри. Щоб не заплутатися, робимо перевірку:

if Length(st) = 1 then st:= '0' + st; //якщо 1 символ, додамо спереду 0 Result: = Result + st;

У змінну st ми отримуємо номер місяця. Якщо цей номер складається із однієї цифри, перед нею додамо '0'. І наприкінці додамо результат у змінну Result. Так само ми перевіряємо й інші дані. Ця функція гарантує нам не тільки унікальність імені файлу, а й правильне сортування файлів за датою. До того ж на ім'я відразу видно - коли було створено файл.

if RB1.Checked then

якщо RB2.Checked then

Розуміємо далі. Копіювання у нас буде починатися або натисканням кнопки, або спрацьовуванням таймера, залежно від того, яка радіокнопка виділена. Отже, щоб двічі не писати той самий код, створимо процедуру резервного копіювання, яку викликатимемо з двох місць. Оскільки процедура безпосередньо працюватиме з компонентом IBBS, спочатку оголосимо її врозділ private, після функції GetName:

< Private declarations >function GetName(): String; procedure BackupCopy;

Встановіть курсор на процедуру та натисніть , щоб згенерувати тіло процедури. Її код:

var s: String; //для отримання префікса файлу begin

//отримаємо префікс: s: = GetName ();

//очистимо Memol, якщо там щось є: Memo1.Clear;

//задаємо параметри компонента IBBackupService:

IBBS.DatabaseName:= 'c:\DataBases\first.gdb'; IBBS.BackupFile.Clear;

IBBS.BackupFile.Add('c:\DataBases\Backup' + s + 'first.gbk'); IBBS.ServiceStart;

//Поки не дійшли до кінця, записуємо паралельно лог в Memo1:

while not IBBS.Eof do

IBBS.Active:= False; end;

//збережемо лог у файл:

Memol.Lines.SaveToFile('c:\DataBases\Backup' + s + 'first.log'); end;

Тут ми спочатку отримали змінну префікс імені файлу. Навіщо це потрібно? Нам необхідно:

1. Зробити резервну копію.

2. Зберегти лог копіювання у файл.

Ці дії будуть проводитися в різний час, тому щоб префікс копії збігався з префіксом лог-файлу, ми зберігаємо його в змінну s:

//отримаємо префікс: s: = GetName ();

Далі ми очищаємо Memo1, якщо там вже був текст. Після чого приступаємо до налаштувань параметрів компонента IBBS:

IBBS.ServerName := 'MyServ'; IBBS.LoginPrompt:= False; IBBS.Params.Add('user name=sysdba'); IBBS.Params.Add('password=masterkey'); IBBS.Active := True;

IBBS.DatabaseName:= 'c:\DataBases\first.gdb'; IBBS.BackupFile.Clear;

IBBS.BackupFile.Add('c:\DataBases\Backup' + s + 'first.gbk'); IBBS.ServiceStart;

//поки не дійшли до кінця, записуємо паралельно лог в Memo1: while not IBBS.Eof do

IBBS.Active:= False;end;

Тут властивість Verbose (багатослівність) визначає - чи виводитиметься лог резервного копіювання. При значенні True лог ведеться, інакше – ні. Нам потрібно, щоб ліг створювався.

І в самому кінці процедури записуємо отриманий в Memol лог у файл з таким самим ім'ям, як резервна копія, але розширенням *.log:

//збережемо лог у файл:

Memo1.Lines.SaveToFile('c:\DataBases\Backup' + s + 'first.log');

gbak: closing file, обговорення іфінішування. 38912 bytes written.

Зайдіть в папку Backup – там має з'явитися пара файлів з однаковим ім'ям та розширеннями *.gbk та *.log. Це і є наша резервна копія та лог-файл.

procedure TfMain.Timer1Timer(Sender: TObject); var

ho, mi, se, ms: Word; //Для часу

//інакше декодуємо час

Насамкінець зауважимо, що компонент IBBackupService має складну властивість Options, що розкривається, яка має наступні перемикачі:

Таблиця 27.1. Перемикачі властивості Options компонента IBBackupService