ViewVC Help
View File | Revision Log | Show Annotations | Download File | View Changeset | Root Listing
root/public/ibx/trunk/runtime/IBServices.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: 60346 byte(s)
Log Message:
Fixes merged into public release

File Contents

# Content
1 {************************************************************************}
2 { }
3 { Borland Delphi Visual Component Library }
4 { InterBase Express core components }
5 { }
6 { Copyright (c) 1998-2000 Inprise Corporation }
7 { }
8 { InterBase Express is based in part on the product }
9 { Free IB Components, written by Gregory H. Deatz for }
10 { Hoagland, Longo, Moran, Dunst & Doukas Company. }
11 { Free IB Components is used under license. }
12 { }
13 { The contents of this file are subject to the InterBase }
14 { Public License Version 1.0 (the "License"); you may not }
15 { use this file except in compliance with the License. You }
16 { may obtain a copy of the License at http://www.Inprise.com/IPL.html }
17 { Software distributed under the License is distributed on }
18 { an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either }
19 { express or implied. See the License for the specific language }
20 { governing rights and limitations under the License. }
21 { The Original Code was created by InterBase Software Corporation }
22 { and its successors. }
23 { Portions created by Inprise Corporation are Copyright (C) Inprise }
24 { Corporation. All Rights Reserved. }
25 { Contributor(s): Jeff Overcash }
26 { }
27 { IBX For Lazarus (Firebird Express) }
28 { Contributor: Tony Whyman, MWA Software http://www.mwasoftware.co.uk }
29 { Portions created by MWA Software are copyright McCallum Whyman }
30 { Associates Ltd 2011 }
31 { }
32 {************************************************************************}
33
34 {
35 InterBase Express provides component interfaces to
36 functions introduced in InterBase 6.0. The Services
37 components (TIB*Service, TIBServerProperties)
38 function only if you have installed InterBase 6.0 or
39 later software, including Firebird
40 }
41
42 unit IBServices;
43
44 {$Mode Delphi}
45 {$codepage UTF8}
46
47 interface
48
49 uses
50 {$IFDEF WINDOWS }
51 Windows,
52 {$ELSE}
53 unix,
54 {$ENDIF}
55 SysUtils, Classes, IBHeader, IB, IBExternals, CustApp, IBTypes, IBSQL;
56
57 const
58 DefaultBufferSize = 32000;
59
60 SPBPrefix = 'isc_spb_';
61 isc_spb_last_spb_constant = 12;
62 SPBConstantNames: array[1..isc_spb_last_spb_constant] of String = (
63 'user_name',
64 'sys_user_name',
65 'sys_user_name_enc',
66 'password',
67 'password_enc',
68 'command_line',
69 'db_name',
70 'verbose',
71 'options',
72 'connect_timeout',
73 'dummy_packet_interval',
74 'sql_role_name'
75 );
76
77 SPBConstantValues: array[1..isc_spb_last_spb_constant] of Integer = (
78 isc_spb_user_name,
79 isc_spb_sys_user_name,
80 isc_spb_sys_user_name_enc,
81 isc_spb_password,
82 isc_spb_password_enc,
83 isc_spb_command_line,
84 isc_spb_dbname,
85 isc_spb_verbose,
86 isc_spb_options,
87 isc_spb_connect_timeout,
88 isc_spb_dummy_packet_interval,
89 isc_spb_sql_role_name
90 );
91
92 type
93 TOutputBufferOption = (ByLine, ByChunk);
94
95 TIBCustomService = class;
96
97 TLoginEvent = procedure(Database: TIBCustomService;
98 LoginParams: TStrings) of object;
99
100 { TIBCustomService }
101
102 TIBCustomService = class(TComponent)
103 private
104 FParamsChanged : Boolean;
105 FSPB : ISPB;
106 FSRB: ISRB;
107 FSQPB: ISQPB;
108 FTraceFlags: TTraceFlags;
109 FOnLogin: TLoginEvent;
110 FLoginPrompt: Boolean;
111 FServerName: string;
112 FService: IServiceManager;
113 FStreamedActive : Boolean;
114 FOnAttach: TNotifyEvent;
115 FProtocol: TProtocol;
116 FParams: TStrings;
117 FServiceQueryResults: IServiceQueryResults;
118 function GetActive: Boolean;
119 function GetServiceParamBySPB(const Idx: Integer): String;
120 function GetSQPB: ISQPB;
121 function GetSRB: ISRB;
122 procedure SetActive(const Value: Boolean);
123 procedure SetParams(const Value: TStrings);
124 procedure SetServerName(const Value: string);
125 procedure SetProtocol(const Value: TProtocol);
126 procedure SetService(AValue: IServiceManager);
127 procedure SetServiceParamBySPB(const Idx: Integer;
128 const Value: String);
129 function IndexOfSPBConst(action: byte): Integer;
130 function GetSPBConstName(action: byte): string;
131 procedure ParamsChange(Sender: TObject);
132 procedure ParamsChanging(Sender: TObject);
133 procedure CheckServerName;
134 function GenerateSPB(sl: TStrings): ISPB;
135
136 protected
137 procedure Loaded; override;
138 function Login(var aServerName: string): Boolean;
139 procedure CheckActive;
140 procedure CheckInactive;
141 procedure HandleException(Sender: TObject);
142 procedure InternalServiceQuery;
143 property SRB: ISRB read GetSRB;
144 property SQPB: ISQPB read GetSQPB;
145 property ServiceQueryResults: IServiceQueryResults read FServiceQueryResults;
146
147 public
148 constructor Create(AOwner: TComponent); override;
149 destructor Destroy; override;
150 procedure Attach;
151 procedure Detach;
152
153 {Copies database parameters as give in the DBParams to the Service
154 omitting any parameters not appropriate for TIBService. Typically, the
155 DBParams are TIBDatabase.Params}
156 procedure SetDBParams(DBParams: TStrings);
157
158 property ServiceIntf: IServiceManager read FService write SetService;
159 property ServiceParamBySPB[const Idx: Integer]: String read GetServiceParamBySPB
160 write SetServiceParamBySPB;
161 published
162 property Active: Boolean read GetActive write SetActive default False;
163 property ServerName: string read FServerName write SetServerName;
164 property Protocol: TProtocol read FProtocol write SetProtocol default Local;
165 property Params: TStrings read FParams write SetParams;
166 property LoginPrompt: Boolean read FLoginPrompt write FLoginPrompt default True;
167 property TraceFlags: TTraceFlags read FTraceFlags write FTraceFlags;
168 property OnAttach: TNotifyEvent read FOnAttach write FOnAttach;
169 property OnLogin: TLoginEvent read FOnLogin write FOnLogin;
170 end;
171
172 TDatabaseInfo = class
173 public
174 NoOfAttachments: Integer;
175 NoOfDatabases: Integer;
176 DbName: array of string;
177 constructor Create;
178 destructor Destroy; override;
179 end;
180
181 TLicenseInfo = class
182 public
183 Key: array of string;
184 Id: array of string;
185 Desc: array of string;
186 LicensedUsers: Integer;
187 constructor Create;
188 destructor Destroy; override;
189 end;
190
191 TLicenseMaskInfo = class
192 public
193 LicenseMask: Integer;
194 CapabilityMask: Integer;
195 end;
196
197 TConfigFileData = class
198 public
199 ConfigFileValue: array of integer;
200 ConfigFileKey: array of integer;
201 constructor Create;
202 destructor Destroy; override;
203 end;
204
205 TConfigParams = class
206 public
207 ConfigFileData: TConfigFileData;
208 ConfigFileParams: array of string;
209 BaseLocation: string;
210 LockFileLocation: string;
211 MessageFileLocation: string;
212 SecurityDatabaseLocation: string;
213 constructor Create;
214 destructor Destroy; override;
215 end;
216
217 TVersionInfo = class
218 ServerVersion: String;
219 ServerImplementation: string;
220 ServiceVersion: Integer;
221 end;
222
223 TPropertyOption = (Database, License, LicenseMask, ConfigParameters, Version);
224 TPropertyOptions = set of TPropertyOption;
225
226 TIBServerProperties = class(TIBCustomService)
227 private
228 FOptions: TPropertyOptions;
229 FDatabaseInfo: TDatabaseInfo;
230 FLicenseInfo: TLicenseInfo;
231 FLicenseMaskInfo: TLicenseMaskInfo;
232 FVersionInfo: TVersionInfo;
233 FConfigParams: TConfigParams;
234 public
235 constructor Create(AOwner: TComponent); override;
236 destructor Destroy; override;
237 procedure Fetch;
238 procedure FetchDatabaseInfo;
239 procedure FetchLicenseInfo;
240 procedure FetchLicenseMaskInfo;
241 procedure FetchConfigParams;
242 procedure FetchVersionInfo;
243 property DatabaseInfo: TDatabaseInfo read FDatabaseInfo;
244 property LicenseInfo: TLicenseInfo read FLicenseInfo;
245 property LicenseMaskInfo: TLicenseMaskInfo read FLicenseMaskInfo;
246 property VersionInfo: TVersionInfo read FVersionInfo;
247 property ConfigParams: TConfigParams read FConfigParams;
248 published
249 property Options : TPropertyOptions read FOptions write FOptions;
250 end;
251
252 { TIBControlService }
253
254 TIBControlService = class (TIBCustomService)
255 private
256 function GetIsServiceRunning: Boolean;
257 protected
258 procedure CheckServiceNotRunning;
259 procedure InternalServiceStart;
260 procedure SetServiceStartOptions; virtual;
261
262 public
263 constructor Create(AOwner: TComponent); override;
264 procedure ServiceStart; virtual;
265 property IsServiceRunning : Boolean read GetIsServiceRunning;
266 end;
267
268 { TIBControlAndQueryService }
269
270 TIBControlAndQueryService = class (TIBControlService)
271 private
272 FEof: Boolean;
273 FAction: Integer;
274 procedure SetAction(Value: Integer);
275 protected
276 property Action: Integer read FAction write SetAction;
277 public
278 constructor create (AOwner: TComponent); override;
279 function GetNextLine : String;
280 function GetNextChunk : String;
281 function WriteNextChunk(stream: TStream): integer;
282 property Eof: boolean read FEof;
283 end;
284
285 TShutdownMode = (Forced, DenyTransaction, DenyAttachment);
286
287 TIBConfigService = class(TIBControlService)
288 private
289 FDatabaseName: string;
290 procedure SetDatabaseName(const Value: string);
291 protected
292
293 public
294 procedure ServiceStart; override;
295 procedure ShutdownDatabase (Options: TShutdownMode; Wait: Integer);
296 procedure SetSweepInterval (Value: Integer);
297 procedure SetDBSqlDialect (Value: Integer);
298 procedure SetPageBuffers (Value: Integer);
299 procedure ActivateShadow;
300 procedure BringDatabaseOnline;
301 procedure SetReserveSpace (Value: Boolean);
302 procedure SetAsyncMode (Value: Boolean);
303 procedure SetReadOnly (Value: Boolean);
304 published
305 property DatabaseName: string read FDatabaseName write SetDatabaseName;
306 end;
307
308 TIBLogService = class(TIBControlAndQueryService)
309 private
310
311 protected
312 procedure SetServiceStartOptions; override;
313 public
314 published
315 end;
316
317 TStatOption = (DataPages, {DbLog,} HeaderPages, IndexPages, SystemRelations);
318 TStatOptions = set of TStatOption;
319
320 TIBStatisticalService = class(TIBControlAndQueryService)
321 private
322 FDatabaseName: string;
323 FOptions: TStatOptions;
324 procedure SetDatabaseName(const Value: string);
325 protected
326 procedure SetServiceStartOptions; override;
327 public
328 published
329 property DatabaseName: string read FDatabaseName write SetDatabaseName;
330 property Options : TStatOptions read FOptions write FOptions;
331 end;
332
333 TBackupLocation = (flServerSide,flClientSide);
334
335 { TIBBackupRestoreService }
336
337 TIBBackupRestoreService = class(TIBControlAndQueryService)
338 private
339 FBackupFileLocation: TBackupLocation;
340 FVerbose: Boolean;
341 protected
342 public
343 constructor Create(AOwner: TComponent); override;
344 published
345 property Verbose : Boolean read FVerbose write FVerbose default False;
346 property BackupFileLocation: TBackupLocation read FBackupFileLocation
347 write FBackupFileLocation default flServerSide;
348 end;
349
350 TBackupOption = (IgnoreChecksums, IgnoreLimbo, MetadataOnly, NoGarbageCollection,
351 OldMetadataDesc, NonTransportable, ConvertExtTables);
352 TBackupOptions = set of TBackupOption;
353
354 TIBBackupService = class (TIBBackupRestoreService)
355 private
356 FDatabaseName: string;
357 FOptions: TBackupOptions;
358 FBackupFile: TStrings;
359 FBlockingFactor: Integer;
360 procedure SetBackupFile(const Value: TStrings);
361 protected
362 procedure SetServiceStartOptions; override;
363 public
364 constructor Create(AOwner: TComponent); override;
365 destructor Destroy; override;
366
367 published
368 { a name=value pair of filename and length }
369 property BackupFile: TStrings read FBackupFile write SetBackupFile;
370 property BlockingFactor: Integer read FBlockingFactor write FBlockingFactor;
371 property DatabaseName: string read FDatabaseName write FDatabaseName;
372 property Options : TBackupOptions read FOptions write FOptions;
373 end;
374
375 TRestoreOption = (DeactivateIndexes, NoShadow, NoValidityCheck, OneRelationAtATime,
376 Replace, CreateNewDB, UseAllSpace);
377
378 TRestoreOptions = set of TRestoreOption;
379
380 { TIBRestoreService }
381
382 TIBRestoreService = class (TIBBackupRestoreService)
383 private
384 FDatabaseName: TStrings;
385 FBackupFile: TStrings;
386 FOptions: TRestoreOptions;
387 FPageSize: Integer;
388 FPageBuffers: Integer;
389 FSendBytes: integer;
390 procedure SetBackupFile(const Value: TStrings);
391 procedure SetDatabaseName(const Value: TStrings);
392 protected
393 procedure SetServiceStartOptions; override;
394 public
395 constructor Create(AOwner: TComponent); override;
396 destructor Destroy; override;
397 function SendNextChunk(stream: TStream; var line: String): integer;
398 published
399 { a name=value pair of filename and length }
400 property DatabaseName: TStrings read FDatabaseName write SetDatabaseName;
401 property BackupFile: TStrings read FBackupFile write SetBackupFile;
402 property PageSize: Integer read FPageSize write FPageSize;
403 property PageBuffers: Integer read FPageBuffers write FPageBuffers;
404 property Options : TRestoreOptions read FOptions write FOptions default [CreateNewDB];
405 end;
406
407 TValidateOption = (LimboTransactions, CheckDB, IgnoreChecksum, KillShadows, MendDB,
408 SweepDB, ValidateDB, ValidateFull);
409 TValidateOptions = set of TValidateOption;
410
411 TTransactionGlobalAction = (CommitGlobal, RollbackGlobal, RecoverTwoPhaseGlobal,
412 NoGlobalAction);
413 TTransactionState = (LimboState, CommitState, RollbackState, UnknownState);
414 TTransactionAdvise = (CommitAdvise, RollbackAdvise, UnknownAdvise);
415 TTransactionAction = (CommitAction, RollbackAction);
416
417 TLimboTransactionInfo = class
418 public
419 MultiDatabase: Boolean;
420 ID: Integer;
421 HostSite: String;
422 RemoteSite: String;
423 RemoteDatabasePath: String;
424 State: TTransactionState;
425 Advise: TTransactionAdvise;
426 Action: TTransactionAction;
427 end;
428
429 TIBValidationService = class(TIBControlAndQueryService)
430 private
431 FDatabaseName: string;
432 FOptions: TValidateOptions;
433 FLimboTransactionInfo: array of TLimboTransactionInfo;
434 FGlobalAction: TTransactionGlobalAction;
435 procedure SetDatabaseName(const Value: string);
436 function GetLimboTransactionInfo(index: integer): TLimboTransactionInfo;
437 function GetLimboTransactionInfoCount: integer;
438
439 protected
440 procedure SetServiceStartOptions; override;
441 public
442 constructor Create(AOwner: TComponent); override;
443 destructor Destroy; override;
444 procedure FetchLimboTransactionInfo;
445 procedure FixLimboTransactionErrors;
446 property LimboTransactionInfo[Index: integer]: TLimboTransactionInfo read GetLimboTransactionInfo;
447 property LimboTransactionInfoCount: Integer read GetLimboTransactionInfoCount;
448
449 published
450 property DatabaseName: string read FDatabaseName write SetDatabaseName;
451 property Options: TValidateOptions read FOptions write FOptions;
452 property GlobalAction: TTransactionGlobalAction read FGlobalAction
453 write FGlobalAction;
454 end;
455
456 TUserInfo = class
457 public
458 UserName: string;
459 FirstName: string;
460 MiddleName: string;
461 LastName: string;
462 GroupID: Integer;
463 UserID: Integer;
464 end;
465
466 TSecurityAction = (ActionAddUser, ActionDeleteUser, ActionModifyUser, ActionDisplayUser);
467 TSecurityModifyParam = (ModifyFirstName, ModifyMiddleName, ModifyLastName, ModifyUserId,
468 ModifyGroupId, ModifyPassword);
469 TSecurityModifyParams = set of TSecurityModifyParam;
470
471 TIBSecurityService = class(TIBControlAndQueryService)
472 private
473 FUserID: Integer;
474 FGroupID: Integer;
475 FFirstName: string;
476 FUserName: string;
477 FPassword: string;
478 FSQLRole: string;
479 FLastName: string;
480 FMiddleName: string;
481 FUserInfo: array of TUserInfo;
482 FSecurityAction: TSecurityAction;
483 FModifyParams: TSecurityModifyParams;
484 procedure ClearParams;
485 procedure SetSecurityAction (Value: TSecurityAction);
486 procedure SetFirstName (Value: String);
487 procedure SetMiddleName (Value: String);
488 procedure SetLastName (Value: String);
489 procedure SetPassword (Value: String);
490 procedure SetUserId (Value: Integer);
491 procedure SetGroupId (Value: Integer);
492
493 procedure FetchUserInfo;
494 function GetUserInfo(Index: Integer): TUserInfo;
495 function GetUserInfoCount: Integer;
496
497 protected
498 procedure Loaded; override;
499 procedure SetServiceStartOptions; override;
500 public
501 constructor Create(AOwner: TComponent); override;
502 destructor Destroy; override;
503 procedure DisplayUsers;
504 procedure DisplayUser(UserName: string);
505 procedure AddUser;
506 procedure DeleteUser;
507 procedure ModifyUser;
508 property UserInfo[Index: Integer]: TUserInfo read GetUserInfo;
509 property UserInfoCount: Integer read GetUserInfoCount;
510
511 published
512 property SecurityAction: TSecurityAction read FSecurityAction
513 write SetSecurityAction;
514 property SQlRole : string read FSQLRole write FSQLrole;
515 property UserName : string read FUserName write FUserName;
516 property FirstName : string read FFirstName write SetFirstName;
517 property MiddleName : string read FMiddleName write SetMiddleName;
518 property LastName : string read FLastName write SetLastName;
519 property UserID : Integer read FUserID write SetUserID;
520 property GroupID : Integer read FGroupID write SetGroupID;
521 property Password : string read FPassword write setPassword;
522 end;
523
524
525 implementation
526
527 uses
528 IBSQLMonitor, Math, FBMessages;
529
530 { TIBBackupRestoreService }
531
532 constructor TIBBackupRestoreService.Create(AOwner: TComponent);
533 begin
534 inherited Create(AOwner);
535 FBackupFileLocation := flServerSide;
536 end;
537
538 { TIBCustomService }
539
540 procedure TIBCustomService.Attach;
541 var aServerName: string;
542 begin
543 CheckInactive;
544 CheckServerName;
545
546 aServerName := FServerName;
547
548 if FLoginPrompt and not Login(aServerName) then
549 IBError(ibxeOperationCancelled, [nil]);
550
551 { Generate a new SPB if necessary }
552 if FParamsChanged then
553 begin
554 FParamsChanged := False;
555 FSPB := GenerateSPB(FParams);
556 end;
557
558 FService := FirebirdAPI.GetServiceManager(aServerName,FProtocol,FSPB);
559
560 if Assigned(FOnAttach) then
561 FOnAttach(Self);
562
563 MonitorHook.ServiceAttach(Self);
564 end;
565
566 procedure TIBCustomService.Loaded;
567 begin
568 inherited Loaded;
569 try
570 if FStreamedActive and (not Active) then
571 Attach;
572 except
573 if csDesigning in ComponentState then
574 HandleException(self)
575 else
576 raise;
577 end;
578 end;
579
580 function TIBCustomService.Login(var aServerName: string): Boolean;
581 var
582 IndexOfUser, IndexOfPassword: Integer;
583 Username, Password: String;
584 LoginParams: TStrings;
585 begin
586 if Assigned(FOnLogin) then begin
587 result := True;
588 LoginParams := TStringList.Create;
589 try
590 LoginParams.Assign(Params);
591 FOnLogin(Self, LoginParams);
592 Params.Assign (LoginParams);
593 aServerName := ServerName;
594 finally
595 LoginParams.Free;
596 end;
597 end
598 else
599 if assigned(IBGUIInterface) then
600 begin
601 IndexOfUser := IndexOfSPBConst(isc_spb_user_name);
602 if IndexOfUser <> -1 then
603 Username := Copy(Params[IndexOfUser],
604 Pos('=', Params[IndexOfUser]) + 1, {mbcs ok}
605 Length(Params[IndexOfUser]));
606 IndexOfPassword := IndexOfSPBConst(isc_spb_password);
607 if IndexOfPassword <> -1 then
608 Password := Copy(Params[IndexOfPassword],
609 Pos('=', Params[IndexOfPassword]) + 1, {mbcs ok}
610 Length(Params[IndexOfPassword]));
611 result := IBGUIInterface.ServerLoginDialog(aServerName, Username, Password);
612 if result then
613 begin
614 IndexOfPassword := IndexOfSPBConst(isc_spb_password);
615 if IndexOfUser = -1 then
616 Params.Add(GetSPBConstName(isc_spb_user_name) + '=' + Username)
617 else
618 Params[IndexOfUser] := GetSPBConstName(isc_spb_user_name) +
619 '=' + Username;
620 if IndexOfPassword = -1 then
621 Params.Add(GetSPBConstName(isc_spb_password) + '=' + Password)
622 else
623 Params[IndexOfPassword] := GetSPBConstName(isc_spb_password) +
624 '=' + Password;
625 end
626 end
627 else
628 IBError(ibxeNoLoginDialog,[]);
629 end;
630
631 procedure TIBCustomService.CheckActive;
632 begin
633 if FStreamedActive and (not Active) then
634 Loaded;
635 if FService = nil then
636 IBError(ibxeServiceActive, [nil]);
637 end;
638
639 procedure TIBCustomService.CheckInactive;
640 begin
641 if FService <> nil then
642 IBError(ibxeServiceInActive, [nil]);
643 end;
644
645 procedure TIBCustomService.HandleException(Sender: TObject);
646 var aParent: TComponent;
647 begin
648 aParent := Owner;
649 while aParent <> nil do
650 begin
651 if aParent is TCustomApplication then
652 begin
653 TCustomApplication(aParent).HandleException(Sender);
654 Exit;
655 end;
656 aParent := aParent.Owner;
657 end;
658 SysUtils.ShowException(ExceptObject,ExceptAddr);
659 end;
660
661 constructor TIBCustomService.Create(AOwner: TComponent);
662 begin
663 inherited Create(AOwner);
664 FserverName := '';
665 FParams := TStringList.Create;
666 FParamsChanged := True;
667 TStringList(FParams).OnChange := ParamsChange;
668 TStringList(FParams).OnChanging := ParamsChanging;
669 FLoginPrompt := True;
670 FTraceFlags := [];
671 FService := nil;
672 FSRB := nil;
673 FSPB := nil;
674 FServiceQueryResults := nil;
675 FProtocol := Local;
676 if (AOwner <> nil) and
677 (AOwner is TCustomApplication) and
678 TCustomApplication(AOwner).ConsoleApplication then
679 LoginPrompt := false;
680 end;
681
682 destructor TIBCustomService.Destroy;
683 begin
684 if FService <> nil then
685 Detach;
686 FSRB := nil;
687 FSPB := nil;
688 FParams.Free;
689 FServiceQueryResults := nil;
690 inherited Destroy;
691 end;
692
693 procedure TIBCustomService.Detach;
694 begin
695 CheckActive;
696 FService.Detach;
697 FService := nil;
698 MonitorHook.ServiceDetach(Self);
699 end;
700
701 procedure TIBCustomService.SetDBParams(DBParams: TStrings);
702 var i: integer;
703 j: integer;
704 k: integer;
705 ParamName: string;
706 begin
707 Params.Clear;
708 for i := 0 to DBParams.Count - 1 do
709 begin
710 ParamName := DBParams[i];
711 k := Pos('=',ParamName);
712 if k > 0 then system.Delete(ParamName,k,Length(ParamName)-k+1);
713 for j := 1 to isc_spb_last_spb_constant do
714 if ParamName = SPBConstantNames[j] then
715 begin
716 Params.Add(DBParams[i]);
717 break;
718 end;
719 end;
720 end;
721
722 function TIBCustomService.GetActive: Boolean;
723 begin
724 result := FService <> nil;
725 end;
726
727 function TIBCustomService.GetServiceParamBySPB(const Idx: Integer): String;
728 var
729 ConstIdx, EqualsIdx: Integer;
730 begin
731 if (Idx > 0) and (Idx <= isc_spb_last_spb_constant) then
732 begin
733 ConstIdx := IndexOfSPBConst(Idx);
734 if ConstIdx = -1 then
735 result := ''
736 else
737 begin
738 result := Params[ConstIdx];
739 EqualsIdx := Pos('=', result); {mbcs ok}
740 if EqualsIdx = 0 then
741 result := ''
742 else
743 result := Copy(result, EqualsIdx + 1, Length(result));
744 end;
745 end
746 else
747 result := '';
748 end;
749
750 function TIBCustomService.GetSQPB: ISQPB;
751 begin
752 CheckActive;
753 if FSQPB = nil then
754 FSQPB := FService.AllocateSQPB;
755 Result := FSQPB;
756 end;
757
758 function TIBCustomService.GetSRB: ISRB;
759 begin
760 CheckActive;
761 if FSRB = nil then
762 FSRB := FService.AllocateSRB;
763 Result := FSRB;
764 end;
765
766 procedure TIBCustomService.InternalServiceQuery;
767 begin
768 CheckActive;
769 FServiceQueryResults := FService.Query(FSQPB,FSRB);
770 FSQPB := nil;
771 FSRB := nil;
772 MonitorHook.ServiceQuery(Self);
773 end;
774
775 procedure TIBCustomService.SetActive(const Value: Boolean);
776 begin
777 if csReading in ComponentState then
778 FStreamedActive := Value
779 else
780 if Value <> Active then
781 begin
782 if Value then
783 Attach
784 else
785 Detach;
786 end
787 else if Value then
788 begin
789 FService.Detach;
790 FService.Attach;
791 end;
792 end;
793
794 procedure TIBCustomService.SetParams(const Value: TStrings);
795 begin
796 FParams.Assign(Value);
797 end;
798
799 procedure TIBCustomService.SetServerName(const Value: string);
800 begin
801 if FServerName <> Value then
802 begin
803 CheckInactive;
804 FServerName := Value;
805 end;
806 end;
807
808 procedure TIBCustomService.SetProtocol(const Value: TProtocol);
809 begin
810 if FProtocol <> Value then
811 begin
812 CheckInactive;
813 FProtocol := Value;
814 if (Value = Local) then
815 FServerName := '';
816 end;
817 end;
818
819 procedure TIBCustomService.SetService(AValue: IServiceManager);
820 begin
821 if FService = AValue then Exit;
822 FService := AValue;
823 if AValue <> nil then
824 FServerName := FService.getServerName;
825 end;
826
827 procedure TIBCustomService.SetServiceParamBySPB(const Idx: Integer;
828 const Value: String);
829 var
830 ConstIdx: Integer;
831 begin
832 ConstIdx := IndexOfSPBConst(Idx);
833 if (Value = '') then
834 begin
835 if ConstIdx <> -1 then
836 Params.Delete(ConstIdx);
837 end
838 else
839 begin
840 if (ConstIdx = -1) then
841 Params.Add(GetSPBConstName(Idx) + '=' + Value)
842 else
843 Params[ConstIdx] := GetSPBConstName(Idx) + '=' + Value;
844 end;
845 end;
846
847 function TIBCustomService.IndexOfSPBConst(action: byte): Integer;
848 var
849 i, pos_of_str: Integer;
850 st: string;
851 begin
852 result := -1;
853 st := GetSPBConstName(action);
854 if st <> '' then
855 for i := 0 to Params.Count - 1 do
856 begin
857 pos_of_str := Pos(st, Params[i]); {mbcs ok}
858 if (pos_of_str = 1) or (pos_of_str = Length(SPBPrefix) + 1) then
859 begin
860 result := i;
861 break;
862 end;
863 end;
864 end;
865
866 function TIBCustomService.GetSPBConstName(action: byte): string;
867 var i: integer;
868 begin
869 Result := '';
870 for i := Low(SPBConstantValues) to High(SPBConstantValues) do
871 if SPBConstantValues[i] = action then
872 begin
873 Result := SPBConstantNames[i];
874 break;
875 end;
876 end;
877
878 procedure TIBCustomService.ParamsChange(Sender: TObject);
879 begin
880 FParamsChanged := True;
881 end;
882
883 procedure TIBCustomService.ParamsChanging(Sender: TObject);
884 begin
885 CheckInactive;
886 end;
887
888 procedure TIBCustomService.CheckServerName;
889 begin
890 if (FServerName = '') and (FProtocol <> Local) then
891 IBError(ibxeServerNameMissing, [nil]);
892 end;
893
894 {
895 * GenerateSPB -
896 * Given a string containing a textual representation
897 * of the Service parameters, generate a service
898 * parameter buffer, and return it .
899 }
900 function TIBCustomService.GenerateSPB(sl: TStrings): ISPB;
901 var
902 i, j, SPBVal, SPBServerVal: UShort;
903 param_name, param_value: String;
904 begin
905 { The SPB is initially empty, with the exception that
906 the SPB version must be the first byte of the string.
907 }
908 Result := FirebirdAPI.AllocateSPB;
909
910 { Iterate through the textual service parameters, constructing
911 a SPB on-the-fly }
912 if sl.Count > 0 then
913 for i := 0 to sl.Count - 1 do
914 begin
915 { Get the parameter's name and value from the list,
916 and make sure that the name is all lowercase with
917 no leading 'isc_spb_' prefix }
918 if (Trim(sl.Names[i]) = '') then continue;
919 param_name := LowerCase(sl.Names[i]); {mbcs ok}
920 param_value := Copy(sl[i], Pos('=', sl[i]) + 1, Length(sl[i])); {mbcs ok}
921 if (Pos(SPBPrefix, param_name) = 1) then {mbcs ok}
922 Delete(param_name, 1, Length(SPBPrefix));
923 { We want to translate the parameter name to some integer
924 value. We do this by scanning through a list of known
925 service parameter names (SPBConstantNames, defined above). }
926 SPBVal := 0;
927 SPBServerVal := 0;
928 { Find the parameter }
929 for j := 1 to isc_spb_last_spb_constant do
930 if (param_name = SPBConstantNames[j]) then
931 begin
932 SPBVal := j;
933 SPBServerVal := SPBConstantValues[j];
934 break;
935 end;
936 case SPBServerVal of
937 isc_spb_user_name, isc_spb_password:
938 Result.Add(SPBServerVal).AsString := param_value;
939 else
940 begin
941 if GetSPBConstName(SPBServerVal) <> '' then
942 IBError(ibxeSPBConstantNotSupported,
943 [GetSPBConstName(SPBServerVal)])
944 else
945 IBError(ibxeSPBConstantUnknown, [SPBServerVal]);
946 end;
947 end;
948 end;
949 end;
950
951 { TIBServerProperties }
952 constructor TIBServerProperties.Create(AOwner: TComponent);
953 begin
954 inherited Create(AOwner);
955 FDatabaseInfo := TDatabaseInfo.Create;
956 FLicenseInfo := TLicenseInfo.Create;
957 FLicenseMaskInfo := TLicenseMaskInfo.Create;
958 FVersionInfo := TVersionInfo.Create;
959 FConfigParams := TConfigParams.Create;
960 end;
961
962 destructor TIBServerProperties.Destroy;
963 begin
964 FDatabaseInfo.Free;
965 FLicenseInfo.Free;
966 FLicenseMaskInfo.Free;
967 FVersionInfo.Free;
968 FConfigParams.Free;
969 inherited Destroy;
970 end;
971
972 procedure TIBServerProperties.Fetch;
973 begin
974 if (Database in Options) then
975 FetchDatabaseInfo;
976 if (License in Options) then
977 FetchLicenseInfo;
978 if (LicenseMask in Options) then
979 FetchLicenseMaskInfo;
980 if (ConfigParameters in Options) then
981 FetchConfigParams;
982 if (Version in Options) then
983 FetchVersionInfo;
984 end;
985
986 procedure TIBServerProperties.FetchConfigParams;
987 var
988 i, j: Integer;
989
990 begin
991 SRB.Add(isc_info_svc_get_config);
992 SRB.Add(isc_info_svc_get_env);
993 SRB.Add(isc_info_svc_get_env_lock);
994 SRB.Add(isc_info_svc_get_env_msg);
995 SRB.Add(isc_info_svc_user_dbpath);
996
997 InternalServiceQuery;
998
999 for i := 0 to FServiceQueryResults.Count - 1 do
1000 with FServiceQueryResults[i] do
1001 begin
1002 case getItemType of
1003 isc_info_svc_get_config:
1004 begin
1005 SetLength (FConfigParams.ConfigFileData.ConfigFileValue, Count);
1006 SetLength (FConfigParams.ConfigFileData.ConfigFileKey, Count);
1007
1008 for j := 0 to Count - 1 do
1009 begin
1010 FConfigParams.ConfigFileData.ConfigFileKey[j] := Items[j].getItemType;
1011 FConfigParams.ConfigFileData.ConfigFileValue[j] := Items[j].AsInteger;
1012 end;
1013 end;
1014
1015 isc_info_svc_get_env:
1016 FConfigParams.BaseLocation := AsString;
1017
1018 isc_info_svc_get_env_lock:
1019 FConfigParams.LockFileLocation := AsString;
1020
1021 isc_info_svc_get_env_msg:
1022 FConfigParams.MessageFileLocation := AsString;
1023
1024 isc_info_svc_user_dbpath:
1025 FConfigParams.SecurityDatabaseLocation := AsString;
1026
1027 else
1028 IBError(ibxeOutputParsingError, [getItemType]);
1029 end;
1030 end;
1031 end;
1032
1033 procedure TIBServerProperties.FetchDatabaseInfo;
1034 var
1035 i,j: Integer;
1036 begin
1037 SRB.Add(isc_info_svc_svr_db_info);
1038 InternalServiceQuery;
1039
1040 SetLength(FDatabaseInfo.DbName,0);
1041 for i := 0 to FServiceQueryResults.Count - 1 do
1042 with FServiceQueryResults[i] do
1043 begin
1044 case getItemType of
1045 isc_info_svc_svr_db_info:
1046 for j := 0 to FServiceQueryResults[i].Count - 1 do
1047 with FServiceQueryResults[i][j] do
1048 case getItemType of
1049 isc_spb_num_att:
1050 FDatabaseInfo.NoOfAttachments := AsInteger;
1051
1052 isc_spb_num_db:
1053 FDatabaseInfo.NoOfDatabases := AsInteger;
1054
1055 isc_spb_dbname:
1056 begin
1057 SetLength(FDatabaseInfo.DbName,length(FDatabaseInfo.DbName)+1);
1058 FDatabaseInfo.DbName[length(FDatabaseInfo.DbName)-1] := AsString;
1059 end;
1060 else
1061 IBError(ibxeOutputParsingError, [getItemType]);
1062 end;
1063 else
1064 IBError(ibxeOutputParsingError, [getItemType]);
1065 end;
1066 end;
1067 end;
1068
1069 procedure TIBServerProperties.FetchLicenseInfo;
1070 var
1071 i,j : Integer;
1072 begin
1073 SRB.Add(isc_info_svc_get_license);
1074 SRB.Add(isc_info_svc_get_licensed_users);
1075 InternalServiceQuery;
1076
1077 SetLength(FLicenseInfo.key, 0);
1078 SetLength(FLicenseInfo.id, 0);
1079 SetLength(FLicenseInfo.desc, 0);
1080
1081 for i := 0 to FServiceQueryResults.Count - 1 do
1082 with FServiceQueryResults[i] do
1083 begin
1084 case getItemType of
1085 isc_info_svc_get_license:
1086 begin
1087 SetLength(FLicenseInfo.key, Count);
1088 SetLength(FLicenseInfo.id, Count);
1089 SetLength(FLicenseInfo.desc, Count);
1090
1091 for j := 0 to Count -1 do
1092 with Items[j] do
1093 case getItemType of
1094 isc_spb_lic_id:
1095 FLicenseInfo.id[j] := AsString;
1096
1097 isc_spb_lic_key:
1098 FLicenseInfo.key[j] := AsString;
1099
1100 isc_spb_lic_desc:
1101 FLicenseInfo.desc[j] := AsString;
1102 else
1103 IBError(ibxeOutputParsingError, [getItemType]);
1104 end;
1105 end;
1106 else
1107 IBError(ibxeOutputParsingError, [getItemType]);
1108 end;
1109 end;
1110 end;
1111
1112 procedure TIBServerProperties.FetchLicenseMaskInfo();
1113 var
1114 i : Integer;
1115 begin
1116 SRB.Add(isc_info_svc_get_license_mask);
1117 SRB.Add(isc_info_svc_capabilities);
1118 InternalServiceQuery;
1119
1120 for i := 0 to FServiceQueryResults.Count - 1 do
1121 with FServiceQueryResults[i] do
1122 begin
1123 case getItemType of
1124 isc_info_svc_get_license_mask:
1125 FLicenseMaskInfo.LicenseMask := AsInteger;
1126 isc_info_svc_capabilities:
1127 FLicenseMaskInfo.CapabilityMask := AsInteger;
1128 else
1129 IBError(ibxeOutputParsingError, [getItemType]);
1130 end;
1131 end;
1132 end;
1133
1134
1135 procedure TIBServerProperties.FetchVersionInfo;
1136 var
1137 i : Integer;
1138 begin
1139 SRB.Add(isc_info_svc_version);
1140 SRB.Add(isc_info_svc_server_version);
1141 SRB.Add(isc_info_svc_implementation);
1142 InternalServiceQuery;
1143
1144 for i := 0 to FServiceQueryResults.Count - 1 do
1145 with FServiceQueryResults[i] do
1146 begin
1147 case getItemType of
1148 isc_info_svc_version:
1149 FVersionInfo.ServiceVersion := AsInteger;
1150 isc_info_svc_server_version:
1151 FVersionInfo.ServerVersion := AsString;
1152 isc_info_svc_implementation:
1153 FVersionInfo.ServerImplementation := AsString;
1154 else
1155 IBError(ibxeOutputParsingError, [getItemType]);
1156 end;
1157 end;
1158 end;
1159
1160 { TIBControlService }
1161
1162 procedure TIBControlService.SetServiceStartOptions;
1163 begin
1164
1165 end;
1166
1167 function TIBControlService.GetIsServiceRunning: Boolean;
1168 begin
1169 SRB.Add(isc_info_svc_running);
1170 InternalServiceQuery;
1171
1172 Result := (FServiceQueryResults.Count > 0) and
1173 (FServiceQueryResults[0].getItemType = isc_info_svc_running) and
1174 (FServiceQueryResults[0].AsInteger = 1);
1175 end;
1176
1177 procedure TIBControlService.CheckServiceNotRunning;
1178 begin
1179 if IsServiceRunning then
1180 IBError(ibxeServiceRunning,[nil]);
1181 end;
1182
1183 constructor TIBControlService.Create(AOwner: TComponent);
1184 begin
1185 inherited create(AOwner);
1186 FSRB := nil;
1187 FSPB := nil;
1188 end;
1189
1190 procedure TIBControlService.InternalServiceStart;
1191 begin
1192 if SRB = nil then
1193 IBError(ibxeStartParamsError, [nil]);
1194
1195 try
1196 FService.Start(SRB);
1197 finally
1198 FSRB := nil;
1199 end;
1200 MonitorHook.ServiceStart(Self);
1201 end;
1202
1203 procedure TIBControlService.ServiceStart;
1204 begin
1205 CheckActive;
1206 CheckServiceNotRunning;
1207 SetServiceStartOptions;
1208 InternalServiceStart;
1209 end;
1210
1211 { TIBConfigService }
1212
1213 procedure TIBConfigService.ServiceStart;
1214 begin
1215 IBError(ibxeUseSpecificProcedures, [nil]);
1216 end;
1217
1218 procedure TIBConfigService.ActivateShadow;
1219 begin
1220 SRB.Add(isc_action_svc_properties);
1221 SRB.Add(isc_spb_dbname).AsString := FDatabaseName;
1222 SRB.Add(isc_spb_options).AsInteger := isc_spb_prp_activate;
1223 InternalServiceStart;
1224 end;
1225
1226 procedure TIBConfigService.BringDatabaseOnline;
1227 begin
1228 SRB.Add(isc_action_svc_properties);
1229 SRB.Add(isc_spb_dbname).AsString := FDatabaseName;
1230 SRB.Add(isc_spb_options).AsInteger := isc_spb_prp_db_online;
1231 InternalServiceStart;
1232 end;
1233
1234 procedure TIBConfigService.SetAsyncMode(Value: Boolean);
1235 begin
1236 SRB.Add(isc_action_svc_properties);
1237 SRB.Add(isc_spb_dbname).AsString := FDatabaseName;
1238 with SRB.Add(isc_spb_prp_write_mode) do
1239 if Value then
1240 AsByte := isc_spb_prp_wm_async
1241 else
1242 AsByte := isc_spb_prp_wm_sync;
1243 InternalServiceStart;
1244 end;
1245
1246 procedure TIBConfigService.SetDatabaseName(const Value: string);
1247 begin
1248 FDatabaseName := Value;
1249 end;
1250
1251 procedure TIBConfigService.SetPageBuffers(Value: Integer);
1252 begin
1253 SRB.Add(isc_action_svc_properties);
1254 SRB.Add(isc_spb_dbname).AsString := FDatabaseName;
1255 SRB.Add(isc_spb_prp_page_buffers).AsInteger := Value;
1256 InternalServiceStart;
1257 end;
1258
1259 procedure TIBConfigService.SetReadOnly(Value: Boolean);
1260 begin
1261 SRB.Add(isc_action_svc_properties);
1262 SRB.Add(isc_spb_dbname).AsString := FDatabaseName;
1263 with SRB.Add(isc_spb_prp_access_mode) do
1264 if Value then
1265 AsByte := isc_spb_prp_am_readonly
1266 else
1267 AsByte := isc_spb_prp_am_readwrite;
1268 InternalServiceStart;
1269 end;
1270
1271 procedure TIBConfigService.SetReserveSpace(Value: Boolean);
1272 begin
1273 SRB.Add(isc_action_svc_properties);
1274 SRB.Add(isc_spb_dbname).AsString := FDatabaseName;
1275 with SRB.Add(isc_spb_prp_reserve_space) do
1276 if Value then
1277 AsByte := isc_spb_prp_res
1278 else
1279 AsByte := isc_spb_prp_res_use_full;
1280 InternalServiceStart;
1281 end;
1282
1283 procedure TIBConfigService.SetSweepInterval(Value: Integer);
1284 begin
1285 SRB.Add(isc_action_svc_properties);
1286 SRB.Add(isc_spb_dbname).AsString := FDatabaseName;
1287 SRB.Add(isc_spb_prp_sweep_interval).AsInteger := Value;
1288 InternalServiceStart;
1289 end;
1290
1291 procedure TIBConfigService.SetDBSqlDialect(Value: Integer);
1292 begin
1293 SRB.Add(isc_action_svc_properties);
1294 SRB.Add(isc_spb_dbname).AsString := FDatabaseName;
1295 SRB.Add(isc_spb_prp_set_sql_dialect).AsInteger := Value;
1296 InternalServiceStart;
1297 end;
1298
1299 procedure TIBConfigService.ShutdownDatabase(Options: TShutdownMode;
1300 Wait: Integer);
1301 begin
1302 SRB.Add(isc_action_svc_properties);
1303 SRB.Add(isc_spb_dbname).AsString := FDatabaseName;
1304 if (Options = Forced) then
1305 SRB.Add(isc_spb_prp_shutdown_db).AsInteger := Wait
1306 else if (Options = DenyTransaction) then
1307 SRB.Add(isc_spb_prp_deny_new_transactions).AsInteger := Wait
1308 else
1309 SRB.Add(isc_spb_prp_deny_new_attachments).AsInteger := Wait;
1310 InternalServiceStart;
1311 end;
1312
1313
1314 { TIBStatisticalService }
1315
1316 procedure TIBStatisticalService.SetDatabaseName(const Value: string);
1317 begin
1318 FDatabaseName := Value;
1319 end;
1320
1321 procedure TIBStatisticalService.SetServiceStartOptions;
1322 var param: integer;
1323 begin
1324 if FDatabaseName = '' then
1325 IBError(ibxeStartParamsError, [nil]);
1326
1327 param := 0;
1328 if (DataPages in Options) then
1329 param := param or isc_spb_sts_data_pages;
1330 { if (DbLog in Options) then
1331 param := param or isc_spb_sts_db_log; -- removed from Firebird 2}
1332 if (HeaderPages in Options) then
1333 param := param or isc_spb_sts_hdr_pages;
1334 if (IndexPages in Options) then
1335 param := param or isc_spb_sts_idx_pages;
1336 if (SystemRelations in Options) then
1337 param := param or isc_spb_sts_sys_relations;
1338 Action := isc_action_svc_db_stats;
1339 SRB.Add(isc_action_svc_db_stats);
1340 SRB.Add(isc_spb_dbname).AsString := FDatabaseName;
1341 SRB.Add(isc_spb_options).AsInteger := param;
1342 end;
1343
1344 { TIBBackupService }
1345 procedure TIBBackupService.SetServiceStartOptions;
1346 var
1347 param, i: Integer;
1348 value: String;
1349 begin
1350 if FDatabaseName = '' then
1351 IBError(ibxeStartParamsError, [nil]);
1352 param := 0;
1353 if (IgnoreChecksums in Options) then
1354 param := param or isc_spb_bkp_ignore_checksums;
1355 if (IgnoreLimbo in Options) then
1356 param := param or isc_spb_bkp_ignore_limbo;
1357 if (MetadataOnly in Options) then
1358 param := param or isc_spb_bkp_metadata_only;
1359 if (NoGarbageCollection in Options) then
1360 param := param or isc_spb_bkp_no_garbage_collect;
1361 if (OldMetadataDesc in Options) then
1362 param := param or isc_spb_bkp_old_descriptions;
1363 if (NonTransportable in Options) then
1364 param := param or isc_spb_bkp_non_transportable;
1365 if (ConvertExtTables in Options) then
1366 param := param or isc_spb_bkp_convert;
1367 Action := isc_action_svc_backup;
1368 SRB.Add(isc_action_svc_backup);
1369 SRB.Add(isc_spb_dbname).AsString := FDatabaseName;
1370 SRB.Add(isc_spb_options).AsInteger := param;
1371 if Verbose and (BackupFileLocation = flServerSide) then
1372 SRB.Add(isc_spb_verbose);
1373 if FBlockingFactor > 0 then
1374 SRB.Add(isc_spb_bkp_factor).AsInteger := FBlockingFactor;
1375 if BackupFileLocation = flServerSide then
1376 for i := 0 to FBackupFile.Count - 1 do
1377 begin
1378 if (Trim(FBackupFile[i]) = '') then
1379 continue;
1380 if (Pos('=', FBackupFile[i]) <> 0) then
1381 begin {mbcs ok}
1382 SRB.Add(isc_spb_bkp_file).AsString := FBackupFile.Names[i];
1383 value := Copy(FBackupFile[i], Pos('=', FBackupFile[i]) + 1, Length(FBackupFile.Names[i])); {mbcs ok}
1384 SRB.Add(isc_spb_bkp_length).AsInteger := StrToInt(value);;
1385 end
1386 else
1387 SRB.Add(isc_spb_bkp_file).AsString := FBackupFile[i];
1388 end
1389 else
1390 SRB.Add(isc_spb_bkp_file).AsString := 'stdout';
1391 end;
1392
1393 constructor TIBBackupService.Create(AOwner: TComponent);
1394 begin
1395 inherited Create(AOwner);
1396 FBackupFile := TStringList.Create;
1397 end;
1398
1399 destructor TIBBackupService.Destroy;
1400 begin
1401 FBackupFile.Free;
1402 inherited Destroy;
1403 end;
1404
1405 procedure TIBBackupService.SetBackupFile(const Value: TStrings);
1406 begin
1407 FBackupFile.Assign(Value);
1408 end;
1409
1410 { TIBRestoreService }
1411
1412 procedure TIBRestoreService.SetServiceStartOptions;
1413 var
1414 param, i: Integer;
1415 value: String;
1416 begin
1417 param := 0;
1418 if (DeactivateIndexes in Options) then
1419 param := param or isc_spb_res_deactivate_idx;
1420 if (NoShadow in Options) then
1421 param := param or isc_spb_res_no_shadow;
1422 if (NoValidityCheck in Options) then
1423 param := param or isc_spb_res_no_validity;
1424 if (OneRelationAtATime in Options) then
1425 param := param or isc_spb_res_one_at_a_time;
1426 if (Replace in Options) then
1427 param := param or isc_spb_res_replace;
1428 if (CreateNewDB in Options) then
1429 param := param or isc_spb_res_create;
1430 if (UseAllSpace in Options) then
1431 param := param or isc_spb_res_use_all_space;
1432 Action := isc_action_svc_restore;
1433 SRB.Add(isc_action_svc_restore);
1434 SRB.Add(isc_spb_options).AsInteger := param;
1435 if Verbose then
1436 SRB.Add(isc_spb_verbose);
1437 if FPageSize > 0 then
1438 SRB.Add(isc_spb_res_page_size).AsInteger := FPageSize;
1439 if FPageBuffers > 0 then
1440 SRB.Add(isc_spb_res_buffers).AsInteger := FPageBuffers;
1441 if BackupFileLocation = flServerSide then
1442 for i := 0 to FBackupFile.Count - 1 do
1443 begin
1444 if (Trim(FBackupFile[i]) = '') then continue;
1445 if (Pos('=', FBackupFile[i]) <> 0) then {mbcs ok}
1446 begin
1447 SRB.Add(isc_spb_bkp_file).AsString := FBackupFile.Names[i];
1448 value := Copy(FBackupFile[i], Pos('=', FBackupFile[i]) + 1, Length(FBackupFile.Names[i])); {mbcs ok}
1449 SRB.Add(isc_spb_bkp_length).AsInteger := StrToInt(value);;
1450 end
1451 else
1452 SRB.Add(isc_spb_bkp_file).AsString := FBackupFile[i];
1453 end
1454 else
1455 SRB.Add(isc_spb_bkp_file).AsString := 'stdin';
1456
1457 for i := 0 to FDatabaseName.Count - 1 do
1458 begin
1459 if (Trim(FDatabaseName[i]) = '') then continue;
1460 if (Pos('=', FDatabaseName[i]) <> 0) then {mbcs ok}
1461 begin
1462 SRB.Add(isc_spb_dbname).AsString := FDatabaseName.Names[i];
1463 value := Copy(FDatabaseName[i], Pos('=', FDatabaseName[i]) + 1, Length(FDatabaseName[i])); {mbcs ok}
1464 SRB.Add(isc_spb_res_length).AsInteger := StrToInt(value);
1465 end
1466 else
1467 SRB.Add(isc_spb_dbname).AsString := FDatabaseName[i];
1468 end;
1469 end;
1470
1471 constructor TIBRestoreService.Create(AOwner: TComponent);
1472 begin
1473 inherited Create(AOwner);
1474 FDatabaseName := TStringList.Create;
1475 FBackupFile := TStringList.Create;
1476 Include (FOptions, CreateNewDB);
1477 end;
1478
1479 destructor TIBRestoreService.Destroy;
1480 begin
1481 FDatabaseName.Free;
1482 FBackupFile.Free;
1483 inherited Destroy;
1484 end;
1485
1486 function TIBRestoreService.SendNextChunk(stream: TStream; var line: String
1487 ): integer;
1488 var
1489 i: Integer;
1490 begin
1491 Result := 0;
1492 line := '';
1493 if (FEof = True) then
1494 exit;
1495
1496 if (FAction = 0) then
1497 IBError(ibxeQueryParamsError, [nil]);
1498
1499 SRB.Add(isc_info_svc_line);
1500 SRB.Add(isc_info_svc_stdin);
1501
1502 SQPB.Add(isc_info_svc_timeout).AsInteger := 1;
1503 if FSendBytes > 0 then
1504 Result := SQPB.Add(isc_info_svc_line).CopyFrom(stream,FSendBytes);
1505 InternalServiceQuery;
1506
1507 FSendBytes := 0;
1508 for i := 0 to FServiceQueryResults.Count - 1 do
1509 with FServiceQueryResults[i] do
1510 begin
1511 case getItemType of
1512 isc_info_svc_line:
1513 line := AsString;
1514
1515 isc_info_svc_stdin:
1516 FSendBytes := AsInteger;
1517
1518 isc_info_svc_timeout,
1519 isc_info_data_not_ready:
1520 {ignore};
1521 else
1522 IBError(ibxeOutputParsingError, [getItemType]);
1523 end;
1524 end;
1525 FEOF := (FSendBytes = 0) and (line = '');
1526 end;
1527
1528 procedure TIBRestoreService.SetBackupFile(const Value: TStrings);
1529 begin
1530 FBackupFile.Assign(Value);
1531 end;
1532
1533 procedure TIBRestoreService.SetDatabaseName(const Value: TStrings);
1534 begin
1535 FDatabaseName.Assign(Value);
1536 end;
1537
1538 { TIBValidationService }
1539 constructor TIBValidationService.Create(AOwner: TComponent);
1540 begin
1541 inherited Create(AOwner);
1542 end;
1543
1544 destructor TIBValidationService.Destroy;
1545 var
1546 i : Integer;
1547 begin
1548 for i := 0 to High(FLimboTransactionInfo) do
1549 FLimboTransactionInfo[i].Free;
1550 FLimboTransactionInfo := nil;
1551 inherited Destroy;
1552 end;
1553
1554 procedure TIBValidationService.FetchLimboTransactionInfo;
1555
1556 procedure NextLimboTransaction(index: integer);
1557 begin
1558 SetLength(FLimboTransactionInfo, index+1);
1559 FLimboTransactionInfo[index] := TLimboTransactionInfo.Create;
1560 { if no advice commit as default }
1561 FLimboTransactionInfo[index].Advise := UnknownAdvise;
1562 FLimboTransactionInfo[index].Action:= CommitAction;
1563 end;
1564
1565 var
1566 i,j, k: Integer;
1567 Value: Char;
1568 begin
1569 for i := 0 to High(FLimboTransactionInfo) do
1570 FLimboTransactionInfo[i].Free;
1571 SetLength(FLimboTransactionInfo,0);
1572
1573 SRB.Add(isc_info_svc_limbo_trans);
1574 InternalServiceQuery;
1575
1576 k := -1;
1577 for i := 0 to FServiceQueryResults.Count - 1 do
1578 with FServiceQueryResults[i] do
1579 case getItemType of
1580 isc_info_svc_limbo_trans:
1581 begin
1582 if FServiceQueryResults[i].Count = 0 then continue;
1583 NextLimboTransaction(0);
1584 for j := 0 to FServiceQueryResults[i].Count - 1 do
1585 begin
1586 with FServiceQueryResults[i][j] do
1587 begin
1588 case getItemType of
1589 isc_spb_single_tra_id:
1590 begin
1591 Inc(k);
1592 if k > 0 then
1593 NextLimboTransaction(k);
1594 FLimboTransactionInfo[k].MultiDatabase := False;
1595 FLimboTransactionInfo[k].ID := AsInteger;
1596 end;
1597
1598 isc_spb_multi_tra_id:
1599 begin
1600 Inc(k);
1601 if k > 0 then
1602 NextLimboTransaction(k);
1603 FLimboTransactionInfo[k].MultiDatabase := True;
1604 FLimboTransactionInfo[k].ID := AsInteger;
1605 end;
1606
1607 isc_spb_tra_host_site:
1608 FLimboTransactionInfo[k].HostSite := AsString;
1609
1610 isc_spb_tra_state:
1611 case AsByte of
1612 isc_spb_tra_state_limbo:
1613 FLimboTransactionInfo[k].State := LimboState;
1614
1615 isc_spb_tra_state_commit:
1616 FLimboTransactionInfo[k].State := CommitState;
1617
1618 isc_spb_tra_state_rollback:
1619 FLimboTransactionInfo[k].State := RollbackState;
1620
1621 else
1622 FLimboTransactionInfo[k].State := UnknownState;
1623 end;
1624
1625 isc_spb_tra_remote_site:
1626 FLimboTransactionInfo[k].RemoteSite := AsString;
1627
1628 isc_spb_tra_db_path:
1629 FLimboTransactionInfo[k].RemoteDatabasePath := AsString;
1630
1631 isc_spb_tra_advise:
1632 with FLimboTransactionInfo[k] do
1633 begin
1634 case (AsByte) of
1635 isc_spb_tra_advise_commit:
1636 begin
1637 Advise := CommitAdvise;
1638 Action:= CommitAction;
1639 end;
1640
1641 isc_spb_tra_advise_rollback:
1642 begin
1643 Advise := RollbackAdvise;
1644 Action := RollbackAction;
1645 end;
1646
1647 else
1648 Advise := UnknownAdvise;
1649 end;
1650 end;
1651
1652 else
1653 IBError(ibxeOutputParsingError, [getItemType]);
1654 end;
1655 end;
1656 end;
1657 end;
1658 else
1659 IBError(ibxeOutputParsingError, [getItemType]);
1660 end;
1661 end;
1662
1663 procedure TIBValidationService.FixLimboTransactionErrors;
1664 var
1665 i: Integer;
1666 begin
1667 SRB.Add(isc_action_svc_repair);
1668 SRB.Add(isc_spb_dbname).AsString := FDatabaseName;
1669 case FGlobalAction of
1670 NoGlobalAction:
1671 begin
1672 for i := 0 to LimboTransactionInfoCount - 1 do
1673 begin
1674 if (FLimboTransactionInfo[i].Action = CommitAction) then
1675 SRB.Add(isc_spb_rpr_commit_trans).AsInteger := FLimboTransactionInfo[i].ID
1676 else
1677 SRB.Add(isc_spb_rpr_rollback_trans).AsInteger := FLimboTransactionInfo[i].ID;
1678 end;
1679 end;
1680
1681 CommitGlobal:
1682 begin
1683 for i := 0 to LimboTransactionInfoCount - 1 do
1684 SRB.Add(isc_spb_rpr_commit_trans).AsInteger := FLimboTransactionInfo[i].ID;
1685 end;
1686
1687 RollbackGlobal:
1688 begin
1689 for i := 0 to LimboTransactionInfoCount - 1 do
1690 SRB.Add(isc_spb_rpr_rollback_trans).AsInteger := FLimboTransactionInfo[i].ID;
1691 end;
1692
1693 RecoverTwoPhaseGlobal:
1694 begin
1695 for i := 0 to LimboTransactionInfoCount - 1 do
1696 SRB.Add(isc_spb_rpr_recover_two_phase).AsInteger := FLimboTransactionInfo[i].ID;
1697 end;
1698 end;
1699 InternalServiceStart;
1700 end;
1701
1702 function TIBValidationService.GetLimboTransactionInfo(index: integer): TLimboTransactionInfo;
1703 begin
1704 if index <= High(FLimboTransactionInfo) then
1705 result := FLimboTransactionInfo[index]
1706 else
1707 result := nil;
1708 end;
1709
1710 function TIBValidationService.GetLimboTransactionInfoCount: integer;
1711 begin
1712 Result := Length(FLimboTransactionInfo);
1713 end;
1714
1715 procedure TIBValidationService.SetDatabaseName(const Value: string);
1716 begin
1717 FDatabaseName := Value;
1718 end;
1719
1720 procedure TIBValidationService.SetServiceStartOptions;
1721 var
1722 param: Integer;
1723 begin
1724 Action := isc_action_svc_repair;
1725 if FDatabaseName = '' then
1726 IBError(ibxeStartParamsError, [nil]);
1727 SRB.Add(isc_action_svc_repair);
1728 SRB.Add(isc_spb_dbname).AsString := FDatabaseName;
1729 param := 0;
1730 if (SweepDB in Options) then
1731 param := param or isc_spb_rpr_sweep_db;
1732 if (ValidateDB in Options) then
1733 param := param or isc_spb_rpr_validate_db;
1734
1735 if (LimboTransactions in Options) then
1736 param := param or isc_spb_rpr_list_limbo_trans;
1737 if (CheckDB in Options) then
1738 param := param or isc_spb_rpr_check_db;
1739 if (IgnoreChecksum in Options) then
1740 param := param or isc_spb_rpr_ignore_checksum;
1741 if (KillShadows in Options) then
1742 param := param or isc_spb_rpr_kill_shadows;
1743 if (MendDB in Options) then
1744 param := param or isc_spb_rpr_mend_db;
1745 if (ValidateFull in Options) then
1746 begin
1747 param := param or isc_spb_rpr_full;
1748 if not (MendDB in Options) then
1749 param := param or isc_spb_rpr_validate_db;
1750 end;
1751 if param > 0 then
1752 SRB.Add(isc_spb_options).AsInteger := param;
1753 end;
1754
1755 { TIBSecurityService }
1756 constructor TIBSecurityService.Create(AOwner: TComponent);
1757 begin
1758 inherited Create(AOwner);
1759 FModifyParams := [];
1760 end;
1761
1762 destructor TIBSecurityService.Destroy;
1763 var
1764 i : Integer;
1765 begin
1766 for i := 0 to High(FUserInfo) do
1767 FUserInfo[i].Free;
1768 FUserInfo := nil;
1769 inherited Destroy;
1770 end;
1771
1772 procedure TIBSecurityService.FetchUserInfo;
1773 var
1774 i, j, k: Integer;
1775 begin
1776 SRB.Add(isc_info_svc_get_users);
1777 InternalServiceQuery;
1778
1779 for i := 0 to High(FUserInfo) do
1780 FUserInfo[i].Free;
1781 for i := 0 to FServiceQueryResults.Count - 1 do
1782 with FServiceQueryResults[i] do
1783 begin
1784 case getItemType of
1785 isc_info_svc_get_users:
1786 begin
1787 SetLength(FUserInfo,1);
1788 k := 0;
1789 FUserInfo[0] := TUserInfo.Create;
1790 FUserInfo[0].UserName := '';
1791 for j := 0 to FServiceQueryResults[i].Count - 1 do
1792 begin
1793 with FServiceQueryResults[i][j] do
1794 case getItemType of
1795 isc_spb_sec_username:
1796 begin
1797 if FUserInfo[k].UserName <> '' then
1798 begin
1799 Inc(k);
1800 SetLength(FUserInfo,k+1);
1801 if FUserInfo[k] = nil then
1802 FUserInfo[k] := TUserInfo.Create;
1803 end;
1804 FUserInfo[k].UserName := AsString;
1805 end;
1806
1807 isc_spb_sec_firstname:
1808 FUserInfo[k].FirstName := AsString;
1809
1810 isc_spb_sec_middlename:
1811 FUserInfo[k].MiddleName := AsString;
1812
1813 isc_spb_sec_lastname:
1814 FUserInfo[k].LastName := AsString;
1815
1816 isc_spb_sec_userId:
1817 FUserInfo[k].UserId := AsInteger;
1818
1819 isc_spb_sec_groupid:
1820 FUserInfo[k].GroupID := AsInteger;
1821
1822 else
1823 IBError(ibxeOutputParsingError, [getItemType]);
1824 end;
1825 end;
1826 end;
1827 else
1828 IBError(ibxeOutputParsingError, [getItemType]);
1829 end;
1830 end;
1831 end;
1832
1833 function TIBSecurityService.GetUserInfo(Index: Integer): TUserInfo;
1834 begin
1835 if Index <= High(FUSerInfo) then
1836 result := FUserInfo[Index]
1837 else
1838 result := nil;
1839 end;
1840
1841 function TIBSecurityService.GetUserInfoCount: Integer;
1842 begin
1843 Result := Length(FUserInfo);
1844 end;
1845
1846 procedure TIBSecurityService.AddUser;
1847 begin
1848 SecurityAction := ActionAddUser;
1849 ServiceStart;
1850 end;
1851
1852 procedure TIBSecurityService.DeleteUser;
1853 begin
1854 SecurityAction := ActionDeleteUser;
1855 ServiceStart;
1856 end;
1857
1858 procedure TIBSecurityService.DisplayUsers;
1859 begin
1860 SecurityAction := ActionDisplayUser;
1861 SRB.Add(isc_action_svc_display_user);
1862 InternalServiceStart;
1863 FetchUserInfo;
1864 end;
1865
1866 procedure TIBSecurityService.DisplayUser(UserName: String);
1867 begin
1868 SecurityAction := ActionDisplayUser;
1869 SRB.Add(isc_action_svc_display_user);
1870 SRB.Add(isc_spb_sec_username).AsString := UserName;
1871 InternalServiceStart;
1872 FetchUserInfo;
1873 end;
1874
1875 procedure TIBSecurityService.ModifyUser;
1876 begin
1877 SecurityAction := ActionModifyUser;
1878 ServiceStart;
1879 end;
1880
1881 procedure TIBSecurityService.SetSecurityAction (Value: TSecurityAction);
1882 begin
1883 FSecurityAction := Value;
1884 if Value = ActionDeleteUser then
1885 ClearParams;
1886 end;
1887
1888 procedure TIBSecurityService.ClearParams;
1889 begin
1890 FModifyParams := [];
1891 FFirstName := '';
1892 FMiddleName := '';
1893 FLastName := '';
1894 FGroupID := 0;
1895 FUserID := 0;
1896 FPassword := '';
1897 end;
1898
1899 procedure TIBSecurityService.SetFirstName (Value: String);
1900 begin
1901 FFirstName := Value;
1902 Include (FModifyParams, ModifyFirstName);
1903 end;
1904
1905 procedure TIBSecurityService.SetMiddleName (Value: String);
1906 begin
1907 FMiddleName := Value;
1908 Include (FModifyParams, ModifyMiddleName);
1909 end;
1910
1911 procedure TIBSecurityService.SetLastName (Value: String);
1912 begin
1913 FLastName := Value;
1914 Include (FModifyParams, ModifyLastName);
1915 end;
1916
1917 procedure TIBSecurityService.SetPassword (Value: String);
1918 begin
1919 FPassword := Value;
1920 Include (FModifyParams, ModifyPassword);
1921 end;
1922
1923 procedure TIBSecurityService.SetUserId (Value: Integer);
1924 begin
1925 FUserId := Value;
1926 Include (FModifyParams, ModifyUserId);
1927 end;
1928
1929 procedure TIBSecurityService.SetGroupId (Value: Integer);
1930 begin
1931 FGroupId := Value;
1932 Include (FModifyParams, ModifyGroupId);
1933 end;
1934
1935 procedure TIBSecurityService.Loaded;
1936 begin
1937 inherited Loaded;
1938 ClearParams;
1939 end;
1940
1941 procedure TIBSecurityService.SetServiceStartOptions;
1942 var
1943 Len: UShort;
1944
1945 begin
1946 case FSecurityAction of
1947 ActionAddUser:
1948 begin
1949 Action := isc_action_svc_add_user;
1950 if ( Pos(' ', FUserName) > 0 ) then
1951 IBError(ibxeStartParamsError, [nil]);
1952 Len := Length(FUserName);
1953 if (Len = 0) then
1954 IBError(ibxeStartParamsError, [nil]);
1955 SRB.Add(isc_action_svc_add_user);
1956 SRB.Add(isc_spb_sec_username).AsString := FUserName;
1957 SRB.Add(isc_spb_sql_role_name).AsString := FSQLRole;
1958 SRB.Add(isc_spb_sec_userid).AsInteger := FUserID;
1959 SRB.Add(isc_spb_sec_groupid).AsInteger := FGroupID;
1960 SRB.Add(isc_spb_sec_password).AsString := FPassword;
1961 SRB.Add(isc_spb_sec_firstname).AsString := FFirstName;
1962 SRB.Add(isc_spb_sec_middlename).AsString := FMiddleName;
1963 SRB.Add(isc_spb_sec_lastname).AsString := FLastName;
1964 end;
1965 ActionDeleteUser:
1966 begin
1967 Action := isc_action_svc_delete_user;
1968 Len := Length(FUserName);
1969 if (Len = 0) then
1970 IBError(ibxeStartParamsError, [nil]);
1971 SRB.Add(isc_action_svc_delete_user);
1972 SRB.Add(isc_spb_sec_username).AsString := FUserName;
1973 SRB.Add(isc_spb_sql_role_name).AsString := FSQLRole;
1974 end;
1975 ActionModifyUser:
1976 begin
1977 Action := isc_action_svc_modify_user;
1978 Len := Length(FUserName);
1979 if (Len = 0) then
1980 IBError(ibxeStartParamsError, [nil]);
1981 SRB.Add(isc_action_svc_modify_user);
1982 SRB.Add(isc_spb_sec_username).AsString := FUserName;
1983 SRB.Add(isc_spb_sql_role_name).AsString := FSQLRole;
1984 if (ModifyUserId in FModifyParams) then
1985 SRB.Add(isc_spb_sec_userid).AsInteger := FUserID;
1986 if (ModifyGroupId in FModifyParams) then
1987 SRB.Add(isc_spb_sec_groupid).AsInteger := FGroupID;
1988 if (ModifyPassword in FModifyParams) then
1989 SRB.Add(isc_spb_sec_password).AsString := FPassword;
1990 if (ModifyFirstName in FModifyParams) then
1991 SRB.Add(isc_spb_sec_firstname).AsString := FFirstName;
1992 if (ModifyMiddleName in FModifyParams) then
1993 SRB.Add(isc_spb_sec_middlename).AsString := FMiddleName;
1994 if (ModifyLastName in FModifyParams) then
1995 SRB.Add(isc_spb_sec_lastname).AsString := FLastName;
1996 end;
1997 end;
1998 ClearParams;
1999 end;
2000
2001 { TIBUnStructuredService }
2002 constructor TIBControlAndQueryService.create(AOwner: TComponent);
2003 begin
2004 inherited Create(AOwner);
2005 FEof := False;
2006 FAction := 0;
2007 end;
2008
2009 procedure TIBControlAndQueryService.SetAction(Value: Integer);
2010 begin
2011 FEof := False;
2012 FAction := Value;
2013 end;
2014
2015
2016 function TIBControlAndQueryService.GetNextChunk: String;
2017 var
2018 i: Integer;
2019 begin
2020 if (FEof = True) then
2021 begin
2022 result := '';
2023 exit;
2024 end;
2025 if (FAction = 0) then
2026 IBError(ibxeQueryParamsError, [nil]);
2027
2028 SRB.Add(isc_info_svc_to_eof);
2029 InternalServiceQuery;
2030
2031 FEof := True;
2032 for i := 0 to FServiceQueryResults.Count - 1 do
2033 with FServiceQueryResults[i] do
2034 begin
2035 case getItemType of
2036 isc_info_svc_to_eof:
2037 Result := AsString;
2038
2039 isc_info_truncated:
2040 FEof := False;
2041 else
2042 IBError(ibxeOutputParsingError, [getItemType]);
2043 end;
2044 end;
2045 end;
2046
2047 function TIBControlAndQueryService.WriteNextChunk(stream: TStream): integer;
2048 var
2049 i: Integer;
2050 begin
2051 result := 0;
2052 if (FEof = True) then
2053 exit;
2054 if (FAction = 0) then
2055 IBError(ibxeQueryParamsError, [nil]);
2056
2057 SQPB.Add(isc_info_svc_timeout).AsInteger := 1;
2058 SRB.Add(isc_info_svc_to_eof);
2059 InternalServiceQuery;
2060
2061 FEof := True;
2062 for i := 0 to FServiceQueryResults.Count - 1 do
2063 with FServiceQueryResults[i] do
2064 begin
2065 case getItemType of
2066 isc_info_svc_to_eof:
2067 begin
2068 Result := CopyTo(stream,0);
2069 FEof := Result = 0;
2070 end;
2071
2072 isc_info_truncated:
2073 FEof := False;
2074
2075 isc_info_svc_timeout:
2076 {ignore};
2077 else
2078 IBError(ibxeOutputParsingError, [getItemType]);
2079 end;
2080 end;
2081 end;
2082
2083 function TIBControlAndQueryService.GetNextLine: String;
2084 var
2085 i: Integer;
2086 begin
2087 Result := '';
2088 if (FEof = True) then
2089 exit;
2090
2091 if (FAction = 0) then
2092 IBError(ibxeQueryParamsError, [nil]);
2093
2094 SRB.Add(isc_info_svc_line);
2095 InternalServiceQuery;
2096
2097 for i := 0 to FServiceQueryResults.Count - 1 do
2098 with FServiceQueryResults[i] do
2099 begin
2100 case getItemType of
2101 isc_info_svc_line:
2102 Result := AsString;
2103 else
2104 IBError(ibxeOutputParsingError, [getItemType]);
2105 end;
2106 end;
2107 FEOF := Result = '';
2108 end;
2109
2110 { TIBLogService }
2111
2112 procedure TIBLogService.SetServiceStartOptions;
2113 begin
2114 Action := isc_action_svc_get_ib_log;
2115 SRB.Add(isc_action_svc_get_ib_log);
2116 end;
2117
2118 { TDatabaseInfo }
2119
2120 constructor TDatabaseInfo.Create;
2121 begin
2122 DbName := nil;
2123 end;
2124
2125 destructor TDatabaseInfo.Destroy;
2126 begin
2127 DbName := nil;
2128 inherited Destroy;
2129 end;
2130
2131 { TLicenseInfo }
2132
2133 constructor TLicenseInfo.Create;
2134 begin
2135 Key := nil;
2136 Id := nil;
2137 Desc := nil;
2138 end;
2139
2140 destructor TLicenseInfo.Destroy;
2141 begin
2142 Key := nil;
2143 Id := nil;
2144 Desc := nil;
2145 inherited Destroy;
2146 end;
2147
2148 { TConfigFileData }
2149
2150 constructor TConfigFileData.Create;
2151 begin
2152 ConfigFileValue := nil;
2153 ConfigFileKey := nil;
2154 end;
2155
2156 destructor TConfigFileData.Destroy;
2157 begin
2158 ConfigFileValue := nil;
2159 ConfigFileKey := nil;
2160 inherited Destroy;
2161 end;
2162
2163 { TConfigParams }
2164
2165 constructor TConfigParams.Create;
2166 begin
2167 ConfigFileData := TConfigFileData.Create;
2168 ConfigFileParams := nil;
2169 end;
2170
2171 destructor TConfigParams.Destroy;
2172 begin
2173 ConfigFileData.Free;
2174 ConfigFileParams := nil;
2175 inherited Destroy;
2176 end;
2177
2178 end.