📄 ibdatabase.pas
字号:
{************************************************************************}
{ }
{ Borland Delphi Visual Component Library }
{ InterBase Express core components }
{ }
{ Copyright (c) 1998-2001 Borland Software Corporation }
{ }
{ InterBase Express is based in part on the product }
{ Free IB Components, written by Gregory H. Deatz for }
{ Hoagland, Longo, Moran, Dunst & Doukas Company. }
{ Free IB Components is used under license. }
{ }
{ The contents of this file are subject to the InterBase }
{ Public License Version 1.0 (the "License"); you may not }
{ use this file except in compliance with the License. You may obtain }
{ a copy of the License at http://www.borland.com/interbase/IPL.html }
{ Software distributed under the License is distributed on }
{ an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either }
{ express or implied. See the License for the specific language }
{ governing rights and limitations under the License. }
{ The Original Code was created by InterBase Software Corporation }
{ and its successors. }
{ Portions created by Borland Software Corporation are Copyright }
{ (C) Borland Software Corporation. All Rights Reserved. }
{ Contributor(s): Jeff Overcash }
{ }
{************************************************************************}
unit IBDatabase;
interface
uses
SysUtils, Classes,
{$IFDEF MSWINDOWS}
Windows, Messages,
{$ENDIF}
{$IFDEF LINUX}
QExtCtrls,
{$ENDIF}
IBHeader, IBExternals, DB, IB;
const
DPBPrefix = 'isc_dpb_';
DPBConstantNames: array[1..isc_dpb_last_dpb_constant] of string = (
'cdd_pathname',
'allocation',
'journal',
'page_size',
'num_buffers',
'buffer_length',
'debug',
'garbage_collect',
'verify',
'sweep',
'enable_journal',
'disable_journal',
'dbkey_scope',
'number_of_users',
'trace',
'no_garbage_collect',
'damaged',
'license',
'sys_user_name',
'encrypt_key',
'activate_shadow',
'sweep_interval',
'delete_shadow',
'force_write',
'begin_log',
'quit_log',
'no_reserve',
'user_name',
'password',
'password_enc',
'sys_user_name_enc',
'interp',
'online_dump',
'old_file_size',
'old_num_files',
'old_file',
'old_start_page',
'old_start_seqno',
'old_start_file',
'drop_walfile',
'old_dump_id',
'wal_backup_dir',
'wal_chkptlen',
'wal_numbufs',
'wal_bufsize',
'wal_grp_cmt_wait',
'lc_messages',
'lc_ctype',
'cache_manager',
'shutdown',
'online',
'shutdown_delay',
'reserved',
'overwrite',
'sec_attach',
'disable_wal',
'connect_timeout',
'dummy_packet_interval',
'gbak_attach',
'sql_role_name',
'set_page_buffers',
'working_directory',
'sql_dialect',
'set_db_readonly',
'set_db_sql_dialect',
'gfix_attach',
'gstat_attach'
);
TPBPrefix = 'isc_tpb_';
TPBConstantNames: array[1..isc_tpb_last_tpb_constant] of string = (
'consistency',
'concurrency',
'shared',
'protected',
'exclusive',
'wait',
'nowait',
'read',
'write',
'lock_read',
'lock_write',
'verb_time',
'commit_time',
'ignore_limbo',
'read_committed',
'autocommit',
'rec_version',
'no_rec_version',
'restart_requests',
'no_auto_undo'
);
type
TIBDatabase = class;
TIBTransaction = class;
TIBBase = class;
TIBDatabaseLoginEvent = procedure(Database: TIBDatabase;
LoginParams: TStrings) of object;
IIBEventNotifier = interface
['{9427DE09-46F7-4E1D-8B92-C1F88B47BF6D}']
procedure RegisterEvents;
procedure UnRegisterEvents;
function GetAutoRegister: Boolean;
end;
TIBTimer = class;
TIBSchema = class(TObject)
public
procedure FreeNodes; virtual; abstract;
function Has_DEFAULT_VALUE(Relation, Field : String) : Boolean; virtual; abstract;
function Has_COMPUTED_BLR(Relation, Field : String) : Boolean; virtual; abstract;
end;
TIBFileName = type string;
{ TIBDatabase }
TIBDataBase = class(TCustomConnection)
private
FHiddenPassword: string;
FIBLoaded: Boolean;
FOnLogin: TIBDatabaseLoginEvent;
FTraceFlags: TTraceFlags;
FDBSQLDialect: Integer;
FSQLDialect: Integer;
FOnDialectDowngradeWarning: TNotifyEvent;
FCanTimeout: Boolean;
FSQLObjects: TList;
FTransactions: TList;
FDBName: TIBFileName;
FDBParams: TStrings;
FDBParamsChanged: Boolean;
FDPB: PChar;
FDPBLength: Short;
FHandle: TISC_DB_HANDLE;
FHandleIsShared: Boolean;
FOnIdleTimer: TNotifyEvent;
FDefaultTransaction: TIBTransaction;
FInternalTransaction: TIBTransaction;
FTimer: TIBTimer;
FUserNames: TStringList;
FEventNotifiers : TList;
FAllowStreamedConnected: Boolean;
FSchema : TIBSchema;
procedure EnsureInactive;
function GetDBSQLDialect: Integer;
function GetSQLDialect: Integer;
procedure SetSQLDialect(const Value: Integer);
procedure ValidateClientSQLDialect;
procedure DBParamsChange(Sender: TObject);
procedure DBParamsChanging(Sender: TObject);
function GetSQLObject(Index: Integer): TIBBase;
function GetSQLObjectCount: Integer;
function GetDBParamByDPB(const Idx: Integer): String;
function GetIdleTimer: Integer;
function GetTransaction(Index: Integer): TIBTransaction;
function GetTransactionCount: Integer;
function Login: Boolean;
procedure SetDatabaseName(const Value: TIBFileName);
procedure SetDBParamByDPB(const Idx: Integer; Value: String);
procedure SetDBParams(Value: TStrings);
procedure SetDefaultTransaction(Value: TIBTransaction);
procedure SetIdleTimer(Value: Integer);
procedure TimeoutConnection(Sender: TObject);
function GetIsReadOnly: Boolean;
function AddSQLObject(ds: TIBBase): Integer;
procedure RemoveSQLObject(Idx: Integer);
procedure RemoveSQLObjects;
procedure InternalClose(Force: Boolean);
protected
procedure DoConnect; override;
procedure DoDisconnect; override;
function GetConnected: Boolean; override;
procedure Loaded; override;
procedure Notification( AComponent: TComponent; Operation: TOperation); override;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure AddEventNotifier(Notifier : IIBEventNotifier);
procedure RemoveEventNotifier(Notifier : IIBEventNotifier);
procedure ApplyUpdates(const DataSets: array of TDataSet);
procedure CloseDataSets;
procedure CheckActive;
procedure CheckInactive;
procedure CreateDatabase;
procedure DropDatabase;
procedure ForceClose;
procedure GetFieldNames(const TableName: string; List: TStrings);
procedure GetTableNames(List: TStrings; SystemTables: Boolean = False);
function IndexOfDBConst(st: String): Integer;
function TestConnected: Boolean;
procedure CheckDatabaseName;
function Call(ErrCode: ISC_STATUS; RaiseError: Boolean): ISC_STATUS;
function AddTransaction(TR: TIBTransaction): Integer;
function FindTransaction(TR: TIBTransaction): Integer;
function FindDefaultTransaction(): TIBTransaction;
procedure RemoveTransaction(Idx: Integer);
procedure RemoveTransactions;
procedure SetHandle(Value: TISC_DB_HANDLE);
property Handle: TISC_DB_HANDLE read FHandle;
property IsReadOnly: Boolean read GetIsReadOnly;
property DBParamByDPB[const Idx: Integer]: String read GetDBParamByDPB
write SetDBParamByDPB;
property SQLObjectCount: Integer read GetSQLObjectCount;
property SQLObjects[Index: Integer]: TIBBase read GetSQLObject;
property HandleIsShared: Boolean read FHandleIsShared;
property TransactionCount: Integer read GetTransactionCount;
property Transactions[Index: Integer]: TIBTransaction read GetTransaction;
property InternalTransaction: TIBTransaction read FInternalTransaction;
{Schema functions}
function Has_DEFAULT_VALUE(Relation, Field : String) : Boolean;
function Has_COMPUTED_BLR(Relation, Field : String) : Boolean;
procedure FlushSchema;
published
property Connected;
property DatabaseName: TIBFileName read FDBName write SetDatabaseName;
property Params: TStrings read FDBParams write SetDBParams;
property LoginPrompt default True;
property DefaultTransaction: TIBTransaction read FDefaultTransaction
write SetDefaultTransaction;
property IdleTimer: Integer read GetIdleTimer write SetIdleTimer;
property SQLDialect : Integer read GetSQLDialect write SetSQLDialect;
property DBSQLDialect : Integer read FDBSQLDialect;
property TraceFlags: TTraceFlags read FTraceFlags write FTraceFlags;
property AllowStreamedConnected : Boolean read FAllowStreamedConnected write FAllowStreamedConnected default true;
property AfterConnect;
property AfterDisconnect;
property BeforeConnect;
property BeforeDisconnect;
property OnLogin: TIBDatabaseLoginEvent read FOnLogin write FOnLogin;
property OnIdleTimer: TNotifyEvent read FOnIdleTimer write FOnIdleTimer;
property OnDialectDowngradeWarning: TNotifyEvent read FOnDialectDowngradeWarning write FOnDialectDowngradeWarning;
end;
{ TIBTransaction }
TTransactionAction = (TARollback, TACommit, TARollbackRetaining, TACommitRetaining);
TAutoStopAction = (saNone, saRollback, saCommit, saRollbackRetaining, saCommitRetaining);
TIBTransaction = class(TComponent)
private
FIBLoaded: Boolean;
FCanTimeout : Boolean;
FDatabases : TList;
FSQLObjects : TList;
FDefaultDatabase : TIBDatabase;
FHandle : TISC_TR_HANDLE;
FHandleIsShared : Boolean;
FOnIdleTimer : TNotifyEvent;
FStreamedActive : Boolean;
FTPB : PChar;
FTPBLength : Short;
FTimer : TIBTimer;
FDefaultAction : TTransactionAction;
FTRParams : TStrings;
FTRParamsChanged : Boolean;
FAutoStopAction: TAutoStopAction;
procedure EnsureNotInTransaction;
procedure EndTransaction(Action: TTransactionAction; Force: Boolean);
function GetDatabase(Index: Integer): TIBDatabase;
function GetDatabaseCount: Integer;
function GetSQLObject(Index: Integer): TIBBase;
function GetSQLObjectCount: Integer;
function GetInTransaction: Boolean;
function GetIdleTimer: Integer;
procedure BeforeDatabaseDisconnect(DB: TIBDatabase);
procedure SetActive(Value: Boolean);
procedure SetDefaultAction(Value: TTransactionAction);
procedure SetDefaultDatabase(Value: TIBDatabase);
procedure SetIdleTimer(Value: Integer);
procedure SetTRParams(Value: TStrings);
procedure TimeoutTransaction(Sender: TObject);
procedure TRParamsChange(Sender: TObject);
procedure TRParamsChanging(Sender: TObject);
function AddSQLObject(ds: TIBBase): Integer;
procedure RemoveSQLObject(Idx: Integer);
procedure RemoveSQLObjects;
protected
procedure Loaded; override;
procedure SetHandle(Value: TISC_TR_HANDLE);
procedure Notification( AComponent: TComponent; Operation: TOperation); override;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
function Call(ErrCode: ISC_STATUS; RaiseError: Boolean): ISC_STATUS;
procedure Commit;
procedure CommitRetaining;
procedure Rollback;
procedure RollbackRetaining;
procedure StartTransaction;
procedure CheckInTransaction;
procedure CheckNotInTransaction;
procedure CheckAutoStop;
function AddDatabase(db: TIBDatabase): Integer;
function FindDatabase(db: TIBDatabase): Integer;
function FindDefaultDatabase: TIBDatabase;
procedure RemoveDatabase(Idx: Integer);
procedure RemoveDatabases;
procedure CheckDatabasesInList;
property DatabaseCount: Integer read GetDatabaseCount;
property Databases[Index: Integer]: TIBDatabase read GetDatabase;
property SQLObjectCount: Integer read GetSQLObjectCount;
property SQLObjects[Index: Integer]: TIBBase read GetSQLObject;
property Handle: TISC_TR_HANDLE read FHandle;
property HandleIsShared: Boolean read FHandleIsShared;
property InTransaction: Boolean read GetInTransaction;
property TPB: PChar read FTPB;
property TPBLength: Short read FTPBLength;
published
property Active: Boolean read GetInTransaction write SetActive;
property DefaultDatabase: TIBDatabase read FDefaultDatabase
write SetDefaultDatabase;
property IdleTimer: Integer read GetIdleTimer write SetIdleTimer default 0;
property DefaultAction: TTransactionAction read FDefaultAction write SetDefaultAction default taCommit;
property Params: TStrings read FTRParams write SetTRParams;
property AutoStopAction : TAutoStopAction read FAutoStopAction write FAutoStopAction;
property OnIdleTimer: TNotifyEvent read FOnIdleTimer write FOnIdleTimer;
end;
{ TIBBase }
{ Virtually all components in IB are "descendents" of TIBBase.
It is to more easily manage the database and transaction
connections. }
TIBBase = class(TObject)
protected
FDatabase: TIBDatabase;
FIndexInDatabase: Integer;
FTransaction: TIBTransaction;
FIndexInTransaction: Integer;
FOwner: TObject;
FBeforeDatabaseDisconnect: TNotifyEvent;
FAfterDatabaseDisconnect: TNotifyEvent;
FOnDatabaseFree: TNotifyEvent;
FBeforeTransactionEnd: TNotifyEvent;
FAfterTransactionEnd: TNotifyEvent;
FOnTransactionFree: TNotifyEvent;
procedure DoBeforeDatabaseDisconnect; virtual;
procedure DoAfterDatabaseDisconnect; virtual;
procedure DoDatabaseFree; virtual;
procedure DoBeforeTransactionEnd; virtual;
procedure DoAfterTransactionEnd; virtual;
procedure DoTransactionFree; virtual;
function GetDBHandle: PISC_DB_HANDLE; virtual;
function GetTRHandle: PISC_TR_HANDLE; virtual;
procedure SetDatabase(Value: TIBDatabase); virtual;
procedure SetTransaction(Value: TIBTransaction); virtual;
public
constructor Create(AOwner: TObject);
destructor Destroy; override;
procedure CheckDatabase; virtual;
procedure CheckTransaction; virtual;
public
property BeforeDatabaseDisconnect: TNotifyEvent read FBeforeDatabaseDisconnect
write FBeforeDatabaseDisconnect;
property AfterDatabaseDisconnect: TNotifyEvent read FAfterDatabaseDisconnect
write FAfterDatabaseDisconnect;
property OnDatabaseFree: TNotifyEvent read FOnDatabaseFree write FOnDatabaseFree;
property BeforeTransactionEnd: TNotifyEvent read FBeforeTransactionEnd write FBeforeTransactionEnd;
property AfterTransactionEnd: TNotifyEvent read FAfterTransactionEnd write FAfterTransactionEnd;
property OnTransactionFree: TNotifyEvent read FOnTransactionFree write FOnTransactionFree;
property Database: TIBDatabase read FDatabase
write SetDatabase;
property DBHandle: PISC_DB_HANDLE read GetDBHandle;
property Owner: TObject read FOwner;
property TRHandle: PISC_TR_HANDLE read GetTRHandle;
property Transaction: TIBTransaction read FTransaction
write SetTransaction;
end;
{$IFDEF MSWINDOWS}
TIBTimer = class(TComponent)
private
FInterval: Cardinal;
FWindowHandle: HWND;
FOnTimer: TNotifyEvent;
FEnabled: Boolean;
procedure UpdateTimer;
procedure SetEnabled(Value: Boolean);
procedure SetInterval(Value: Cardinal);
procedure SetOnTimer(Value: TNotifyEvent);
procedure WndProc(var Msg: TMessage);
protected
procedure Timer; dynamic;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
published
property Enabled: Boolean read FEnabled write SetEnabled default True;
property Interval: Cardinal read FInterval write SetInterval default 1000;
property OnTimer: TNotifyEvent read FOnTimer write SetOnTimer;
end;
{$ENDIF}
{$IFDEF LINUX}
TIBTimer = class(TTimer);
{$ENDIF}
procedure GenerateDPB(sl: TStrings; var DPB: string; var DPBLength: Short);
procedure GenerateTPB(sl: TStrings; var TPB: string; var TPBLength: Short);
implementation
uses IBIntf, IBSQLMonitor, IBCustomDataSet, IBDatabaseInfo, IBSQL, IBUtils,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -