ViewVC Help
View File | Revision Log | Show Annotations | Download File | View Changeset | Root Listing
root/public/ibx/trunk/runtime/IBServices.pas
Revision: 33
Committed: Sat Jul 18 12:30:52 2015 UTC (8 years, 9 months ago) by tony
Content type: text/x-pascal
File size: 63854 byte(s)
Log Message:
Committing updates for Release R1-3-1

File Contents

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