ViewVC Help
View File | Revision Log | Show Annotations | Download File | View Changeset | Root Listing
root/public/ibx/branches/journaling/iblocaldb/nongui/IBCMLocalDBSupport.pas
Revision: 209
Committed: Wed Mar 14 12:48:51 2018 UTC (6 years, 1 month ago) by tony
Content type: text/x-pascal
Original Path: ibx/trunk/iblocaldb/nongui/IBCMLocalDBSupport.pas
File size: 5734 byte(s)
Log Message:
Fixes Merged

File Contents

# Content
1 (*
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 IBCMLocalDBSupport;
27
28 {$mode objfpc}{$H+}
29
30 interface
31
32 uses
33 Classes, SysUtils, IBXCustomIBLocalDBSupport, ibxscript, IBXServices;
34
35 type
36 TOnLogMessage = procedure(Sender: TObject; Msg: string) of object;
37
38 { TIBCMLocalDBSupport }
39
40 TIBCMLocalDBSupport = class(TCustomIBLocalDBSupport)
41 private
42 FOnLogMessage: TOnLogMessage;
43 procedure Add2Log(Sender: TObject; Msg: string);
44 procedure DoUpgrade(IBXScript: TIBXScript; TargetVersionNo: integer);
45 procedure WriteLog(Msg: string);
46 procedure HandleOnGetNextLine(Sender: TObject; var Line: string);
47 protected
48 procedure Downgrade(DBArchive: string); override;
49 function InternalCreateNewDatabase(DBArchive: string): boolean; override;
50 function RestoreDatabaseFromArchive(aFilename: string): boolean; override;
51 function RunUpgradeDatabase(TargetVersionNo: integer): boolean; override;
52 function SaveDatabaseToArchive( aFilename: string): boolean; override;
53 public
54 constructor Create(aOwner: TComponent); override;
55 property OnLogMessage: TOnLogMessage read FOnLogMessage write FOnLogMessage;
56 end;
57
58 implementation
59
60 uses IBXUpgradeConfFile, IBDatabase;
61
62 resourcestring
63 sUpdateMsg = 'Applying Update from %s';
64 sCreatingDatabase = 'Creating new Database';
65 sBackupDone = 'Database Archived to %s';
66
67 { TIBCMLocalDBSupport }
68
69 procedure TIBCMLocalDBSupport.Add2Log(Sender: TObject; Msg: string);
70 begin
71 WriteLog(Msg);
72 end;
73
74 procedure TIBCMLocalDBSupport.DoUpgrade(IBXScript: TIBXScript;
75 TargetVersionNo: integer);
76 var UpdateAvailable: boolean;
77 UpgradeInfo: TUpgradeInfo;
78 DBArchive: string;
79 LastVersionNo: integer;
80 begin
81 repeat
82 if CurrentDBVersionNo >= TargetVersionNo then break;
83 LastVersionNo := CurrentDBVersionNo;
84 UpdateAvailable := UpgradeConf.GetUpgradeInfo(CurrentDBVersionNo+1,UpgradeInfo);
85 if UpdateAvailable then
86 begin
87 if UpgradeInfo.BackupDB then
88 begin
89 DBArchive := ChangeFileExt(ActiveDatabasePathName,'');
90 DBArchive := DBArchive + '.' + IntToStr(CurrentDBVersionNo) + '.gbk';
91 SaveDatabaseToArchive(DBArchive);
92 end;
93 Add2Log(self,UpgradeInfo.UserMessage);
94 Add2Log(self,Format(sUpdateMsg,[UpgradeInfo.UpdateSQLFile]));
95 if not IBXScript.RunScript(UpgradeInfo.UpdateSQLFile) then
96 break;
97 UpdateVersionNo;
98 end;
99 until not UpdateAvailable or (LastVersionNo = CurrentDBVersionNo);
100 end;
101
102 procedure TIBCMLocalDBSupport.WriteLog(Msg: string);
103 begin
104 if assigned(OnLogMessage) then
105 OnLogMessage(self,Msg);
106 end;
107
108 procedure TIBCMLocalDBSupport.HandleOnGetNextLine(Sender: TObject;
109 var Line: string);
110 begin
111 if assigned(OnLogMessage) then
112 OnLogMessage(self,Line);
113 end;
114
115 procedure TIBCMLocalDBSupport.Downgrade(DBArchive: string);
116 begin
117 RestoreDatabase(DBArchive);
118 end;
119
120 function TIBCMLocalDBSupport.InternalCreateNewDatabase(DBArchive: string
121 ): boolean;
122 var Ext: string;
123 begin
124 Result := true;
125 Ext := AnsiUpperCase(ExtractFileExt(DBArchive));
126 if Ext = '.GBK' then
127 begin
128 with RestoreService do
129 begin
130 BackupFiles.Clear;
131 BackupFiles.Add(DBArchive);
132 Options := [Replace];
133 WriteLog(sCreatingDatabase);
134 Database.Attachment.Disconnect;
135 try
136 Execute(nil);
137 finally
138 Database.Attachment.Connect;
139 end;
140 end;
141 end
142 else
143 if (Ext = '.SQL') and Database.Connected then
144 with TIBXScript.Create(self) do
145 try
146 Database := self.Database;
147 IgnoreCreateDatabase := true;
148 WriteLog(sCreatingDatabase);
149 Result := RunScript(DBArchive);
150 finally
151 Free
152 end
153 else
154 raise Exception.CreateFmt('Archive file (%s) has an unknown extension',[DBArchive]);
155 end;
156
157 function TIBCMLocalDBSupport.RestoreDatabaseFromArchive(
158 aFilename: string): boolean;
159 begin
160 Result := true;
161 with RestoreService do
162 begin
163 BackupFiles.Clear;
164 BackupFiles.Add(aFilename);
165 Options := [Replace];
166 Execute(nil);
167 end;
168 end;
169
170 function TIBCMLocalDBSupport.RunUpgradeDatabase(TargetVersionNo: integer
171 ): boolean;
172 var IBXScript: TIBXScript;
173 begin
174 Result := true;
175 IBXScript := TIBXScript.Create(self);
176 try
177 IBXScript.Database := Database;
178 IBXScript.OnErrorLog := @Add2Log;
179 IBXScript.OnOutputLog := @Add2Log;
180 if assigned(UpgradeConf) then
181 IBXScript.GetParamValue := @UpgradeConf.GetParamValue;
182 DoUpgrade(IBXScript, TargetVersionNo);
183 finally
184 IBXScript.Free;
185 end;
186
187 end;
188
189 function TIBCMLocalDBSupport.SaveDatabaseToArchive(aFilename: string): boolean;
190 var Service: TIBXClientSideBackupService;
191 begin
192 Result := true;
193 with BackupService do
194 begin
195 Execute(nil);
196 WriteLog(Format(sBackupDone,[aFileName]));
197 end;
198 end;
199
200 constructor TIBCMLocalDBSupport.Create(aOwner: TComponent);
201 begin
202 inherited Create(aOwner);
203 RestoreService.OnGetNextLine := @HandleOnGetNextLine;
204 BackupService.OnGetNextLine := @HandleOnGetNextLine;
205 end;
206
207 end.
208