ViewVC Help
View File | Revision Log | Show Annotations | Download File | View Changeset | Root Listing
root/public/ibx/trunk/iblocaldb/IBXUpgradeDatabaseDlg.pas
Revision: 80
Committed: Mon Jan 1 11:31:07 2018 UTC (6 years, 3 months ago) by tony
Content type: text/x-pascal
File size: 7122 byte(s)
Log Message:
Fixes merged into public release

File Contents

# User Rev Content
1 tony 37 (*
2     * IBX For Lazarus (Firebird Express)
3     *
4     * The contents of this file are subject to the Initial Developer's
5     * Public License Version 1.0 (the "License"); you may not use this
6     * file except in compliance with the License. You may obtain a copy
7     * of the License here:
8     *
9     * http://www.firebirdsql.org/index.php?op=doc&id=idpl
10     *
11     * Software distributed under the License is distributed on an "AS
12     * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
13     * implied. See the License for the specific language governing rights
14     * and limitations under the License.
15     *
16     * The Initial Developer of the Original Code is Tony Whyman.
17     *
18     * The Original Code is (C) 2014 Tony Whyman, MWA Software
19     * (http://www.mwasoftware.co.uk).
20     *
21     * All Rights Reserved.
22     *
23     * Contributor(s): ______________________________________.
24     *
25     *)
26     unit IBXUpgradeDatabaseDlg;
27    
28     {$mode objfpc}{$H+}
29    
30     interface
31    
32     uses
33     Classes, SysUtils, FileUtil, Forms, Controls, Dialogs, StdCtrls,
34 tony 80 ComCtrls, ExtCtrls, IBDatabase, ibxscript, IBXUpgradeConfFile;
35 tony 37
36     type
37 tony 80 TGetDatabaseVersionNo = procedure (Sender: TObject; var VersionNo: integer) of object;
38    
39 tony 37 { TUpgradeDatabaseDlg }
40    
41     TUpgradeDatabaseDlg = class(TForm)
42     UpdateTransaction: TIBTransaction;
43     IBXScript: TIBXScript;
44     Label1: TLabel;
45     Panel1: TPanel;
46     ProgressBar1: TProgressBar;
47     Status: TLabel;
48     Timer1: TTimer;
49     procedure FormShow(Sender: TObject);
50     procedure HandleCompletionEvent(Sender: TObject);
51     procedure IBXScriptLogProc(Sender: TObject; Msg: string);
52     procedure IBXScriptProgressEvent(Sender: TObject; Reset: boolean;
53     value: integer);
54     private
55 tony 80 FOnGetDatabaseVersionNo: TGetDatabaseVersionNo;
56     FOnUpgradeStepCompleted: TNotifyEvent;
57 tony 37 { private declarations }
58     FUpgradeLog: TStrings;
59 tony 80 FTargetVersionNo: integer;
60     FUpgradeConf: TUpgradeConfFile;
61     FArchiveStub: string;
62 tony 37 procedure DoUpdate(Data: PtrInt);
63 tony 80 function CurrentDBVersionNo: integer;
64 tony 37 public
65     { public declarations }
66     SuccessfulCompletion: boolean;
67     constructor Create(theOwner: TComponent); override;
68     destructor Destroy; override;
69     procedure Add2Log(Msg: string);
70 tony 80 property OnGetDatabaseVersionNo: TGetDatabaseVersionNo read FOnGetDatabaseVersionNo
71     write FOnGetDatabaseVersionNo;
72     property OnUpgradeStepCompleted: TNotifyEvent read FOnUpgradeStepCompleted write FOnUpgradeStepCompleted;
73 tony 37 end;
74    
75    
76     var
77     UpgradeDatabaseDlg: TUpgradeDatabaseDlg;
78    
79 tony 80 function RunUpgradeDatabase(aDatabase: TIBDatabase;
80     UpgradeConf: TUpgradeConfFile;
81     ArchiveStub: string;
82     TargetVersionNo: integer;
83     aOnGetDatabaseVersionNo: TGetDatabaseVersionNo;
84     aOnUpgradeStepCompleted: TNotifyEvent): boolean;
85 tony 37
86 tony 80
87 tony 37 implementation
88    
89     {$R *.lfm}
90    
91 tony 80 uses IBXViewLogDig, IBXSaveDatabaseDlg;
92 tony 37
93 tony 80 resourcestring
94     sNoUpgradeConf = 'An Upgrade Conf file must be provided';
95     sUpdateMsg = 'Applying Update from %s';
96     sUpdateStarted = '%s Update Started';
97     sUpdateEnded = '%s Update Completed';
98     sUpdateFailed = 'Update Failed - %s';
99    
100     function RunUpgradeDatabase(aDatabase: TIBDatabase;
101     UpgradeConf: TUpgradeConfFile; ArchiveStub: string; TargetVersionNo: integer;
102     aOnGetDatabaseVersionNo: TGetDatabaseVersionNo;
103     aOnUpgradeStepCompleted: TNotifyEvent): boolean;
104     begin
105     if not assigned(UpgradeConf) then
106     raise Exception.Create(sNoUpgradeConf);
107    
108     with TUpgradeDatabaseDlg.Create(Application) do
109     try
110     FTargetVersionNo := TargetVersionNo;
111     FUpgradeConf := UpgradeConf;
112     FArchiveStub := ArchiveStub;
113     IBXScript.Database := aDatabase;
114     UpdateTransaction.DefaultDatabase := aDatabase;
115     IBXScript.GetParamValue := @UpgradeConf.GetParamValue;
116     OnGetDatabaseVersionNo := aOnGetDatabaseVersionNo;
117     OnUpgradeStepCompleted := aOnUpgradeStepCompleted;
118     Result := ShowModal = mrOK;
119     finally
120     Free
121     end;
122     end;
123    
124 tony 37 { TUpgradeDatabaseDlg }
125    
126     procedure TUpgradeDatabaseDlg.FormShow(Sender: TObject);
127     begin
128     ProgressBar1.Position := 0;
129     Status.Caption := '';
130     FUpgradeLog.Clear;
131     Application.QueueAsyncCall(@DoUpdate,0);
132     end;
133    
134     procedure TUpgradeDatabaseDlg.HandleCompletionEvent(Sender: TObject);
135     begin
136     Timer1.Enabled := false;
137     if not SuccessfulCompletion then
138     begin
139     ShowViewLogDlg(FUpgradeLog);
140     ModalResult := mrCancel
141     end
142     else
143     ModalResult := mrOK;
144     end;
145    
146     procedure TUpgradeDatabaseDlg.IBXScriptLogProc(Sender: TObject; Msg: string);
147     begin
148     Add2Log(Msg);
149     end;
150    
151     procedure TUpgradeDatabaseDlg.IBXScriptProgressEvent(Sender: TObject;
152     Reset: boolean; value: integer);
153     begin
154     if Reset then
155     begin
156     with ProgressBar1 do
157     begin
158     Position := 0;
159     Max := value;
160     end;
161     end;
162     ProgressBar1.StepIt;
163     Application.ProcessMessages;
164     end;
165    
166     procedure TUpgradeDatabaseDlg.Add2Log(Msg: string);
167     begin
168     FUpgradeLog.Add(Msg);
169     end;
170    
171     procedure TUpgradeDatabaseDlg.DoUpdate(Data: PtrInt);
172 tony 80 var UpdateAvailable: boolean;
173     UpgradeInfo: TUpgradeInfo;
174     DBArchive: string;
175     LastVersionNo: integer;
176     CurVersionNo: integer;
177 tony 37 begin
178     SuccessfulCompletion := true;
179     try
180 tony 80 CurVersionNo := CurrentDBVersionNo;
181     repeat
182     if CurVersionNo >= FTargetVersionNo then break;
183     LastVersionNo := CurVersionNo;
184     UpdateAvailable := FUpgradeConf.GetUpgradeInfo(CurVersionNo+1,UpgradeInfo);
185     if UpdateAvailable then
186     begin
187     if UpgradeInfo.BackupDB then
188     begin
189     CreateDir(ExtractFileDir(FArchiveStub));
190     DBArchive := FArchiveStub + '.' + IntToStr(CurrentDBVersionNo) + '.gbk';
191     with IBXScript.Database do
192     SaveDatabaseToArchive(DatabaseName,Params,DBArchive);
193     end;
194     Add2Log(UpgradeInfo.UserMessage);
195     Status.Caption := UpgradeInfo.UserMessage;
196     Application.ProcessMessages;
197     Add2Log(Format(sUpdateMsg,[UpgradeInfo.UpdateSQLFile]));
198     Add2Log(Format(sUpdateStarted,[DateTimeToStr(Now)]));
199     if not IBXScript.PerformUpdate(UpgradeInfo.UpdateSQLFile,true) then
200     begin
201     Add2Log(Format(sUpdateFailed,[DateTimeToStr(Now)]));
202     SuccessfulCompletion := false;
203     UpdateTransaction.Rollback;
204     break;
205     end;
206     UpdateTransaction.Commit;
207     Add2Log(Format(sUpdateEnded,[DateTimeToStr(Now)]));
208     if assigned(FOnUpgradeStepCompleted) then
209     OnUpgradeStepCompleted(self);
210     end;
211     CurVersionNo := CurrentDBVersionNo;
212     until not UpdateAvailable or (LastVersionNo = CurVersionNo);
213 tony 37 except on E:Exception do
214     begin
215     SuccessfulCompletion := false;
216     Add2Log(E.Message);
217     end;
218     end;
219     Timer1.Enabled := true;
220     end;
221    
222 tony 80 function TUpgradeDatabaseDlg.CurrentDBVersionNo: integer;
223     begin
224     if assigned(FOnGetDatabaseVersionNo) then
225     OnGetDatabaseVersionNo(self,Result)
226     else
227     Result := 0;
228     end;
229 tony 37
230 tony 80
231 tony 37 constructor TUpgradeDatabaseDlg.Create(theOwner: TComponent);
232     begin
233     inherited Create(theOwner);
234     FUpgradeLog := TStringList.Create;
235     end;
236    
237     destructor TUpgradeDatabaseDlg.Destroy;
238     begin
239     if assigned(FUpgradeLog) then
240     FUpgradeLog.Free;
241     inherited Destroy;
242     end;
243    
244     end.
245