ViewVC Help
View File | Revision Log | Show Annotations | Download File | View Changeset | Root Listing
root/public/ibx/trunk/runtime/IBServices.pas
Revision: 29
Committed: Sat May 9 11:37:49 2015 UTC (8 years, 11 months ago) by tony
Content type: text/x-pascal
File size: 65333 byte(s)
Log Message:
Committing updates for Release R1-2-4

File Contents

# Content
1 {************************************************************************}
2 { }
3 { Borland Delphi Visual Component Library }
4 { InterBase Express core components }
5 { }
6 { Copyright (c) 1998-2000 Inprise Corporation }
7 { }
8 { InterBase Express is based in part on the product }
9 { Free IB Components, written by Gregory H. Deatz for }
10 { Hoagland, Longo, Moran, Dunst & Doukas Company. }
11 { Free IB Components is used under license. }
12 { }
13 { The contents of this file are subject to the InterBase }
14 { Public License Version 1.0 (the "License"); you may not }
15 { use this file except in compliance with the License. You }
16 { may obtain a copy of the License at http://www.Inprise.com/IPL.html }
17 { Software distributed under the License is distributed on }
18 { an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either }
19 { express or implied. See the License for the specific language }
20 { governing rights and limitations under the License. }
21 { The Original Code was created by InterBase Software Corporation }
22 { and its successors. }
23 { Portions created by Inprise Corporation are Copyright (C) Inprise }
24 { Corporation. All Rights Reserved. }
25 { Contributor(s): Jeff Overcash }
26 { }
27 { IBX For Lazarus (Firebird Express) }
28 { Contributor: Tony Whyman, MWA Software http://www.mwasoftware.co.uk }
29 { Portions created by MWA Software are copyright McCallum Whyman }
30 { Associates Ltd 2011 }
31 { }
32 {************************************************************************}
33
34 {
35 InterBase Express provides component interfaces to
36 functions introduced in InterBase 6.0. The Services
37 components (TIB*Service, TIBServerProperties)
38 function only if you have installed InterBase 6.0 or
39 later software, including Firebird
40 }
41
42 unit IBServices;
43
44 {$Mode Delphi}
45
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 if sl.Count > 0 then
883 for i := 0 to sl.Count - 1 do
884 begin
885 { Get the parameter's name and value from the list,
886 and make sure that the name is all lowercase with
887 no leading 'isc_spb_' prefix }
888 if (Trim(sl.Names[i]) = '') then continue;
889 param_name := LowerCase(sl.Names[i]); {mbcs ok}
890 param_value := Copy(sl[i], Pos('=', sl[i]) + 1, Length(sl[i])); {mbcs ok}
891 if (Pos(SPBPrefix, param_name) = 1) then {mbcs ok}
892 Delete(param_name, 1, Length(SPBPrefix));
893 { We want to translate the parameter name to some integer
894 value. We do this by scanning through a list of known
895 service parameter names (SPBConstantNames, defined above). }
896 SPBVal := 0;
897 SPBServerVal := 0;
898 { Find the parameter }
899 for j := 1 to isc_spb_last_spb_constant do
900 if (param_name = SPBConstantNames[j]) then
901 begin
902 SPBVal := j;
903 SPBServerVal := SPBConstantValues[j];
904 break;
905 end;
906 case SPBVal of
907 isc_spb_user_name, isc_spb_password:
908 begin
909 SPB := SPB +
910 Char(SPBServerVal) +
911 Char(Length(param_value)) +
912 param_value;
913 Inc(SPBLength, 2 + Length(param_value));
914 end;
915 else
916 begin
917 if (SPBVal > 0) and
918 (SPBVal <= isc_dpb_last_dpb_constant) then
919 IBError(ibxeSPBConstantNotSupported,
920 [SPBConstantNames[SPBVal]])
921 else
922 IBError(ibxeSPBConstantUnknown, [SPBVal]);
923 end;
924 end;
925 end;
926 end;
927
928 { TIBServerProperties }
929 constructor TIBServerProperties.Create(AOwner: TComponent);
930 begin
931 inherited Create(AOwner);
932 FDatabaseInfo := TDatabaseInfo.Create;
933 FLicenseInfo := TLicenseInfo.Create;
934 FLicenseMaskInfo := TLicenseMaskInfo.Create;
935 FVersionInfo := TVersionInfo.Create;
936 FConfigParams := TConfigParams.Create;
937 end;
938
939 destructor TIBServerProperties.Destroy;
940 begin
941 FDatabaseInfo.Free;
942 FLicenseInfo.Free;
943 FLicenseMaskInfo.Free;
944 FVersionInfo.Free;
945 FConfigParams.Free;
946 inherited Destroy;
947 end;
948
949 procedure TIBServerProperties.ParseConfigFileData(var RunLen: Integer);
950 begin
951 Inc(RunLen);
952 with FConfigParams.ConfigFileData do
953 begin
954 SetLength (ConfigFileValue, Length(ConfigFileValue)+1);
955 SetLength (ConfigFileKey, Length(ConfigFileKey)+1);
956
957 ConfigFileKey[High(ConfigFileKey)] := Integer(OutputBuffer[RunLen-1]);
958 ConfigFileValue[High(ConfigFileValue)] := ParseInteger(RunLen);
959 end;
960 end;
961
962 procedure TIBServerProperties.Fetch;
963 begin
964 if (Database in Options) then
965 FetchDatabaseInfo;
966 if (License in Options) then
967 FetchLicenseInfo;
968 if (LicenseMask in Options) then
969 FetchLicenseMaskInfo;
970 if (ConfigParameters in Options) then
971 FetchConfigParams;
972 if (Version in Options) then
973 FetchVersionInfo;
974 end;
975
976 procedure TIBServerProperties.FetchConfigParams;
977 var
978 RunLen: Integer;
979
980 begin
981 ServiceQueryParams := Char(isc_info_svc_get_config) +
982 Char(isc_info_svc_get_env) +
983 Char(isc_info_svc_get_env_lock) +
984 Char(isc_info_svc_get_env_msg) +
985 Char(isc_info_svc_user_dbpath);
986
987 InternalServiceQuery;
988 RunLen := 0;
989 While (not (Integer(OutputBuffer[RunLen]) = isc_info_end)) do
990 begin
991 case Integer(OutputBuffer[RunLen]) of
992 isc_info_svc_get_config:
993 begin
994 FConfigParams.ConfigFileData.ConfigFileKey := nil;
995 FConfigParams.ConfigFileData.ConfigFileValue := nil;
996 Inc (RunLen);
997 while (not (Integer(OutputBuffer[RunLen]) = isc_info_flag_end)) do
998 ParseConfigFileData (RunLen);
999 if (Integer(OutputBuffer[RunLen]) = isc_info_flag_end) then
1000 Inc (RunLen);
1001 end;
1002
1003 isc_info_svc_get_env:
1004 begin
1005 Inc (RunLen);
1006 FConfigParams.BaseLocation := ParseString(RunLen);
1007 end;
1008
1009 isc_info_svc_get_env_lock:
1010 begin
1011 Inc (RunLen);
1012 FConfigParams.LockFileLocation := ParseString(RunLen);
1013 end;
1014
1015 isc_info_svc_get_env_msg:
1016 begin
1017 Inc (RunLen);
1018 FConfigParams.MessageFileLocation := ParseString(RunLen);
1019 end;
1020
1021 isc_info_svc_user_dbpath:
1022 begin
1023 Inc (RunLen);
1024 FConfigParams.SecurityDatabaseLocation := ParseString(RunLen);
1025 end;
1026 else
1027 IBError(ibxeOutputParsingError, [nil]);
1028 end;
1029 end;
1030 end;
1031
1032 procedure TIBServerProperties.FetchDatabaseInfo;
1033 var
1034 i, RunLen: Integer;
1035 begin
1036 ServiceQueryParams := Char(isc_info_svc_svr_db_info);
1037 InternalServiceQuery;
1038 if (OutputBuffer[0] <> Char(isc_info_svc_svr_db_info)) then
1039 IBError(ibxeOutputParsingError, [nil]);
1040 RunLen := 1;
1041 if (OutputBuffer[RunLen] <> Char(isc_spb_num_att)) then
1042 IBError(ibxeOutputParsingError, [nil]);
1043 Inc(RunLen);
1044 FDatabaseInfo.NoOfAttachments := ParseInteger(RunLen);
1045 if (OutputBuffer[RunLen] <> Char(isc_spb_num_db)) then
1046 IBError(ibxeOutputParsingError, [nil]);
1047 Inc(RunLen);
1048 FDatabaseInfo.NoOfDatabases := ParseInteger(RunLen);
1049 FDatabaseInfo.DbName := nil;
1050 SetLength(FDatabaseInfo.DbName, FDatabaseInfo.NoOfDatabases);
1051 i := 0;
1052 while (OutputBuffer[RunLen] <> Char(isc_info_flag_end)) do
1053 begin
1054 if (OutputBuffer[RunLen] <> Char(SPBConstantValues[isc_spb_dbname])) then
1055 IBError(ibxeOutputParsingError, [nil]);
1056 Inc(RunLen);
1057 FDatabaseInfo.DbName[i] := ParseString(RunLen);
1058 Inc (i);
1059 end;
1060 end;
1061
1062 procedure TIBServerProperties.FetchLicenseInfo;
1063 var
1064 i, RunLen: Integer;
1065 done: Integer;
1066 begin
1067 ServiceQueryParams := Char(isc_info_svc_get_license) +
1068 Char(isc_info_svc_get_licensed_users);
1069 InternalServiceQuery;
1070 RunLen := 0;
1071 done := 0;
1072 i := 0;
1073 FLicenseInfo.key := nil;
1074 FLicenseInfo.id := nil;
1075 FLicenseInfo.desc := nil;
1076
1077 While done < 2 do begin
1078 Inc(Done);
1079 Inc(RunLen);
1080 case Integer(OutputBuffer[RunLen-1]) of
1081 isc_info_svc_get_license:
1082 begin
1083 while (OutputBuffer[RunLen] <> Char(isc_info_flag_end)) do
1084 begin
1085 if (i >= Length(FLicenseInfo.key)) then
1086 begin
1087 SetLength(FLicenseInfo.key, i + 10);
1088 SetLength(FLicenseInfo.id, i + 10);
1089 SetLength(FLicenseInfo.desc, i + 10);
1090 end;
1091 if (OutputBuffer[RunLen] <> Char(isc_spb_lic_id)) then
1092 IBError(ibxeOutputParsingError, [nil]);
1093 Inc(RunLen);
1094 FLicenseInfo.id[i] := ParseString(RunLen);
1095 if (OutputBuffer[RunLen] <> Char(isc_spb_lic_key)) then
1096 IBError(ibxeOutputParsingError, [nil]);
1097 Inc(RunLen);
1098 FLicenseInfo.key[i] := ParseString(RunLen);
1099 if (OutputBuffer[RunLen] <> Char(7)) then
1100 IBError(ibxeOutputParsingError, [nil]);
1101 Inc(RunLen);
1102 FLicenseInfo.desc[i] := ParseString(RunLen);
1103 Inc(i);
1104 end;
1105 Inc(RunLen);
1106 if (Length(FLicenseInfo.key) > i) then
1107 begin
1108 SetLength(FLicenseInfo.key, i);
1109 SetLength(FLicenseInfo.id, i);
1110 SetLength(FLicenseInfo.desc, i);
1111 end;
1112 end;
1113 isc_info_svc_get_licensed_users:
1114 FLicenseInfo.LicensedUsers := ParseInteger(RunLen);
1115 else
1116 IBError(ibxeOutputParsingError, [nil]);
1117 end;
1118 end;
1119 end;
1120
1121 procedure TIBServerProperties.FetchLicenseMaskInfo();
1122 var
1123 done,RunLen:integer;
1124 begin
1125 ServiceQueryParams := Char(isc_info_svc_get_license_mask) +
1126 Char(isc_info_svc_capabilities);
1127 InternalServiceQuery;
1128 RunLen := 0;
1129 done := 0;
1130 While done <= 1 do
1131 begin
1132 Inc(done);
1133 Inc(RunLen);
1134 case Integer(OutputBuffer[RunLen-1]) of
1135 isc_info_svc_get_license_mask:
1136 FLicenseMaskInfo.LicenseMask := ParseInteger(RunLen);
1137 isc_info_svc_capabilities:
1138 FLicenseMaskInfo.CapabilityMask := ParseInteger(RunLen);
1139 else
1140 IBError(ibxeOutputParsingError, [nil]);
1141 end;
1142 end;
1143 end;
1144
1145
1146 procedure TIBServerProperties.FetchVersionInfo;
1147 var
1148 RunLen: Integer;
1149 done: Integer;
1150 begin
1151 ServiceQueryParams := Char(isc_info_svc_version) +
1152 Char(isc_info_svc_server_version) +
1153 Char(isc_info_svc_implementation);
1154 InternalServiceQuery;
1155 RunLen := 0;
1156 done := 0;
1157
1158 While done <= 2 do
1159 begin
1160 Inc(done);
1161 Inc(RunLen);
1162 case Integer(OutputBuffer[RunLen-1]) of
1163 isc_info_svc_version:
1164 FVersionInfo.ServiceVersion := ParseInteger(RunLen);
1165 isc_info_svc_server_version:
1166 FVersionInfo.ServerVersion := ParseString(RunLen);
1167 isc_info_svc_implementation:
1168 FVersionInfo.ServerImplementation := ParseString(RunLen);
1169 else
1170 IBError(ibxeOutputParsingError, [nil]);
1171 end;
1172 end;
1173 end;
1174
1175 { TIBControlService }
1176 procedure TIBControlService.SetServiceStartOptions;
1177 begin
1178
1179 end;
1180
1181 function TIBControlService.GetIsServiceRunning: Boolean;
1182 var
1183 RunLen: Integer;
1184 begin
1185 ServiceQueryParams := Char(isc_info_svc_running);
1186 InternalServiceQuery;
1187 if (OutputBuffer[0] <> Char(isc_info_svc_running)) then
1188 IBError(ibxeOutputParsingError, [nil]);
1189 RunLen := 1;
1190 if (ParseInteger(RunLen) = 1) then
1191 result := True
1192 else
1193 result := False;
1194 end;
1195
1196 procedure TIBControlService.ServiceStartAddParam (Value: string; param: Integer);
1197 var
1198 Len: UShort;
1199 begin
1200 Len := Length(Value);
1201 if Len > 0 then
1202 begin
1203 FStartParams := FStartParams +
1204 Char(Param) +
1205 PChar(@Len)[0] +
1206 PChar(@Len)[1] +
1207 Value;
1208 end;
1209 end;
1210
1211 procedure TIBControlService.ServiceStartAddParam (Value: Integer; param: Integer);
1212 begin
1213 FStartParams := FStartParams +
1214 Char(Param) +
1215 PChar(@Value)[0] +
1216 PChar(@Value)[1] +
1217 PChar(@Value)[2] +
1218 PChar(@Value)[3];
1219 end;
1220
1221 constructor TIBControlService.Create(AOwner: TComponent);
1222 begin
1223 inherited create(AOwner);
1224 FStartParams := '';
1225 FStartSPB := nil;
1226 FStartSPBLength := 0;
1227 end;
1228
1229 procedure TIBControlService.InternalServiceStart;
1230 begin
1231 FStartSPBLength := Length(FStartParams);
1232 if FStartSPBLength = 0 then
1233 IBError(ibxeStartParamsError, [nil]);
1234 IBAlloc(FStartSPB, 0, FStartSPBLength);
1235 Move(FStartParams[1], FStartSPB[0], FstartSPBLength);
1236 try
1237 if call(isc_service_start(StatusVector, @FHandle, nil,
1238 FStartSPBLength, FStartSPB), False) > 0 then
1239 begin
1240 FHandle := nil;
1241 IBDataBaseError;
1242 end;
1243 finally
1244 FreeMem(FStartSPB);
1245 FStartSPB := nil;
1246 FStartSPBLength := 0;
1247 FStartParams := '';
1248 end;
1249 MonitorHook.ServiceStart(Self);
1250 end;
1251
1252 procedure TIBControlService.ServiceStart;
1253 begin
1254 CheckActive;
1255 SetServiceStartOptions;
1256 InternalServiceStart;
1257 end;
1258
1259 { TIBConfigService }
1260
1261 procedure TIBConfigService.ServiceStart;
1262 begin
1263 IBError(ibxeUseSpecificProcedures, [nil]);
1264 end;
1265
1266 procedure TIBConfigService.ActivateShadow;
1267 begin
1268 ServiceStartParams := Char(isc_action_svc_properties);
1269 ServiceStartAddParam (FDatabaseName, SPBConstantValues[isc_spb_dbname]);
1270 ServiceStartAddParam (isc_spb_prp_activate, SPBConstantValues[isc_spb_options]);
1271 InternalServiceStart;
1272 end;
1273
1274 procedure TIBConfigService.BringDatabaseOnline;
1275 begin
1276 ServiceStartParams := Char(isc_action_svc_properties);
1277 ServiceStartAddParam (FDatabaseName, SPBConstantValues[isc_spb_dbname]);
1278 ServiceStartAddParam (isc_spb_prp_db_online, SPBConstantValues[isc_spb_options]);
1279 InternalServiceStart;
1280 end;
1281
1282 procedure TIBConfigService.SetAsyncMode(Value: Boolean);
1283 begin
1284 ServiceStartParams := Char(isc_action_svc_properties);
1285 ServiceStartAddParam (FDatabaseName, SPBConstantValues[isc_spb_dbname]);
1286 ServiceStartParams := ServiceStartParams +
1287 Char(isc_spb_prp_write_mode);
1288 if Value then
1289 ServiceStartParams := ServiceStartParams +
1290 Char(isc_spb_prp_wm_async)
1291 else
1292 ServiceStartParams := ServiceStartParams +
1293 Char(isc_spb_prp_wm_sync);
1294 InternalServiceStart;
1295 end;
1296
1297 procedure TIBConfigService.SetDatabaseName(const Value: string);
1298 begin
1299 FDatabaseName := Value;
1300 end;
1301
1302 procedure TIBConfigService.SetPageBuffers(Value: Integer);
1303 begin
1304 ServiceStartParams := Char(isc_action_svc_properties);
1305 ServiceStartAddParam (FDatabaseName, SPBConstantValues[isc_spb_dbname]);
1306 ServiceStartAddParam (Value, isc_spb_prp_page_buffers);
1307 InternalServiceStart;
1308 end;
1309
1310 procedure TIBConfigService.SetReadOnly(Value: Boolean);
1311 begin
1312 ServiceStartParams := Char(isc_action_svc_properties);
1313 ServiceStartAddParam (FDatabaseName, SPBConstantValues[isc_spb_dbname]);
1314 ServiceStartParams := ServiceStartParams +
1315 Char(isc_spb_prp_access_mode);
1316 if Value then
1317 ServiceStartParams := ServiceStartParams +
1318 Char(isc_spb_prp_am_readonly)
1319 else
1320 ServiceStartParams := ServiceStartParams +
1321 Char(isc_spb_prp_am_readwrite);
1322 InternalServiceStart;
1323 end;
1324
1325 procedure TIBConfigService.SetReserveSpace(Value: Boolean);
1326 begin
1327 ServiceStartParams := Char(isc_action_svc_properties);
1328 ServiceStartAddParam (FDatabaseName, SPBConstantValues[isc_spb_dbname]);
1329 ServiceStartParams := ServiceStartParams +
1330 Char(isc_spb_prp_reserve_space);
1331 if Value then
1332 ServiceStartParams := ServiceStartParams +
1333 Char(isc_spb_prp_res)
1334 else
1335 ServiceStartParams := ServiceStartParams +
1336 Char(isc_spb_prp_res_use_full);
1337 InternalServiceStart;
1338 end;
1339
1340 procedure TIBConfigService.SetSweepInterval(Value: Integer);
1341 begin
1342 ServiceStartParams := Char(isc_action_svc_properties);
1343 ServiceStartAddParam (FDatabaseName, SPBConstantValues[isc_spb_dbname]);
1344 ServiceStartAddParam (Value, isc_spb_prp_sweep_interval);
1345 InternalServiceStart;
1346 end;
1347
1348 procedure TIBConfigService.SetDBSqlDialect(Value: Integer);
1349 begin
1350 ServiceStartParams := Char(isc_action_svc_properties);
1351 ServiceStartAddParam (FDatabaseName, SPBConstantValues[isc_spb_dbname]);
1352 ServiceStartAddParam (Value, isc_spb_prp_set_sql_dialect);
1353 InternalServiceStart;
1354 end;
1355
1356 procedure TIBConfigService.ShutdownDatabase(Options: TShutdownMode;
1357 Wait: Integer);
1358 begin
1359 ServiceStartParams := Char(isc_action_svc_properties);
1360 ServiceStartAddParam (FDatabaseName, SPBConstantValues[isc_spb_dbname]);
1361 if (Options = Forced) then
1362 ServiceStartAddParam (Wait, isc_spb_prp_shutdown_db)
1363 else if (Options = DenyTransaction) then
1364 ServiceStartAddParam (Wait, isc_spb_prp_deny_new_transactions)
1365 else
1366 ServiceStartAddParam (Wait, isc_spb_prp_deny_new_attachments);
1367 InternalServiceStart;
1368 end;
1369
1370 { TIBStatisticalService }
1371
1372 procedure TIBStatisticalService.SetDatabaseName(const Value: string);
1373 begin
1374 FDatabaseName := Value;
1375 end;
1376
1377 procedure TIBStatisticalService.SetServiceStartOptions;
1378 var
1379 param: Integer;
1380 begin
1381 if FDatabaseName = '' then
1382 IBError(ibxeStartParamsError, [nil]);
1383 param := 0;
1384 if (DataPages in Options) then
1385 param := param or isc_spb_sts_data_pages;
1386 if (DbLog in Options) then
1387 param := param or isc_spb_sts_db_log;
1388 if (HeaderPages in Options) then
1389 param := param or isc_spb_sts_hdr_pages;
1390 if (IndexPages in Options) then
1391 param := param or isc_spb_sts_idx_pages;
1392 if (SystemRelations in Options) then
1393 param := param or isc_spb_sts_sys_relations;
1394 Action := isc_action_svc_db_stats;
1395 ServiceStartParams := Char(isc_action_svc_db_stats);
1396 ServiceStartAddParam (FDatabaseName, SPBConstantValues[isc_spb_dbname]);
1397 ServiceStartAddParam (param, SPBConstantValues[isc_spb_options]);
1398 end;
1399
1400 { TIBBackupService }
1401 procedure TIBBackupService.SetServiceStartOptions;
1402 var
1403 param, i: Integer;
1404 value: String;
1405 begin
1406 if FDatabaseName = '' then
1407 IBError(ibxeStartParamsError, [nil]);
1408 param := 0;
1409 if (IgnoreChecksums in Options) then
1410 param := param or isc_spb_bkp_ignore_checksums;
1411 if (IgnoreLimbo in Options) then
1412 param := param or isc_spb_bkp_ignore_limbo;
1413 if (MetadataOnly in Options) then
1414 param := param or isc_spb_bkp_metadata_only;
1415 if (NoGarbageCollection in Options) then
1416 param := param or isc_spb_bkp_no_garbage_collect;
1417 if (OldMetadataDesc in Options) then
1418 param := param or isc_spb_bkp_old_descriptions;
1419 if (NonTransportable in Options) then
1420 param := param or isc_spb_bkp_non_transportable;
1421 if (ConvertExtTables in Options) then
1422 param := param or isc_spb_bkp_convert;
1423 Action := isc_action_svc_backup;
1424 ServiceStartParams := Char(isc_action_svc_backup);
1425 ServiceStartAddParam(FDatabaseName, SPBConstantValues[isc_spb_dbname]);
1426 ServiceStartAddParam(param, SPBConstantValues[isc_spb_options]);
1427 if Verbose then
1428 ServiceStartParams := ServiceStartParams + Char(SPBConstantValues[isc_spb_verbose]);
1429 if FBlockingFactor > 0 then
1430 ServiceStartAddParam(FBlockingFactor, isc_spb_bkp_factor);
1431 for i := 0 to FBackupFile.Count - 1 do
1432 begin
1433 if (Trim(FBackupFile[i]) = '') then
1434 continue;
1435 if (Pos('=', FBackupFile[i]) <> 0) then
1436 begin {mbcs ok}
1437 ServiceStartAddParam(FBackupFile.Names[i], isc_spb_bkp_file);
1438 value := Copy(FBackupFile[i], Pos('=', FBackupFile[i]) + 1, Length(FBackupFile.Names[i])); {mbcs ok}
1439 param := StrToInt(value);
1440 ServiceStartAddParam(param, isc_spb_bkp_length);
1441 end
1442 else
1443 ServiceStartAddParam(FBackupFile[i], isc_spb_bkp_file);
1444 end;
1445 end;
1446
1447 constructor TIBBackupService.Create(AOwner: TComponent);
1448 begin
1449 inherited Create(AOwner);
1450 FBackupFile := TStringList.Create;
1451 end;
1452
1453 destructor TIBBackupService.Destroy;
1454 begin
1455 FBackupFile.Free;
1456 inherited Destroy;
1457 end;
1458
1459 procedure TIBBackupService.SetBackupFile(const Value: TStrings);
1460 begin
1461 FBackupFile.Assign(Value);
1462 end;
1463
1464 { TIBRestoreService }
1465
1466 procedure TIBRestoreService.SetServiceStartOptions;
1467 var
1468 param, i: Integer;
1469 value: String;
1470 begin
1471 param := 0;
1472 if (DeactivateIndexes in Options) then
1473 param := param or isc_spb_res_deactivate_idx;
1474 if (NoShadow in Options) then
1475 param := param or isc_spb_res_no_shadow;
1476 if (NoValidityCheck in Options) then
1477 param := param or isc_spb_res_no_validity;
1478 if (OneRelationAtATime in Options) then
1479 param := param or isc_spb_res_one_at_a_time;
1480 if (Replace in Options) then
1481 param := param or isc_spb_res_replace;
1482 if (CreateNewDB in Options) then
1483 param := param or isc_spb_res_create;
1484 if (UseAllSpace in Options) then
1485 param := param or isc_spb_res_use_all_space;
1486 Action := isc_action_svc_restore;
1487 ServiceStartParams := Char(isc_action_svc_restore);
1488 ServiceStartAddParam(param, SPBConstantValues[isc_spb_options]);
1489 if Verbose then ServiceStartParams := ServiceStartParams + Char(SPBConstantValues[isc_spb_verbose]);
1490 if FPageSize > 0 then
1491 ServiceStartAddParam(FPageSize, isc_spb_res_page_size);
1492 if FPageBuffers > 0 then
1493 ServiceStartAddParam(FPageBuffers, isc_spb_res_buffers);
1494 for i := 0 to FBackupFile.Count - 1 do
1495 begin
1496 if (Trim(FBackupFile[i]) = '') then continue;
1497 if (Pos('=', FBackupFile[i]) <> 0) then {mbcs ok}
1498 begin
1499 ServiceStartAddParam(FBackupFile.Names[i], isc_spb_bkp_file);
1500 value := Copy(FBackupFile[i], Pos('=', FBackupFile[i]) + 1, Length(FBackupFile.Names[i])); {mbcs ok}
1501 param := StrToInt(value);
1502 ServiceStartAddParam(param, isc_spb_bkp_length);
1503 end
1504 else
1505 ServiceStartAddParam(FBackupFile[i], isc_spb_bkp_file);
1506 end;
1507 for i := 0 to FDatabaseName.Count - 1 do
1508 begin
1509 if (Trim(FDatabaseName[i]) = '') then continue;
1510 if (Pos('=', FDatabaseName[i]) <> 0) then {mbcs ok}
1511 begin
1512 ServiceStartAddParam(FDatabaseName.Names[i], SPBConstantValues[isc_spb_dbname]);
1513 value := Copy(FDatabaseName[i], Pos('=', FDatabaseName[i]) + 1, Length(FDatabaseName[i])); {mbcs ok}
1514 param := StrToInt(value);
1515 ServiceStartAddParam(param, isc_spb_res_length);
1516 end
1517 else
1518 ServiceStartAddParam(FDatabaseName[i], SPBConstantValues[isc_spb_dbname]);
1519 end;
1520 end;
1521
1522 constructor TIBRestoreService.Create(AOwner: TComponent);
1523 begin
1524 inherited Create(AOwner);
1525 FDatabaseName := TStringList.Create;
1526 FBackupFile := TStringList.Create;
1527 Include (FOptions, CreateNewDB);
1528 end;
1529
1530 destructor TIBRestoreService.Destroy;
1531 begin
1532 FDatabaseName.Free;
1533 FBackupFile.Free;
1534 inherited Destroy;
1535 end;
1536
1537 procedure TIBRestoreService.SetBackupFile(const Value: TStrings);
1538 begin
1539 FBackupFile.Assign(Value);
1540 end;
1541
1542 procedure TIBRestoreService.SetDatabaseName(const Value: TStrings);
1543 begin
1544 FDatabaseName.Assign(Value);
1545 end;
1546
1547 { TIBValidationService }
1548 constructor TIBValidationService.Create(AOwner: TComponent);
1549 begin
1550 inherited Create(AOwner);
1551 end;
1552
1553 destructor TIBValidationService.Destroy;
1554 var
1555 i : Integer;
1556 begin
1557 for i := 0 to High(FLimboTransactionInfo) do
1558 FLimboTransactionInfo[i].Free;
1559 FLimboTransactionInfo := nil;
1560 inherited Destroy;
1561 end;
1562
1563 procedure TIBValidationService.FetchLimboTransactionInfo;
1564 var
1565 i, RunLen: Integer;
1566 Value: Char;
1567 begin
1568 ServiceQueryParams := Char(isc_info_svc_limbo_trans);
1569 InternalServiceQuery;
1570 RunLen := 0;
1571 if (OutputBuffer[RunLen] <> Char(isc_info_svc_limbo_trans)) then
1572 IBError(ibxeOutputParsingError, [nil]);
1573 Inc(RunLen, 3);
1574 for i := 0 to High(FLimboTransactionInfo) do
1575 FLimboTransactionInfo[i].Free;
1576 FLimboTransactionInfo := nil;
1577 i := 0;
1578 while (OutputBuffer[RunLen] <> Char(isc_info_end)) do
1579 begin
1580 if (i >= Length(FLimboTransactionInfo)) then
1581 SetLength(FLimboTransactionInfo, i + 10);
1582 if FLimboTransactionInfo[i] = nil then
1583 FLimboTransactionInfo[i] := TLimboTransactionInfo.Create;
1584 with FLimboTransactionInfo[i] do
1585 begin
1586 if (OutputBuffer[RunLen] = Char(isc_spb_single_tra_id)) then
1587 begin
1588 Inc(RunLen);
1589 MultiDatabase := False;
1590 ID := ParseInteger(RunLen);
1591 end
1592 else
1593 begin
1594 Inc(RunLen);
1595 MultiDatabase := True;
1596 ID := ParseInteger(RunLen);
1597 HostSite := ParseString(RunLen);
1598 if (OutputBuffer[RunLen] <> Char(isc_spb_tra_state)) then
1599 IBError(ibxeOutputParsingError, [nil]);
1600 Inc(RunLen);
1601 Value := OutputBuffer[RunLen];
1602 Inc(RunLen);
1603 if (Value = Char(isc_spb_tra_state_limbo)) then
1604 State := LimboState
1605 else
1606 if (Value = Char(isc_spb_tra_state_commit)) then
1607 State := CommitState
1608 else
1609 if (Value = Char(isc_spb_tra_state_rollback)) then
1610 State := RollbackState
1611 else
1612 State := UnknownState;
1613 RemoteSite := ParseString(RunLen);
1614 RemoteDatabasePath := ParseString(RunLen);
1615 Value := OutputBuffer[RunLen];
1616 Inc(RunLen);
1617 if (Value = Char(isc_spb_tra_advise_commit)) then
1618 begin
1619 Advise := CommitAdvise;
1620 Action:= CommitAction;
1621 end
1622 else
1623 if (Value = Char(isc_spb_tra_advise_rollback)) then
1624 begin
1625 Advise := RollbackAdvise;
1626 Action := RollbackAction;
1627 end
1628 else
1629 begin
1630 { if no advice commit as default }
1631 Advise := UnknownAdvise;
1632 Action:= CommitAction;
1633 end;
1634 end;
1635 Inc (i);
1636 end;
1637 end;
1638 if (i > 0) then
1639 SetLength(FLimboTransactionInfo, i+1);
1640 end;
1641
1642 procedure TIBValidationService.FixLimboTransactionErrors;
1643 var
1644 i: Integer;
1645 begin
1646 ServiceStartParams := Char(isc_action_svc_repair);
1647 ServiceStartAddParam (FDatabaseName, SPBConstantValues[isc_spb_dbname]);
1648 if (FGlobalAction = NoGlobalAction) then
1649 begin
1650 i := 0;
1651 while (FLimboTransactionInfo[i].ID <> 0) do
1652 begin
1653 if (FLimboTransactionInfo[i].Action = CommitAction) then
1654 ServiceStartAddParam (FLimboTransactionInfo[i].ID, isc_spb_rpr_commit_trans)
1655 else
1656 ServiceStartAddParam (FLimboTransactionInfo[i].ID, isc_spb_rpr_rollback_trans);
1657 Inc(i);
1658 end;
1659 end
1660 else
1661 begin
1662 i := 0;
1663 if (FGlobalAction = CommitGlobal) then
1664 while (FLimboTransactionInfo[i].ID <> 0) do
1665 begin
1666 ServiceStartAddParam (FLimboTransactionInfo[i].ID, isc_spb_rpr_commit_trans);
1667 Inc(i);
1668 end
1669 else
1670 while (FLimboTransactionInfo[i].ID <> 0) do
1671 begin
1672 ServiceStartAddParam (FLimboTransactionInfo[i].ID, isc_spb_rpr_rollback_trans);
1673 Inc(i);
1674 end;
1675 end;
1676 InternalServiceStart;
1677 end;
1678
1679 function TIBValidationService.GetLimboTransactionInfo(index: integer): TLimboTransactionInfo;
1680 begin
1681 if index <= High(FLimboTransactionInfo) then
1682 result := FLimboTransactionInfo[index]
1683 else
1684 result := nil;
1685 end;
1686
1687 function TIBValidationService.GetLimboTransactionInfoCount: integer;
1688 begin
1689 Result := High(FLimboTransactionInfo);
1690 end;
1691
1692 procedure TIBValidationService.SetDatabaseName(const Value: string);
1693 begin
1694 FDatabaseName := Value;
1695 end;
1696
1697 procedure TIBValidationService.SetServiceStartOptions;
1698 var
1699 param: Integer;
1700 begin
1701 Action := isc_action_svc_repair;
1702 if FDatabaseName = '' then
1703 IBError(ibxeStartParamsError, [nil]);
1704 param := 0;
1705 if (SweepDB in Options) then
1706 param := param or isc_spb_rpr_sweep_db;
1707 if (ValidateDB in Options) then
1708 param := param or isc_spb_rpr_validate_db;
1709 ServiceStartParams := Char(isc_action_svc_repair);
1710 ServiceStartAddParam (FDatabaseName, SPBConstantValues[isc_spb_dbname]);
1711 if param > 0 then
1712 ServiceStartAddParam (param, SPBConstantValues[isc_spb_options]);
1713 param := 0;
1714 if (LimboTransactions in Options) then
1715 param := param or isc_spb_rpr_list_limbo_trans;
1716 if (CheckDB in Options) then
1717 param := param or isc_spb_rpr_check_db;
1718 if (IgnoreChecksum in Options) then
1719 param := param or isc_spb_rpr_ignore_checksum;
1720 if (KillShadows in Options) then
1721 param := param or isc_spb_rpr_kill_shadows;
1722 if (MendDB in Options) then
1723 param := param or isc_spb_rpr_mend_db;
1724 if (ValidateFull in Options) then
1725 begin
1726 param := param or isc_spb_rpr_full;
1727 if not (MendDB in Options) then
1728 param := param or isc_spb_rpr_validate_db;
1729 end;
1730 if param > 0 then
1731 ServiceStartAddParam (param, SPBConstantValues[isc_spb_options]);
1732 end;
1733
1734 { TIBSecurityService }
1735 constructor TIBSecurityService.Create(AOwner: TComponent);
1736 begin
1737 inherited Create(AOwner);
1738 FModifyParams := [];
1739 end;
1740
1741 destructor TIBSecurityService.Destroy;
1742 var
1743 i : Integer;
1744 begin
1745 for i := 0 to High(FUserInfo) do
1746 FUserInfo[i].Free;
1747 FUserInfo := nil;
1748 inherited Destroy;
1749 end;
1750
1751 procedure TIBSecurityService.FetchUserInfo;
1752 var
1753 i, RunLen: Integer;
1754 begin
1755 ServiceQueryParams := Char(isc_info_svc_get_users);
1756 InternalServiceQuery;
1757 RunLen := 0;
1758 if (OutputBuffer[RunLen] <> Char(isc_info_svc_get_users)) then
1759 IBError(ibxeOutputParsingError, [nil]);
1760 Inc(RunLen);
1761 for i := 0 to High(FUserInfo) do
1762 FUserInfo[i].Free;
1763 FUserInfo := nil;
1764 i := 0;
1765 { Don't have any use for the combined length
1766 so increment past by 2 }
1767 Inc(RunLen, 2);
1768 while (OutputBuffer[RunLen] <> Char(isc_info_end)) do
1769 begin
1770 if (i >= Length(FUSerInfo)) then
1771 SetLength(FUserInfo, i + 10);
1772 if (OutputBuffer[RunLen] <> Char(isc_spb_sec_username)) then
1773 IBError(ibxeOutputParsingError, [nil]);
1774 Inc(RunLen);
1775 if FUserInfo[i] = nil then
1776 FUserInfo[i] := TUserInfo.Create;
1777 FUserInfo[i].UserName := ParseString(RunLen);
1778 if (OutputBuffer[RunLen] <> Char(isc_spb_sec_firstname)) then
1779 IBError(ibxeOutputParsingError, [nil]);
1780 Inc(RunLen);
1781 FUserInfo[i].FirstName := ParseString(RunLen);
1782 if (OutputBuffer[RunLen] <> Char(isc_spb_sec_middlename)) then
1783 IBError(ibxeOutputParsingError, [nil]);
1784 Inc(RunLen);
1785 FUserInfo[i].MiddleName := ParseString(RunLen);
1786 if (OutputBuffer[RunLen] <> Char(isc_spb_sec_lastname)) then
1787 IBError(ibxeOutputParsingError, [nil]);
1788 Inc(RunLen);
1789 FUserInfo[i].LastName := ParseString(RunLen);
1790 if (OutputBuffer[RunLen] <> Char(isc_spb_sec_userId)) then
1791 IBError(ibxeOutputParsingError, [nil]);
1792 Inc(RunLen);
1793 FUserInfo[i].UserId := ParseInteger(RunLen);
1794 if (OutputBuffer[RunLen] <> Char(isc_spb_sec_groupid)) then
1795 IBError(ibxeOutputParsingError, [nil]);
1796 Inc(RunLen);
1797 FUserInfo[i].GroupID := ParseInteger(RunLen);
1798 Inc (i);
1799 end;
1800 if (i > 0) then
1801 SetLength(FUserInfo, i+1);
1802 end;
1803
1804 function TIBSecurityService.GetUserInfo(Index: Integer): TUserInfo;
1805 begin
1806 if Index <= High(FUSerInfo) then
1807 result := FUserInfo[Index]
1808 else
1809 result := nil;
1810 end;
1811
1812 function TIBSecurityService.GetUserInfoCount: Integer;
1813 begin
1814 Result := Max(High(FUSerInfo),0);
1815 end;
1816
1817 procedure TIBSecurityService.AddUser;
1818 begin
1819 SecurityAction := ActionAddUser;
1820 ServiceStart;
1821 end;
1822
1823 procedure TIBSecurityService.DeleteUser;
1824 begin
1825 SecurityAction := ActionDeleteUser;
1826 ServiceStart;
1827 end;
1828
1829 procedure TIBSecurityService.DisplayUsers;
1830 begin
1831 SecurityAction := ActionDisplayUser;
1832 ServiceStartParams := Char(isc_action_svc_display_user);
1833 InternalServiceStart;
1834 FetchUserInfo;
1835 end;
1836
1837 procedure TIBSecurityService.DisplayUser(UserName: String);
1838 begin
1839 SecurityAction := ActionDisplayUser;
1840 ServiceStartParams := Char(isc_action_svc_display_user);
1841 ServiceStartAddParam (UserName, isc_spb_sec_username);
1842 InternalServiceStart;
1843 FetchUserInfo;
1844 end;
1845
1846 procedure TIBSecurityService.ModifyUser;
1847 begin
1848 SecurityAction := ActionModifyUser;
1849 ServiceStart;
1850 end;
1851
1852 procedure TIBSecurityService.SetSecurityAction (Value: TSecurityAction);
1853 begin
1854 FSecurityAction := Value;
1855 if Value = ActionDeleteUser then
1856 ClearParams;
1857 end;
1858
1859 procedure TIBSecurityService.ClearParams;
1860 begin
1861 FModifyParams := [];
1862 FFirstName := '';
1863 FMiddleName := '';
1864 FLastName := '';
1865 FGroupID := 0;
1866 FUserID := 0;
1867 FPassword := '';
1868 end;
1869
1870 procedure TIBSecurityService.SetFirstName (Value: String);
1871 begin
1872 FFirstName := Value;
1873 Include (FModifyParams, ModifyFirstName);
1874 end;
1875
1876 procedure TIBSecurityService.SetMiddleName (Value: String);
1877 begin
1878 FMiddleName := Value;
1879 Include (FModifyParams, ModifyMiddleName);
1880 end;
1881
1882 procedure TIBSecurityService.SetLastName (Value: String);
1883 begin
1884 FLastName := Value;
1885 Include (FModifyParams, ModifyLastName);
1886 end;
1887
1888 procedure TIBSecurityService.SetPassword (Value: String);
1889 begin
1890 FPassword := Value;
1891 Include (FModifyParams, ModifyPassword);
1892 end;
1893
1894 procedure TIBSecurityService.SetUserId (Value: Integer);
1895 begin
1896 FUserId := Value;
1897 Include (FModifyParams, ModifyUserId);
1898 end;
1899
1900 procedure TIBSecurityService.SetGroupId (Value: Integer);
1901 begin
1902 FGroupId := Value;
1903 Include (FModifyParams, ModifyGroupId);
1904 end;
1905
1906 procedure TIBSecurityService.Loaded;
1907 begin
1908 inherited Loaded;
1909 ClearParams;
1910 end;
1911
1912 procedure TIBSecurityService.SetServiceStartOptions;
1913 var
1914 Len: UShort;
1915
1916 begin
1917 case FSecurityAction of
1918 ActionAddUser:
1919 begin
1920 Action := isc_action_svc_add_user;
1921 if ( Pos(' ', FUserName) > 0 ) then
1922 IBError(ibxeStartParamsError, [nil]);
1923 Len := Length(FUserName);
1924 if (Len = 0) then
1925 IBError(ibxeStartParamsError, [nil]);
1926 ServiceStartParams := Char(isc_action_svc_add_user);
1927 ServiceStartAddParam (FSQLRole, SPBConstantValues[isc_spb_sql_role_name]);
1928 ServiceStartAddParam (FUserName, isc_spb_sec_username);
1929 ServiceStartAddParam (FUserID, isc_spb_sec_userid);
1930 ServiceStartAddParam (FGroupID, isc_spb_sec_groupid);
1931 ServiceStartAddParam (FPassword, isc_spb_sec_password);
1932 ServiceStartAddParam (FFirstName, isc_spb_sec_firstname);
1933 ServiceStartAddParam (FMiddleName, isc_spb_sec_middlename);
1934 ServiceStartAddParam (FLastName, isc_spb_sec_lastname);
1935 end;
1936 ActionDeleteUser:
1937 begin
1938 Action := isc_action_svc_delete_user;
1939 Len := Length(FUserName);
1940 if (Len = 0) then
1941 IBError(ibxeStartParamsError, [nil]);
1942 ServiceStartParams := Char(isc_action_svc_delete_user);
1943 ServiceStartAddParam (FSQLRole, SPBConstantValues[isc_spb_sql_role_name]);
1944 ServiceStartAddParam (FUserName, isc_spb_sec_username);
1945 end;
1946 ActionModifyUser:
1947 begin
1948 Action := isc_action_svc_modify_user;
1949 Len := Length(FUserName);
1950 if (Len = 0) then
1951 IBError(ibxeStartParamsError, [nil]);
1952 ServiceStartParams := Char(isc_action_svc_modify_user);
1953 ServiceStartAddParam (FSQLRole, SPBConstantValues[isc_spb_sql_role_name]);
1954 ServiceStartAddParam (FUserName, isc_spb_sec_username);
1955 if (ModifyUserId in FModifyParams) then
1956 ServiceStartAddParam (FUserID, isc_spb_sec_userid);
1957 if (ModifyGroupId in FModifyParams) then
1958 ServiceStartAddParam (FGroupID, isc_spb_sec_groupid);
1959 if (ModifyPassword in FModifyParams) then
1960 ServiceStartAddParam (FPassword, isc_spb_sec_password);
1961 if (ModifyFirstName in FModifyParams) then
1962 ServiceStartAddParam (FFirstName, isc_spb_sec_firstname);
1963 if (ModifyMiddleName in FModifyParams) then
1964 ServiceStartAddParam (FMiddleName, isc_spb_sec_middlename);
1965 if (ModifyLastName in FModifyParams) then
1966 ServiceStartAddParam (FLastName, isc_spb_sec_lastname);
1967 end;
1968 end;
1969 ClearParams;
1970 end;
1971
1972 { TIBUnStructuredService }
1973 constructor TIBControlAndQueryService.Create(AOwner: TComponent);
1974 begin
1975 inherited Create(AOwner);
1976 FEof := False;
1977 FAction := 0;
1978 end;
1979
1980 procedure TIBControlAndQueryService.SetAction(Value: Integer);
1981 begin
1982 FEof := False;
1983 FAction := Value;
1984 end;
1985
1986
1987 function TIBControlAndQueryService.GetNextChunk: String;
1988 var
1989 Length: Integer;
1990 begin
1991 if (FEof = True) then
1992 begin
1993 result := '';
1994 exit;
1995 end;
1996 if (FAction = 0) then
1997 IBError(ibxeQueryParamsError, [nil]);
1998 ServiceQueryParams := Char(isc_info_svc_to_eof);
1999 InternalServiceQuery;
2000 if (OutputBuffer[0] <> Char(isc_info_svc_to_eof)) then
2001 IBError(ibxeOutputParsingError, [nil]);
2002 Length := isc_vax_integer(OutputBuffer + 1, 2);
2003 if (OutputBuffer[3 + Length] = Char(isc_info_truncated)) then
2004 FEof := False
2005 else
2006 if (OutputBuffer[3 + Length] = Char(isc_info_end)) then
2007 FEof := True
2008 else
2009 IBError(ibxeOutputParsingError, [nil]);
2010 OutputBuffer[3 + Length] := #0;
2011 result := String(PChar(@OutputBuffer[3]));
2012 end;
2013
2014 function TIBControlAndQueryService.GetNextLine: String;
2015 var
2016 Length: Integer;
2017 begin
2018 if (FEof = True) then
2019 begin
2020 result := '';
2021 exit;
2022 end;
2023 if (FAction = 0) then
2024 IBError(ibxeQueryParamsError, [nil]);
2025 ServiceQueryParams := Char(isc_info_svc_line);
2026 InternalServiceQuery;
2027 if (OutputBuffer[0] <> Char(isc_info_svc_line)) then
2028 IBError(ibxeOutputParsingError, [nil]);
2029 Length := isc_vax_integer(OutputBuffer + 1, 2);
2030 if (OutputBuffer[3 + Length] <> Char(isc_info_end)) then
2031 IBError(ibxeOutputParsingError, [nil]);
2032 if (length <> 0) then
2033 FEof := False
2034 else
2035 begin
2036 result := '';
2037 FEof := True;
2038 exit;
2039 end;
2040 OutputBuffer[3 + Length] := #0;
2041 result := String(PChar(@OutputBuffer[3]));
2042 end;
2043
2044 { TIBLogService }
2045
2046 procedure TIBLogService.SetServiceStartOptions;
2047 begin
2048 Action := isc_action_svc_get_ib_log;
2049 ServiceStartParams := Char(isc_action_svc_get_ib_log);
2050 end;
2051
2052 { TDatabaseInfo }
2053
2054 constructor TDatabaseInfo.Create;
2055 begin
2056 DbName := nil;
2057 end;
2058
2059 destructor TDatabaseInfo.Destroy;
2060 begin
2061 DbName := nil;
2062 inherited Destroy;
2063 end;
2064
2065 { TLicenseInfo }
2066
2067 constructor TLicenseInfo.Create;
2068 begin
2069 Key := nil;
2070 Id := nil;
2071 Desc := nil;
2072 end;
2073
2074 destructor TLicenseInfo.Destroy;
2075 begin
2076 Key := nil;
2077 Id := nil;
2078 Desc := nil;
2079 inherited Destroy;
2080 end;
2081
2082 { TConfigFileData }
2083
2084 constructor TConfigFileData.Create;
2085 begin
2086 ConfigFileValue := nil;
2087 ConfigFileKey := nil;
2088 end;
2089
2090 destructor TConfigFileData.Destroy;
2091 begin
2092 ConfigFileValue := nil;
2093 ConfigFileKey := nil;
2094 inherited Destroy;
2095 end;
2096
2097 { TConfigParams }
2098
2099 constructor TConfigParams.Create;
2100 begin
2101 ConfigFileData := TConfigFileData.Create;
2102 ConfigFileParams := nil;
2103 end;
2104
2105 destructor TConfigParams.Destroy;
2106 begin
2107 ConfigFileData.Free;
2108 ConfigFileParams := nil;
2109 inherited Destroy;
2110 end;
2111
2112 end.