1 |
(*
|
2 |
* IBX Test suite. This program is used to test the IBX non-visual
|
3 |
* components and provides a semi-automated pass/fail check for each test.
|
4 |
*
|
5 |
* The contents of this file are subject to the Initial Developer's
|
6 |
* Public License Version 1.0 (the "License"); you may not use this
|
7 |
* file except in compliance with the License. You may obtain a copy
|
8 |
* of the License here:
|
9 |
*
|
10 |
* http://www.firebirdsql.org/index.php?op=doc&id=idpl
|
11 |
*
|
12 |
* Software distributed under the License is distributed on an "AS
|
13 |
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
14 |
* implied. See the License for the specific language governing rights
|
15 |
* and limitations under the License.
|
16 |
*
|
17 |
* The Initial Developer of the Original Code is Tony Whyman.
|
18 |
*
|
19 |
* The Original Code is (C) 2021 Tony Whyman, MWA Software
|
20 |
* (http://www.mwasoftware.co.uk).
|
21 |
*
|
22 |
* All Rights Reserved.
|
23 |
*
|
24 |
* Contributor(s): ______________________________________.
|
25 |
*
|
26 |
*)
|
27 |
unit Test12;
|
28 |
|
29 |
{$mode objfpc}{$H+}
|
30 |
|
31 |
{Test 12 Test use of Services Connection}
|
32 |
|
33 |
{ Tests out the Services Interface for functions:
|
34 |
1. Show Server Properties
|
35 |
2. Show Database Stats
|
36 |
3. Show Server Log
|
37 |
4. Validate Database
|
38 |
5. Database Sweep
|
39 |
6. User List Handling (Show users, create user, Edit user, Delete User)
|
40 |
7. Shutdown DB and bring back online
|
41 |
8. Client side backup/restore
|
42 |
9. Server Side Backup/restore
|
43 |
10. Limbo Transaction Resolution.
|
44 |
11. Show Database Properties
|
45 |
12. Update Database Properties
|
46 |
13. Create, Remove and Activate a Shadow File.
|
47 |
}
|
48 |
|
49 |
interface
|
50 |
|
51 |
uses
|
52 |
Classes, SysUtils, TestApplication, IBXTestBase, DB, IB, IBXServices,
|
53 |
IBDatabaseInfo, IBQuery, IBSQL, IBDatabase;
|
54 |
|
55 |
const
|
56 |
aTestID = '12';
|
57 |
aTestTitle = 'Test use of Services Connection';
|
58 |
|
59 |
type
|
60 |
|
61 |
{ TTest12 }
|
62 |
|
63 |
TTest12 = class(TIBXTestBase)
|
64 |
private
|
65 |
FIBConfigService: TIBXConfigService;
|
66 |
FIBXServicesConnection: TIBXServicesConnection;
|
67 |
FIBLogService: TIBXLogService;
|
68 |
FIBOnlineValidationService: TIBXOnlineValidationService;
|
69 |
FIBServerProperties: TIBXServerProperties;
|
70 |
FIBStatisticalService: TIBXStatisticalService;
|
71 |
FIBValidationService: TIBXValidationService;
|
72 |
FIBXSecurityService: TIBXSecurityService;
|
73 |
FUserList: TIBXServicesUserList;
|
74 |
FBackupService: TIBXClientSideBackupService;
|
75 |
FRestoreService: TIBXClientSideRestoreService;
|
76 |
FSSBackupService: TIBXServerSideBackupService;
|
77 |
FSSRestoreService: TIBXServerSideRestoreService;
|
78 |
FLimboTransactionsList: TIBXServicesLimboTransactionsList;
|
79 |
FLimboTransResolutionService: TIBXLimboTransactionResolutionService;
|
80 |
FIBDatabaseInfo: TIBDatabaseInfo;
|
81 |
FIBShadowDatabase: TIBDatabase;
|
82 |
function IsDatabaseOnline (DBName: AnsiString): boolean;
|
83 |
function IsShadowDatabase(DBName: AnsiString): boolean;
|
84 |
procedure ShowServerProperties;
|
85 |
procedure ShowStatistics;
|
86 |
procedure ShowServerLog;
|
87 |
procedure ValidateDatabase;
|
88 |
procedure UserListHandling;
|
89 |
procedure DBUpDown;
|
90 |
procedure DatabaseSweepDB;
|
91 |
procedure BackupRestore;
|
92 |
procedure SSBackupRestore;
|
93 |
procedure LimboTransactionResolution;
|
94 |
procedure DatabasePropertiesTests;
|
95 |
procedure ShowDatabaseProperties;
|
96 |
procedure CreateShadow;
|
97 |
procedure RemoveShadow;
|
98 |
procedure ShowShadowFiles;
|
99 |
procedure ActivateShadow;
|
100 |
protected
|
101 |
procedure CreateObjects(Application: TTestApplication); override;
|
102 |
function GetTestID: AnsiString; override;
|
103 |
function GetTestTitle: AnsiString; override;
|
104 |
procedure InitTest; override;
|
105 |
procedure ProcessResults; override;
|
106 |
public
|
107 |
destructor Destroy; override;
|
108 |
procedure RunTest(CharSet: AnsiString; SQLDialect: integer); override;
|
109 |
end;
|
110 |
|
111 |
|
112 |
implementation
|
113 |
|
114 |
uses IBUtils;
|
115 |
|
116 |
const First2 = 2;
|
117 |
|
118 |
{ TTest12 }
|
119 |
|
120 |
function TTest12.IsDatabaseOnline(DBName: AnsiString): boolean;
|
121 |
var Lines: TStringList;
|
122 |
i: integer;
|
123 |
line: string;
|
124 |
begin
|
125 |
{Scan header page to see if database is online }
|
126 |
Result := true;
|
127 |
with TIBXStatisticalService.Create(nil) do
|
128 |
try
|
129 |
ServicesConnection := FIBXServicesConnection;
|
130 |
DatabaseName := DBName;
|
131 |
Options := [HeaderPages];
|
132 |
Lines := TStringList.Create;
|
133 |
try
|
134 |
Execute(Lines);
|
135 |
for i := 0 to Lines.Count - 1 do
|
136 |
begin
|
137 |
line := Lines[i];
|
138 |
if (Pos('Attributes',Line) <> 0) and ((Pos('database shutdown',Line) <> 0)
|
139 |
or (Pos('multi-user maintenance',Line) <> 0)) then
|
140 |
begin
|
141 |
Result := false;
|
142 |
break;
|
143 |
end;
|
144 |
|
145 |
end;
|
146 |
finally
|
147 |
Lines.Free;
|
148 |
end
|
149 |
finally
|
150 |
Free
|
151 |
end;
|
152 |
end;
|
153 |
|
154 |
function TTest12.IsShadowDatabase(DBName: AnsiString): boolean;
|
155 |
var Lines: TStringList;
|
156 |
i: integer;
|
157 |
line: string;
|
158 |
begin
|
159 |
{Scan header page to see if database is a shadow}
|
160 |
Result := false;
|
161 |
with TIBXStatisticalService.Create(nil) do
|
162 |
try
|
163 |
ServicesConnection := FIBXServicesConnection;
|
164 |
DatabaseName := DBName;
|
165 |
Options := [HeaderPages];
|
166 |
Lines := TStringList.Create;
|
167 |
try
|
168 |
Execute(Lines);
|
169 |
for i := 0 to Lines.Count - 1 do
|
170 |
begin
|
171 |
line := Lines[i];
|
172 |
if (Pos('Attributes',Line) <> 0) and (Pos('shadow',Line) <> 0) then
|
173 |
begin
|
174 |
Result := true;
|
175 |
break;
|
176 |
end;
|
177 |
|
178 |
end;
|
179 |
finally
|
180 |
Lines.Free;
|
181 |
end
|
182 |
finally
|
183 |
Free
|
184 |
end;
|
185 |
end;
|
186 |
|
187 |
procedure TTest12.ShowServerProperties;
|
188 |
var i: integer;
|
189 |
begin
|
190 |
with FIBServerProperties, FIBXServicesConnection do
|
191 |
begin
|
192 |
writeln(OutFile,'Firebird Library PathName = ' + FirebirdAPI.GetFBLibrary.GetLibraryFilePath);
|
193 |
writeln(OutFile,'Connect String = ',FIBXServicesConnection.ConnectString);
|
194 |
writeln(OutFile,'Server Version = ' + VersionInfo.ServerVersion);
|
195 |
writeln(OutFile,'Server Implementation = ' + VersionInfo.ServerImplementation);
|
196 |
writeln(OutFile,'Service Version = ' + IntToStr(VersionInfo.ServiceVersion));
|
197 |
writeln(OutFile,Format('Firebird Release = %d.%d.%d (Build no. %d)',[ServerVersionNo[1],
|
198 |
ServerVersionNo[2],
|
199 |
ServerVersionNo[3],
|
200 |
ServerVersionNo[4]]));
|
201 |
writeln(OutFile,'No. of attachments = ' + IntToStr(DatabaseInfo.NoOfAttachments));
|
202 |
writeln(OutFile,'No. of databases = ' + IntToStr(DatabaseInfo.NoOfDatabases));
|
203 |
for i := 0 to DatabaseInfo.NoOfDatabases - 1 do
|
204 |
writeln(OutFile,'DB Name = ' + DatabaseInfo.DbName[i]);
|
205 |
writeln(OutFile,'Base Location = ' + ConfigParams.BaseLocation);
|
206 |
writeln(OutFile,'Lock File Location = ' + ConfigParams.LockFileLocation);
|
207 |
writeln(OutFile,'Security Database Location = ' + ConfigParams.SecurityDatabaseLocation);
|
208 |
writeln(OutFile,'Message File Location = ' + ConfigParams.MessageFileLocation);
|
209 |
for i := Low(ConfigParams.ConfigFileParams) to High(ConfigParams.ConfigFileParams) do
|
210 |
writeln(OutFile,ConfigParams.ConfigFileParams[i]);
|
211 |
for i := Low(ConfigParams.ConfigFileData.ConfigFileKey) to High(ConfigParams.ConfigFileData.ConfigFileKey) do
|
212 |
writeln(OutFile,Format('%d=%s',[ConfigParams.ConfigFileData.ConfigFileKey[i],ConfigParams.ConfigFileData.ConfigFileValue[i]]));
|
213 |
end;
|
214 |
end;
|
215 |
|
216 |
procedure TTest12.ShowStatistics;
|
217 |
var S: TStringList;
|
218 |
begin
|
219 |
writeln(OutFile,'Database Statistics for ' + FIBStatisticalService.DatabaseName);
|
220 |
S := TStringList.Create;
|
221 |
try
|
222 |
FIBStatisticalService.Execute(S);
|
223 |
WriteStrings(S);
|
224 |
finally
|
225 |
S.Free;
|
226 |
end;
|
227 |
end;
|
228 |
|
229 |
procedure TTest12.ShowServerLog;
|
230 |
var S: TStringList;
|
231 |
begin
|
232 |
writeln(OutFile,'Server Log');
|
233 |
S := TStringList.Create;
|
234 |
try
|
235 |
FIBLogService.Execute(S);
|
236 |
WriteStrings(S,First2);
|
237 |
finally
|
238 |
S.Free;
|
239 |
end;
|
240 |
end;
|
241 |
|
242 |
procedure TTest12.ValidateDatabase;
|
243 |
var S: TStringList;
|
244 |
begin
|
245 |
S := TStringList.Create;
|
246 |
try
|
247 |
writeln(OutFile,'Online Validation');
|
248 |
FIBOnlineValidationService.Execute(S);
|
249 |
WriteStrings(S);
|
250 |
S.Clear;
|
251 |
writeln(OutFile,'Normal Validation');
|
252 |
FIBConfigService.ShutDownDatabase(Forced,0);
|
253 |
try
|
254 |
FIBValidationService.Options := [ValidateFull];
|
255 |
FIBValidationService.Execute(S);
|
256 |
finally
|
257 |
FIBConfigService.BringDatabaseOnline;
|
258 |
end;
|
259 |
WriteStrings(S);
|
260 |
finally
|
261 |
S.Free;
|
262 |
end;
|
263 |
writeln(OutFile,'Validation Completed');
|
264 |
end;
|
265 |
|
266 |
procedure TTest12.UserListHandling;
|
267 |
begin
|
268 |
writeln(Outfile,' Current User List');
|
269 |
FUserList.Active := true;
|
270 |
PrintDataSet(FUserList);
|
271 |
writeln(Outfile,'Add user');
|
272 |
with FUserList do
|
273 |
begin
|
274 |
Append;
|
275 |
FieldByName('SEC$USER_NAME').AsString := 'Test12Tester';
|
276 |
FieldByName('SEC$PASSWORD').AsString := 'LetMeIn';
|
277 |
FieldByName('SEC$LAST_NAME').AsString := 'Tester';
|
278 |
Post;
|
279 |
end;
|
280 |
writeln(Outfile,'Updated User List');
|
281 |
PrintDataSet(FUserList);
|
282 |
writeln(Outfile,'Close and re-open user list');
|
283 |
FUserList.Active := false;
|
284 |
FUserList.Active := true;
|
285 |
PrintDataSet(FUserList);
|
286 |
writeln(Outfile,'Modify the new user');
|
287 |
if FUserList.Locate('SEC$USER_NAME','Test12Tester',[loCaseInsensitive]) then
|
288 |
with FUserList do
|
289 |
begin
|
290 |
Edit;
|
291 |
FieldByName('SEC$FIRST_NAME').AsString := 'The';
|
292 |
Post;
|
293 |
PrintDataSet(FUserList);
|
294 |
writeln(Outfile,'Close and re-open user list');
|
295 |
Active := false;
|
296 |
Active := true;
|
297 |
PrintDataSet(FUserList);
|
298 |
end
|
299 |
else
|
300 |
writeln(Outfile,'Added user not found');
|
301 |
writeln(Outfile,'Now delete the new user');
|
302 |
if FUserList.Locate('SEC$USER_NAME','Test12Tester',[loCaseInsensitive]) then
|
303 |
FUserList.Delete;
|
304 |
FUserList.Active := false;
|
305 |
FUserList.Active := true;
|
306 |
writeln(Outfile,'Updated User List');
|
307 |
PrintDataSet(FUserList);
|
308 |
FUserList.Active := false;
|
309 |
end;
|
310 |
|
311 |
procedure TTest12.DBUpDown;
|
312 |
begin
|
313 |
writeln(OutFile,'Employee Database is Online = ',IsDatabaseOnline(FIBConfigService.DatabaseName));
|
314 |
FIBConfigService.ShutDownDatabase(Forced,0);
|
315 |
writeln(OutFile,'Employee Database is Online = ',IsDatabaseOnline(FIBConfigService.DatabaseName));
|
316 |
FIBConfigService.BringDatabaseOnline;
|
317 |
writeln(OutFile,'Employee Database is Online = ',IsDatabaseOnline(FIBConfigService.DatabaseName));
|
318 |
end;
|
319 |
|
320 |
procedure TTest12.DatabaseSweepDB;
|
321 |
var S: TStringList;
|
322 |
begin
|
323 |
writeln(OutFile,'Database Sweep');
|
324 |
FIBValidationService.Options := [SweepDB];
|
325 |
S := TStringList.Create;
|
326 |
try
|
327 |
FIBValidationService.Execute(S);
|
328 |
WriteStrings(S);
|
329 |
finally
|
330 |
S.Free;
|
331 |
end;
|
332 |
writeln(OutFile,'Database Swept');
|
333 |
end;
|
334 |
|
335 |
procedure TTest12.BackupRestore;
|
336 |
var BackupCount: integer;
|
337 |
S: TStringList;
|
338 |
begin
|
339 |
writeln(OutFile);
|
340 |
writeln(OutFile,'Starting Backup');
|
341 |
FBackupService.BackupToFile(Owner.GetBackupFileName,BackupCount);
|
342 |
writeln(OutFile,Format('Backup Completed - File Size = %d bytes',[BackupCount]));
|
343 |
writeln(OutFile,'Restore Started');
|
344 |
S := TStringList.Create;
|
345 |
try
|
346 |
FRestoreService.RestoreFromFile(Owner.GetBackupFileName,S);
|
347 |
WriteStrings(S);
|
348 |
finally
|
349 |
S.Free;
|
350 |
end;
|
351 |
writeln(Outfile,'Restore Completed');
|
352 |
DeleteFile(Owner.GetBackupFileName);
|
353 |
end;
|
354 |
|
355 |
procedure TTest12.SSBackupRestore;
|
356 |
var S: TStringList;
|
357 |
ServerDatabase: TIBDatabase;
|
358 |
ServerTransaction: TIBTransaction;
|
359 |
ServerQuery: TIBQuery;
|
360 |
begin
|
361 |
writeln(OutFile);
|
362 |
writeln(OutFile,'Starting Server Side Backup');
|
363 |
S := TStringList.Create;
|
364 |
try
|
365 |
FSSBackupService.BackupFiles.Add(GetSSBackupFile);
|
366 |
FSSBackupService.Verbose := true;
|
367 |
FSSBackupService.Execute(S);
|
368 |
WriteStrings(S);
|
369 |
writeln(OutFile,'Backup Completed');
|
370 |
writeln(OutFile,'Restore Started');
|
371 |
FSSRestoreService.BackupFiles.Assign(FSSBackupService.BackupFiles);
|
372 |
FSSRestoreService.Execute(S);
|
373 |
WriteStrings(S);
|
374 |
finally
|
375 |
S.Free;
|
376 |
end;
|
377 |
writeln(Outfile,'Restore Completed');
|
378 |
ServerDatabase := TIBDatabase.Create(Owner);
|
379 |
ServerTransaction := TIBTransaction.Create(Owner);
|
380 |
ServerQuery := TIBQuery.Create(Owner);
|
381 |
try
|
382 |
with FIBXServicesConnection do
|
383 |
ServerDatabase.DatabaseName := MakeConnectString(ServerName,FSSRestoreService.DatabaseFiles[0],Protocol,PortNo);
|
384 |
ServerDatabase.FirebirdLibraryPathName := Owner.ClientLibraryPath;
|
385 |
ServerDatabase.LoginPrompt := false;
|
386 |
ServerDatabase.Params.Assign(IBDatabase.Params);
|
387 |
ServerTransaction.DefaultDatabase := ServerDatabase;
|
388 |
ServerTransaction.Params.Assign(IBTransaction.Params);
|
389 |
ServerDatabase.DefaultTransaction := ServerTransaction;
|
390 |
ServerQuery.Database := ServerDatabase;
|
391 |
ServerQuery.SQL.Text := 'Select * From EMPLOYEE Order by EMP_NO';
|
392 |
ServerDatabase.Connected := true;
|
393 |
try
|
394 |
ServerTransaction.Active := true;
|
395 |
ServerQuery.Active := true;
|
396 |
writeln(OutFile,'Show the EMPLOYEE Table from the restored database');
|
397 |
PrintDataset(ServerQuery);
|
398 |
finally
|
399 |
ServerDatabase.DropDatabase;
|
400 |
end;
|
401 |
finally
|
402 |
ServerQuery.Free;
|
403 |
ServerTransaction.Free;
|
404 |
ServerDatabase.Free;
|
405 |
end;
|
406 |
end;
|
407 |
|
408 |
procedure TTest12.LimboTransactionResolution;
|
409 |
var S: TStrings;
|
410 |
begin
|
411 |
writeln(Outfile,'Show Limbo Transactions');
|
412 |
S := TStringList.Create;
|
413 |
try
|
414 |
FLimboTransactionsList.Active := true;
|
415 |
PrintDataSet(FLimboTransactionsList);
|
416 |
writeln(Outfile,'Call Fix Limbo transactions');
|
417 |
FLimboTransactionsList.FixErrors(CommitGlobal,S);
|
418 |
WriteStrings(S);
|
419 |
finally
|
420 |
S.Free;
|
421 |
end;
|
422 |
end;
|
423 |
|
424 |
procedure TTest12.DatabasePropertiesTests;
|
425 |
begin
|
426 |
writeln(Outfile,'Update properties for ',IBDatabase.DatabaseName);
|
427 |
IBDatabase.Connected := false;
|
428 |
with FIBConfigService do
|
429 |
begin
|
430 |
SetNoLinger;
|
431 |
SetSweepInterval(10000);
|
432 |
SetDBSqlDialect(1);
|
433 |
SetPageBuffers(1024);
|
434 |
SetAsyncMode(true);
|
435 |
SetReserveSpace(false);
|
436 |
SetReadOnly(true);
|
437 |
end;
|
438 |
IBDatabase.Connected := true;
|
439 |
ShowDatabaseProperties;
|
440 |
end;
|
441 |
|
442 |
procedure TTest12.ShowDatabaseProperties;
|
443 |
var Linger,
|
444 |
ForcedWrites,
|
445 |
ReserveSpace: TField;
|
446 |
begin
|
447 |
with FIBDatabaseInfo do
|
448 |
begin
|
449 |
writeln(Outfile,'Database Properties for ',DBFileName );
|
450 |
writeln(OutFile,'ODS Minor Version = ' + IntToStr(ODSMinorVersion));
|
451 |
writeln(OutFile,'ODS Major Version = ' + IntToStr(ODSMajorVersion));
|
452 |
writeln(OutFile,'DB SQLDialect = ' + IntToStr(DBSQLDialect));
|
453 |
writeln(OutFile,'Page Size = ' + IntToStr(PageSize));
|
454 |
writeln(OutFile,'Number of Buffers = ' + IntToStr(NumBuffers));
|
455 |
writeln(OutFile,'Version = ' + Version);
|
456 |
ShowBoolValue(ForcedWrites,'Forced Writes Enabled','Forced Writes Disabled');
|
457 |
writeln(OutFile,'Sweep Interval = ' + IntToStr(SweepInterval));
|
458 |
ShowBoolValue(ReadOnly,'Database is Read Only','Database is Read/Write');
|
459 |
writeln(Outfile,'Database Online = ',IsDatabaseOnline(DBFileName));
|
460 |
writeln(Outfile,'Database is Shadow = ',IsShadowDatabase(DBFileName));
|
461 |
end;
|
462 |
with TIBQuery.Create(nil) do
|
463 |
try
|
464 |
Database := FIBDatabaseInfo.Database;
|
465 |
Transaction := IBTransaction;
|
466 |
Transaction.Active := true;
|
467 |
SQL.Text := 'Select * From RDB$Database, MON$Database';
|
468 |
Active := true;
|
469 |
Linger := FindField('RDB$LINGER');
|
470 |
if Linger <> nil then
|
471 |
begin
|
472 |
if Linger.IsNull then
|
473 |
writeln(Outfile,'Linger = 0')
|
474 |
else
|
475 |
writeln(Outfile,'Linger = ',Linger.AsString);
|
476 |
end
|
477 |
else
|
478 |
writeln(OutFile,'Linger not found');
|
479 |
ForcedWrites := FindField('MON$FORCED_WRITES');
|
480 |
if ForcedWrites <> nil then
|
481 |
ShowBoolValue(ForcedWrites.AsInteger,'Database in Synchronous Mode','Database in Asynchronous Mode')
|
482 |
else
|
483 |
writeln(Outfile,'Sync State unknown');
|
484 |
ReserveSpace := FieldByName('MON$RESERVE_SPACE');
|
485 |
if ReserveSpace <> nil then
|
486 |
writeln(Outfile,'Reserve Space = ',ReserveSpace.AsBoolean)
|
487 |
else
|
488 |
writeln(Outfile,'Reserve Space unknown');
|
489 |
finally
|
490 |
Free
|
491 |
end;
|
492 |
end;
|
493 |
|
494 |
procedure TTest12.CreateShadow;
|
495 |
var ShadowFileName: AnsiString;
|
496 |
begin
|
497 |
ShadowFileName := GetTempFileName;
|
498 |
with TIBSQL.Create(nil) do
|
499 |
try
|
500 |
Database := IBDatabase;
|
501 |
Transaction := IBTransaction;
|
502 |
ReadWriteTransaction;
|
503 |
SQL.Text := 'Create Shadow 1 AUTO ''' + ShadowFileName + '''';
|
504 |
Transaction.Active := true;
|
505 |
ExecQuery;
|
506 |
Transaction.Commit;
|
507 |
finally
|
508 |
Free
|
509 |
end;
|
510 |
FIBShadowDatabase.DatabaseName := MakeConnectString('',ShadowFileName,inet);
|
511 |
end;
|
512 |
|
513 |
procedure TTest12.RemoveShadow;
|
514 |
begin
|
515 |
with TIBSQL.Create(nil) do
|
516 |
try
|
517 |
Database := IBDatabase;
|
518 |
Transaction := IBTransaction;
|
519 |
ReadWriteTransaction;
|
520 |
SQL.Text := 'Drop Shadow 1 PRESERVE FILE';
|
521 |
Transaction.Active := true;
|
522 |
ExecQuery;
|
523 |
Transaction.Commit;
|
524 |
finally
|
525 |
Free
|
526 |
end;
|
527 |
end;
|
528 |
|
529 |
procedure TTest12.ShowShadowFiles;
|
530 |
var Qry: TIBQuery;
|
531 |
begin
|
532 |
Qry := TIBQuery.Create(nil);
|
533 |
with Qry do
|
534 |
try
|
535 |
Database := IBDatabase;
|
536 |
Transaction := IBTransaction;
|
537 |
SQl.Text := 'Select * From RDB$Files Where RDB$Shadow_Number <> 0 '+
|
538 |
'Order by RDB$Shadow_Number, RDB$FILE_SEQUENCE';
|
539 |
Transaction.Active := true;
|
540 |
Active := true;
|
541 |
writeln(Outfile,'Shadow Files');
|
542 |
PrintDataSet(Qry);
|
543 |
Transaction.Commit;
|
544 |
finally
|
545 |
Free
|
546 |
end;
|
547 |
end;
|
548 |
|
549 |
procedure TTest12.ActivateShadow;
|
550 |
begin
|
551 |
FIBConfigService.DatabaseName := FIBShadowDatabase.DatabaseName;
|
552 |
writeln(Outfile,'Activating Shadow');
|
553 |
FIBConfigService.ActivateShadow;
|
554 |
end;
|
555 |
|
556 |
procedure TTest12.CreateObjects(Application: TTestApplication);
|
557 |
begin
|
558 |
inherited CreateObjects(Application);
|
559 |
FIBXServicesConnection := TIBXServicesConnection.Create(Application);
|
560 |
FIBConfigService := TIBXConfigService.Create(Application);
|
561 |
FIBConfigService.ServicesConnection := FIBXServicesConnection;
|
562 |
FIBLogService := TIBXLogService.Create(Application);
|
563 |
FIBLogService.ServicesConnection := FIBXServicesConnection;
|
564 |
FIBOnlineValidationService := TIBXOnlineValidationService.Create(Application);
|
565 |
FIBOnlineValidationService.ServicesConnection := FIBXServicesConnection;
|
566 |
FIBServerProperties := TIBXServerProperties.Create(Application);
|
567 |
FIBServerProperties.ServicesConnection := FIBXServicesConnection;
|
568 |
FIBStatisticalService := TIBXStatisticalService.Create(Application);
|
569 |
FIBStatisticalService.ServicesConnection := FIBXServicesConnection;
|
570 |
FIBValidationService := TIBXValidationService.Create(Application);
|
571 |
FIBValidationService.ServicesConnection := FIBXServicesConnection;
|
572 |
FIBXSecurityService := TIBXSecurityService.Create(Application);
|
573 |
FIBXSecurityService.ServicesConnection := FIBXServicesConnection;
|
574 |
FUserList := TIBXServicesUserList.Create(Application);
|
575 |
FUserList.Source := FIBXSecurityService;
|
576 |
FBackupService := TIBXClientSideBackupService.Create(Application);
|
577 |
FBackupService.ServicesConnection := FIBXServicesConnection;
|
578 |
FRestoreService := TIBXClientSideRestoreService.Create(Application);
|
579 |
FRestoreService.ServicesConnection := FIBXServicesConnection;
|
580 |
FSSBackupService := TIBXServerSideBackupService.Create(Application);
|
581 |
FSSBackupService.ServicesConnection := FIBXServicesConnection;
|
582 |
FSSRestoreService := TIBXServerSideRestoreService.Create(Application);
|
583 |
FSSRestoreService.ServicesConnection := FIBXServicesConnection;
|
584 |
FLimboTransResolutionService := TIBXLimboTransactionResolutionService.Create(Application);
|
585 |
FLimboTransResolutionService.ServicesConnection := FIBXServicesConnection;
|
586 |
FLimboTransactionsList := TIBXServicesLimboTransactionsList.Create(Application);
|
587 |
FLimboTransactionsList.Source := FLimboTransResolutionService;
|
588 |
FIBDatabaseInfo := TIBDatabaseInfo.Create(Application);
|
589 |
FIBShadowDatabase := TIBDatabase.Create(Application);
|
590 |
end;
|
591 |
|
592 |
function TTest12.GetTestID: AnsiString;
|
593 |
begin
|
594 |
Result := aTestID;
|
595 |
end;
|
596 |
|
597 |
function TTest12.GetTestTitle: AnsiString;
|
598 |
begin
|
599 |
Result := aTestTitle;
|
600 |
end;
|
601 |
|
602 |
procedure TTest12.InitTest;
|
603 |
begin
|
604 |
IBDatabase.DatabaseName := Owner.GetNewDatabaseName;
|
605 |
IBQuery.SQL.Text := 'Select * From EMPLOYEE Order by EMP_NO';
|
606 |
FIBXServicesConnection.ServerName := Owner.Server;
|
607 |
FIBXServicesConnection.Protocol := TCP;
|
608 |
FIBXServicesConnection.PortNo := Owner.PortNo;
|
609 |
FIBXServicesConnection.Params.Values['user_name'] := Owner.GetUserName;
|
610 |
FIBXServicesConnection.Params.Values['password'] := Owner.GetPassword;
|
611 |
FIBXServicesConnection.FirebirdLibraryPathName := Owner.ClientLibraryPath;
|
612 |
FIBStatisticalService.Options := [DataPages];
|
613 |
FIBStatisticalService.DatabaseName := ExtractDBName(Owner.GetEmployeeDatabaseName);
|
614 |
FIBOnlineValidationService.DatabaseName := ExtractDBName(Owner.GetEmployeeDatabaseName);
|
615 |
FIBValidationService.DatabaseName := ExtractDBName(Owner.GetEmployeeDatabaseName);
|
616 |
FIBConfigService.DatabaseName := ExtractDBName(Owner.GetEmployeeDatabaseName);
|
617 |
FBackupService.DatabaseName := ExtractDBName(Owner.GetEmployeeDatabaseName);
|
618 |
FBackupService.Options := [IgnoreLimbo];
|
619 |
FRestoreService.DatabaseFiles.Add(ExtractDBName(Owner.GetNewDatabaseName));
|
620 |
FRestoreService.StatisticsRequested := [bsTotalTime];
|
621 |
FSSBackupService.DatabaseName := ExtractDBName(Owner.GetEmployeeDatabaseName);
|
622 |
FSSBackupService.Options := [IgnoreLimbo];
|
623 |
FSSRestoreService.DatabaseFiles.Add(ExtractDBName(Owner.GetNewDatabaseName));
|
624 |
FSSRestoreService.StatisticsRequested := [bsTotalTime];
|
625 |
FLimboTransResolutionService.DatabaseName := ExtractDBName(Owner.GetEmployeeDatabaseName);
|
626 |
FIBDatabaseInfo.Database := IBDatabase;
|
627 |
ReadOnlyTransaction;
|
628 |
FIBShadowDatabase.Params.Assign(IBDatabase.Params);
|
629 |
end;
|
630 |
|
631 |
procedure TTest12.ProcessResults;
|
632 |
begin
|
633 |
inherited ProcessResults;
|
634 |
FIBShadowDatabase.Connected := false;
|
635 |
FIBXServicesConnection.Connected := false;
|
636 |
end;
|
637 |
|
638 |
destructor TTest12.Destroy;
|
639 |
begin
|
640 |
if FIBShadowDatabase <> nil then
|
641 |
FIBShadowDatabase.Connected := false;
|
642 |
if FIBXServicesConnection <> nil then
|
643 |
FIBXServicesConnection.Connected := false;
|
644 |
inherited Destroy;
|
645 |
end;
|
646 |
|
647 |
procedure TTest12.RunTest(CharSet: AnsiString; SQLDialect: integer);
|
648 |
begin
|
649 |
FIBXServicesConnection.Connected := true;
|
650 |
try
|
651 |
ShowServerProperties;
|
652 |
ShowStatistics;
|
653 |
ShowServerLog;
|
654 |
ValidateDatabase;
|
655 |
DatabaseSweepDB;
|
656 |
UserListHandling;
|
657 |
DBUpDown;
|
658 |
BackupRestore;
|
659 |
writeln(OutFile,'Show the EMPLOYEE Table from the restored database');
|
660 |
IBDatabase.Connected := true;
|
661 |
try
|
662 |
IBTransaction.Active := true;
|
663 |
IBQuery.Active := true;
|
664 |
PrintDataset(IBQuery);
|
665 |
finally
|
666 |
IBDatabase.DropDatabase;
|
667 |
end;
|
668 |
SSBackupRestore;
|
669 |
exit;
|
670 |
LimboTransactionResolution;
|
671 |
IBDatabase.DatabaseName := Owner.GetNewDatabaseName;
|
672 |
FIBConfigService.DatabaseName := IBDatabase.DatabaseName;
|
673 |
FIBXServicesConnection.Connected := false;
|
674 |
writeln(Outfile,'Creating an empty database ',IBDatabase.DatabaseName);
|
675 |
IBDatabase.CreateDatabase;
|
676 |
try
|
677 |
FIBXServicesConnection.Connected := true;
|
678 |
ShowDatabaseProperties;
|
679 |
DatabasePropertiesTests;
|
680 |
finally
|
681 |
IBDatabase.DropDatabase;
|
682 |
end;
|
683 |
writeln(Outfile,'Create and activate a shadow file');
|
684 |
IBDatabase.CreateDatabase;
|
685 |
try
|
686 |
CreateShadow;
|
687 |
ShowShadowFiles;
|
688 |
RemoveShadow;
|
689 |
IBDatabase.Connected := false;
|
690 |
writeln(Outfile,FIBShadowDatabase.DatabaseName,' Is Shadow Database = ',IsShadowDatabase(FIBShadowDatabase.DatabaseName));
|
691 |
ActivateShadow;
|
692 |
writeln(Outfile,FIBShadowDatabase.DatabaseName,' Is Shadow Database = ',IsShadowDatabase(FIBShadowDatabase.DatabaseName));
|
693 |
finally
|
694 |
IBDatabase.DropDatabase;
|
695 |
FIBShadowDatabase.DropDatabase;
|
696 |
end;
|
697 |
finally
|
698 |
FIBXServicesConnection.Connected := false;
|
699 |
end;
|
700 |
end;
|
701 |
|
702 |
initialization
|
703 |
RegisterTest(TTest12);
|
704 |
|
705 |
end.
|
706 |
|