ViewVC Help
View File | Revision Log | Show Annotations | Download File | View Changeset | Root Listing
root/public/ibx/branches/udr/client/IB.pas
Revision: 391
Committed: Thu Jan 27 16:34:24 2022 UTC (2 years, 9 months ago) by tony
Content type: text/x-pascal
File size: 69310 byte(s)
Log Message:
Fix issues with a select procedure returning an empty dataset

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 390 function InErrorState: boolean;
326 tony 345 function GetIBErrorCode: TStatusCode;
327     function Getsqlcode: TStatusCode;
328 tony 56 function GetMessage: AnsiString;
329 tony 45 function CheckStatusVector(ErrorCodes: array of TFBStatusCode): Boolean;
330     function GetIBDataBaseErrorMessages: TIBDataBaseErrorMessages;
331 tony 386 function Clone: IStatus;
332 tony 45 procedure SetIBDataBaseErrorMessages(Value: TIBDataBaseErrorMessages);
333     end;
334    
335     { The array metadata interface provides access to the metadata used to describe
336     an array column in a Firebird table.
337     }
338    
339     TArrayBound = record
340     UpperBound: short;
341     LowerBound: short;
342     end;
343     TArrayBounds = array of TArrayBound;
344    
345     IArrayMetaData = interface
346 tony 56 ['{7dd0aea4-59af-4c2a-b958-565d5025c489}']
347 tony 45 function GetSQLType: cardinal;
348 tony 56 function GetSQLTypeName: AnsiString;
349 tony 45 function GetScale: integer;
350     function GetSize: cardinal;
351 tony 309 function GetCharSetWidth: integer;
352 tony 45 function GetCharSetID: cardinal;
353 tony 56 function GetTableName: AnsiString;
354     function GetColumnName: AnsiString;
355 tony 45 function GetDimensions: integer;
356     function GetBounds: TArrayBounds;
357     end;
358    
359     {The array interface provides access to and modification of the array data
360     contained in an array field of a Firebird Table. The array element is
361     selected by specifying its co-ordinates using an integer array. The
362     getter and setter methods used should be appropriate for the type of data
363     contained in the array. Automatic conversion is provided to and from strings.
364     That is GetAsString and SetAsString are safe to use for sql types other than
365     boolean.
366    
367     The interface is returned by a GetAsArray getter method (see ISQLData). A new array
368     can be obtained from the IAttachment interface. The SetAsArray setter method
369     (See ISQLParam) is used to apply an updated or new array to the database using
370     an UPDATE or INSERT statement.
371    
372     }
373    
374     TArrayEventReason = (arChanging,arChanged);
375     IArray = interface;
376     TArrayEventHandler = procedure(Sender: IArray; Reason: TArrayEventReason) of object;
377    
378     IArray = interface(IArrayMetaData)
379 tony 56 ['{631c6bb1-fb49-44fb-a64a-c49859632b88}']
380 tony 45 function GetArrayID: TISC_QUAD;
381     procedure Clear;
382     function IsEmpty: boolean;
383     procedure PreLoad;
384     procedure CancelChanges;
385     procedure SaveChanges;
386     function GetAsInteger(index: array of integer): integer;
387     function GetAsBoolean(index: array of integer): boolean;
388     function GetAsCurrency(index: array of integer): Currency;
389     function GetAsInt64(index: array of integer): Int64;
390 tony 315 function GetAsDateTime(index: array of integer): TDateTime; overload;
391     procedure GetAsDateTime(index: array of integer; var aDateTime: TDateTime; var dstOffset: smallint; var aTimezoneID: TFBTimeZoneID); overload;
392     procedure GetAsDateTime(index: array of integer; var aDateTime: TDateTime; var dstOffset: smallint; var aTimezone: AnsiString); overload;
393     procedure GetAsTime(index: array of integer; var aTime: TDateTime; var dstOffset: smallint; var aTimezoneID: TFBTimeZoneID; OnDate: TDateTime); overload;
394     procedure GetAsTime(index: array of integer; var aTime: TDateTime; var dstOffset: smallint; var aTimezone: AnsiString; OnDate: TDateTime); overload;
395     function GetAsUTCDateTime(index: array of integer): TDateTime;
396 tony 45 function GetAsDouble(index: array of integer): Double;
397     function GetAsFloat(index: array of integer): Float;
398     function GetAsLong(index: array of integer): Long;
399     function GetAsShort(index: array of integer): Short;
400 tony 56 function GetAsString(index: array of integer): AnsiString;
401 tony 45 function GetAsVariant(index: array of integer): Variant;
402 tony 315 function GetAsBCD(index: array of integer): tBCD;
403 tony 45 procedure SetAsInteger(index: array of integer; AValue: integer);
404     procedure SetAsBoolean(index: array of integer; AValue: boolean);
405     procedure SetAsCurrency(index: array of integer; Value: Currency);
406     procedure SetAsInt64(index: array of integer; Value: Int64);
407     procedure SetAsDate(index: array of integer; Value: TDateTime);
408 tony 315 procedure SetAsDateTime(index: array of integer; Value: TDateTime); overload;
409     procedure SetAsDateTime(index: array of integer; aValue: TDateTime; aTimeZoneID: TFBTimeZoneID); overload;
410     procedure SetAsDateTime(index: array of integer; aValue: TDateTime; aTimeZone: AnsiString); overload;
411     procedure SetAsTime(index: array of integer; Value: TDateTime); overload;
412     procedure SetAsTime(index: array of integer; aValue: TDateTime; OnDate: TDateTime; aTimeZoneID: TFBTimeZoneID); overload;
413     procedure SetAsTime(index: array of integer; aValue: TDateTime; OnDate: TDateTime; aTimeZone: AnsiString); overload;
414     procedure SetAsUTCDateTime(index: array of integer; aUTCTime: TDateTime);
415 tony 45 procedure SetAsLong(index: array of integer; Value: Long);
416     procedure SetAsDouble(index: array of integer; Value: Double);
417     procedure SetAsFloat(index: array of integer; Value: Float);
418     procedure SetAsShort(index: array of integer; Value: Short);
419 tony 56 procedure SetAsString(index: array of integer; Value: AnsiString);
420 tony 45 procedure SetAsVariant(index: array of integer; Value: Variant);
421 tony 315 procedure SetAsBcd(index: array of integer; aValue: tBCD);
422 tony 45 procedure SetBounds(dim, UpperBound, LowerBound: integer);
423     function GetAttachment: IAttachment;
424     function GetTransaction: ITransaction;
425     procedure AddEventHandler(Handler: TArrayEventHandler);
426     procedure RemoveEventHandler(Handler: TArrayEventHandler);
427     end;
428    
429     { The Blob metadata interface provides access to the metadata used to describe
430     a blob column in a Firebird table.
431     }
432    
433     IBlobMetaData = interface
434 tony 56 ['{575f3c61-bb33-46a5-8975-bb7d1b6e37cc}']
435 tony 45 function GetSubType: integer;
436     function GetCharSetID: cardinal;
437     function GetCodePage: TSystemCodePage;
438     function GetSegmentSize: cardinal;
439 tony 56 function GetRelationName: AnsiString;
440     function GetColumnName: AnsiString;
441 tony 45 end;
442    
443     {The Blob Parameter block is used to select a Blob Filter}
444    
445 tony 56 IBPBItem = interface (IParameterBlockItem)
446     ['{660822a5-3114-4c16-b6cb-c1a7b2aba70d}']
447     end;
448 tony 45
449 tony 87 IBPB = interface (IParameterBlock<IBPBItem>)
450 tony 56 ['{e0cb9eb5-17f7-4416-b7d1-3cddd1dfca76}']
451     end;
452 tony 45
453     { The Blob Interface provides access to a blob data item.
454    
455     The interface is returned by a GetAsBlob getter method (see ISQLData). A new Blob
456     can be obtained from the IAttachment interface. The SetAsBlob setter method
457     (See ISQLParam) is used to apply an updated or new array to the database using
458     an UPDATE or INSERT statement.
459     }
460    
461     TFBBlobMode = (fbmRead,fbmWrite);
462     TBlobType = (btSegmented,btStream);
463    
464     IBlob = interface(IBlobMetaData)
465 tony 56 ['{3090a145-7780-442b-b15b-efd4568b8611}']
466 tony 45 function GetBPB: IBPB;
467     procedure Cancel;
468     procedure Close;
469     function GetBlobID: TISC_QUAD;
470     function GetBlobMode: TFBBlobMode;
471     function GetBlobSize: Int64;
472     procedure GetInfo(var NumSegments: Int64; var MaxSegmentSize,
473     TotalSize: Int64; var BlobType: TBlobType);
474     function Read(var Buffer; Count: Longint): Longint;
475     function Write(const Buffer; Count: Longint): Longint;
476 tony 56 function LoadFromFile(Filename: AnsiString): IBlob;
477 tony 45 function LoadFromStream(S: TStream) : IBlob;
478 tony 56 function SaveToFile(Filename: AnsiString): IBlob;
479 tony 45 function SaveToStream(S: TStream): IBlob;
480     function GetAsString: rawbytestring;
481     procedure SetAsString(aValue: rawbytestring);
482     function SetString(aValue: rawbytestring): IBlob;
483     function GetAttachment: IAttachment;
484     function GetTransaction: ITransaction;
485     property AsString: rawbytestring read GetAsString write SetAsString;
486     end;
487    
488     { The IColumnMetaData interface provides access to the per column metadata for
489     the output of an SQL Statement.
490     }
491    
492 tony 270 TIBDateTimeFormats = (dfTimestamp, {SQL TIMESTAMP}
493     dfDateTime, {SQL DATETIME}
494 tony 315 dfTime, {SQL TIME}
495     dfTimestampTZ, {SQL_TIMESTAMP_TZ}
496     dfTimeTZ); {SQLTIME_TZ
497 tony 270
498 tony 45 { IColumnMetaData }
499    
500     IColumnMetaData = interface
501 tony 56 ['{c222e6c3-53c1-469f-9e05-0a5c3ef232d8}']
502 tony 45 function GetIndex: integer;
503     function GetSQLType: cardinal;
504 tony 56 function GetSQLTypeName: AnsiString;
505 tony 45 function getSubtype: integer;
506 tony 56 function getRelationName: AnsiString;
507     function getOwnerName: AnsiString;
508     function getSQLName: AnsiString; {Name of the column}
509     function getAliasName: AnsiString; {Alias Name of column or Column Name if no alias}
510     function getName: AnsiString; {Disambiguated uppercase Field Name}
511 tony 45 function getScale: integer;
512     function getCharSetID: cardinal;
513     function getCodePage: TSystemCodePage;
514 tony 310 function GetCharSetWidth: integer;
515 tony 45 function getIsNullable: boolean;
516     function GetSize: cardinal;
517     function GetArrayMetaData: IArrayMetaData; {Valid only for Array SQL Type}
518     function GetBlobMetaData: IBlobMetaData; {Valid only for Blob SQL Type}
519 tony 270 function GetDateTimeStrLength(DateTimeFormat: TIBDateTimeFormats): integer;
520 tony 291 function GetStatement: IStatement;
521     function GetTransaction: ITransaction;
522 tony 371 function GetAttachment: IAttachment;
523 tony 56 property Name: AnsiString read GetName;
524 tony 45 property Size: cardinal read GetSize;
525     property SQLType: cardinal read GetSQLType;
526     property Scale: integer read getScale;
527     property SQLSubtype: integer read getSubtype;
528     property IsNullable: Boolean read GetIsNullable;
529     end;
530    
531     {
532     The IMetaData interface provides access to the set of column metadata
533     for the output of an SQL Statement
534     }
535    
536     { IMetaData }
537    
538     IMetaData = interface
539 tony 56 ['{4dafdbb6-0d36-4f1f-9c95-8b132804b965}']
540 tony 45 function getCount: integer;
541     function getColumnMetaData(index: integer): IColumnMetaData;
542 tony 56 function GetUniqueRelationName: AnsiString; {Non empty if all columns come from the same table}
543     function ByName(Idx: AnsiString): IColumnMetaData;
544 tony 45 property ColMetaData[index: integer]: IColumnMetaData read getColumnMetaData; default;
545     property Count: integer read getCount;
546     end;
547    
548     {
549     The ISQLData interface provides access to the data returned in a field in the
550     current row returned from a query or the result of an SQL Execute statement.
551    
552     It subclasses IColumnMetaData and so also provides access to the metadata
553     associated with the column.
554    
555     The getter and setter methods, and the corresponding properties, provide typed
556     access to the field data. The method/property used should be consistent
557     with the SQL Type. Automatic conversion is provided from strings.
558     That is GetAsString is safe to use for sql types other than boolean.
559     }
560    
561    
562     ISQLData = interface(IColumnMetaData)
563 tony 56 ['{3f493e31-7e3f-4606-a07c-b210b9e3619d}']
564 tony 291 function GetStrDataLength: short;
565 tony 45 function GetAsBoolean: boolean;
566     function GetAsCurrency: Currency;
567     function GetAsInt64: Int64;
568 tony 315 function GetAsDateTime: TDateTime; overload;
569     procedure GetAsDateTime(var aDateTime: TDateTime; var dstOffset: smallint; var aTimezoneID: TFBTimeZoneID); overload;
570     procedure GetAsDateTime(var aDateTime: TDateTime; var dstOffset: smallint; var aTimezone: AnsiString); overload;
571     procedure GetAsTime(var aTime: TDateTime; var dstOffset: smallint; var aTimezoneID: TFBTimeZoneID; OnDate: TDateTime); overload;
572     procedure GetAsTime(var aTime: TDateTime; var dstOffset: smallint; var aTimezone: AnsiString; OnDate: TDateTime); overload;
573     procedure GetAsTime(var aTime: TDateTime; var dstOffset: smallint; var aTimezoneID: TFBTimeZoneID); overload;
574     procedure GetAsTime(var aTime: TDateTime; var dstOffset: smallint; var aTimezone: AnsiString); overload;
575     function GetAsUTCDateTime: TDateTime;
576 tony 45 function GetAsDouble: Double;
577     function GetAsFloat: Float;
578     function GetAsLong: Long;
579     function GetAsPointer: Pointer;
580     function GetAsQuad: TISC_QUAD;
581     function GetAsShort: short;
582 tony 56 function GetAsString: AnsiString;
583 tony 45 function GetIsNull: Boolean;
584     function GetAsVariant: Variant;
585     function GetAsBlob: IBlob; overload;
586     function GetAsBlob(BPB: IBPB): IBlob; overload;
587     function GetAsArray: IArray;
588 tony 315 function GetAsBCD: tBCD;
589 tony 371 function GetAsNumeric: IFBNumeric;
590 tony 45 property AsDate: TDateTime read GetAsDateTime;
591     property AsBoolean:boolean read GetAsBoolean;
592     property AsTime: TDateTime read GetAsDateTime;
593     property AsDateTime: TDateTime read GetAsDateTime ;
594     property AsDouble: Double read GetAsDouble;
595     property AsFloat: Float read GetAsFloat;
596     property AsCurrency: Currency read GetAsCurrency;
597     property AsInt64: Int64 read GetAsInt64 ;
598     property AsInteger: Integer read GetAsLong;
599     property AsLong: Long read GetAsLong;
600     property AsPointer: Pointer read GetAsPointer;
601     property AsQuad: TISC_QUAD read GetAsQuad;
602     property AsShort: short read GetAsShort;
603 tony 56 property AsString: AnsiString read GetAsString;
604 tony 45 property AsVariant: Variant read GetAsVariant ;
605     property AsBlob: IBlob read GetAsBlob;
606     property AsArray: IArray read GetAsArray;
607 tony 315 property AsBCD: tBCD read GetAsBCD;
608 tony 371 property AsNumeric: IFBNumeric read GetAsNumeric;
609 tony 45 property IsNull: Boolean read GetIsNull;
610     property Value: Variant read GetAsVariant;
611     end;
612    
613     { An IResults interface is returned as the result of an SQL Execute statement
614     and provides access to the fields returned, if any. It is a collection of
615     ISQLData interfaces which are, in turn, used to access the data returned by
616     each field of the result set.
617     }
618    
619     IResults = interface
620 tony 56 ['{e836b2bb-93d1-4bbf-a8eb-7ce535de3bb5}']
621 tony 45 function getCount: integer;
622 tony 291 function GetStatement: IStatement;
623 tony 45 function GetTransaction: ITransaction;
624 tony 371 function GetAttachment: IAttachment;
625 tony 391 function FieldExists(Idx: AnsiString): boolean;
626 tony 56 function ByName(Idx: AnsiString): ISQLData;
627 tony 45 function getSQLData(index: integer): ISQLData;
628 tony 56 procedure GetData(index: integer; var IsNull:boolean; var len: short; var data: PByte);
629 tony 45 procedure SetRetainInterfaces(aValue: boolean);
630     property Data[index: integer]: ISQLData read getSQLData; default;
631     property Count: integer read getCount;
632     end;
633    
634     { An IResultSet interface is returned as the result of an SQL Open Cursor statement
635     (e.g. Select Statement) and provides access to the fields returned, if any
636     for the current row. It is a collection of ISQLData interfaces which are,
637     in turn, used to access the data returned by each field of the current row.
638     }
639     IResultSet = interface(IResults)
640 tony 56 ['{0ae4979b-7857-4e8c-8918-ec6f155b51a0}']
641 tony 350 function FetchNext: boolean; {fetch next record}
642     function FetchPrior: boolean; {fetch previous record}
643     function FetchFirst:boolean; {fetch first record}
644     function FetchLast: boolean; {fetch last record}
645     function FetchAbsolute(position: Integer): boolean; {fetch record by its absolute position in result set}
646     function FetchRelative(offset: Integer): boolean; {fetch record by position relative to current}
647 tony 56 function GetCursorName: AnsiString;
648 tony 350 function IsBof: boolean;
649 tony 45 function IsEof: boolean;
650     procedure Close;
651     end;
652    
653     {The ISQLParam interface is used to provide access to each parameter in a
654 tony 349 parametised SQL Statement. The interface comprises the Setter Methods and properties used to
655 tony 45 set the value of each parameter.
656    
657     Automatic conversion is provided to and from strings. That is GetAsString and
658     SetAsString are safe to use for sql types other than boolean - provided automatic
659     conversion is possible.
660 tony 349
661     ISQLParam is subclassed from the IParamMetaData interface. This interface provides
662     access to the parameter metadata. This metadata is mutable and can change after
663     a parameter is set to a given value. This is acceptable as long as the parameter
664     metadata is type compatible with the underlying column metadata and hence the
665     parameter value can be converted by Firebird into a value acceptable by the
666     underlying column. The column metadata, which is unmutable, can be obtained
667     by the ISQLParam.getColMetadata interface. When a statement is prepared, the
668     parameter metadata is always initialised to the column metadata.
669 tony 45 }
670    
671 tony 349 IParamMetaData = interface
672     ['{4e148c4e-2d48-4991-a263-f66eca05c6aa}']
673 tony 45 function GetSQLType: cardinal;
674 tony 56 function GetSQLTypeName: AnsiString;
675 tony 45 function getSubtype: integer;
676     function getScale: integer;
677     function getCharSetID: cardinal;
678     function getCodePage: TSystemCodePage;
679     function getIsNullable: boolean;
680     function GetSize: cardinal;
681 tony 349 property SQLType: cardinal read GetSQLType;
682     end;
683    
684     ISQLParam = interface(IParamMetaData)
685     ['{b22b4578-6d41-4807-a9a9-d2ec8d1d5a14}']
686     function getColMetadata: IParamMetaData;
687 tony 371 function GetStatement: IStatement;
688     function GetTransaction: ITransaction;
689     function GetAttachment: IAttachment;
690 tony 349 function GetIndex: integer;
691     function getName: AnsiString;
692 tony 45 function GetAsBoolean: boolean;
693     function GetAsCurrency: Currency;
694     function GetAsInt64: Int64;
695 tony 315 function GetAsDateTime: TDateTime; overload;
696     procedure GetAsDateTime(var aDateTime: TDateTime; var dstOffset: smallint; var aTimezoneID: TFBTimeZoneID); overload;
697     procedure GetAsDateTime(var aDateTime: TDateTime; var dstOffset: smallint; var aTimezone: AnsiString); overload;
698     procedure GetAsTime(var aTime: TDateTime; var dstOffset: smallint; var aTimezoneID: TFBTimeZoneID; OnDate: TDateTime); overload;
699     procedure GetAsTime(var aTime: TDateTime; var dstOffset: smallint; var aTimezone: AnsiString; OnDate: TDateTime); overload;
700     procedure GetAsTime(var aTime: TDateTime; var dstOffset: smallint; var aTimezoneID: TFBTimeZoneID); overload;
701     procedure GetAsTime(var aTime: TDateTime; var dstOffset: smallint; var aTimezone: AnsiString); overload;
702     function GetAsUTCDateTime: TDateTime;
703 tony 45 function GetAsDouble: Double;
704     function GetAsFloat: Float;
705     function GetAsLong: Long;
706     function GetAsPointer: Pointer;
707     function GetAsQuad: TISC_QUAD;
708     function GetAsShort: short;
709 tony 56 function GetAsString: AnsiString;
710 tony 45 function GetIsNull: boolean;
711     function GetAsVariant: Variant;
712     function GetAsBlob: IBlob;
713     function GetAsArray: IArray;
714 tony 315 function GetAsBCD: tBCD;
715 tony 371 function GetAsNumeric: IFBNumeric;
716 tony 45 procedure Clear;
717     function GetModified: boolean;
718     procedure SetAsBoolean(AValue: boolean);
719     procedure SetAsCurrency(aValue: Currency);
720     procedure SetAsInt64(aValue: Int64);
721     procedure SetAsDate(aValue: TDateTime);
722     procedure SetAsLong(aValue: Long);
723 tony 315 procedure SetAsTime(aValue: TDateTime); overload;
724     procedure SetAsTime(aValue: TDateTime; OnDate: TDateTime; aTimeZoneID: TFBTimeZoneID); overload;
725     procedure SetAsTime(aValue: TDateTime; OnDate: TDateTime; aTimeZone: AnsiString); overload;
726     procedure SetAsTime(aValue: TDateTime; aTimeZoneID: TFBTimeZoneID); overload;
727     procedure SetAsTime(aValue: TDateTime; aTimeZone: AnsiString); overload;
728     procedure SetAsDateTime(aValue: TDateTime); overload;
729     procedure SetAsDateTime(aValue: TDateTime; aTimeZoneID: TFBTimeZoneID); overload;
730     procedure SetAsDateTime(aValue: TDateTime; aTimeZone: AnsiString); overload;
731     procedure SetAsUTCDateTime(aUTCTime: TDateTime);
732 tony 45 procedure SetAsDouble(aValue: Double);
733     procedure SetAsFloat(aValue: Float);
734     procedure SetAsPointer(aValue: Pointer);
735     procedure SetAsShort(aValue: Short);
736 tony 56 procedure SetAsString(aValue: AnsiString);
737 tony 45 procedure SetAsVariant(aValue: Variant);
738     procedure SetIsNull(aValue: Boolean);
739     procedure SetAsBlob(aValue: IBlob);
740     procedure SetAsArray(anArray: IArray);
741     procedure SetAsQuad(aValue: TISC_QUAD);
742     procedure SetCharSetID(aValue: cardinal);
743 tony 315 procedure SetAsBcd(aValue: tBCD);
744 tony 371 procedure SetAsNumeric(Value: IFBNumeric);
745 tony 45 property AsDate: TDateTime read GetAsDateTime write SetAsDate;
746     property AsBoolean:boolean read GetAsBoolean write SetAsBoolean;
747     property AsTime: TDateTime read GetAsDateTime write SetAsTime;
748     property AsDateTime: TDateTime read GetAsDateTime write SetAsDateTime;
749     property AsDouble: Double read GetAsDouble write SetAsDouble;
750     property AsFloat: Float read GetAsFloat write SetAsFloat;
751     property AsCurrency: Currency read GetAsCurrency write SetAsCurrency;
752     property AsInt64: Int64 read GetAsInt64 write SetAsInt64;
753     property AsInteger: Integer read GetAsLong write SetAsLong;
754     property AsLong: Long read GetAsLong write SetAsLong;
755     property AsPointer: Pointer read GetAsPointer write SetAsPointer;
756     property AsShort: Short read GetAsShort write SetAsShort;
757 tony 56 property AsString: AnsiString read GetAsString write SetAsString;
758 tony 45 property AsVariant: Variant read GetAsVariant write SetAsVariant;
759     property AsBlob: IBlob read GetAsBlob write SetAsBlob;
760     property AsArray: IArray read GetAsArray write SetAsArray;
761 tony 315 property AsBCD: tBCD read GetAsBCD write SetAsBCD;
762 tony 371 property AsNumeric: IFBNumeric read GetAsNumeric write SetAsNumeric;
763 tony 45 property AsQuad: TISC_QUAD read GetAsQuad write SetAsQuad;
764     property Value: Variant read GetAsVariant write SetAsVariant;
765     property IsNull: Boolean read GetIsNull write SetIsNull;
766     property IsNullable: Boolean read GetIsNullable;
767     property Modified: Boolean read getModified;
768 tony 56 property Name: AnsiString read GetName;
769 tony 45 end;
770    
771     {
772     The ISQLParams interface provides access to the collection of parameters used
773     for the input to an SQL Statement
774     }
775    
776 tony 391 { ISQLParams }
777    
778 tony 45 ISQLParams = interface
779 tony 56 ['{c6d95ac7-b2b7-461b-b890-afef0acbb077}']
780 tony 45 function getCount: integer;
781     function getSQLParam(index: integer): ISQLParam;
782 tony 391 function ParamExists(Idx: AnsiString): boolean;
783 tony 56 function ByName(Idx: AnsiString): ISQLParam ;
784 tony 45 function GetModified: Boolean;
785 tony 287 function GetHasCaseSensitiveParams: Boolean;
786 tony 371 function GetStatement: IStatement;
787     function GetTransaction: ITransaction;
788     function GetAttachment: IAttachment;
789     procedure Clear;
790 tony 45 property Modified: Boolean read GetModified;
791     property Params[index: integer]: ISQLParam read getSQLParam; default;
792     property Count: integer read getCount;
793     end;
794    
795 tony 47
796     TPerfStats = (psCurrentMemory, psMaxMemory,
797     psRealTime, psUserTime, psBuffers,
798     psReads, psWrites, psFetches,psDeltaMemory);
799    
800 tony 209 TPerfCounters = array[TPerfStats] of Int64;
801 tony 47
802 tony 345 {Batch Query Execution Support}
803    
804     TBatchCompletionState = (bcExecuteFailed, bcSuccessNoInfo, bcNoMoreErrors);
805    
806     IBatchCompletion = interface
807     ['{9bc3d49d-16d9-4606-94e5-ee987103ad92}']
808     function getTotalProcessed: cardinal;
809     function getState(updateNo: cardinal): TBatchCompletionState;
810     function getStatusMessage(updateNo: cardinal): AnsiString;
811     function getUpdated: integer;
812     function getErrorStatus(var RowNo: integer; var status: IStatus): boolean;
813     end;
814    
815 tony 45 {The IStatement interface provides access to an SQL Statement once it has been
816     initially prepared. The interface is returned from the IAttachment interface.
817     }
818    
819 tony 359 TStatementFlag = (stHasCursor,stRepeatExecute,stScrollable);
820     TStatementFlags = set of TStatementFlag;
821    
822 tony 45 IStatement = interface
823 tony 56 ['{a260576d-a07d-4a66-b02d-1b72543fd7cf}']
824 tony 45 function GetMetaData: IMetaData; {Output Metadata}
825     function GetSQLParams: ISQLParams;{Statement Parameters}
826 tony 56 function GetPlan: AnsiString;
827 tony 45 function GetRowsAffected(var SelectCount, InsertCount, UpdateCount, DeleteCount: integer): boolean;
828     function GetSQLStatementType: TIBSQLStatementTypes;
829 tony 345 function GetSQLStatementTypeName: AnsiString;
830 tony 56 function GetSQLText: AnsiString;
831 tony 263 function GetProcessedSQLText: AnsiString;
832 tony 45 function GetSQLDialect: integer;
833 tony 359 function GetFlags: TStatementFlags;
834 tony 45 function IsPrepared: boolean;
835 tony 345 function HasBatchMode: boolean;
836     function IsInBatchMode: boolean;
837 tony 350 procedure Prepare(aTransaction: ITransaction=nil); overload;
838     procedure Prepare(CursorName: AnsiString; aTransaction: ITransaction=nil); overload;
839 tony 45 function Execute(aTransaction: ITransaction=nil): IResults;
840 tony 350 function OpenCursor(aTransaction: ITransaction=nil): IResultSet; overload;
841     function OpenCursor(Scrollable: boolean; aTransaction: ITransaction=nil): IResultSet; overload;
842 tony 45 function GetAttachment: IAttachment;
843     function GetTransaction: ITransaction;
844     procedure SetRetainInterfaces(aValue: boolean);
845 tony 47 procedure EnableStatistics(aValue: boolean);
846     function GetPerfStatistics(var stats: TPerfCounters): boolean;
847 tony 345 {IBatch interface support}
848     procedure AddToBatch;
849     function ExecuteBatch(aTransaction: ITransaction=nil): IBatchCompletion;
850     procedure CancelBatch;
851     function GetBatchCompletion: IBatchCompletion;
852     function GetBatchRowLimit: integer;
853     procedure SetBatchRowLimit(aLimit: integer);
854 tony 347 {Stale Reference Check}
855     procedure SetStaleReferenceChecks(Enable:boolean); {default true}
856     function GetStaleReferenceChecks: boolean;
857 tony 345
858 tony 45 property MetaData: IMetaData read GetMetaData;
859     property SQLParams: ISQLParams read GetSQLParams;
860     property SQLStatementType: TIBSQLStatementTypes read GetSQLStatementType;
861     end;
862    
863 tony 359 ITrInfoItem = interface
864     ['{41455e1a-f84e-4e26-aff0-1a78e8b69cfe}']
865     function getItemType: byte;
866     function getSize: integer;
867     function getAsString: AnsiString;
868     function getAsInteger: int64;
869     procedure DecodeTraIsolation(var IsolationType, RecVersion: byte);
870     end;
871    
872     { ITrInformation }
873    
874     ITrInformation = interface
875     ['{e6ea4a52-c1a1-44ba-9609-c8bcc7cba7b2}']
876     function GetCount: integer;
877     function GetItem(index: integer): ITrInfoItem;
878     function Find(ItemType: byte): ITrInfoItem;
879     procedure PrintBuf; {can be used to print buffer in hex for debugging}
880     property Count: integer read GetCount;
881     property Items[index: integer]: ITrInfoItem read getItem; default;
882     end;
883    
884 tony 45 {Transaction Parameter Block: (TPB)
885    
886     The TPB provides the parameters used when starting a transaction. It is allocated
887     empty by the FirebirdAPI and the parameters are then added to it. Each individual
888     parameter may be accessed by the ITPBItem interface which can be used to set the
889     value, if any, of the parameter.
890    
891     The TPB parameters, and the associated symbolic codes and parameter values may be
892     found in the Interbase 6.0 API Guide.
893     }
894    
895 tony 315 ITPBItem = interface(IParameterBlockItemWithTypeName)
896 tony 56 ['{544c1f2b-7c12-4a87-a4a5-face7ea72671}']
897     end;
898 tony 45
899 tony 315 ITPB = interface(IParameterBlockWithTypeNames<ITPBItem>)
900 tony 56 ['{7369b0ff-defe-437b-81fe-19b211d42d25}']
901 tony 363 function AsText: AnsiString;
902 tony 56 end;
903 tony 45
904     {The ITransactionAction interface provides access to a Transaction once it
905     has been initially started. After a Commit or Rollback, a transaction
906     may be restarted, optinally with a new TPB.
907    
908     A multi-database transaction is started from the FirebirdAPI. A single database
909     transaction is started from the IAttachment interface.
910     }
911    
912     TTransactionAction = (TARollback, TACommit, TACommitRetaining, TARollbackRetaining);
913     TTransactionCompletion = TARollback.. TACommit;
914 tony 387 TTrCompletionState = (trCommitted, trRolledback, trCommitFailed, trRollbackFailed);
915 tony 45
916 tony 387
917 tony 45 ITransaction = interface
918 tony 56 ['{30928d0e-a9d7-4c61-b7cf-14f4f38abe2a}']
919 tony 45 function getTPB: ITPB;
920     procedure Start(DefaultCompletion: TTransactionCompletion=taCommit);
921     function GetInTransaction: boolean;
922 tony 359 function GetIsReadOnly: boolean;
923     function GetTransactionID: integer;
924 tony 363 function GetJournalingActive(attachment: IAttachment): boolean;
925     function GetDefaultCompletion: TTransactionCompletion;
926 tony 45 procedure PrepareForCommit; {Two phase commit - stage 1}
927 tony 387 function Commit(Force: boolean=false): TTrCompletionState;
928 tony 45 procedure CommitRetaining;
929     function HasActivity: boolean;
930 tony 387 function Rollback(Force: boolean=false): TTrCompletionState;
931 tony 45 procedure RollbackRetaining;
932     function GetAttachmentCount: integer;
933     function GetAttachment(index: integer): IAttachment;
934 tony 359 function GetTrInformation(Requests: array of byte): ITrInformation; overload;
935     function GetTrInformation(Request: byte): ITrInformation; overload;
936 tony 363 function GetTransactionName: AnsiString;
937     procedure SetTransactionName(aValue: AnsiString);
938 tony 45 property InTransaction: boolean read GetInTransaction;
939 tony 363 property TransactionName: AnsiString read GetTransactionName write SetTransactionName;
940 tony 45 end;
941    
942     { The IEvents Interface is used to handle events from a single database. The
943     interface is allocated from the IAttachment Interface.
944    
945     Note that the EventHandler called when an event occurs following AsynWaitForEvent
946     is called in a different thread to the calling program and TThread.Synchronize
947     may be needed to pass the event back to the main thread.
948    
949     Neither AsyncWaitForEvent nor WaitForEvent is intended to be thread safe
950     in a multi-threaded environment and should always be called from the main
951     thread.
952     }
953    
954     TEventInfo = record
955 tony 56 EventName: AnsiString;
956 tony 45 Count: integer;
957     end;
958    
959     TEventCounts = array of TEventInfo;
960     IEvents = interface;
961     TEventHandler = procedure(Sender: IEvents) of object;
962    
963     { IEvents }
964    
965     IEvents = interface
966 tony 56 ['{6a0be233-ed08-4524-889c-2e45d0c20e5f}']
967 tony 45 procedure GetEvents(EventNames: TStrings);
968     procedure SetEvents(EventNames: TStrings); overload;
969 tony 381 procedure SetEvents(EventName: string); overload;
970 tony 45 procedure Cancel;
971     function ExtractEventCounts: TEventCounts;
972     procedure WaitForEvent;
973     procedure AsyncWaitForEvent(EventHandler: TEventHandler);
974     function GetAttachment: IAttachment;
975     end;
976    
977 tony 315 TTZTextOptions = (tzOffset, {Time Zone Rendered as an offset to GMT}
978     tzGMT, {No Time Zone. Time part is always rendered in GMT}
979     tzOriginalID); {Time Zone shown as originally entered}
980    
981     {The ITimeZoneServices interface provides access to the time zone database
982     used for the attachment. It may be used in support of TIMESTAMP WITH TIME ZONE
983     and TIME WITH TIME ZONE data types.}
984    
985     ITimeZoneServices = interface
986     ['{163821f5-ebef-42b9-ac60-8ac4b5c09954}']
987     {utility functions}
988     function TimeZoneID2TimeZoneName(aTimeZoneID: TFBTimeZoneID): AnsiString;
989     function TimeZoneName2TimeZoneID(aTimeZone: AnsiString): TFBTimeZoneID;
990     function LocalTimeToGMT(aLocalTime: TDateTime; aTimeZone: AnsiString): TDateTime; overload;
991     function LocalTimeToGMT(aLocalTime: TDateTime; aTimeZoneID: TFBTimeZoneID): TDateTime; overload;
992     function GMTToLocalTime(aGMTTime: TDateTime; aTimeZone: AnsiString): TDateTime; overload;
993     function GMTToLocalTime(aGMTTime: TDateTime; aTimeZoneID: TFBTimeZoneID): TDateTime; overload;
994     function GetEffectiveOffsetMins(aLocalTime: TDateTime; aTimeZone: AnsiString): integer; overload;
995     function GetEffectiveOffsetMins(aLocalTime: TDateTime; aTimeZoneID: TFBTimeZoneID): integer; overload;
996    
997     {Time Zone DB Information}
998     function UsingRemoteTZDB: boolean;
999     procedure SetUseLocalTZDB(useLocalTZDB: boolean);
1000     function GetLocalTimeZoneName: AnsiString;
1001     function GetLocalTimeZoneID: TFBTimeZoneID;
1002     procedure GetTimeZoneInfo(aTimeZone: AnsiString; OnDate: TDateTime;
1003     var ZoneOffset, DSTOffset, EffectiveOffset: integer);
1004     {Configurable Options}
1005     function GetTimeTZDate: TDateTime;
1006     procedure SetTimeTZDate(aDate: TDateTime);
1007     function GetTZTextOption: TTZTextOptions;
1008     procedure SetTZTextOption(aOptionValue: TTZTextOptions);
1009     end;
1010    
1011 tony 45 {The IDBInformation Interface.
1012    
1013     An IDBInformation interface is returned by the IAttachment GetDBInformation
1014     method. The interface provides access to the information requested and
1015     returned by the method.
1016    
1017     IDBInformation itself gives access to a collection of IDBInfoItems. Each one
1018     provides information requested, as indicated by the ItemType and the actual
1019     value of the information. In some cases, the returned item is itself a
1020     colletion of IDBInfoItems.
1021    
1022     The IDBInformation items, and the associated symbolic codes and parameter values may be
1023     found in the Interbase 6.0 API Guide.
1024     }
1025    
1026     TDBOperationCount = record
1027     TableID: UShort;
1028     Count: cardinal;
1029     end;
1030    
1031     TDBOperationCounts = array of TDBOperationCount;
1032    
1033     IDBInfoItem = interface
1034 tony 56 ['{eeb97b51-ec0f-473f-9f75-c1721f055fcb}']
1035 tony 45 function getItemType: byte;
1036     function getSize: integer;
1037     procedure getRawBytes(var Buffer);
1038 tony 56 function getAsString: AnsiString;
1039 tony 345 function getAsInteger: int64;
1040 tony 56 procedure DecodeIDCluster(var ConnectionType: integer; var DBFileName, DBSiteName: AnsiString);
1041 tony 45 function getAsBytes: TByteArray;
1042 tony 143 function getAsDateTime: TDateTime;
1043 tony 56 procedure DecodeVersionString(var Version: byte; var VersionString: AnsiString);
1044 tony 45 function getOperationCounts: TDBOperationCounts;
1045     procedure DecodeUserNames(UserNames: TStrings);
1046    
1047     {user names only}
1048     function GetCount: integer;
1049     function GetItem(index: integer): IDBInfoItem;
1050     function Find(ItemType: byte): IDBInfoItem;
1051 tony 345 property AsInteger: int64 read getAsInteger;
1052 tony 56 property AsString: AnsiString read GetAsString;
1053 tony 45 property Count: integer read GetCount;
1054     property Items[index: integer]: IDBInfoItem read getItem; default;
1055     end;
1056    
1057     { IDBInformation }
1058    
1059     IDBInformation = interface
1060 tony 56 ['{7ac6777f-f0a9-498a-9f5c-4a57a554df81}']
1061 tony 45 function GetCount: integer;
1062     function GetItem(index: integer): IDBInfoItem;
1063     function Find(ItemType: byte): IDBInfoItem;
1064     procedure PrintBuf; {can be used to print buffer in hex for debugging}
1065     property Count: integer read GetCount;
1066     property Items[index: integer]: IDBInfoItem read getItem; default;
1067     end;
1068    
1069 tony 143 {The Database Information Request Block is used to pass requests for
1070     database information where at least one item requested has a parameter.
1071     At present, this is only fb_info_page_contents which has a single
1072     integer parameter.}
1073    
1074     IDIRBItem = interface(IParameterBlockItem)
1075     ['{d34a7511-8435-4a24-81a7-5103d218d234}']
1076     end;
1077    
1078     IDIRB = interface(IParameterBlock<IDIRBItem>)
1079     ['{1010e5ac-0a8f-403b-a302-91625e9d9579}']
1080     end;
1081    
1082    
1083 tony 45 {The Database Parameter Block (DPB).
1084    
1085     The DPB provides the parameters used when connecting to a database. It is allocated
1086     empty by the FirebirdAPI and the parameters are then added to it. Each individual
1087     parameter may be accessed by the IDPBItem interface which can be used to set the
1088     value, if any, of the parameter.
1089    
1090     The DPB parameters, and the associated symbolic codes and parameter values may be
1091     found in the Interbase 6.0 API Guide.
1092     }
1093    
1094 tony 315 IDPBItem = interface(IParameterBlockItemWithTypeName)
1095 tony 56 ['{123d4ad0-087a-4cd1-a344-1b3d03b30673}']
1096     end;
1097 tony 45
1098 tony 315 IDPB = interface(IParameterBlockWithTypeNames<IDPBItem>)
1099     ['{e676067b-1cf4-4eba-9256-9724f57e0d16}']
1100     end;
1101 tony 45
1102 tony 363 {Journaling options. Default is [joReadWriteTransactions,joModifyQueries] }
1103    
1104     TJournalOption = (joReadOnlyTransactions, joReadWriteTransactions,
1105 tony 371 joModifyQueries, joReadOnlyQueries,joNoServerTable);
1106 tony 363
1107     TJournalOptions = set of TJournalOption;
1108    
1109 tony 45 {The IAttachment interface provides access to a Database Connection. It may be
1110     used to:
1111    
1112     a. Disconnect and reconnect to the database.
1113    
1114     b. Start a Transaction on the database
1115    
1116     c. Execute directly SQL DDL Statements and others that return no information.
1117    
1118     d. OpenCursors (i.e. execute SQL Select statements and return the results)
1119    
1120     e. Prepare SQL Statements, returning an IStatement interface for further processing.
1121    
1122     f. Provide access to an SQL Event Handler.
1123    
1124     g. Access Database Information.
1125    
1126     h. Support the handling of Array and Blob data.
1127    
1128     Note that SQL statements can be prepared with named parameters (PSQL style).
1129     This then allows the parameters to be accessed by name. The same name can
1130     be used for more than one parameter, allowing a single operation to be used
1131     to set all parameters with the same name.
1132     }
1133    
1134     { IAttachment }
1135    
1136     IAttachment = interface
1137 tony 56 ['{466e9b67-9def-4807-b3e7-e08a35e7185c}']
1138 tony 263 function getFirebirdAPI: IFirebirdAPI;
1139 tony 45 function getDPB: IDPB;
1140     function AllocateBPB: IBPB;
1141 tony 143 function AllocateDIRB: IDIRB;
1142 tony 45 procedure Connect;
1143     procedure Disconnect(Force: boolean=false);
1144     function IsConnected: boolean;
1145     procedure DropDatabase;
1146 tony 363 function StartTransaction(TPB: array of byte;
1147     DefaultCompletion: TTransactionCompletion=taCommit;
1148     aName: AnsiString=''): ITransaction; overload;
1149     function StartTransaction(TPB: ITPB;
1150     DefaultCompletion: TTransactionCompletion=taCommit;
1151     aName: AnsiString=''): ITransaction; overload;
1152 tony 56 procedure ExecImmediate(transaction: ITransaction; sql: AnsiString; SQLDialect: integer); overload;
1153     procedure ExecImmediate(TPB: array of byte; sql: AnsiString; SQLDialect: integer); overload;
1154     procedure ExecImmediate(transaction: ITransaction; sql: AnsiString); overload;
1155     procedure ExecImmediate(TPB: array of byte; sql: AnsiString); overload;
1156     function ExecuteSQL(TPB: array of byte; sql: AnsiString; SQLDialect: integer; params: array of const): IResults; overload;
1157     function ExecuteSQL(transaction: ITransaction; sql: AnsiString; SQLDialect: integer; params: array of const): IResults; overload;
1158     function ExecuteSQL(TPB: array of byte; sql: AnsiString; params: array of const): IResults; overload;
1159     function ExecuteSQL(transaction: ITransaction; sql: AnsiString; params: array of const): IResults; overload;
1160     function OpenCursor(transaction: ITransaction; sql: AnsiString; aSQLDialect: integer;
1161 tony 350 Scrollable: boolean=false): IResultSet; overload;
1162     function OpenCursor(transaction: ITransaction; sql: AnsiString; aSQLDialect: integer;
1163 tony 45 params: array of const): IResultSet; overload;
1164 tony 350 function OpenCursor(transaction: ITransaction; sql: AnsiString; Scrollable: boolean=false): IResultSet; overload;
1165     function OpenCursor(transaction: ITransaction; sql: AnsiString; Scrollable: boolean;
1166     params: array of const): IResultSet; overload;
1167 tony 56 function OpenCursor(transaction: ITransaction; sql: AnsiString;
1168 tony 45 params: array of const): IResultSet; overload;
1169 tony 350 function OpenCursor(transaction: ITransaction; sql: AnsiString; aSQLDialect: integer; Scrollable: boolean;
1170     params: array of const): IResultSet; overload;
1171 tony 56 function OpenCursorAtStart(transaction: ITransaction; sql: AnsiString; aSQLDialect: integer;
1172 tony 350 Scrollable: boolean=false): IResultSet; overload;
1173     function OpenCursorAtStart(transaction: ITransaction; sql: AnsiString; aSQLDialect: integer;
1174 tony 45 params: array of const): IResultSet; overload;
1175 tony 350 function OpenCursorAtStart(transaction: ITransaction; sql: AnsiString; aSQLDialect: integer; Scrollable: boolean;
1176     params: array of const): IResultSet; overload;
1177     function OpenCursorAtStart(transaction: ITransaction; sql: AnsiString; Scrollable: boolean=false): IResultSet; overload;
1178 tony 56 function OpenCursorAtStart(transaction: ITransaction; sql: AnsiString;
1179 tony 45 params: array of const): IResultSet; overload;
1180 tony 350 function OpenCursorAtStart(transaction: ITransaction; sql: AnsiString; Scrollable: boolean;
1181     params: array of const): IResultSet; overload;
1182     function OpenCursorAtStart(sql: AnsiString; Scrollable: boolean=false): IResultSet; overload;
1183     function OpenCursorAtStart(sql: AnsiString; Scrollable: boolean;
1184     params: array of const): IResultSet; overload;
1185 tony 56 function OpenCursorAtStart(sql: AnsiString;
1186 tony 45 params: array of const): IResultSet; overload;
1187 tony 350 function Prepare(transaction: ITransaction; sql: AnsiString; aSQLDialect: integer; CursorName: AnsiString=''): IStatement; overload;
1188     function Prepare(transaction: ITransaction; sql: AnsiString; CursorName: AnsiString=''): IStatement; overload;
1189 tony 56 function PrepareWithNamedParameters(transaction: ITransaction; sql: AnsiString;
1190 tony 270 aSQLDialect: integer; GenerateParamNames: boolean=false;
1191 tony 350 CaseSensitiveParams: boolean = false; CursorName: AnsiString=''): IStatement; overload;
1192 tony 56 function PrepareWithNamedParameters(transaction: ITransaction; sql: AnsiString;
1193 tony 270 GenerateParamNames: boolean=false;
1194 tony 350 CaseSensitiveParams: boolean = false; CursorName: AnsiString=''): IStatement; overload;
1195 tony 45
1196     {Events}
1197     function GetEventHandler(Events: TStrings): IEvents; overload;
1198 tony 56 function GetEventHandler(Event: AnsiString): IEvents; overload;
1199 tony 45
1200     {Blob - may use to open existing Blobs. However, ISQLData.AsBlob is preferred}
1201    
1202 tony 56 function CreateBlob(transaction: ITransaction; RelationName, ColumnName: AnsiString; BPB: IBPB=nil): IBlob; overload;
1203 tony 45 function CreateBlob(transaction: ITransaction; BlobMetaData: IBlobMetaData; BPB: IBPB=nil): IBlob; overload;
1204     function CreateBlob(transaction: ITransaction; SubType: integer; CharSetID: cardinal=0; BPB: IBPB=nil): IBlob; overload;
1205 tony 291 function OpenBlob(transaction: ITransaction; RelationName, ColumnName: AnsiString; BlobID: TISC_QUAD; BPB: IBPB=nil): IBlob; overload;
1206     function OpenBlob(transaction: ITransaction; BlobMetaData: IBlobMetaData; BlobID: TISC_QUAD; BPB: IBPB=nil): IBlob; overload;
1207 tony 345 function GetInlineBlobLimit: integer;
1208     procedure SetInlineBlobLimit(limit: integer);
1209 tony 45
1210     {Array - may use to open existing arrays. However, ISQLData.AsArray is preferred}
1211    
1212 tony 291 function OpenArray(transaction: ITransaction; RelationName, ColumnName: AnsiString; ArrayID: TISC_QUAD): IArray; overload;
1213     function OpenArray(transaction: ITransaction; ArrayMetaData: IArrayMetaData; ArrayID: TISC_QUAD): IArray; overload;
1214 tony 56 function CreateArray(transaction: ITransaction; RelationName, ColumnName: AnsiString): IArray; overload;
1215 tony 45 function CreateArray(transaction: ITransaction; ArrayMetaData: IArrayMetaData): IArray; overload;
1216 tony 56 function CreateArrayMetaData(SQLType: cardinal; tableName: AnsiString; columnName: AnsiString;
1217 tony 47 Scale: integer; size: cardinal; charSetID: cardinal; dimensions: cardinal;
1218     bounds: TArrayBounds): IArrayMetaData;
1219 tony 45
1220     {Database Information}
1221     function GetSQLDialect: integer;
1222 tony 363 function GetAttachmentID: integer;
1223 tony 56 function GetBlobMetaData(Transaction: ITransaction; tableName, columnName: AnsiString): IBlobMetaData;
1224     function GetArrayMetaData(Transaction: ITransaction; tableName, columnName: AnsiString): IArrayMetaData;
1225 tony 45 function GetDBInformation(Requests: array of byte): IDBInformation; overload;
1226     function GetDBInformation(Request: byte): IDBInformation; overload;
1227 tony 143 function GetDBInformation(Requests: IDIRB): IDBInformation; overload;
1228 tony 117 function GetConnectString: AnsiString;
1229     function GetRemoteProtocol: AnsiString;
1230 tony 143 function GetAuthenticationMethod: AnsiString;
1231 tony 209 function GetSecurityDatabase: AnsiString;
1232 tony 117 function GetODSMajorVersion: integer;
1233     function GetODSMinorVersion: integer;
1234 tony 266 procedure getFBVersion(version: TStrings);
1235 tony 45 function HasActivity: boolean;
1236 tony 315 function HasDecFloatSupport: boolean;
1237 tony 345 function HasBatchMode: boolean;
1238 tony 352 function HasScollableCursors: boolean;
1239 tony 371 function HasTable(aTableName: AnsiString): boolean; {case sensitive}
1240     function HasFunction(aFunctionName: AnsiString): boolean; {case sensitive}
1241     function HasProcedure(aProcName: AnsiString): boolean; {case sensitive}
1242 tony 60
1243     {Character Sets}
1244 tony 371 function GetCharSetID: integer; {connection character set}
1245 tony 109 function HasDefaultCharSet: boolean;
1246     function GetDefaultCharSetID: integer;
1247 tony 60 function GetCharsetName(CharSetID: integer): AnsiString;
1248     function CharSetID2CodePage(CharSetID: integer; var CodePage: TSystemCodePage): boolean;
1249     function CodePage2CharSetID(CodePage: TSystemCodePage; var CharSetID: integer): boolean;
1250     function CharSetName2CharSetID(CharSetName: AnsiString; var CharSetID: integer): boolean;
1251     function CharSetWidth(CharSetID: integer; var Width: integer): boolean;
1252     procedure RegisterCharSet(CharSetName: AnsiString; CodePage: TSystemCodePage;
1253     AllowReverseLookup:boolean; out CharSetID: integer);
1254 tony 45
1255 tony 315 {Time Zone Database}
1256     function GetTimeZoneServices: ITimeZoneServices;
1257     function HasTimeZoneSupport: boolean;
1258 tony 363
1259     {Client side Journaling}
1260     function JournalingActive: boolean;
1261     function GetJournalOptions: TJournalOptions;
1262     function StartJournaling(aJournalLogFile: AnsiString): integer; overload;
1263     function StartJournaling(aJournalLogFile: AnsiString; Options: TJournalOptions): integer; overload;
1264 tony 371 function StartJournaling(S: TStream; Options: TJournalOptions): integer; overload;
1265 tony 363 procedure StopJournaling(RetainJournal: boolean);
1266 tony 315 end;
1267    
1268 tony 231 TProtocolAll = (TCP, SPX, NamedPipe, Local, inet, inet4, inet6, wnet, xnet, unknownProtocol);
1269 tony 143 TProtocol = TCP..xnet;
1270 tony 45
1271     {Service Parameter Block (SPB).
1272    
1273     The SPB provides the parameters used when connecting to a Service Manager. It is
1274     allocated empty by the FirebirdAPI and the parameters are then added to it. Each
1275     individual parameter may be accessed by the ISPBItem interface which can be used
1276     to set the value, if any, of the parameter.
1277    
1278     The SPB parameters, and the associated symbolic codes and parameter values may be
1279     found in the Interbase 6.0 API Guide.
1280    
1281     }
1282    
1283 tony 315 ISPBItem = interface(IParameterBlockItemWithTypeName)
1284 tony 56 ['{5d08ae2b-4519-41bd-8b40-97cd451c3f6a}']
1285     end;
1286 tony 45
1287 tony 315 ISPB = interface(IParameterBlockWithTypeNames<ISPBItem>)
1288 tony 56 ['{2c5836fd-41ed-4426-9b7d-5af580ec2659}']
1289     end;
1290 tony 45
1291     {Service Query Parameter Block (SQPB).
1292    
1293     This is a specialised parameter block used to send data to a service manager
1294     in a Query Request.
1295     }
1296    
1297     ISQPBItem = interface(IParameterBlockItem)
1298 tony 56 ['{b07841a6-33b3-47f0-b5a2-028cbc86dc97}']
1299 tony 45 function CopyFrom(source: TStream; count: integer): integer;
1300     end;
1301    
1302 tony 56 ISQPB = interface(IParameterBlock<ISQPBItem>)
1303     ['{8553e66b-ee62-498b-8431-dff030211447}']
1304     end;
1305 tony 45
1306     {Service Request Block (SRB).
1307    
1308     The SRB specifies what is requested from the Service Manager when starting a
1309     service or querying a service. It is allocated empty by the ServiceManager API and
1310     the parameters are then added to it. Each individual parameter may be accessed
1311     by the ISRBItem interface which can be used to set the value, if any, of the parameter.
1312    
1313     The SRB parameters, and the associated symbolic codes and parameter values may be
1314     found in the Interbase 6.0 API Guide.
1315    
1316     }
1317    
1318 tony 56 ISRBItem = interface(IParameterBlockItem)
1319     ['{47ec790e-f265-4b30-9dcd-261e51677245}']
1320     end;
1321 tony 45
1322 tony 56 ISRB = interface(IParameterBlock<ISRBItem>)
1323     ['{9f2e204f-3c33-4e44-90f9-9135e95dafb9}']
1324     end;
1325 tony 45
1326     {The Service Query Results Interface.
1327    
1328     An IServiceQueryResults interface is returned by the IServiceManager Query
1329     method. The interface provides access to the information requested and
1330     returned by the method.
1331    
1332     IServiceQueryResults itself gives access to a collection of IServiceQueryResultItem.
1333     Each one provides information requested, as indicated by the ItemType and the actual
1334     value of the information. In some cases, the returned item is itself a
1335     collection of IServiceQueryResultSubItem.
1336    
1337     The IServiceQueryResultItem items, and the associated symbolic codes and parameter values may be
1338     found in the Interbase 6.0 API Guide.
1339     }
1340    
1341     IServiceQueryResultSubItem = interface
1342 tony 56 ['{8a4c381e-9923-4cc9-a96b-553729248640}']
1343 tony 45 function getItemType: byte;
1344     function getSize: integer;
1345     procedure getRawBytes(var Buffer);
1346 tony 56 function getAsString: AnsiString;
1347 tony 345 function getAsInteger: int64;
1348 tony 45 function getAsByte: byte;
1349     function CopyTo(stream: TStream; count: integer): integer;
1350 tony 56 property AsString: AnsiString read getAsString;
1351 tony 345 property AsInteger: int64 read getAsInteger;
1352 tony 45 property AsByte: byte read getAsByte;
1353     end;
1354    
1355     IServiceQueryResultItem = interface(IServiceQueryResultSubItem)
1356 tony 56 ['{b2806886-206c-4024-8df9-5fe0a7630a5e}']
1357 tony 45 function getCount: integer;
1358     function getItem(index: integer): IServiceQueryResultSubItem;
1359     function find(ItemType: byte): IServiceQueryResultSubItem;
1360     property Items[index: integer]: IServiceQueryResultSubItem read getItem; default;
1361     property Count: integer read getCount;
1362     end;
1363    
1364     IServiceQueryResults = interface
1365 tony 56 ['{8fbbef7d-fe03-4409-828a-a787d34ef531}']
1366 tony 45 function getCount: integer;
1367     function getItem(index: integer): IServiceQueryResultItem;
1368     function find(ItemType: byte): IServiceQueryResultItem;
1369     procedure PrintBuf; {can be used to print buffer in hex for debugging}
1370     property Items[index: integer]: IServiceQueryResultItem read getItem; default;
1371     property Count: integer read getCount;
1372     end;
1373    
1374 tony 263 IFirebirdLibrary = interface;
1375    
1376 tony 45 {The IServiceManager interface provides access to a service manager. It can
1377     used to Detach and re-attach to Service Manager, to start services and to
1378     query the service manager.
1379    
1380     The interface is returned by the FirebirdAPI GetService Manager method.
1381     }
1382    
1383     { IServiceManager }
1384    
1385     IServiceManager = interface
1386 tony 56 ['{905b587d-1e1f-4e40-a3f8-a3519f852e48}']
1387 tony 263 function getFirebirdAPI: IFirebirdAPI;
1388 tony 45 function getSPB: ISPB;
1389 tony 56 function getServerName: AnsiString;
1390 tony 209 function getProtocol: TProtocol;
1391     function getPortNo: AnsiString;
1392 tony 45 procedure Attach;
1393     procedure Detach(Force: boolean=false);
1394     function IsAttached: boolean;
1395     function AllocateSRB: ISRB;
1396     function AllocateSQPB: ISQPB;
1397 tony 209 function Start(Request: ISRB; RaiseExceptionOnError: boolean=true): boolean;
1398     function Query(SQPB: ISQPB; Request: ISRB; RaiseExceptionOnError: boolean=true) :IServiceQueryResults; overload;
1399     function Query(Request: ISRB; RaiseExceptionOnError: boolean=true) :IServiceQueryResults; overload;
1400 tony 45 end;
1401    
1402 tony 263 {Tbe Firebird Library API used to get information about the Firebird library}
1403    
1404    
1405     IFirebirdLibrary = interface
1406     ['{3c04e0a1-12e0-428a-b2e1-bc6fcd97b79b}']
1407     function GetHandle: TLibHandle;
1408     function GetLibraryName: string;
1409     function GetLibraryFilePath: string;
1410     function GetFirebirdAPI: IFirebirdAPI;
1411     end;
1412    
1413 tony 45 {The Firebird API.
1414    
1415     This is the base interface and is used to create/open a database connection, to
1416     start a transaction on multiple databases and the access the service manager.
1417    
1418     The interface is returned by the FirebirdAPI function.
1419     }
1420    
1421 tony 315 { IFirebirdAPI }
1422    
1423 tony 45 IFirebirdAPI = interface
1424 tony 56 ['{edeee691-c8d3-4dcf-a780-cd7e432821d5}']
1425 tony 45 {Database connections}
1426     function AllocateDPB: IDPB;
1427 tony 56 function OpenDatabase(DatabaseName: AnsiString; DPB: IDPB; RaiseExceptionOnConnectError: boolean=true): IAttachment;
1428     function CreateDatabase(DatabaseName: AnsiString; DPB: IDPB; RaiseExceptionOnError: boolean=true): IAttachment; overload;
1429     function CreateDatabase(sql: AnsiString; aSQLDialect: integer; RaiseExceptionOnError: boolean=true): IAttachment; overload;
1430 tony 45
1431     {Start Transaction against multiple databases}
1432     function AllocateTPB: ITPB;
1433     function StartTransaction(Attachments: array of IAttachment;
1434 tony 363 TPB: array of byte; DefaultCompletion: TTransactionCompletion=taCommit;
1435     aName: AnsiString=''): ITransaction; overload;
1436 tony 45 function StartTransaction(Attachments: array of IAttachment;
1437 tony 363 TPB: ITPB; DefaultCompletion: TTransactionCompletion=taCommit;
1438     aName: AnsiString=''): ITransaction; overload;
1439 tony 45
1440     {Service Manager}
1441     function HasServiceAPI: boolean;
1442     function AllocateSPB: ISPB;
1443 tony 143 function GetServiceManager(ServerName: AnsiString; Protocol: TProtocol; SPB: ISPB): IServiceManager; overload;
1444     function GetServiceManager(ServerName: AnsiString; Port: AnsiString; Protocol: TProtocol; SPB: ISPB): IServiceManager; overload;
1445 tony 45
1446     {Information}
1447     function GetStatus: IStatus;
1448     function HasRollbackRetaining: boolean;
1449     function IsEmbeddedServer: boolean;
1450 tony 56 function GetImplementationVersion: AnsiString;
1451 tony 308 function GetClientMajor: integer;
1452     function GetClientMinor: integer;
1453 tony 315 function HasDecFloatSupport: boolean;
1454     function HasLocalTZDB: boolean;
1455     function HasTimeZoneSupport: boolean;
1456     function HasExtendedTZSupport: boolean;
1457 tony 45
1458     {Firebird 3 API}
1459     function HasMasterIntf: boolean;
1460 tony 315 function GetIMaster: TObject; deprecated 'Use FirebirdAPI.QueryInterface and FBClientLib.pas IFBIMasterProvider instead';
1461 tony 263 function GetFBLibrary: IFirebirdLibrary;
1462 tony 45 end;
1463    
1464     type
1465     TOnGetLibraryName = procedure(var libname: string);
1466    
1467     const
1468     OnGetLibraryName: TOnGetLibraryName = nil;
1469     AllowUseOfFBLIB: boolean = false;
1470    
1471     type
1472     { EIBError }
1473    
1474     EIBError = class(EDatabaseError)
1475     private
1476     FSQLCode: Long;
1477     public
1478 tony 56 constructor Create(ASQLCode: Long; Msg: AnsiString);
1479 tony 45 property SQLCode: Long read FSQLCode;
1480     end;
1481    
1482     { EIBInterBaseError - Firebird Engine errors}
1483    
1484     EIBInterBaseError = class(EIBError)
1485     private
1486     FIBErrorCode: Long;
1487 tony 371 FStatus: IStatus;
1488 tony 45 public
1489 tony 371 constructor Create(aStatus: IStatus); overload;
1490 tony 56 constructor Create(ASQLCode: Long; AIBErrorCode: Long; Msg: AnsiString); overload;
1491 tony 45 property IBErrorCode: Long read FIBErrorCode;
1492 tony 371 property Status: IStatus read FStatus;
1493 tony 45 end;
1494    
1495     {IB Client Exceptions}
1496     EIBClientError = class(EIBError);
1497    
1498 tony 345 {Used to explicitly report a Batch Buffer overflow}
1499     EIBBatchBufferOverflow = class(EIBError);
1500    
1501 tony 45 {The Firebird API function is used to access the IFirebirdAPI interface.
1502    
1503     It will load the Firebird Client Library if this is not already loaded and
1504     select an implementation of the Firebird API (legacy 2.5 or 3.0.
1505     }
1506    
1507     function FirebirdAPI: IFirebirdAPI;
1508    
1509     {IBX support functions. Probably best ignored i.e. always used the FirebirdAPI
1510 tony 315 function to load the library and check if it's loaded.}
1511 tony 45
1512     function TryIBLoad: Boolean;
1513     procedure CheckIBLoaded;
1514    
1515 tony 263 {If you want to explicitly load the Firebird library from a
1516     non-default location then use this function and its GetFirebirdAPI function
1517     to get the API.}
1518    
1519     function LoadFBLibrary(aLibPathName: string): IFirebirdLibrary;
1520    
1521 tony 371 {$if not declared(Null)} {Needed for Delphi}
1522 tony 363 function Null: Variant; // Null standard constant
1523     {$define NEEDNULLFUNCTION}
1524     {$ifend}
1525 tony 315
1526 tony 45 implementation
1527    
1528 tony 363 uses FBClientAPI {$if not declared(NULL)}, Variants {$ifend}
1529 tony 45 {$IFDEF USELEGACYFIREBIRDAPI}, FB25ClientAPI {$ENDIF}
1530     {$IFDEF USEFIREBIRD3API}, FB30ClientAPI {$ENDIF};
1531    
1532 tony 263 var FDefaultFBLibrary: IFirebirdLibrary;
1533 tony 45
1534 tony 263 type
1535    
1536     { TFBLibrary }
1537    
1538     TFBLibraryImpl = class(TFBLibrary)
1539     protected
1540     function GetFirebird3API: IFirebirdAPI; override;
1541     function GetLegacyFirebirdAPI: IFirebirdAPI; override;
1542     end;
1543    
1544     function TFBLibraryImpl.GetFirebird3API: IFirebirdAPI;
1545     begin
1546     {$IFDEF USEFIREBIRD3API}
1547     Result := TFB30ClientAPI.Create(self);
1548     {$ELSE}
1549     Result := nil;
1550     {$ENDIF}
1551     end;
1552    
1553     function TFBLibraryImpl.GetLegacyFirebirdAPI: IFirebirdAPI;
1554     begin
1555     {$IFDEF USELEGACYFIREBIRDAPI}
1556     Result := TFB25ClientAPI.Create(self);
1557     {$ELSE}
1558     Result := nil;
1559     {$ENDIF}
1560     end;
1561    
1562 tony 45 function FirebirdAPI: IFirebirdAPI;
1563     begin
1564 tony 263 if FDefaultFBLibrary = nil then
1565 tony 45 CheckIBLoaded;
1566 tony 263 Result := FDefaultFBLibrary.GetFirebirdAPI;
1567 tony 45 end;
1568    
1569     function TryIBLoad: Boolean;
1570 tony 263 var fblib: IFirebirdLibrary;
1571 tony 45 begin
1572 tony 263 Result := FDefaultFBLibrary <> nil;
1573 tony 45 try
1574     if not Result then
1575     begin
1576 tony 263 fblib := TFBLibraryImpl.Create;
1577     if (fblib <> nil) and (fblib.GetFirebirdAPI <> nil) then
1578     FDefaultFBLibrary := fblib;
1579     Result := FDefaultFBLibrary <> nil;
1580 tony 45 end;
1581     except
1582     SysUtils.showexception(ExceptObject,ExceptAddr);
1583     Result := false;
1584     end;
1585     end;
1586    
1587     procedure CheckIBLoaded;
1588     begin
1589     if not TryIBLoad then
1590     IBError(ibxeInterBaseMissing, [nil]);
1591     end;
1592    
1593 tony 263 function LoadFBLibrary(aLibPathName: string): IFirebirdLibrary;
1594     var fblib: IFirebirdLibrary;
1595     begin
1596     if trim(aLibPathName) = '' then
1597     begin
1598     CheckIBLoaded;
1599     Result := FDefaultFBLibrary;
1600     end
1601     else
1602     begin
1603     fblib := TFBLibraryImpl.GetFBLibrary(aLibPathName);
1604     if (fblib = nil) or (fblib.GetFirebirdAPI = nil) then
1605     IBError(ibxeInterBaseMissing, [nil]);
1606     Result := fblib;
1607     end;
1608     end;
1609    
1610 tony 45 { EIBError }
1611    
1612 tony 56 constructor EIBError.Create(ASQLCode: Long; Msg: AnsiString);
1613 tony 45 begin
1614     inherited Create(Msg);
1615     FSQLCode := ASQLCode;
1616     end;
1617    
1618     { EIBInterBaseError }
1619    
1620 tony 371 constructor EIBInterBaseError.Create(aStatus: IStatus);
1621 tony 45 begin
1622 tony 371 inherited Create(aStatus.Getsqlcode,aStatus.GetMessage);
1623     FIBErrorCode := aStatus.GetIBErrorCode;
1624 tony 386 FStatus := aStatus.Clone;
1625 tony 45 end;
1626    
1627     constructor EIBInterBaseError.Create(ASQLCode: Long; AIBErrorCode: Long;
1628 tony 56 Msg: AnsiString);
1629 tony 45 begin
1630     inherited Create(ASQLCode,Msg);
1631     FIBErrorCode := AIBErrorCode;
1632     end;
1633    
1634 tony 363 {$ifdef NEEDNULLFUNCTION}
1635     function Null: Variant; // Null standard constant
1636     begin
1637     VarClearProc(TVarData(Result));
1638     TVarData(Result).VType := varnull;
1639     end;
1640     {$endif}
1641 tony 45
1642     initialization
1643 tony 263 FDefaultFBLibrary := nil;
1644 tony 45
1645 tony 209 finalization
1646 tony 263 FDefaultFBLibrary := nil;
1647 tony 45
1648     end.
1649    

Properties

Name Value
svn:eol-style native