ViewVC Help
View File | Revision Log | Show Annotations | Download File | View Changeset | Root Listing
root/public/ibx/trunk/runtime/IBServices.pas
Revision: 17
Committed: Sat Dec 28 19:22:24 2013 UTC (10 years, 10 months ago) by tony
Content type: text/x-pascal
File size: 65309 byte(s)
Log Message:
Committing updates for Release R1-0-5

File Contents

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