ViewVC Help
View File | Revision Log | Show Annotations | Download File | View Changeset | Root Listing
root/public/ibx/branches/udr/client/IB.pas
Revision: 387
Committed: Wed Jan 19 13:34:42 2022 UTC (2 years, 10 months ago) by tony
Content type: text/x-pascal
File size: 69153 byte(s)
Log Message:
Transactions started within a UDR are not forcibly closed if still active immediately prior to UDR exit

File Contents

# User Rev Content
1 tony 45 (*
2     * Firebird Interface (fbintf). The fbintf components provide a set of
3     * Pascal language bindings for the Firebird API. Although predominantly
4     * a new development they include source code taken from IBX and may be
5     * considered a derived product. This software thus also includes the copyright
6     * notice and license conditions from IBX.
7     *
8     * Except for those parts dervied from IBX, contents of this file are subject
9     * to the Initial Developer's Public License Version 1.0 (the "License"); you
10     * may not use this file except in compliance with the License. You may obtain a
11     * copy of the License here:
12     *
13     * http://www.firebirdsql.org/index.php?op=doc&id=idpl
14     *
15     * Software distributed under the License is distributed on an "AS
16     * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
17     * implied. See the License for the specific language governing rights
18     * and limitations under the License.
19     *
20     * The Initial Developer of the Original Code is Tony Whyman.
21     *
22     * The Original Code is (C) 2016 Tony Whyman, MWA Software
23     * (http://www.mwasoftware.co.uk).
24     *
25     * All Rights Reserved.
26     *
27     * Contributor(s): ______________________________________.
28     *
29     *)
30     {************************************************************************}
31     { }
32     { Borland Delphi Visual Component Library }
33     { InterBase Express core components }
34     { }
35     { Copyright (c) 1998-2000 Inprise Corporation }
36     { }
37     { InterBase Express is based in part on the product }
38     { Free IB Components, written by Gregory H. Deatz for }
39     { Hoagland, Longo, Moran, Dunst & Doukas Company. }
40     { Free IB Components is used under license. }
41     { }
42     { The contents of this file are subject to the InterBase }
43     { Public License Version 1.0 (the "License"); you may not }
44     { use this file except in compliance with the License. You }
45     { may obtain a copy of the License at http://www.Inprise.com/IPL.html }
46     { Software distributed under the License is distributed on }
47     { an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either }
48     { express or implied. See the License for the specific language }
49     { governing rights and limitations under the License. }
50     { The Original Code was created by InterBase Software Corporation }
51     { and its successors. }
52     { Portions created by Inprise Corporation are Copyright (C) Inprise }
53     { Corporation. All Rights Reserved. }
54     { Contributor(s): Jeff Overcash }
55     { }
56     { IBX For Lazarus (Firebird Express) }
57     { Contributor: Tony Whyman, MWA Software http://www.mwasoftware.co.uk }
58     { Portions created by MWA Software are copyright McCallum Whyman }
59     { Associates Ltd 2011 - 2015 }
60     { }
61     {************************************************************************}
62     unit IB;
63 tony 56 {$IFDEF MSWINDOWS}
64     {$DEFINE WINDOWS}
65     {$ENDIF}
66 tony 45
67     {$IFDEF FPC}
68 tony 56 {$mode delphi}
69 tony 45 {$codepage UTF8}
70     {$interfaces COM}
71 tony 56 {$IF defined(FPC) and (FPC_FULLVERSION < 30000) }
72 tony 45 {$ERROR FPC Version 3.0.0 or later is required}
73 tony 56 {$IFEND}
74 tony 45 {$ENDIF}
75    
76 tony 270 {$IFNDEF LEGACYFIREBIRDAPIONLY}
77 tony 45 {$DEFINE USEFIREBIRD3API}
78 tony 270 {$ENDIF}
79     {$IFNDEF FIREBIRD3APIONLY}
80 tony 45 {$DEFINE USELEGACYFIREBIRDAPI}
81 tony 270 {$ENDIF}
82 tony 45
83     {
84     This unit defines the interfaces used to provide the Pascal Language
85     bindings for the Firebird API. These are COM style references counted interfaces
86     and are automatically freed when they go out of scope.
87    
88     The interface definition is independent of the Firebird API version and two
89     implementations are provided. One is for the legacy API (2.5 and earlier) and the
90     other is for the new object orientated API (3.0 and later). By default, both are
91     available with the 3.0 API used if it is available. Otherwise the 2.5 API is used.
92     The above two defines can be used to force only one implementation by undefining
93     the symbol for the unwanted API.
94    
95     Note that the FirebirdAPI function defined below is used for initial access to
96     the language bindings.
97    
98     The goals of these Pascal Langauge bindings are to provide:
99    
100     1. A set of reference counted interfaces providing complete access to the Firebird API.
101    
102     2. Application Independence from the Firebird API version.
103    
104     3. All data access through strongly typed variables and functions with no need for
105     the end user to manipulate untyped data in buffers such as the legacy API SQLDA
106     or the Firebird 3.0 message buffer.
107    
108     4. A stable platform for LCL Packages (e.g. IBX) that implement the TDataSet model
109     with independence from the Firebird API version.
110    
111     5. Straightforward progammatic access to the Firebird API from Pascal programs.
112    
113 tony 56 6. FPC and Delphi Support.
114    
115 tony 45 String Types
116     ============
117    
118     From FPC 3.0 onwards, ANSISTRINGs include the codepage in their definition. All
119     strings used by the interface are sensitive to the codepage in that the codepage
120     for all strings returned by an interface is consistent with the SQL Character set
121     used for the database connection. Input strings will be transliterated, where possible
122     and if necessary, to the codepage consistent with the character set used for
123     the database connection.
124     }
125    
126     interface
127    
128     uses
129 tony 263 Classes,
130     {$IFDEF WINDOWS}Windows, {$ENDIF}
131     {$IFDEF FPC} Dynlibs, {$ENDIF}
132 tony 315 SysUtils, DB, FBMessages, IBExternals, FmtBcd;
133 tony 45
134 tony 47 const
135     {Interface version information}
136     FBIntf_Major = 1;
137 tony 364 FBIntf_Minor = 4;
138     FBIntf_Release = 0;
139     FBIntf_Version = '1.4.0';
140 tony 47
141 tony 315 const
142     {DPB, TPB and SPB Parameter Block Name Prefixes}
143     DPBPrefix = 'isc_dpb_';
144     TPBPrefix = 'isc_tpb_';
145    
146     const
147     {Time Zone ID constraint}
148     MaxOffsetTimeZoneID = 2879; {lower values represent a time zone offset between
149     -23:59 and 23:59. Higher values are keys to the
150     Time Zone database.}
151    
152     TimeZoneID_GMT = 23*minsPerHour + 59;
153     decimillisecondsPerSecond = 10000;
154     TimeZoneDisplacementDelta = 60*23 + 59; {23:59 in minutes}
155    
156 tony 45 {These include files are converted from the 'C' originals in the Firebird API
157     and define the various constants used by the API}
158    
159 tony 56 {$I 'include/consts_pub.inc'}
160 tony 315 {$I 'include/dyn_consts.inc'}
161 tony 56 {$I 'include/inf_pub.inc'}
162     {$I 'include/configkeys.inc'}
163 tony 315 {$I 'include/blr.inc'}
164 tony 45
165     {The following constants define the values return by calls to the GetSQLType
166     methods provided by several of the interfaces defined below.}
167    
168     (*********************)
169     (** SQL definitions **)
170     (*********************)
171     SQL_VARYING = 448;
172     SQL_TEXT = 452;
173     SQL_DOUBLE = 480;
174     SQL_FLOAT = 482;
175     SQL_LONG = 496;
176     SQL_SHORT = 500;
177     SQL_TIMESTAMP = 510;
178     SQL_BLOB = 520;
179     SQL_D_FLOAT = 530;
180     SQL_ARRAY = 540;
181     SQL_QUAD = 550;
182     SQL_TYPE_TIME = 560;
183     SQL_TYPE_DATE = 570;
184     SQL_INT64 = 580;
185 tony 315 SQL_TIMESTAMP_TZ_EX = 32748;
186     SQL_TIME_TZ_EX = 32750;
187     SQL_INT128 = 32752;
188 tony 45 SQL_BOOLEAN = 32764;
189 tony 315 SQL_TIMESTAMP_TZ = 32754;
190     SQL_TIME_TZ = 32756;
191     SQL_DEC_FIXED = 32758; {FB4 Beta 1 only}
192     SQL_DEC16 = 32760;
193     SQL_DEC34 = 32762;
194     SQL_NULL = 32766;
195 tony 45 SQL_DATE = SQL_TIMESTAMP;
196    
197     type
198     TGDS_QUAD = record
199     gds_quad_high : ISC_LONG;
200     gds_quad_low : UISC_LONG;
201     end;
202     TGDS__QUAD = TGDS_QUAD;
203     TISC_QUAD = TGDS_QUAD;
204     PGDS_QUAD = ^TGDS_QUAD;
205     PGDS__QUAD = ^TGDS__QUAD;
206     PISC_QUAD = ^TISC_QUAD;
207    
208 tony 56 {$IFNDEF FPC}
209 tony 263 {Delphi missing definitions}
210     type
211     TLibHandle = THandle;
212    
213     const
214     NilHandle = 0;
215     DirectorySeparator = '\';
216    
217 tony 56 {Delphi only seems to define CP_UTF8 and CP_UTF16}
218     const
219     CP_ACP = 0; // default to ANSI code page
220     CP_OEMCP = 1; // default to OEM (console) code page
221     CP_UTF16BE = 1201; // unicodeFFFE
222     CP_UTF7 = 65000; // utf-7
223     CP_ASCII = 20127; // us-ascii
224     CP_NONE = $FFFF; // rawbytestring encoding
225    
226     {$ENDIF}
227    
228     type
229     {$IF not declared(TSystemCodePage)}
230     TSystemCodePage = word; {not defined in Delphi}
231     {$IFEND}
232    
233 tony 45 TIBSQLStatementTypes =
234     (SQLUnknown, SQLSelect, SQLInsert,
235     SQLUpdate, SQLDelete, SQLDDL,
236     SQLGetSegment, SQLPutSegment,
237     SQLExecProcedure, SQLStartTransaction,
238     SQLCommit, SQLRollback,
239 tony 291 SQLSelectForUpdate, SQLSetGenerator,
240     SQLSavePoint);
241 tony 45
242     TFBStatusCode = cardinal;
243     TByteArray = array of byte;
244 tony 315 TFBTimeZoneID = ISC_USHORT;
245 tony 45
246 tony 263 IFirebirdAPI = interface;
247 tony 45 IAttachment = interface;
248     ITransaction = interface;
249 tony 291 IStatement = interface;
250 tony 45
251 tony 371 {The IFBNumeric interface provides a managed type for Fixed Point integers
252     used to hold Firebird Numeric(m,n) types}
253    
254     IFBNumeric = interface
255     ['{8bdccfe9-d552-446b-bd82-844ca264455d}']
256     function getRawValue: Int64;
257     function getScale: integer;
258 tony 381 function AdjustScaleTo(aNewScale: integer): IFBNumeric;
259 tony 371 function getAsString: AnsiString;
260     function getAsDouble: double;
261     function getAsBCD: TBCD;
262     function getAsInt64: Int64; {scaled}
263     function getAsInteger: integer; {scaled - may be truncated}
264     function getAsSmallInt: SmallInt; {scaled - may be truncated}
265     function getAsCurrency: Currency;
266     end;
267    
268 tony 56 {The IParameterBlock interface provides the template for all parameter
269 tony 45 block interfaces}
270    
271 tony 56 IParameterBlock<_IItem> = interface
272 tony 45 function getCount: integer;
273     function Add(ParamType: byte): _IItem;
274     function getItems(index: integer): _IItem;
275     function Find(ParamType: byte): _IItem;
276     procedure PrintBuf; {can be used to print buffer in hex for debugging}
277     property Count: integer read getCount;
278     property Items[index: integer]: _IItem read getItems; default;
279     end;
280    
281 tony 315 IParameterBlockWithTypeNames<_IItem> = interface(IParameterBlock<_IItem>)
282     function AddByTypeName(ParamTypeName: AnsiString): _IItem;
283 tony 345 function GetDPBParamTypeName(ParamType: byte): Ansistring; deprecated 'Use Get ParamTypeName';
284     function GetParamTypeName(ParamType: byte): Ansistring;
285 tony 315 end;
286    
287 tony 45 {IParameterBlockItem is not used on its own but instead provides a base type for
288     different parameter block items }
289    
290     IParameterBlockItem = interface
291 tony 56 ['{53b23f7b-abda-46a5-9aa5-07bd5e723266}']
292 tony 45 function getParamType: byte;
293     function getAsInteger: integer;
294 tony 56 function getAsString: AnsiString;
295 tony 45 function getAsByte: byte;
296 tony 56 procedure setAsString(aValue: AnsiString);
297 tony 45 procedure setAsByte(aValue: byte);
298     procedure SetAsInteger(aValue: integer);
299 tony 56 property AsString: AnsiString read getAsString write setAsString;
300 tony 45 property AsByte: byte read getAsByte write setAsByte;
301     property AsInteger: integer read getAsInteger write SetAsInteger;
302     end;
303    
304 tony 315 IParameterBlockItemWithTypeName = interface(IParameterBlockItem)
305     function getParamTypeName: AnsiString;
306     end;
307 tony 45
308     {The IStatus interface provides access to error information, if any, returned
309     by the last API call. It can also be used to customise the error message
310     returned by a database engine exception - see EIBInterbaseError.
311    
312     This interface can be accessed from IFirebirdAPI.
313     }
314    
315 tony 291 TIBDataBaseErrorMessage = (ShowSQLCode,
316     ShowIBMessage,
317     ShowSQLMessage);
318    
319     TIBDataBaseErrorMessages = set of TIBDataBaseErrorMessage;
320    
321 tony 345 TStatusCode = long;
322    
323 tony 45 IStatus = interface
324 tony 56 ['{34167722-af38-4831-b08a-93162d58ede3}']
325 tony 345 function GetIBErrorCode: TStatusCode;
326     function Getsqlcode: TStatusCode;
327 tony 56 function GetMessage: AnsiString;
328 tony 45 function CheckStatusVector(ErrorCodes: array of TFBStatusCode): Boolean;
329     function GetIBDataBaseErrorMessages: TIBDataBaseErrorMessages;
330 tony 386 function Clone: IStatus;
331 tony 45 procedure SetIBDataBaseErrorMessages(Value: TIBDataBaseErrorMessages);
332     end;
333    
334     { The array metadata interface provides access to the metadata used to describe
335     an array column in a Firebird table.
336     }
337    
338     TArrayBound = record
339     UpperBound: short;
340     LowerBound: short;
341     end;
342     TArrayBounds = array of TArrayBound;
343    
344     IArrayMetaData = interface
345 tony 56 ['{7dd0aea4-59af-4c2a-b958-565d5025c489}']
346 tony 45 function GetSQLType: cardinal;
347 tony 56 function GetSQLTypeName: AnsiString;
348 tony 45 function GetScale: integer;
349     function GetSize: cardinal;
350 tony 309 function GetCharSetWidth: integer;
351 tony 45 function GetCharSetID: cardinal;
352 tony 56 function GetTableName: AnsiString;
353     function GetColumnName: AnsiString;
354 tony 45 function GetDimensions: integer;
355     function GetBounds: TArrayBounds;
356     end;
357    
358     {The array interface provides access to and modification of the array data
359     contained in an array field of a Firebird Table. The array element is
360     selected by specifying its co-ordinates using an integer array. The
361     getter and setter methods used should be appropriate for the type of data
362     contained in the array. Automatic conversion is provided to and from strings.
363     That is GetAsString and SetAsString are safe to use for sql types other than
364     boolean.
365    
366     The interface is returned by a GetAsArray getter method (see ISQLData). A new array
367     can be obtained from the IAttachment interface. The SetAsArray setter method
368     (See ISQLParam) is used to apply an updated or new array to the database using
369     an UPDATE or INSERT statement.
370    
371     }
372    
373     TArrayEventReason = (arChanging,arChanged);
374     IArray = interface;
375     TArrayEventHandler = procedure(Sender: IArray; Reason: TArrayEventReason) of object;
376    
377     IArray = interface(IArrayMetaData)
378 tony 56 ['{631c6bb1-fb49-44fb-a64a-c49859632b88}']
379 tony 45 function GetArrayID: TISC_QUAD;
380     procedure Clear;
381     function IsEmpty: boolean;
382     procedure PreLoad;
383     procedure CancelChanges;
384     procedure SaveChanges;
385     function GetAsInteger(index: array of integer): integer;
386     function GetAsBoolean(index: array of integer): boolean;
387     function GetAsCurrency(index: array of integer): Currency;
388     function GetAsInt64(index: array of integer): Int64;
389 tony 315 function GetAsDateTime(index: array of integer): TDateTime; overload;
390     procedure GetAsDateTime(index: array of integer; var aDateTime: TDateTime; var dstOffset: smallint; var aTimezoneID: TFBTimeZoneID); overload;
391     procedure GetAsDateTime(index: array of integer; var aDateTime: TDateTime; var dstOffset: smallint; var aTimezone: AnsiString); overload;
392     procedure GetAsTime(index: array of integer; var aTime: TDateTime; var dstOffset: smallint; var aTimezoneID: TFBTimeZoneID; OnDate: TDateTime); overload;
393     procedure GetAsTime(index: array of integer; var aTime: TDateTime; var dstOffset: smallint; var aTimezone: AnsiString; OnDate: TDateTime); overload;
394     function GetAsUTCDateTime(index: array of integer): TDateTime;
395 tony 45 function GetAsDouble(index: array of integer): Double;
396     function GetAsFloat(index: array of integer): Float;
397     function GetAsLong(index: array of integer): Long;
398     function GetAsShort(index: array of integer): Short;
399 tony 56 function GetAsString(index: array of integer): AnsiString;
400 tony 45 function GetAsVariant(index: array of integer): Variant;
401 tony 315 function GetAsBCD(index: array of integer): tBCD;
402 tony 45 procedure SetAsInteger(index: array of integer; AValue: integer);
403     procedure SetAsBoolean(index: array of integer; AValue: boolean);
404     procedure SetAsCurrency(index: array of integer; Value: Currency);
405     procedure SetAsInt64(index: array of integer; Value: Int64);
406     procedure SetAsDate(index: array of integer; Value: TDateTime);
407 tony 315 procedure SetAsDateTime(index: array of integer; Value: TDateTime); overload;
408     procedure SetAsDateTime(index: array of integer; aValue: TDateTime; aTimeZoneID: TFBTimeZoneID); overload;
409     procedure SetAsDateTime(index: array of integer; aValue: TDateTime; aTimeZone: AnsiString); overload;
410     procedure SetAsTime(index: array of integer; Value: TDateTime); overload;
411     procedure SetAsTime(index: array of integer; aValue: TDateTime; OnDate: TDateTime; aTimeZoneID: TFBTimeZoneID); overload;
412     procedure SetAsTime(index: array of integer; aValue: TDateTime; OnDate: TDateTime; aTimeZone: AnsiString); overload;
413     procedure SetAsUTCDateTime(index: array of integer; aUTCTime: TDateTime);
414 tony 45 procedure SetAsLong(index: array of integer; Value: Long);
415     procedure SetAsDouble(index: array of integer; Value: Double);
416     procedure SetAsFloat(index: array of integer; Value: Float);
417     procedure SetAsShort(index: array of integer; Value: Short);
418 tony 56 procedure SetAsString(index: array of integer; Value: AnsiString);
419 tony 45 procedure SetAsVariant(index: array of integer; Value: Variant);
420 tony 315 procedure SetAsBcd(index: array of integer; aValue: tBCD);
421 tony 45 procedure SetBounds(dim, UpperBound, LowerBound: integer);
422     function GetAttachment: IAttachment;
423     function GetTransaction: ITransaction;
424     procedure AddEventHandler(Handler: TArrayEventHandler);
425     procedure RemoveEventHandler(Handler: TArrayEventHandler);
426     end;
427    
428     { The Blob metadata interface provides access to the metadata used to describe
429     a blob column in a Firebird table.
430     }
431    
432     IBlobMetaData = interface
433 tony 56 ['{575f3c61-bb33-46a5-8975-bb7d1b6e37cc}']
434 tony 45 function GetSubType: integer;
435     function GetCharSetID: cardinal;
436     function GetCodePage: TSystemCodePage;
437     function GetSegmentSize: cardinal;
438 tony 56 function GetRelationName: AnsiString;
439     function GetColumnName: AnsiString;
440 tony 45 end;
441    
442     {The Blob Parameter block is used to select a Blob Filter}
443    
444 tony 56 IBPBItem = interface (IParameterBlockItem)
445     ['{660822a5-3114-4c16-b6cb-c1a7b2aba70d}']
446     end;
447 tony 45
448 tony 87 IBPB = interface (IParameterBlock<IBPBItem>)
449 tony 56 ['{e0cb9eb5-17f7-4416-b7d1-3cddd1dfca76}']
450     end;
451 tony 45
452     { The Blob Interface provides access to a blob data item.
453    
454     The interface is returned by a GetAsBlob getter method (see ISQLData). A new Blob
455     can be obtained from the IAttachment interface. The SetAsBlob setter method
456     (See ISQLParam) is used to apply an updated or new array to the database using
457     an UPDATE or INSERT statement.
458     }
459    
460     TFBBlobMode = (fbmRead,fbmWrite);
461     TBlobType = (btSegmented,btStream);
462    
463     IBlob = interface(IBlobMetaData)
464 tony 56 ['{3090a145-7780-442b-b15b-efd4568b8611}']
465 tony 45 function GetBPB: IBPB;
466     procedure Cancel;
467     procedure Close;
468     function GetBlobID: TISC_QUAD;
469     function GetBlobMode: TFBBlobMode;
470     function GetBlobSize: Int64;
471     procedure GetInfo(var NumSegments: Int64; var MaxSegmentSize,
472     TotalSize: Int64; var BlobType: TBlobType);
473     function Read(var Buffer; Count: Longint): Longint;
474     function Write(const Buffer; Count: Longint): Longint;
475 tony 56 function LoadFromFile(Filename: AnsiString): IBlob;
476 tony 45 function LoadFromStream(S: TStream) : IBlob;
477 tony 56 function SaveToFile(Filename: AnsiString): IBlob;
478 tony 45 function SaveToStream(S: TStream): IBlob;
479     function GetAsString: rawbytestring;
480     procedure SetAsString(aValue: rawbytestring);
481     function SetString(aValue: rawbytestring): IBlob;
482     function GetAttachment: IAttachment;
483     function GetTransaction: ITransaction;
484     property AsString: rawbytestring read GetAsString write SetAsString;
485     end;
486    
487     { The IColumnMetaData interface provides access to the per column metadata for
488     the output of an SQL Statement.
489     }
490    
491 tony 270 TIBDateTimeFormats = (dfTimestamp, {SQL TIMESTAMP}
492     dfDateTime, {SQL DATETIME}
493 tony 315 dfTime, {SQL TIME}
494     dfTimestampTZ, {SQL_TIMESTAMP_TZ}
495     dfTimeTZ); {SQLTIME_TZ
496 tony 270
497 tony 45 { IColumnMetaData }
498    
499     IColumnMetaData = interface
500 tony 56 ['{c222e6c3-53c1-469f-9e05-0a5c3ef232d8}']
501 tony 45 function GetIndex: integer;
502     function GetSQLType: cardinal;
503 tony 56 function GetSQLTypeName: AnsiString;
504 tony 45 function getSubtype: integer;
505 tony 56 function getRelationName: AnsiString;
506     function getOwnerName: AnsiString;
507     function getSQLName: AnsiString; {Name of the column}
508     function getAliasName: AnsiString; {Alias Name of column or Column Name if no alias}
509     function getName: AnsiString; {Disambiguated uppercase Field Name}
510 tony 45 function getScale: integer;
511     function getCharSetID: cardinal;
512     function getCodePage: TSystemCodePage;
513 tony 310 function GetCharSetWidth: integer;
514 tony 45 function getIsNullable: boolean;
515     function GetSize: cardinal;
516     function GetArrayMetaData: IArrayMetaData; {Valid only for Array SQL Type}
517     function GetBlobMetaData: IBlobMetaData; {Valid only for Blob SQL Type}
518 tony 270 function GetDateTimeStrLength(DateTimeFormat: TIBDateTimeFormats): integer;
519 tony 291 function GetStatement: IStatement;
520     function GetTransaction: ITransaction;
521 tony 371 function GetAttachment: IAttachment;
522 tony 56 property Name: AnsiString read GetName;
523 tony 45 property Size: cardinal read GetSize;
524     property SQLType: cardinal read GetSQLType;
525     property Scale: integer read getScale;
526     property SQLSubtype: integer read getSubtype;
527     property IsNullable: Boolean read GetIsNullable;
528     end;
529    
530     {
531     The IMetaData interface provides access to the set of column metadata
532     for the output of an SQL Statement
533     }
534    
535     { IMetaData }
536    
537     IMetaData = interface
538 tony 56 ['{4dafdbb6-0d36-4f1f-9c95-8b132804b965}']
539 tony 45 function getCount: integer;
540     function getColumnMetaData(index: integer): IColumnMetaData;
541 tony 56 function GetUniqueRelationName: AnsiString; {Non empty if all columns come from the same table}
542     function ByName(Idx: AnsiString): IColumnMetaData;
543 tony 45 property ColMetaData[index: integer]: IColumnMetaData read getColumnMetaData; default;
544     property Count: integer read getCount;
545     end;
546    
547     {
548     The ISQLData interface provides access to the data returned in a field in the
549     current row returned from a query or the result of an SQL Execute statement.
550    
551     It subclasses IColumnMetaData and so also provides access to the metadata
552     associated with the column.
553    
554     The getter and setter methods, and the corresponding properties, provide typed
555     access to the field data. The method/property used should be consistent
556     with the SQL Type. Automatic conversion is provided from strings.
557     That is GetAsString is safe to use for sql types other than boolean.
558     }
559    
560    
561     ISQLData = interface(IColumnMetaData)
562 tony 56 ['{3f493e31-7e3f-4606-a07c-b210b9e3619d}']
563 tony 291 function GetStrDataLength: short;
564 tony 45 function GetAsBoolean: boolean;
565     function GetAsCurrency: Currency;
566     function GetAsInt64: Int64;
567 tony 315 function GetAsDateTime: TDateTime; overload;
568     procedure GetAsDateTime(var aDateTime: TDateTime; var dstOffset: smallint; var aTimezoneID: TFBTimeZoneID); overload;
569     procedure GetAsDateTime(var aDateTime: TDateTime; var dstOffset: smallint; var aTimezone: AnsiString); overload;
570     procedure GetAsTime(var aTime: TDateTime; var dstOffset: smallint; var aTimezoneID: TFBTimeZoneID; OnDate: TDateTime); overload;
571     procedure GetAsTime(var aTime: TDateTime; var dstOffset: smallint; var aTimezone: AnsiString; OnDate: TDateTime); overload;
572     procedure GetAsTime(var aTime: TDateTime; var dstOffset: smallint; var aTimezoneID: TFBTimeZoneID); overload;
573     procedure GetAsTime(var aTime: TDateTime; var dstOffset: smallint; var aTimezone: AnsiString); overload;
574     function GetAsUTCDateTime: TDateTime;
575 tony 45 function GetAsDouble: Double;
576     function GetAsFloat: Float;
577     function GetAsLong: Long;
578     function GetAsPointer: Pointer;
579     function GetAsQuad: TISC_QUAD;
580     function GetAsShort: short;
581 tony 56 function GetAsString: AnsiString;
582 tony 45 function GetIsNull: Boolean;
583     function GetAsVariant: Variant;
584     function GetAsBlob: IBlob; overload;
585     function GetAsBlob(BPB: IBPB): IBlob; overload;
586     function GetAsArray: IArray;
587 tony 315 function GetAsBCD: tBCD;
588 tony 371 function GetAsNumeric: IFBNumeric;
589 tony 45 property AsDate: TDateTime read GetAsDateTime;
590     property AsBoolean:boolean read GetAsBoolean;
591     property AsTime: TDateTime read GetAsDateTime;
592     property AsDateTime: TDateTime read GetAsDateTime ;
593     property AsDouble: Double read GetAsDouble;
594     property AsFloat: Float read GetAsFloat;
595     property AsCurrency: Currency read GetAsCurrency;
596     property AsInt64: Int64 read GetAsInt64 ;
597     property AsInteger: Integer read GetAsLong;
598     property AsLong: Long read GetAsLong;
599     property AsPointer: Pointer read GetAsPointer;
600     property AsQuad: TISC_QUAD read GetAsQuad;
601     property AsShort: short read GetAsShort;
602 tony 56 property AsString: AnsiString read GetAsString;
603 tony 45 property AsVariant: Variant read GetAsVariant ;
604     property AsBlob: IBlob read GetAsBlob;
605     property AsArray: IArray read GetAsArray;
606 tony 315 property AsBCD: tBCD read GetAsBCD;
607 tony 371 property AsNumeric: IFBNumeric read GetAsNumeric;
608 tony 45 property IsNull: Boolean read GetIsNull;
609     property Value: Variant read GetAsVariant;
610     end;
611    
612     { An IResults interface is returned as the result of an SQL Execute statement
613     and provides access to the fields returned, if any. It is a collection of
614     ISQLData interfaces which are, in turn, used to access the data returned by
615     each field of the result set.
616     }
617    
618     IResults = interface
619 tony 56 ['{e836b2bb-93d1-4bbf-a8eb-7ce535de3bb5}']
620 tony 45 function getCount: integer;
621 tony 291 function GetStatement: IStatement;
622 tony 45 function GetTransaction: ITransaction;
623 tony 371 function GetAttachment: IAttachment;
624 tony 56 function ByName(Idx: AnsiString): ISQLData;
625 tony 45 function getSQLData(index: integer): ISQLData;
626 tony 56 procedure GetData(index: integer; var IsNull:boolean; var len: short; var data: PByte);
627 tony 45 procedure SetRetainInterfaces(aValue: boolean);
628     property Data[index: integer]: ISQLData read getSQLData; default;
629     property Count: integer read getCount;
630     end;
631    
632     { An IResultSet interface is returned as the result of an SQL Open Cursor statement
633     (e.g. Select Statement) and provides access to the fields returned, if any
634     for the current row. It is a collection of ISQLData interfaces which are,
635     in turn, used to access the data returned by each field of the current row.
636     }
637     IResultSet = interface(IResults)
638 tony 56 ['{0ae4979b-7857-4e8c-8918-ec6f155b51a0}']
639 tony 350 function FetchNext: boolean; {fetch next record}
640     function FetchPrior: boolean; {fetch previous record}
641     function FetchFirst:boolean; {fetch first record}
642     function FetchLast: boolean; {fetch last record}
643     function FetchAbsolute(position: Integer): boolean; {fetch record by its absolute position in result set}
644     function FetchRelative(offset: Integer): boolean; {fetch record by position relative to current}
645 tony 56 function GetCursorName: AnsiString;
646 tony 350 function IsBof: boolean;
647 tony 45 function IsEof: boolean;
648     procedure Close;
649     end;
650    
651     {The ISQLParam interface is used to provide access to each parameter in a
652 tony 349 parametised SQL Statement. The interface comprises the Setter Methods and properties used to
653 tony 45 set the value of each parameter.
654    
655     Automatic conversion is provided to and from strings. That is GetAsString and
656     SetAsString are safe to use for sql types other than boolean - provided automatic
657     conversion is possible.
658 tony 349
659     ISQLParam is subclassed from the IParamMetaData interface. This interface provides
660     access to the parameter metadata. This metadata is mutable and can change after
661     a parameter is set to a given value. This is acceptable as long as the parameter
662     metadata is type compatible with the underlying column metadata and hence the
663     parameter value can be converted by Firebird into a value acceptable by the
664     underlying column. The column metadata, which is unmutable, can be obtained
665     by the ISQLParam.getColMetadata interface. When a statement is prepared, the
666     parameter metadata is always initialised to the column metadata.
667 tony 45 }
668    
669 tony 349 IParamMetaData = interface
670     ['{4e148c4e-2d48-4991-a263-f66eca05c6aa}']
671 tony 45 function GetSQLType: cardinal;
672 tony 56 function GetSQLTypeName: AnsiString;
673 tony 45 function getSubtype: integer;
674     function getScale: integer;
675     function getCharSetID: cardinal;
676     function getCodePage: TSystemCodePage;
677     function getIsNullable: boolean;
678     function GetSize: cardinal;
679 tony 349 property SQLType: cardinal read GetSQLType;
680     end;
681    
682     ISQLParam = interface(IParamMetaData)
683     ['{b22b4578-6d41-4807-a9a9-d2ec8d1d5a14}']
684     function getColMetadata: IParamMetaData;
685 tony 371 function GetStatement: IStatement;
686     function GetTransaction: ITransaction;
687     function GetAttachment: IAttachment;
688 tony 349 function GetIndex: integer;
689     function getName: AnsiString;
690 tony 45 function GetAsBoolean: boolean;
691     function GetAsCurrency: Currency;
692     function GetAsInt64: Int64;
693 tony 315 function GetAsDateTime: TDateTime; overload;
694     procedure GetAsDateTime(var aDateTime: TDateTime; var dstOffset: smallint; var aTimezoneID: TFBTimeZoneID); overload;
695     procedure GetAsDateTime(var aDateTime: TDateTime; var dstOffset: smallint; var aTimezone: AnsiString); overload;
696     procedure GetAsTime(var aTime: TDateTime; var dstOffset: smallint; var aTimezoneID: TFBTimeZoneID; OnDate: TDateTime); overload;
697     procedure GetAsTime(var aTime: TDateTime; var dstOffset: smallint; var aTimezone: AnsiString; OnDate: TDateTime); overload;
698     procedure GetAsTime(var aTime: TDateTime; var dstOffset: smallint; var aTimezoneID: TFBTimeZoneID); overload;
699     procedure GetAsTime(var aTime: TDateTime; var dstOffset: smallint; var aTimezone: AnsiString); overload;
700     function GetAsUTCDateTime: TDateTime;
701 tony 45 function GetAsDouble: Double;
702     function GetAsFloat: Float;
703     function GetAsLong: Long;
704     function GetAsPointer: Pointer;
705     function GetAsQuad: TISC_QUAD;
706     function GetAsShort: short;
707 tony 56 function GetAsString: AnsiString;
708 tony 45 function GetIsNull: boolean;
709     function GetAsVariant: Variant;
710     function GetAsBlob: IBlob;
711     function GetAsArray: IArray;
712 tony 315 function GetAsBCD: tBCD;
713 tony 371 function GetAsNumeric: IFBNumeric;
714 tony 45 procedure Clear;
715     function GetModified: boolean;
716     procedure SetAsBoolean(AValue: boolean);
717     procedure SetAsCurrency(aValue: Currency);
718     procedure SetAsInt64(aValue: Int64);
719     procedure SetAsDate(aValue: TDateTime);
720     procedure SetAsLong(aValue: Long);
721 tony 315 procedure SetAsTime(aValue: TDateTime); overload;
722     procedure SetAsTime(aValue: TDateTime; OnDate: TDateTime; aTimeZoneID: TFBTimeZoneID); overload;
723     procedure SetAsTime(aValue: TDateTime; OnDate: TDateTime; aTimeZone: AnsiString); overload;
724     procedure SetAsTime(aValue: TDateTime; aTimeZoneID: TFBTimeZoneID); overload;
725     procedure SetAsTime(aValue: TDateTime; aTimeZone: AnsiString); overload;
726     procedure SetAsDateTime(aValue: TDateTime); overload;
727     procedure SetAsDateTime(aValue: TDateTime; aTimeZoneID: TFBTimeZoneID); overload;
728     procedure SetAsDateTime(aValue: TDateTime; aTimeZone: AnsiString); overload;
729     procedure SetAsUTCDateTime(aUTCTime: TDateTime);
730 tony 45 procedure SetAsDouble(aValue: Double);
731     procedure SetAsFloat(aValue: Float);
732     procedure SetAsPointer(aValue: Pointer);
733     procedure SetAsShort(aValue: Short);
734 tony 56 procedure SetAsString(aValue: AnsiString);
735 tony 45 procedure SetAsVariant(aValue: Variant);
736     procedure SetIsNull(aValue: Boolean);
737     procedure SetAsBlob(aValue: IBlob);
738     procedure SetAsArray(anArray: IArray);
739     procedure SetAsQuad(aValue: TISC_QUAD);
740     procedure SetCharSetID(aValue: cardinal);
741 tony 315 procedure SetAsBcd(aValue: tBCD);
742 tony 371 procedure SetAsNumeric(Value: IFBNumeric);
743 tony 45 property AsDate: TDateTime read GetAsDateTime write SetAsDate;
744     property AsBoolean:boolean read GetAsBoolean write SetAsBoolean;
745     property AsTime: TDateTime read GetAsDateTime write SetAsTime;
746     property AsDateTime: TDateTime read GetAsDateTime write SetAsDateTime;
747     property AsDouble: Double read GetAsDouble write SetAsDouble;
748     property AsFloat: Float read GetAsFloat write SetAsFloat;
749     property AsCurrency: Currency read GetAsCurrency write SetAsCurrency;
750     property AsInt64: Int64 read GetAsInt64 write SetAsInt64;
751     property AsInteger: Integer read GetAsLong write SetAsLong;
752     property AsLong: Long read GetAsLong write SetAsLong;
753     property AsPointer: Pointer read GetAsPointer write SetAsPointer;
754     property AsShort: Short read GetAsShort write SetAsShort;
755 tony 56 property AsString: AnsiString read GetAsString write SetAsString;
756 tony 45 property AsVariant: Variant read GetAsVariant write SetAsVariant;
757     property AsBlob: IBlob read GetAsBlob write SetAsBlob;
758     property AsArray: IArray read GetAsArray write SetAsArray;
759 tony 315 property AsBCD: tBCD read GetAsBCD write SetAsBCD;
760 tony 371 property AsNumeric: IFBNumeric read GetAsNumeric write SetAsNumeric;
761 tony 45 property AsQuad: TISC_QUAD read GetAsQuad write SetAsQuad;
762     property Value: Variant read GetAsVariant write SetAsVariant;
763     property IsNull: Boolean read GetIsNull write SetIsNull;
764     property IsNullable: Boolean read GetIsNullable;
765     property Modified: Boolean read getModified;
766 tony 56 property Name: AnsiString read GetName;
767 tony 45 end;
768    
769     {
770     The ISQLParams interface provides access to the collection of parameters used
771     for the input to an SQL Statement
772     }
773    
774     ISQLParams = interface
775 tony 56 ['{c6d95ac7-b2b7-461b-b890-afef0acbb077}']
776 tony 45 function getCount: integer;
777     function getSQLParam(index: integer): ISQLParam;
778 tony 56 function ByName(Idx: AnsiString): ISQLParam ;
779 tony 45 function GetModified: Boolean;
780 tony 287 function GetHasCaseSensitiveParams: Boolean;
781 tony 371 function GetStatement: IStatement;
782     function GetTransaction: ITransaction;
783     function GetAttachment: IAttachment;
784     procedure Clear;
785 tony 45 property Modified: Boolean read GetModified;
786     property Params[index: integer]: ISQLParam read getSQLParam; default;
787     property Count: integer read getCount;
788     end;
789    
790 tony 47
791     TPerfStats = (psCurrentMemory, psMaxMemory,
792     psRealTime, psUserTime, psBuffers,
793     psReads, psWrites, psFetches,psDeltaMemory);
794    
795 tony 209 TPerfCounters = array[TPerfStats] of Int64;
796 tony 47
797 tony 345 {Batch Query Execution Support}
798    
799     TBatchCompletionState = (bcExecuteFailed, bcSuccessNoInfo, bcNoMoreErrors);
800    
801     IBatchCompletion = interface
802     ['{9bc3d49d-16d9-4606-94e5-ee987103ad92}']
803     function getTotalProcessed: cardinal;
804     function getState(updateNo: cardinal): TBatchCompletionState;
805     function getStatusMessage(updateNo: cardinal): AnsiString;
806     function getUpdated: integer;
807     function getErrorStatus(var RowNo: integer; var status: IStatus): boolean;
808     end;
809    
810 tony 45 {The IStatement interface provides access to an SQL Statement once it has been
811     initially prepared. The interface is returned from the IAttachment interface.
812     }
813    
814 tony 359 TStatementFlag = (stHasCursor,stRepeatExecute,stScrollable);
815     TStatementFlags = set of TStatementFlag;
816    
817 tony 45 IStatement = interface
818 tony 56 ['{a260576d-a07d-4a66-b02d-1b72543fd7cf}']
819 tony 45 function GetMetaData: IMetaData; {Output Metadata}
820     function GetSQLParams: ISQLParams;{Statement Parameters}
821 tony 56 function GetPlan: AnsiString;
822 tony 45 function GetRowsAffected(var SelectCount, InsertCount, UpdateCount, DeleteCount: integer): boolean;
823     function GetSQLStatementType: TIBSQLStatementTypes;
824 tony 345 function GetSQLStatementTypeName: AnsiString;
825 tony 56 function GetSQLText: AnsiString;
826 tony 263 function GetProcessedSQLText: AnsiString;
827 tony 45 function GetSQLDialect: integer;
828 tony 359 function GetFlags: TStatementFlags;
829 tony 45 function IsPrepared: boolean;
830 tony 345 function HasBatchMode: boolean;
831     function IsInBatchMode: boolean;
832 tony 350 procedure Prepare(aTransaction: ITransaction=nil); overload;
833     procedure Prepare(CursorName: AnsiString; aTransaction: ITransaction=nil); overload;
834 tony 45 function Execute(aTransaction: ITransaction=nil): IResults;
835 tony 350 function OpenCursor(aTransaction: ITransaction=nil): IResultSet; overload;
836     function OpenCursor(Scrollable: boolean; aTransaction: ITransaction=nil): IResultSet; overload;
837 tony 45 function GetAttachment: IAttachment;
838     function GetTransaction: ITransaction;
839     procedure SetRetainInterfaces(aValue: boolean);
840 tony 47 procedure EnableStatistics(aValue: boolean);
841     function GetPerfStatistics(var stats: TPerfCounters): boolean;
842 tony 345 {IBatch interface support}
843     procedure AddToBatch;
844     function ExecuteBatch(aTransaction: ITransaction=nil): IBatchCompletion;
845     procedure CancelBatch;
846     function GetBatchCompletion: IBatchCompletion;
847     function GetBatchRowLimit: integer;
848     procedure SetBatchRowLimit(aLimit: integer);
849 tony 347 {Stale Reference Check}
850     procedure SetStaleReferenceChecks(Enable:boolean); {default true}
851     function GetStaleReferenceChecks: boolean;
852 tony 345
853 tony 45 property MetaData: IMetaData read GetMetaData;
854     property SQLParams: ISQLParams read GetSQLParams;
855     property SQLStatementType: TIBSQLStatementTypes read GetSQLStatementType;
856     end;
857    
858 tony 359 ITrInfoItem = interface
859     ['{41455e1a-f84e-4e26-aff0-1a78e8b69cfe}']
860     function getItemType: byte;
861     function getSize: integer;
862     function getAsString: AnsiString;
863     function getAsInteger: int64;
864     procedure DecodeTraIsolation(var IsolationType, RecVersion: byte);
865     end;
866    
867     { ITrInformation }
868    
869     ITrInformation = interface
870     ['{e6ea4a52-c1a1-44ba-9609-c8bcc7cba7b2}']
871     function GetCount: integer;
872     function GetItem(index: integer): ITrInfoItem;
873     function Find(ItemType: byte): ITrInfoItem;
874     procedure PrintBuf; {can be used to print buffer in hex for debugging}
875     property Count: integer read GetCount;
876     property Items[index: integer]: ITrInfoItem read getItem; default;
877     end;
878    
879 tony 45 {Transaction Parameter Block: (TPB)
880    
881     The TPB provides the parameters used when starting a transaction. It is allocated
882     empty by the FirebirdAPI and the parameters are then added to it. Each individual
883     parameter may be accessed by the ITPBItem interface which can be used to set the
884     value, if any, of the parameter.
885    
886     The TPB parameters, and the associated symbolic codes and parameter values may be
887     found in the Interbase 6.0 API Guide.
888     }
889    
890 tony 315 ITPBItem = interface(IParameterBlockItemWithTypeName)
891 tony 56 ['{544c1f2b-7c12-4a87-a4a5-face7ea72671}']
892     end;
893 tony 45
894 tony 315 ITPB = interface(IParameterBlockWithTypeNames<ITPBItem>)
895 tony 56 ['{7369b0ff-defe-437b-81fe-19b211d42d25}']
896 tony 363 function AsText: AnsiString;
897 tony 56 end;
898 tony 45
899     {The ITransactionAction interface provides access to a Transaction once it
900     has been initially started. After a Commit or Rollback, a transaction
901     may be restarted, optinally with a new TPB.
902    
903     A multi-database transaction is started from the FirebirdAPI. A single database
904     transaction is started from the IAttachment interface.
905     }
906    
907     TTransactionAction = (TARollback, TACommit, TACommitRetaining, TARollbackRetaining);
908     TTransactionCompletion = TARollback.. TACommit;
909 tony 387 TTrCompletionState = (trCommitted, trRolledback, trCommitFailed, trRollbackFailed);
910 tony 45
911 tony 387
912 tony 45 ITransaction = interface
913 tony 56 ['{30928d0e-a9d7-4c61-b7cf-14f4f38abe2a}']
914 tony 45 function getTPB: ITPB;
915     procedure Start(DefaultCompletion: TTransactionCompletion=taCommit);
916     function GetInTransaction: boolean;
917 tony 359 function GetIsReadOnly: boolean;
918     function GetTransactionID: integer;
919 tony 363 function GetJournalingActive(attachment: IAttachment): boolean;
920     function GetDefaultCompletion: TTransactionCompletion;
921 tony 45 procedure PrepareForCommit; {Two phase commit - stage 1}
922 tony 387 function Commit(Force: boolean=false): TTrCompletionState;
923 tony 45 procedure CommitRetaining;
924     function HasActivity: boolean;
925 tony 387 function Rollback(Force: boolean=false): TTrCompletionState;
926 tony 45 procedure RollbackRetaining;
927     function GetAttachmentCount: integer;
928     function GetAttachment(index: integer): IAttachment;
929 tony 359 function GetTrInformation(Requests: array of byte): ITrInformation; overload;
930     function GetTrInformation(Request: byte): ITrInformation; overload;
931 tony 363 function GetTransactionName: AnsiString;
932     procedure SetTransactionName(aValue: AnsiString);
933 tony 45 property InTransaction: boolean read GetInTransaction;
934 tony 363 property TransactionName: AnsiString read GetTransactionName write SetTransactionName;
935 tony 45 end;
936    
937     { The IEvents Interface is used to handle events from a single database. The
938     interface is allocated from the IAttachment Interface.
939    
940     Note that the EventHandler called when an event occurs following AsynWaitForEvent
941     is called in a different thread to the calling program and TThread.Synchronize
942     may be needed to pass the event back to the main thread.
943    
944     Neither AsyncWaitForEvent nor WaitForEvent is intended to be thread safe
945     in a multi-threaded environment and should always be called from the main
946     thread.
947     }
948    
949     TEventInfo = record
950 tony 56 EventName: AnsiString;
951 tony 45 Count: integer;
952     end;
953    
954     TEventCounts = array of TEventInfo;
955     IEvents = interface;
956     TEventHandler = procedure(Sender: IEvents) of object;
957    
958     { IEvents }
959    
960     IEvents = interface
961 tony 56 ['{6a0be233-ed08-4524-889c-2e45d0c20e5f}']
962 tony 45 procedure GetEvents(EventNames: TStrings);
963     procedure SetEvents(EventNames: TStrings); overload;
964 tony 381 procedure SetEvents(EventName: string); overload;
965 tony 45 procedure Cancel;
966     function ExtractEventCounts: TEventCounts;
967     procedure WaitForEvent;
968     procedure AsyncWaitForEvent(EventHandler: TEventHandler);
969     function GetAttachment: IAttachment;
970     end;
971    
972 tony 315 TTZTextOptions = (tzOffset, {Time Zone Rendered as an offset to GMT}
973     tzGMT, {No Time Zone. Time part is always rendered in GMT}
974     tzOriginalID); {Time Zone shown as originally entered}
975    
976     {The ITimeZoneServices interface provides access to the time zone database
977     used for the attachment. It may be used in support of TIMESTAMP WITH TIME ZONE
978     and TIME WITH TIME ZONE data types.}
979    
980     ITimeZoneServices = interface
981     ['{163821f5-ebef-42b9-ac60-8ac4b5c09954}']
982     {utility functions}
983     function TimeZoneID2TimeZoneName(aTimeZoneID: TFBTimeZoneID): AnsiString;
984     function TimeZoneName2TimeZoneID(aTimeZone: AnsiString): TFBTimeZoneID;
985     function LocalTimeToGMT(aLocalTime: TDateTime; aTimeZone: AnsiString): TDateTime; overload;
986     function LocalTimeToGMT(aLocalTime: TDateTime; aTimeZoneID: TFBTimeZoneID): TDateTime; overload;
987     function GMTToLocalTime(aGMTTime: TDateTime; aTimeZone: AnsiString): TDateTime; overload;
988     function GMTToLocalTime(aGMTTime: TDateTime; aTimeZoneID: TFBTimeZoneID): TDateTime; overload;
989     function GetEffectiveOffsetMins(aLocalTime: TDateTime; aTimeZone: AnsiString): integer; overload;
990     function GetEffectiveOffsetMins(aLocalTime: TDateTime; aTimeZoneID: TFBTimeZoneID): integer; overload;
991    
992     {Time Zone DB Information}
993     function UsingRemoteTZDB: boolean;
994     procedure SetUseLocalTZDB(useLocalTZDB: boolean);
995     function GetLocalTimeZoneName: AnsiString;
996     function GetLocalTimeZoneID: TFBTimeZoneID;
997     procedure GetTimeZoneInfo(aTimeZone: AnsiString; OnDate: TDateTime;
998     var ZoneOffset, DSTOffset, EffectiveOffset: integer);
999     {Configurable Options}
1000     function GetTimeTZDate: TDateTime;
1001     procedure SetTimeTZDate(aDate: TDateTime);
1002     function GetTZTextOption: TTZTextOptions;
1003     procedure SetTZTextOption(aOptionValue: TTZTextOptions);
1004     end;
1005    
1006 tony 45 {The IDBInformation Interface.
1007    
1008     An IDBInformation interface is returned by the IAttachment GetDBInformation
1009     method. The interface provides access to the information requested and
1010     returned by the method.
1011    
1012     IDBInformation itself gives access to a collection of IDBInfoItems. Each one
1013     provides information requested, as indicated by the ItemType and the actual
1014     value of the information. In some cases, the returned item is itself a
1015     colletion of IDBInfoItems.
1016    
1017     The IDBInformation items, and the associated symbolic codes and parameter values may be
1018     found in the Interbase 6.0 API Guide.
1019     }
1020    
1021     TDBOperationCount = record
1022     TableID: UShort;
1023     Count: cardinal;
1024     end;
1025    
1026     TDBOperationCounts = array of TDBOperationCount;
1027    
1028     IDBInfoItem = interface
1029 tony 56 ['{eeb97b51-ec0f-473f-9f75-c1721f055fcb}']
1030 tony 45 function getItemType: byte;
1031     function getSize: integer;
1032     procedure getRawBytes(var Buffer);
1033 tony 56 function getAsString: AnsiString;
1034 tony 345 function getAsInteger: int64;
1035 tony 56 procedure DecodeIDCluster(var ConnectionType: integer; var DBFileName, DBSiteName: AnsiString);
1036 tony 45 function getAsBytes: TByteArray;
1037 tony 143 function getAsDateTime: TDateTime;
1038 tony 56 procedure DecodeVersionString(var Version: byte; var VersionString: AnsiString);
1039 tony 45 function getOperationCounts: TDBOperationCounts;
1040     procedure DecodeUserNames(UserNames: TStrings);
1041    
1042     {user names only}
1043     function GetCount: integer;
1044     function GetItem(index: integer): IDBInfoItem;
1045     function Find(ItemType: byte): IDBInfoItem;
1046 tony 345 property AsInteger: int64 read getAsInteger;
1047 tony 56 property AsString: AnsiString read GetAsString;
1048 tony 45 property Count: integer read GetCount;
1049     property Items[index: integer]: IDBInfoItem read getItem; default;
1050     end;
1051    
1052     { IDBInformation }
1053    
1054     IDBInformation = interface
1055 tony 56 ['{7ac6777f-f0a9-498a-9f5c-4a57a554df81}']
1056 tony 45 function GetCount: integer;
1057     function GetItem(index: integer): IDBInfoItem;
1058     function Find(ItemType: byte): IDBInfoItem;
1059     procedure PrintBuf; {can be used to print buffer in hex for debugging}
1060     property Count: integer read GetCount;
1061     property Items[index: integer]: IDBInfoItem read getItem; default;
1062     end;
1063    
1064 tony 143 {The Database Information Request Block is used to pass requests for
1065     database information where at least one item requested has a parameter.
1066     At present, this is only fb_info_page_contents which has a single
1067     integer parameter.}
1068    
1069     IDIRBItem = interface(IParameterBlockItem)
1070     ['{d34a7511-8435-4a24-81a7-5103d218d234}']
1071     end;
1072    
1073     IDIRB = interface(IParameterBlock<IDIRBItem>)
1074     ['{1010e5ac-0a8f-403b-a302-91625e9d9579}']
1075     end;
1076    
1077    
1078 tony 45 {The Database Parameter Block (DPB).
1079    
1080     The DPB provides the parameters used when connecting to a database. It is allocated
1081     empty by the FirebirdAPI and the parameters are then added to it. Each individual
1082     parameter may be accessed by the IDPBItem interface which can be used to set the
1083     value, if any, of the parameter.
1084    
1085     The DPB parameters, and the associated symbolic codes and parameter values may be
1086     found in the Interbase 6.0 API Guide.
1087     }
1088    
1089 tony 315 IDPBItem = interface(IParameterBlockItemWithTypeName)
1090 tony 56 ['{123d4ad0-087a-4cd1-a344-1b3d03b30673}']
1091     end;
1092 tony 45
1093 tony 315 IDPB = interface(IParameterBlockWithTypeNames<IDPBItem>)
1094     ['{e676067b-1cf4-4eba-9256-9724f57e0d16}']
1095     end;
1096 tony 45
1097 tony 363 {Journaling options. Default is [joReadWriteTransactions,joModifyQueries] }
1098    
1099     TJournalOption = (joReadOnlyTransactions, joReadWriteTransactions,
1100 tony 371 joModifyQueries, joReadOnlyQueries,joNoServerTable);
1101 tony 363
1102     TJournalOptions = set of TJournalOption;
1103    
1104 tony 45 {The IAttachment interface provides access to a Database Connection. It may be
1105     used to:
1106    
1107     a. Disconnect and reconnect to the database.
1108    
1109     b. Start a Transaction on the database
1110    
1111     c. Execute directly SQL DDL Statements and others that return no information.
1112    
1113     d. OpenCursors (i.e. execute SQL Select statements and return the results)
1114    
1115     e. Prepare SQL Statements, returning an IStatement interface for further processing.
1116    
1117     f. Provide access to an SQL Event Handler.
1118    
1119     g. Access Database Information.
1120    
1121     h. Support the handling of Array and Blob data.
1122    
1123     Note that SQL statements can be prepared with named parameters (PSQL style).
1124     This then allows the parameters to be accessed by name. The same name can
1125     be used for more than one parameter, allowing a single operation to be used
1126     to set all parameters with the same name.
1127     }
1128    
1129     { IAttachment }
1130    
1131     IAttachment = interface
1132 tony 56 ['{466e9b67-9def-4807-b3e7-e08a35e7185c}']
1133 tony 263 function getFirebirdAPI: IFirebirdAPI;
1134 tony 45 function getDPB: IDPB;
1135     function AllocateBPB: IBPB;
1136 tony 143 function AllocateDIRB: IDIRB;
1137 tony 45 procedure Connect;
1138     procedure Disconnect(Force: boolean=false);
1139     function IsConnected: boolean;
1140     procedure DropDatabase;
1141 tony 363 function StartTransaction(TPB: array of byte;
1142     DefaultCompletion: TTransactionCompletion=taCommit;
1143     aName: AnsiString=''): ITransaction; overload;
1144     function StartTransaction(TPB: ITPB;
1145     DefaultCompletion: TTransactionCompletion=taCommit;
1146     aName: AnsiString=''): ITransaction; overload;
1147 tony 56 procedure ExecImmediate(transaction: ITransaction; sql: AnsiString; SQLDialect: integer); overload;
1148     procedure ExecImmediate(TPB: array of byte; sql: AnsiString; SQLDialect: integer); overload;
1149     procedure ExecImmediate(transaction: ITransaction; sql: AnsiString); overload;
1150     procedure ExecImmediate(TPB: array of byte; sql: AnsiString); overload;
1151     function ExecuteSQL(TPB: array of byte; sql: AnsiString; SQLDialect: integer; params: array of const): IResults; overload;
1152     function ExecuteSQL(transaction: ITransaction; sql: AnsiString; SQLDialect: integer; params: array of const): IResults; overload;
1153     function ExecuteSQL(TPB: array of byte; sql: AnsiString; params: array of const): IResults; overload;
1154     function ExecuteSQL(transaction: ITransaction; sql: AnsiString; params: array of const): IResults; overload;
1155     function OpenCursor(transaction: ITransaction; sql: AnsiString; aSQLDialect: integer;
1156 tony 350 Scrollable: boolean=false): IResultSet; overload;
1157     function OpenCursor(transaction: ITransaction; sql: AnsiString; aSQLDialect: integer;
1158 tony 45 params: array of const): IResultSet; overload;
1159 tony 350 function OpenCursor(transaction: ITransaction; sql: AnsiString; Scrollable: boolean=false): IResultSet; overload;
1160     function OpenCursor(transaction: ITransaction; sql: AnsiString; Scrollable: boolean;
1161     params: array of const): IResultSet; overload;
1162 tony 56 function OpenCursor(transaction: ITransaction; sql: AnsiString;
1163 tony 45 params: array of const): IResultSet; overload;
1164 tony 350 function OpenCursor(transaction: ITransaction; sql: AnsiString; aSQLDialect: integer; Scrollable: boolean;
1165     params: array of const): IResultSet; overload;
1166 tony 56 function OpenCursorAtStart(transaction: ITransaction; sql: AnsiString; aSQLDialect: integer;
1167 tony 350 Scrollable: boolean=false): IResultSet; overload;
1168     function OpenCursorAtStart(transaction: ITransaction; sql: AnsiString; aSQLDialect: integer;
1169 tony 45 params: array of const): IResultSet; overload;
1170 tony 350 function OpenCursorAtStart(transaction: ITransaction; sql: AnsiString; aSQLDialect: integer; Scrollable: boolean;
1171     params: array of const): IResultSet; overload;
1172     function OpenCursorAtStart(transaction: ITransaction; sql: AnsiString; Scrollable: boolean=false): IResultSet; overload;
1173 tony 56 function OpenCursorAtStart(transaction: ITransaction; sql: AnsiString;
1174 tony 45 params: array of const): IResultSet; overload;
1175 tony 350 function OpenCursorAtStart(transaction: ITransaction; sql: AnsiString; Scrollable: boolean;
1176     params: array of const): IResultSet; overload;
1177     function OpenCursorAtStart(sql: AnsiString; Scrollable: boolean=false): IResultSet; overload;
1178     function OpenCursorAtStart(sql: AnsiString; Scrollable: boolean;
1179     params: array of const): IResultSet; overload;
1180 tony 56 function OpenCursorAtStart(sql: AnsiString;
1181 tony 45 params: array of const): IResultSet; overload;
1182 tony 350 function Prepare(transaction: ITransaction; sql: AnsiString; aSQLDialect: integer; CursorName: AnsiString=''): IStatement; overload;
1183     function Prepare(transaction: ITransaction; sql: AnsiString; CursorName: AnsiString=''): IStatement; overload;
1184 tony 56 function PrepareWithNamedParameters(transaction: ITransaction; sql: AnsiString;
1185 tony 270 aSQLDialect: integer; GenerateParamNames: boolean=false;
1186 tony 350 CaseSensitiveParams: boolean = false; CursorName: AnsiString=''): IStatement; overload;
1187 tony 56 function PrepareWithNamedParameters(transaction: ITransaction; sql: AnsiString;
1188 tony 270 GenerateParamNames: boolean=false;
1189 tony 350 CaseSensitiveParams: boolean = false; CursorName: AnsiString=''): IStatement; overload;
1190 tony 45
1191     {Events}
1192     function GetEventHandler(Events: TStrings): IEvents; overload;
1193 tony 56 function GetEventHandler(Event: AnsiString): IEvents; overload;
1194 tony 45
1195     {Blob - may use to open existing Blobs. However, ISQLData.AsBlob is preferred}
1196    
1197 tony 56 function CreateBlob(transaction: ITransaction; RelationName, ColumnName: AnsiString; BPB: IBPB=nil): IBlob; overload;
1198 tony 45 function CreateBlob(transaction: ITransaction; BlobMetaData: IBlobMetaData; BPB: IBPB=nil): IBlob; overload;
1199     function CreateBlob(transaction: ITransaction; SubType: integer; CharSetID: cardinal=0; BPB: IBPB=nil): IBlob; overload;
1200 tony 291 function OpenBlob(transaction: ITransaction; RelationName, ColumnName: AnsiString; BlobID: TISC_QUAD; BPB: IBPB=nil): IBlob; overload;
1201     function OpenBlob(transaction: ITransaction; BlobMetaData: IBlobMetaData; BlobID: TISC_QUAD; BPB: IBPB=nil): IBlob; overload;
1202 tony 345 function GetInlineBlobLimit: integer;
1203     procedure SetInlineBlobLimit(limit: integer);
1204 tony 45
1205     {Array - may use to open existing arrays. However, ISQLData.AsArray is preferred}
1206    
1207 tony 291 function OpenArray(transaction: ITransaction; RelationName, ColumnName: AnsiString; ArrayID: TISC_QUAD): IArray; overload;
1208     function OpenArray(transaction: ITransaction; ArrayMetaData: IArrayMetaData; ArrayID: TISC_QUAD): IArray; overload;
1209 tony 56 function CreateArray(transaction: ITransaction; RelationName, ColumnName: AnsiString): IArray; overload;
1210 tony 45 function CreateArray(transaction: ITransaction; ArrayMetaData: IArrayMetaData): IArray; overload;
1211 tony 56 function CreateArrayMetaData(SQLType: cardinal; tableName: AnsiString; columnName: AnsiString;
1212 tony 47 Scale: integer; size: cardinal; charSetID: cardinal; dimensions: cardinal;
1213     bounds: TArrayBounds): IArrayMetaData;
1214 tony 45
1215     {Database Information}
1216     function GetSQLDialect: integer;
1217 tony 363 function GetAttachmentID: integer;
1218 tony 56 function GetBlobMetaData(Transaction: ITransaction; tableName, columnName: AnsiString): IBlobMetaData;
1219     function GetArrayMetaData(Transaction: ITransaction; tableName, columnName: AnsiString): IArrayMetaData;
1220 tony 45 function GetDBInformation(Requests: array of byte): IDBInformation; overload;
1221     function GetDBInformation(Request: byte): IDBInformation; overload;
1222 tony 143 function GetDBInformation(Requests: IDIRB): IDBInformation; overload;
1223 tony 117 function GetConnectString: AnsiString;
1224     function GetRemoteProtocol: AnsiString;
1225 tony 143 function GetAuthenticationMethod: AnsiString;
1226 tony 209 function GetSecurityDatabase: AnsiString;
1227 tony 117 function GetODSMajorVersion: integer;
1228     function GetODSMinorVersion: integer;
1229 tony 266 procedure getFBVersion(version: TStrings);
1230 tony 45 function HasActivity: boolean;
1231 tony 315 function HasDecFloatSupport: boolean;
1232 tony 345 function HasBatchMode: boolean;
1233 tony 352 function HasScollableCursors: boolean;
1234 tony 371 function HasTable(aTableName: AnsiString): boolean; {case sensitive}
1235     function HasFunction(aFunctionName: AnsiString): boolean; {case sensitive}
1236     function HasProcedure(aProcName: AnsiString): boolean; {case sensitive}
1237 tony 60
1238     {Character Sets}
1239 tony 371 function GetCharSetID: integer; {connection character set}
1240 tony 109 function HasDefaultCharSet: boolean;
1241     function GetDefaultCharSetID: integer;
1242 tony 60 function GetCharsetName(CharSetID: integer): AnsiString;
1243     function CharSetID2CodePage(CharSetID: integer; var CodePage: TSystemCodePage): boolean;
1244     function CodePage2CharSetID(CodePage: TSystemCodePage; var CharSetID: integer): boolean;
1245     function CharSetName2CharSetID(CharSetName: AnsiString; var CharSetID: integer): boolean;
1246     function CharSetWidth(CharSetID: integer; var Width: integer): boolean;
1247     procedure RegisterCharSet(CharSetName: AnsiString; CodePage: TSystemCodePage;
1248     AllowReverseLookup:boolean; out CharSetID: integer);
1249 tony 45
1250 tony 315 {Time Zone Database}
1251     function GetTimeZoneServices: ITimeZoneServices;
1252     function HasTimeZoneSupport: boolean;
1253 tony 363
1254     {Client side Journaling}
1255     function JournalingActive: boolean;
1256     function GetJournalOptions: TJournalOptions;
1257     function StartJournaling(aJournalLogFile: AnsiString): integer; overload;
1258     function StartJournaling(aJournalLogFile: AnsiString; Options: TJournalOptions): integer; overload;
1259 tony 371 function StartJournaling(S: TStream; Options: TJournalOptions): integer; overload;
1260 tony 363 procedure StopJournaling(RetainJournal: boolean);
1261 tony 315 end;
1262    
1263 tony 231 TProtocolAll = (TCP, SPX, NamedPipe, Local, inet, inet4, inet6, wnet, xnet, unknownProtocol);
1264 tony 143 TProtocol = TCP..xnet;
1265 tony 45
1266     {Service Parameter Block (SPB).
1267    
1268     The SPB provides the parameters used when connecting to a Service Manager. It is
1269     allocated empty by the FirebirdAPI and the parameters are then added to it. Each
1270     individual parameter may be accessed by the ISPBItem interface which can be used
1271     to set the value, if any, of the parameter.
1272    
1273     The SPB parameters, and the associated symbolic codes and parameter values may be
1274     found in the Interbase 6.0 API Guide.
1275    
1276     }
1277    
1278 tony 315 ISPBItem = interface(IParameterBlockItemWithTypeName)
1279 tony 56 ['{5d08ae2b-4519-41bd-8b40-97cd451c3f6a}']
1280     end;
1281 tony 45
1282 tony 315 ISPB = interface(IParameterBlockWithTypeNames<ISPBItem>)
1283 tony 56 ['{2c5836fd-41ed-4426-9b7d-5af580ec2659}']
1284     end;
1285 tony 45
1286     {Service Query Parameter Block (SQPB).
1287    
1288     This is a specialised parameter block used to send data to a service manager
1289     in a Query Request.
1290     }
1291    
1292     ISQPBItem = interface(IParameterBlockItem)
1293 tony 56 ['{b07841a6-33b3-47f0-b5a2-028cbc86dc97}']
1294 tony 45 function CopyFrom(source: TStream; count: integer): integer;
1295     end;
1296    
1297 tony 56 ISQPB = interface(IParameterBlock<ISQPBItem>)
1298     ['{8553e66b-ee62-498b-8431-dff030211447}']
1299     end;
1300 tony 45
1301     {Service Request Block (SRB).
1302    
1303     The SRB specifies what is requested from the Service Manager when starting a
1304     service or querying a service. It is allocated empty by the ServiceManager API and
1305     the parameters are then added to it. Each individual parameter may be accessed
1306     by the ISRBItem interface which can be used to set the value, if any, of the parameter.
1307    
1308     The SRB parameters, and the associated symbolic codes and parameter values may be
1309     found in the Interbase 6.0 API Guide.
1310    
1311     }
1312    
1313 tony 56 ISRBItem = interface(IParameterBlockItem)
1314     ['{47ec790e-f265-4b30-9dcd-261e51677245}']
1315     end;
1316 tony 45
1317 tony 56 ISRB = interface(IParameterBlock<ISRBItem>)
1318     ['{9f2e204f-3c33-4e44-90f9-9135e95dafb9}']
1319     end;
1320 tony 45
1321     {The Service Query Results Interface.
1322    
1323     An IServiceQueryResults interface is returned by the IServiceManager Query
1324     method. The interface provides access to the information requested and
1325     returned by the method.
1326    
1327     IServiceQueryResults itself gives access to a collection of IServiceQueryResultItem.
1328     Each one provides information requested, as indicated by the ItemType and the actual
1329     value of the information. In some cases, the returned item is itself a
1330     collection of IServiceQueryResultSubItem.
1331    
1332     The IServiceQueryResultItem items, and the associated symbolic codes and parameter values may be
1333     found in the Interbase 6.0 API Guide.
1334     }
1335    
1336     IServiceQueryResultSubItem = interface
1337 tony 56 ['{8a4c381e-9923-4cc9-a96b-553729248640}']
1338 tony 45 function getItemType: byte;
1339     function getSize: integer;
1340     procedure getRawBytes(var Buffer);
1341 tony 56 function getAsString: AnsiString;
1342 tony 345 function getAsInteger: int64;
1343 tony 45 function getAsByte: byte;
1344     function CopyTo(stream: TStream; count: integer): integer;
1345 tony 56 property AsString: AnsiString read getAsString;
1346 tony 345 property AsInteger: int64 read getAsInteger;
1347 tony 45 property AsByte: byte read getAsByte;
1348     end;
1349    
1350     IServiceQueryResultItem = interface(IServiceQueryResultSubItem)
1351 tony 56 ['{b2806886-206c-4024-8df9-5fe0a7630a5e}']
1352 tony 45 function getCount: integer;
1353     function getItem(index: integer): IServiceQueryResultSubItem;
1354     function find(ItemType: byte): IServiceQueryResultSubItem;
1355     property Items[index: integer]: IServiceQueryResultSubItem read getItem; default;
1356     property Count: integer read getCount;
1357     end;
1358    
1359     IServiceQueryResults = interface
1360 tony 56 ['{8fbbef7d-fe03-4409-828a-a787d34ef531}']
1361 tony 45 function getCount: integer;
1362     function getItem(index: integer): IServiceQueryResultItem;
1363     function find(ItemType: byte): IServiceQueryResultItem;
1364     procedure PrintBuf; {can be used to print buffer in hex for debugging}
1365     property Items[index: integer]: IServiceQueryResultItem read getItem; default;
1366     property Count: integer read getCount;
1367     end;
1368    
1369 tony 263 IFirebirdLibrary = interface;
1370    
1371 tony 45 {The IServiceManager interface provides access to a service manager. It can
1372     used to Detach and re-attach to Service Manager, to start services and to
1373     query the service manager.
1374    
1375     The interface is returned by the FirebirdAPI GetService Manager method.
1376     }
1377    
1378     { IServiceManager }
1379    
1380     IServiceManager = interface
1381 tony 56 ['{905b587d-1e1f-4e40-a3f8-a3519f852e48}']
1382 tony 263 function getFirebirdAPI: IFirebirdAPI;
1383 tony 45 function getSPB: ISPB;
1384 tony 56 function getServerName: AnsiString;
1385 tony 209 function getProtocol: TProtocol;
1386     function getPortNo: AnsiString;
1387 tony 45 procedure Attach;
1388     procedure Detach(Force: boolean=false);
1389     function IsAttached: boolean;
1390     function AllocateSRB: ISRB;
1391     function AllocateSQPB: ISQPB;
1392 tony 209 function Start(Request: ISRB; RaiseExceptionOnError: boolean=true): boolean;
1393     function Query(SQPB: ISQPB; Request: ISRB; RaiseExceptionOnError: boolean=true) :IServiceQueryResults; overload;
1394     function Query(Request: ISRB; RaiseExceptionOnError: boolean=true) :IServiceQueryResults; overload;
1395 tony 45 end;
1396    
1397 tony 263 {Tbe Firebird Library API used to get information about the Firebird library}
1398    
1399    
1400     IFirebirdLibrary = interface
1401     ['{3c04e0a1-12e0-428a-b2e1-bc6fcd97b79b}']
1402     function GetHandle: TLibHandle;
1403     function GetLibraryName: string;
1404     function GetLibraryFilePath: string;
1405     function GetFirebirdAPI: IFirebirdAPI;
1406     end;
1407    
1408 tony 45 {The Firebird API.
1409    
1410     This is the base interface and is used to create/open a database connection, to
1411     start a transaction on multiple databases and the access the service manager.
1412    
1413     The interface is returned by the FirebirdAPI function.
1414     }
1415    
1416 tony 315 { IFirebirdAPI }
1417    
1418 tony 45 IFirebirdAPI = interface
1419 tony 56 ['{edeee691-c8d3-4dcf-a780-cd7e432821d5}']
1420 tony 45 {Database connections}
1421     function AllocateDPB: IDPB;
1422 tony 56 function OpenDatabase(DatabaseName: AnsiString; DPB: IDPB; RaiseExceptionOnConnectError: boolean=true): IAttachment;
1423     function CreateDatabase(DatabaseName: AnsiString; DPB: IDPB; RaiseExceptionOnError: boolean=true): IAttachment; overload;
1424     function CreateDatabase(sql: AnsiString; aSQLDialect: integer; RaiseExceptionOnError: boolean=true): IAttachment; overload;
1425 tony 45
1426     {Start Transaction against multiple databases}
1427     function AllocateTPB: ITPB;
1428     function StartTransaction(Attachments: array of IAttachment;
1429 tony 363 TPB: array of byte; DefaultCompletion: TTransactionCompletion=taCommit;
1430     aName: AnsiString=''): ITransaction; overload;
1431 tony 45 function StartTransaction(Attachments: array of IAttachment;
1432 tony 363 TPB: ITPB; DefaultCompletion: TTransactionCompletion=taCommit;
1433     aName: AnsiString=''): ITransaction; overload;
1434 tony 45
1435     {Service Manager}
1436     function HasServiceAPI: boolean;
1437     function AllocateSPB: ISPB;
1438 tony 143 function GetServiceManager(ServerName: AnsiString; Protocol: TProtocol; SPB: ISPB): IServiceManager; overload;
1439     function GetServiceManager(ServerName: AnsiString; Port: AnsiString; Protocol: TProtocol; SPB: ISPB): IServiceManager; overload;
1440 tony 45
1441     {Information}
1442     function GetStatus: IStatus;
1443     function HasRollbackRetaining: boolean;
1444     function IsEmbeddedServer: boolean;
1445 tony 56 function GetImplementationVersion: AnsiString;
1446 tony 308 function GetClientMajor: integer;
1447     function GetClientMinor: integer;
1448 tony 315 function HasDecFloatSupport: boolean;
1449     function HasLocalTZDB: boolean;
1450     function HasTimeZoneSupport: boolean;
1451     function HasExtendedTZSupport: boolean;
1452 tony 45
1453     {Firebird 3 API}
1454     function HasMasterIntf: boolean;
1455 tony 315 function GetIMaster: TObject; deprecated 'Use FirebirdAPI.QueryInterface and FBClientLib.pas IFBIMasterProvider instead';
1456 tony 263 function GetFBLibrary: IFirebirdLibrary;
1457 tony 45 end;
1458    
1459     type
1460     TOnGetLibraryName = procedure(var libname: string);
1461    
1462     const
1463     OnGetLibraryName: TOnGetLibraryName = nil;
1464     AllowUseOfFBLIB: boolean = false;
1465    
1466     type
1467     { EIBError }
1468    
1469     EIBError = class(EDatabaseError)
1470     private
1471     FSQLCode: Long;
1472     public
1473 tony 56 constructor Create(ASQLCode: Long; Msg: AnsiString);
1474 tony 45 property SQLCode: Long read FSQLCode;
1475     end;
1476    
1477     { EIBInterBaseError - Firebird Engine errors}
1478    
1479     EIBInterBaseError = class(EIBError)
1480     private
1481     FIBErrorCode: Long;
1482 tony 371 FStatus: IStatus;
1483 tony 45 public
1484 tony 371 constructor Create(aStatus: IStatus); overload;
1485 tony 56 constructor Create(ASQLCode: Long; AIBErrorCode: Long; Msg: AnsiString); overload;
1486 tony 45 property IBErrorCode: Long read FIBErrorCode;
1487 tony 371 property Status: IStatus read FStatus;
1488 tony 45 end;
1489    
1490     {IB Client Exceptions}
1491     EIBClientError = class(EIBError);
1492    
1493 tony 345 {Used to explicitly report a Batch Buffer overflow}
1494     EIBBatchBufferOverflow = class(EIBError);
1495    
1496 tony 45 {The Firebird API function is used to access the IFirebirdAPI interface.
1497    
1498     It will load the Firebird Client Library if this is not already loaded and
1499     select an implementation of the Firebird API (legacy 2.5 or 3.0.
1500     }
1501    
1502     function FirebirdAPI: IFirebirdAPI;
1503    
1504     {IBX support functions. Probably best ignored i.e. always used the FirebirdAPI
1505 tony 315 function to load the library and check if it's loaded.}
1506 tony 45
1507     function TryIBLoad: Boolean;
1508     procedure CheckIBLoaded;
1509    
1510 tony 263 {If you want to explicitly load the Firebird library from a
1511     non-default location then use this function and its GetFirebirdAPI function
1512     to get the API.}
1513    
1514     function LoadFBLibrary(aLibPathName: string): IFirebirdLibrary;
1515    
1516 tony 371 {$if not declared(Null)} {Needed for Delphi}
1517 tony 363 function Null: Variant; // Null standard constant
1518     {$define NEEDNULLFUNCTION}
1519     {$ifend}
1520 tony 315
1521 tony 45 implementation
1522    
1523 tony 363 uses FBClientAPI {$if not declared(NULL)}, Variants {$ifend}
1524 tony 45 {$IFDEF USELEGACYFIREBIRDAPI}, FB25ClientAPI {$ENDIF}
1525     {$IFDEF USEFIREBIRD3API}, FB30ClientAPI {$ENDIF};
1526    
1527 tony 263 var FDefaultFBLibrary: IFirebirdLibrary;
1528 tony 45
1529 tony 263 type
1530    
1531     { TFBLibrary }
1532    
1533     TFBLibraryImpl = class(TFBLibrary)
1534     protected
1535     function GetFirebird3API: IFirebirdAPI; override;
1536     function GetLegacyFirebirdAPI: IFirebirdAPI; override;
1537     end;
1538    
1539     function TFBLibraryImpl.GetFirebird3API: IFirebirdAPI;
1540     begin
1541     {$IFDEF USEFIREBIRD3API}
1542     Result := TFB30ClientAPI.Create(self);
1543     {$ELSE}
1544     Result := nil;
1545     {$ENDIF}
1546     end;
1547    
1548     function TFBLibraryImpl.GetLegacyFirebirdAPI: IFirebirdAPI;
1549     begin
1550     {$IFDEF USELEGACYFIREBIRDAPI}
1551     Result := TFB25ClientAPI.Create(self);
1552     {$ELSE}
1553     Result := nil;
1554     {$ENDIF}
1555     end;
1556    
1557 tony 45 function FirebirdAPI: IFirebirdAPI;
1558     begin
1559 tony 263 if FDefaultFBLibrary = nil then
1560 tony 45 CheckIBLoaded;
1561 tony 263 Result := FDefaultFBLibrary.GetFirebirdAPI;
1562 tony 45 end;
1563    
1564     function TryIBLoad: Boolean;
1565 tony 263 var fblib: IFirebirdLibrary;
1566 tony 45 begin
1567 tony 263 Result := FDefaultFBLibrary <> nil;
1568 tony 45 try
1569     if not Result then
1570     begin
1571 tony 263 fblib := TFBLibraryImpl.Create;
1572     if (fblib <> nil) and (fblib.GetFirebirdAPI <> nil) then
1573     FDefaultFBLibrary := fblib;
1574     Result := FDefaultFBLibrary <> nil;
1575 tony 45 end;
1576     except
1577     SysUtils.showexception(ExceptObject,ExceptAddr);
1578     Result := false;
1579     end;
1580     end;
1581    
1582     procedure CheckIBLoaded;
1583     begin
1584     if not TryIBLoad then
1585     IBError(ibxeInterBaseMissing, [nil]);
1586     end;
1587    
1588 tony 263 function LoadFBLibrary(aLibPathName: string): IFirebirdLibrary;
1589     var fblib: IFirebirdLibrary;
1590     begin
1591     if trim(aLibPathName) = '' then
1592     begin
1593     CheckIBLoaded;
1594     Result := FDefaultFBLibrary;
1595     end
1596     else
1597     begin
1598     fblib := TFBLibraryImpl.GetFBLibrary(aLibPathName);
1599     if (fblib = nil) or (fblib.GetFirebirdAPI = nil) then
1600     IBError(ibxeInterBaseMissing, [nil]);
1601     Result := fblib;
1602     end;
1603     end;
1604    
1605 tony 45 { EIBError }
1606    
1607 tony 56 constructor EIBError.Create(ASQLCode: Long; Msg: AnsiString);
1608 tony 45 begin
1609     inherited Create(Msg);
1610     FSQLCode := ASQLCode;
1611     end;
1612    
1613     { EIBInterBaseError }
1614    
1615 tony 371 constructor EIBInterBaseError.Create(aStatus: IStatus);
1616 tony 45 begin
1617 tony 371 inherited Create(aStatus.Getsqlcode,aStatus.GetMessage);
1618     FIBErrorCode := aStatus.GetIBErrorCode;
1619 tony 386 FStatus := aStatus.Clone;
1620 tony 45 end;
1621    
1622     constructor EIBInterBaseError.Create(ASQLCode: Long; AIBErrorCode: Long;
1623 tony 56 Msg: AnsiString);
1624 tony 45 begin
1625     inherited Create(ASQLCode,Msg);
1626     FIBErrorCode := AIBErrorCode;
1627     end;
1628    
1629 tony 363 {$ifdef NEEDNULLFUNCTION}
1630     function Null: Variant; // Null standard constant
1631     begin
1632     VarClearProc(TVarData(Result));
1633     TVarData(Result).VType := varnull;
1634     end;
1635     {$endif}
1636 tony 45
1637     initialization
1638 tony 263 FDefaultFBLibrary := nil;
1639 tony 45
1640 tony 209 finalization
1641 tony 263 FDefaultFBLibrary := nil;
1642 tony 45
1643     end.
1644    

Properties

Name Value
svn:eol-style native