📄 ib_services.pas
字号:
{***************************************************************}
{ FIBPlus - component library for direct access to Firebird and }
{ InterBase databases }
{ }
{ FIBPlus is based in part on the product }
{ Free IB Components, written by Gregory H. Deatz for }
{ Hoagland, Longo, Moran, Dunst & Doukas Company. }
{ mailto:gdeatz@hlmdd.com }
{ }
{ Copyright (c) 1998-2007 Devrace Ltd. }
{ Written by Serge Buzadzhy (buzz@devrace.com) }
{ }
{ ------------------------------------------------------------- }
{ FIBPlus home page: http://www.fibplus.com/ }
{ FIBPlus support : http://www.devrace.com/support/ }
{ ------------------------------------------------------------- }
{ }
{ Please see the file License.txt for full license information }
{***************************************************************}
unit IB_Services;
interface
{$I FIBPlus.inc}
uses
{$IFDEF MSWINDOWS}
Windows, Messages, SysUtils, Classes,
ibase, IB_Intf, IB_Externals {$IFDEF D6+}, Variants {$ELSE}, Forms {$ENDIF};
{$ENDIF}
{$IFDEF LINUX}
Types, SysUtils, Classes, Variants,
// QControls, QForms,
ibase, IB_Intf,IB_Externals;
{$ENDIF}
const
DefaultBufferSize = 32000;
SPBPrefix = 'isc_spb_';
SPBConstantNames: array[1..isc_spb_last_spb_constant] of String = (
'user_name',
'sys_user_name',
'sys_user_name_enc',
'password',
'password_enc',
'command_line',
'db_name',
'verbose',
'options',
'connect_timeout',
'dummy_packet_interval',
'sql_role_name',
'instance_name'
);
SPBConstantValues: array[1..isc_spb_last_spb_constant] of Integer = (
isc_spb_user_name_mapped_to_server,
isc_spb_sys_user_name_mapped_to_server,
isc_spb_sys_user_name_enc_mapped_to_server,
isc_spb_password_mapped_to_server,
isc_spb_password_enc_mapped_to_server,
isc_spb_command_line_mapped_to_server,
isc_spb_dbname_mapped_to_server,
isc_spb_verbose_mapped_to_server,
isc_spb_options_mapped_to_server,
isc_spb_connect_timeout_mapped_to_server,
isc_spb_dummy_packet_interval_mapped_to_server,
isc_spb_sql_role_name_mapped_to_server ,
isc_spb_instance_name_mapped_to_server
);
{$IFDEF INC_SERVICE_SUPPORT}
type
TProtocol = (TCP, SPX, NamedPipe, Local);
TOutputBufferOption = (ByLine, ByChunk);
TpFIBCustomService = class;
TLoginEvent = procedure(Database: TpFIBCustomService;
LoginParams: TStrings) of object;
TpFIBCustomService = class(TComponent)
private
FClientLibrary: IIBClientLibrary;
FLibraryName: string;
procedure LoadLibrary;
private
FIBLoaded: Boolean;
FParamsChanged : Boolean;
FSPB, FQuerySPB : PChar;
FSPBLength, FQuerySPBLength : Short;
// FTraceFlags: TTraceFlags;
FOnLogin: TLoginEvent;
FLoginPrompt: Boolean;
FBufferSize: Integer;
FOutputBuffer: PChar;
FQueryParams: String;
FServerName: string;
FHandle: TISC_SVC_HANDLE;
FStreamedActive : Boolean;
FOnAttach: TNotifyEvent;
FOutputBufferOption: TOutputBufferOption;
FProtocol: TProtocol;
FParams: TStrings;
// FGDSLibrary : IGDSLibrary;
function GetActive: Boolean;
function GetServiceParamBySPB(const Idx: Integer): String;
procedure SetActive(const Value: Boolean);
procedure SetBufferSize(const Value: Integer);
procedure SetParams(const Value: TStrings);
procedure SetServerName(const Value: string);
procedure SetProtocol(const Value: TProtocol);
procedure SetServiceParamBySPB(const Idx: Integer;
const Value: String);
function IndexOfSPBConst(st: String): Integer;
procedure ParamsChange(Sender: TObject);
procedure ParamsChanging(Sender: TObject);
procedure CheckServerName;
function Call(ErrCode: ISC_STATUS; RaiseError: Boolean): ISC_STATUS;
function ParseString(var RunLen: Integer): string;
function ParseInteger(var RunLen: Integer): Integer;
procedure GenerateSPB(sl: TStrings; var SPB: String; var SPBLength: Short);
procedure SetLibraryName(const Value: string);
function StoredLibraryName: Boolean;
protected
procedure Loaded; override;
function Login: Boolean;
procedure CheckActive;
procedure CheckInactive;
property OutputBuffer : PChar read FOutputBuffer;
property OutputBufferOption : TOutputBufferOption read FOutputBufferOption write FOutputBufferOption;
property BufferSize : Integer read FBufferSize write SetBufferSize default DefaultBufferSize;
procedure InternalServiceQuery;
property ServiceQueryParams: String read FQueryParams write FQueryParams;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure Attach;
procedure Detach;
property Handle: TISC_SVC_HANDLE read FHandle;
property ServiceParamBySPB[const Idx: Integer]: String read GetServiceParamBySPB
write SetServiceParamBySPB;
published
property Active: Boolean read GetActive write SetActive default False;
property ServerName: string read FServerName write SetServerName;
property LibraryName:string read FLibraryName write SetLibraryName stored StoredLibraryName;
property Protocol: TProtocol read FProtocol write SetProtocol default Local;
property Params: TStrings read FParams write SetParams;
property LoginPrompt: Boolean read FLoginPrompt write FLoginPrompt default True;
// property TraceFlags: TTraceFlags read FTraceFlags write FTraceFlags;
property OnAttach: TNotifyEvent read FOnAttach write FOnAttach;
property OnLogin: TLoginEvent read FOnLogin write FOnLogin;
end;
TDatabaseInfo = class
public
NoOfAttachments: Integer;
NoOfDatabases: Integer;
DbName: array of string;
constructor Create;
destructor Destroy; override;
end;
TLicenseInfo = class
public
Key: array of string;
Id: array of string;
Desc: array of string;
LicensedUsers: Integer;
constructor Create;
destructor Destroy; override;
end;
TLicenseMaskInfo = class
public
LicenseMask: Integer;
CapabilityMask: Integer;
end;
TConfigFileData = class
public
ConfigFileValue: array of integer;
ConfigFileKey: array of integer;
constructor Create;
destructor Destroy; override;
end;
TConfigParams = class
public
ConfigFileData: TConfigFileData;
ConfigFileParams: array of string;
BaseLocation: string;
LockFileLocation: string;
MessageFileLocation: string;
SecurityDatabaseLocation: string;
constructor Create;
destructor Destroy; override;
end;
TVersionInfo = class
public
ServerVersion: String;
ServerImplementation: string;
ServiceVersion: Integer;
end;
TPropertyOption = (Database, License, LicenseMask, ConfigParameters, Version);
TPropertyOptions = set of TPropertyOption;
TpFIBServerProperties = class(TpFIBCustomService)
private
FOptions: TPropertyOptions;
FDatabaseInfo: TDatabaseInfo;
FLicenseInfo: TLicenseInfo;
FLicenseMaskInfo: TLicenseMaskInfo;
FVersionInfo: TVersionInfo;
FConfigParams: TConfigParams;
procedure ParseConfigFileData(var RunLen: Integer);
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure Fetch;
procedure FetchDatabaseInfo;
procedure FetchLicenseInfo;
procedure FetchLicenseMaskInfo;
procedure FetchConfigParams;
procedure FetchVersionInfo;
property DatabaseInfo: TDatabaseInfo read FDatabaseInfo;
property LicenseInfo: TLicenseInfo read FLicenseInfo;
property LicenseMaskInfo: TLicenseMaskInfo read FLicenseMaskInfo;
property VersionInfo: TVersionInfo read FVersionInfo;
property ConfigParams: TConfigParams read FConfigParams;
published
property Options : TPropertyOptions read FOptions write FOptions;
end;
TpFIBControlService = class (TpFIBCustomService)
private
FStartParams: String;
FStartSPB: PChar;
FStartSPBLength: Integer;
function GetIsServiceRunning: Boolean;
protected
property ServiceStartParams: String read FStartParams write FStartParams;
procedure SetServiceStartOptions; virtual;
procedure ServiceStartAddParam (Value: string; param: Integer); overload;
procedure ServiceStartAddParam (Value: Integer; param: Integer); overload;
procedure InternalServiceStart;
public
constructor Create(AOwner: TComponent); override;
procedure ServiceStart; virtual;
property IsServiceRunning : Boolean read GetIsServiceRunning;
end;
TServiceGetTextNotify = procedure (Sender: TObject; const Text: string) of object;
TpFIBControlAndQueryService = class (TpFIBControlService)
private
FEof: Boolean;
FAction: Integer;
FOnTextNotify: TServiceGetTextNotify;
procedure SetAction(Value: Integer);
protected
property Action: Integer read FAction write SetAction;
property OnTextNotify: TServiceGetTextNotify read FOnTextNotify write FOnTextNotify;
public
constructor Create (AOwner: TComponent); override;
function GetNextLine : String;
function GetNextChunk : String;
procedure ServiceStart; override;
property Eof: boolean read FEof;
published
property BufferSize;
end;
TShutdownMode = (Forced, DenyTransaction, DenyAttachment);
TpFIBConfigService = class(TpFIBControlService)
private
FDatabaseName: string;
procedure SetDatabaseName(const Value: string);
protected
public
procedure ServiceStart; override;
procedure ShutdownDatabase (Options: TShutdownMode; Wait: Integer);
procedure SetSweepInterval (Value: Integer);
procedure SetDBSqlDialect (Value: Integer);
procedure SetPageBuffers (Value: Integer);
procedure ActivateShadow;
procedure BringDatabaseOnline;
procedure SetReserveSpace (Value: Boolean);
procedure SetAsyncMode (Value: Boolean);
procedure SetReadOnly (Value: Boolean);
published
property DatabaseName: string read FDatabaseName write SetDatabaseName;
end;
TLicensingAction = (LicenseAdd, LicenseRemove);
TpFIBLicensingService = class(TpFIBControlService)
private
FID: String;
FKey: String;
FAction: TLicensingAction;
procedure SetAction(Value: TLicensingAction);
protected
procedure SetServiceStartOptions; override;
public
procedure AddLicense;
procedure RemoveLicense;
published
property Action: TLicensingAction read FAction write SetAction default LicenseAdd;
property Key: String read FKey write FKey;
property ID: String read FID write FID;
end;
TpFIBLogService = class(TpFIBControlAndQueryService)
private
protected
procedure SetServiceStartOptions; override;
public
published
property OnTextNotify;
end;
TStatOption = (DataPages, DbLog, HeaderPages, IndexPages, SystemRelations,
RecordVersions, StatTables);
TStatOptions = set of TStatOption;
TpFIBStatisticalService = class(TpFIBControlAndQueryService)
private
FDatabaseName : string;
FOptions : TStatOptions;
FTableNames : String;
procedure SetDatabaseName(const Value: string);
protected
procedure SetServiceStartOptions; override;
public
published
property DatabaseName: string read FDatabaseName write SetDatabaseName;
property Options : TStatOptions read FOptions write FOptions;
property TableNames : String read FTableNames write FTableNames;
property OnTextNotify;
end;
TpFIBBackupRestoreService = class(TpFIBControlAndQueryService)
private
FVerbose: Boolean;
protected
public
published
property Verbose : Boolean read FVerbose write FVerbose default False;
property OnTextNotify;
end;
TBackupOption = (IgnoreChecksums, IgnoreLimbo, MetadataOnly, NoGarbageCollection,
OldMetadataDesc, NonTransportable, ConvertExtTables);
TBackupOptions = set of TBackupOption;
TpFIBBackupService = class (TpFIBBackupRestoreService)
private
FDatabaseName: string;
FOptions: TBackupOptions;
FBackupFile: TStrings;
FBlockingFactor: Integer;
procedure SetBackupFile(const Value: TStrings);
protected
procedure SetServiceStartOptions; override;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
published
{ a name=value pair of filename and length }
property BackupFile: TStrings read FBackupFile write SetBackupFile;
property BlockingFactor: Integer read FBlockingFactor write FBlockingFactor;
property DatabaseName: string read FDatabaseName write FDatabaseName;
property Options : TBackupOptions read FOptions write FOptions;
end;
TRestoreOption = (DeactivateIndexes, NoShadow, NoValidityCheck, OneRelationAtATime,
Replace, CreateNewDB, UseAllSpace, ValidationCheck, OnlyMetadata);
TRestoreOptions = set of TRestoreOption;
TpFIBRestoreService = class (TpFIBBackupRestoreService)
private
FDatabaseName: TStrings;
FBackupFile: TStrings;
FOptions: TRestoreOptions;
FPageSize: Integer;
FPageBuffers: Integer;
procedure SetBackupFile(const Value: TStrings);
procedure SetDatabaseName(const Value: TStrings);
protected
procedure SetServiceStartOptions; override;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
published
{ a name=value pair of filename and length }
property DatabaseName: TStrings read FDatabaseName write SetDatabaseName;
property BackupFile: TStrings read FBackupFile write SetBackupFile;
property PageSize: Integer read FPageSize write FPageSize default 4096;
property PageBuffers: Integer read FPageBuffers write FPageBuffers;
property Options : TRestoreOptions read FOptions write FOptions default [CreateNewDB];
end;
TValidateOption = (LimboTransactions, CheckDB, IgnoreChecksum, KillShadows, MendDB,
SweepDB, ValidateDB, ValidateFull);
TValidateOptions = set of TValidateOption;
TTransactionGlobalAction = (CommitGlobal, RollbackGlobal, RecoverTwoPhaseGlobal,
NoGlobalAction);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -