ViewVC Help
View File | Revision Log | Show Annotations | Download File | View Changeset | Root Listing
root/public/ibx/branches/udr/client/IB.pas
Revision: 386
Committed: Tue Jan 18 12:05:35 2022 UTC (2 years, 10 months ago) by tony
Content type: text/x-pascal
File size: 69028 byte(s)
Log Message:
Silent exceptions bug fixed

File Contents

# Content
1 (*
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 {$IFDEF MSWINDOWS}
64 {$DEFINE WINDOWS}
65 {$ENDIF}
66
67 {$IFDEF FPC}
68 {$mode delphi}
69 {$codepage UTF8}
70 {$interfaces COM}
71 {$IF defined(FPC) and (FPC_FULLVERSION < 30000) }
72 {$ERROR FPC Version 3.0.0 or later is required}
73 {$IFEND}
74 {$ENDIF}
75
76 {$IFNDEF LEGACYFIREBIRDAPIONLY}
77 {$DEFINE USEFIREBIRD3API}
78 {$ENDIF}
79 {$IFNDEF FIREBIRD3APIONLY}
80 {$DEFINE USELEGACYFIREBIRDAPI}
81 {$ENDIF}
82
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 6. FPC and Delphi Support.
114
115 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 Classes,
130 {$IFDEF WINDOWS}Windows, {$ENDIF}
131 {$IFDEF FPC} Dynlibs, {$ENDIF}
132 SysUtils, DB, FBMessages, IBExternals, FmtBcd;
133
134 const
135 {Interface version information}
136 FBIntf_Major = 1;
137 FBIntf_Minor = 4;
138 FBIntf_Release = 0;
139 FBIntf_Version = '1.4.0';
140
141 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 {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 {$I 'include/consts_pub.inc'}
160 {$I 'include/dyn_consts.inc'}
161 {$I 'include/inf_pub.inc'}
162 {$I 'include/configkeys.inc'}
163 {$I 'include/blr.inc'}
164
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 SQL_TIMESTAMP_TZ_EX = 32748;
186 SQL_TIME_TZ_EX = 32750;
187 SQL_INT128 = 32752;
188 SQL_BOOLEAN = 32764;
189 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 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 {$IFNDEF FPC}
209 {Delphi missing definitions}
210 type
211 TLibHandle = THandle;
212
213 const
214 NilHandle = 0;
215 DirectorySeparator = '\';
216
217 {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 TIBSQLStatementTypes =
234 (SQLUnknown, SQLSelect, SQLInsert,
235 SQLUpdate, SQLDelete, SQLDDL,
236 SQLGetSegment, SQLPutSegment,
237 SQLExecProcedure, SQLStartTransaction,
238 SQLCommit, SQLRollback,
239 SQLSelectForUpdate, SQLSetGenerator,
240 SQLSavePoint);
241
242 TFBStatusCode = cardinal;
243 TByteArray = array of byte;
244 TFBTimeZoneID = ISC_USHORT;
245
246 IFirebirdAPI = interface;
247 IAttachment = interface;
248 ITransaction = interface;
249 IStatement = interface;
250
251 {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 function AdjustScaleTo(aNewScale: integer): IFBNumeric;
259 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 {The IParameterBlock interface provides the template for all parameter
269 block interfaces}
270
271 IParameterBlock<_IItem> = interface
272 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 IParameterBlockWithTypeNames<_IItem> = interface(IParameterBlock<_IItem>)
282 function AddByTypeName(ParamTypeName: AnsiString): _IItem;
283 function GetDPBParamTypeName(ParamType: byte): Ansistring; deprecated 'Use Get ParamTypeName';
284 function GetParamTypeName(ParamType: byte): Ansistring;
285 end;
286
287 {IParameterBlockItem is not used on its own but instead provides a base type for
288 different parameter block items }
289
290 IParameterBlockItem = interface
291 ['{53b23f7b-abda-46a5-9aa5-07bd5e723266}']
292 function getParamType: byte;
293 function getAsInteger: integer;
294 function getAsString: AnsiString;
295 function getAsByte: byte;
296 procedure setAsString(aValue: AnsiString);
297 procedure setAsByte(aValue: byte);
298 procedure SetAsInteger(aValue: integer);
299 property AsString: AnsiString read getAsString write setAsString;
300 property AsByte: byte read getAsByte write setAsByte;
301 property AsInteger: integer read getAsInteger write SetAsInteger;
302 end;
303
304 IParameterBlockItemWithTypeName = interface(IParameterBlockItem)
305 function getParamTypeName: AnsiString;
306 end;
307
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 TIBDataBaseErrorMessage = (ShowSQLCode,
316 ShowIBMessage,
317 ShowSQLMessage);
318
319 TIBDataBaseErrorMessages = set of TIBDataBaseErrorMessage;
320
321 TStatusCode = long;
322
323 IStatus = interface
324 ['{34167722-af38-4831-b08a-93162d58ede3}']
325 function GetIBErrorCode: TStatusCode;
326 function Getsqlcode: TStatusCode;
327 function GetMessage: AnsiString;
328 function CheckStatusVector(ErrorCodes: array of TFBStatusCode): Boolean;
329 function GetIBDataBaseErrorMessages: TIBDataBaseErrorMessages;
330 function Clone: IStatus;
331 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 ['{7dd0aea4-59af-4c2a-b958-565d5025c489}']
346 function GetSQLType: cardinal;
347 function GetSQLTypeName: AnsiString;
348 function GetScale: integer;
349 function GetSize: cardinal;
350 function GetCharSetWidth: integer;
351 function GetCharSetID: cardinal;
352 function GetTableName: AnsiString;
353 function GetColumnName: AnsiString;
354 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 ['{631c6bb1-fb49-44fb-a64a-c49859632b88}']
379 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 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 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 function GetAsString(index: array of integer): AnsiString;
400 function GetAsVariant(index: array of integer): Variant;
401 function GetAsBCD(index: array of integer): tBCD;
402 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 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 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 procedure SetAsString(index: array of integer; Value: AnsiString);
419 procedure SetAsVariant(index: array of integer; Value: Variant);
420 procedure SetAsBcd(index: array of integer; aValue: tBCD);
421 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 ['{575f3c61-bb33-46a5-8975-bb7d1b6e37cc}']
434 function GetSubType: integer;
435 function GetCharSetID: cardinal;
436 function GetCodePage: TSystemCodePage;
437 function GetSegmentSize: cardinal;
438 function GetRelationName: AnsiString;
439 function GetColumnName: AnsiString;
440 end;
441
442 {The Blob Parameter block is used to select a Blob Filter}
443
444 IBPBItem = interface (IParameterBlockItem)
445 ['{660822a5-3114-4c16-b6cb-c1a7b2aba70d}']
446 end;
447
448 IBPB = interface (IParameterBlock<IBPBItem>)
449 ['{e0cb9eb5-17f7-4416-b7d1-3cddd1dfca76}']
450 end;
451
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 ['{3090a145-7780-442b-b15b-efd4568b8611}']
465 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 function LoadFromFile(Filename: AnsiString): IBlob;
476 function LoadFromStream(S: TStream) : IBlob;
477 function SaveToFile(Filename: AnsiString): IBlob;
478 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 TIBDateTimeFormats = (dfTimestamp, {SQL TIMESTAMP}
492 dfDateTime, {SQL DATETIME}
493 dfTime, {SQL TIME}
494 dfTimestampTZ, {SQL_TIMESTAMP_TZ}
495 dfTimeTZ); {SQLTIME_TZ
496
497 { IColumnMetaData }
498
499 IColumnMetaData = interface
500 ['{c222e6c3-53c1-469f-9e05-0a5c3ef232d8}']
501 function GetIndex: integer;
502 function GetSQLType: cardinal;
503 function GetSQLTypeName: AnsiString;
504 function getSubtype: integer;
505 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 function getScale: integer;
511 function getCharSetID: cardinal;
512 function getCodePage: TSystemCodePage;
513 function GetCharSetWidth: integer;
514 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 function GetDateTimeStrLength(DateTimeFormat: TIBDateTimeFormats): integer;
519 function GetStatement: IStatement;
520 function GetTransaction: ITransaction;
521 function GetAttachment: IAttachment;
522 property Name: AnsiString read GetName;
523 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 ['{4dafdbb6-0d36-4f1f-9c95-8b132804b965}']
539 function getCount: integer;
540 function getColumnMetaData(index: integer): IColumnMetaData;
541 function GetUniqueRelationName: AnsiString; {Non empty if all columns come from the same table}
542 function ByName(Idx: AnsiString): IColumnMetaData;
543 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 ['{3f493e31-7e3f-4606-a07c-b210b9e3619d}']
563 function GetStrDataLength: short;
564 function GetAsBoolean: boolean;
565 function GetAsCurrency: Currency;
566 function GetAsInt64: Int64;
567 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 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 function GetAsString: AnsiString;
582 function GetIsNull: Boolean;
583 function GetAsVariant: Variant;
584 function GetAsBlob: IBlob; overload;
585 function GetAsBlob(BPB: IBPB): IBlob; overload;
586 function GetAsArray: IArray;
587 function GetAsBCD: tBCD;
588 function GetAsNumeric: IFBNumeric;
589 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 property AsString: AnsiString read GetAsString;
603 property AsVariant: Variant read GetAsVariant ;
604 property AsBlob: IBlob read GetAsBlob;
605 property AsArray: IArray read GetAsArray;
606 property AsBCD: tBCD read GetAsBCD;
607 property AsNumeric: IFBNumeric read GetAsNumeric;
608 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 ['{e836b2bb-93d1-4bbf-a8eb-7ce535de3bb5}']
620 function getCount: integer;
621 function GetStatement: IStatement;
622 function GetTransaction: ITransaction;
623 function GetAttachment: IAttachment;
624 function ByName(Idx: AnsiString): ISQLData;
625 function getSQLData(index: integer): ISQLData;
626 procedure GetData(index: integer; var IsNull:boolean; var len: short; var data: PByte);
627 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 ['{0ae4979b-7857-4e8c-8918-ec6f155b51a0}']
639 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 function GetCursorName: AnsiString;
646 function IsBof: boolean;
647 function IsEof: boolean;
648 procedure Close;
649 end;
650
651 {The ISQLParam interface is used to provide access to each parameter in a
652 parametised SQL Statement. The interface comprises the Setter Methods and properties used to
653 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
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 }
668
669 IParamMetaData = interface
670 ['{4e148c4e-2d48-4991-a263-f66eca05c6aa}']
671 function GetSQLType: cardinal;
672 function GetSQLTypeName: AnsiString;
673 function getSubtype: integer;
674 function getScale: integer;
675 function getCharSetID: cardinal;
676 function getCodePage: TSystemCodePage;
677 function getIsNullable: boolean;
678 function GetSize: cardinal;
679 property SQLType: cardinal read GetSQLType;
680 end;
681
682 ISQLParam = interface(IParamMetaData)
683 ['{b22b4578-6d41-4807-a9a9-d2ec8d1d5a14}']
684 function getColMetadata: IParamMetaData;
685 function GetStatement: IStatement;
686 function GetTransaction: ITransaction;
687 function GetAttachment: IAttachment;
688 function GetIndex: integer;
689 function getName: AnsiString;
690 function GetAsBoolean: boolean;
691 function GetAsCurrency: Currency;
692 function GetAsInt64: Int64;
693 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 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 function GetAsString: AnsiString;
708 function GetIsNull: boolean;
709 function GetAsVariant: Variant;
710 function GetAsBlob: IBlob;
711 function GetAsArray: IArray;
712 function GetAsBCD: tBCD;
713 function GetAsNumeric: IFBNumeric;
714 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 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 procedure SetAsDouble(aValue: Double);
731 procedure SetAsFloat(aValue: Float);
732 procedure SetAsPointer(aValue: Pointer);
733 procedure SetAsShort(aValue: Short);
734 procedure SetAsString(aValue: AnsiString);
735 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 procedure SetAsBcd(aValue: tBCD);
742 procedure SetAsNumeric(Value: IFBNumeric);
743 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 property AsString: AnsiString read GetAsString write SetAsString;
756 property AsVariant: Variant read GetAsVariant write SetAsVariant;
757 property AsBlob: IBlob read GetAsBlob write SetAsBlob;
758 property AsArray: IArray read GetAsArray write SetAsArray;
759 property AsBCD: tBCD read GetAsBCD write SetAsBCD;
760 property AsNumeric: IFBNumeric read GetAsNumeric write SetAsNumeric;
761 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 property Name: AnsiString read GetName;
767 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 ['{c6d95ac7-b2b7-461b-b890-afef0acbb077}']
776 function getCount: integer;
777 function getSQLParam(index: integer): ISQLParam;
778 function ByName(Idx: AnsiString): ISQLParam ;
779 function GetModified: Boolean;
780 function GetHasCaseSensitiveParams: Boolean;
781 function GetStatement: IStatement;
782 function GetTransaction: ITransaction;
783 function GetAttachment: IAttachment;
784 procedure Clear;
785 property Modified: Boolean read GetModified;
786 property Params[index: integer]: ISQLParam read getSQLParam; default;
787 property Count: integer read getCount;
788 end;
789
790
791 TPerfStats = (psCurrentMemory, psMaxMemory,
792 psRealTime, psUserTime, psBuffers,
793 psReads, psWrites, psFetches,psDeltaMemory);
794
795 TPerfCounters = array[TPerfStats] of Int64;
796
797 {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 {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 TStatementFlag = (stHasCursor,stRepeatExecute,stScrollable);
815 TStatementFlags = set of TStatementFlag;
816
817 IStatement = interface
818 ['{a260576d-a07d-4a66-b02d-1b72543fd7cf}']
819 function GetMetaData: IMetaData; {Output Metadata}
820 function GetSQLParams: ISQLParams;{Statement Parameters}
821 function GetPlan: AnsiString;
822 function GetRowsAffected(var SelectCount, InsertCount, UpdateCount, DeleteCount: integer): boolean;
823 function GetSQLStatementType: TIBSQLStatementTypes;
824 function GetSQLStatementTypeName: AnsiString;
825 function GetSQLText: AnsiString;
826 function GetProcessedSQLText: AnsiString;
827 function GetSQLDialect: integer;
828 function GetFlags: TStatementFlags;
829 function IsPrepared: boolean;
830 function HasBatchMode: boolean;
831 function IsInBatchMode: boolean;
832 procedure Prepare(aTransaction: ITransaction=nil); overload;
833 procedure Prepare(CursorName: AnsiString; aTransaction: ITransaction=nil); overload;
834 function Execute(aTransaction: ITransaction=nil): IResults;
835 function OpenCursor(aTransaction: ITransaction=nil): IResultSet; overload;
836 function OpenCursor(Scrollable: boolean; aTransaction: ITransaction=nil): IResultSet; overload;
837 function GetAttachment: IAttachment;
838 function GetTransaction: ITransaction;
839 procedure SetRetainInterfaces(aValue: boolean);
840 procedure EnableStatistics(aValue: boolean);
841 function GetPerfStatistics(var stats: TPerfCounters): boolean;
842 {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 {Stale Reference Check}
850 procedure SetStaleReferenceChecks(Enable:boolean); {default true}
851 function GetStaleReferenceChecks: boolean;
852
853 property MetaData: IMetaData read GetMetaData;
854 property SQLParams: ISQLParams read GetSQLParams;
855 property SQLStatementType: TIBSQLStatementTypes read GetSQLStatementType;
856 end;
857
858 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 {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 ITPBItem = interface(IParameterBlockItemWithTypeName)
891 ['{544c1f2b-7c12-4a87-a4a5-face7ea72671}']
892 end;
893
894 ITPB = interface(IParameterBlockWithTypeNames<ITPBItem>)
895 ['{7369b0ff-defe-437b-81fe-19b211d42d25}']
896 function AsText: AnsiString;
897 end;
898
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
910 ITransaction = interface
911 ['{30928d0e-a9d7-4c61-b7cf-14f4f38abe2a}']
912 function getTPB: ITPB;
913 procedure Start(DefaultCompletion: TTransactionCompletion=taCommit);
914 function GetInTransaction: boolean;
915 function GetIsReadOnly: boolean;
916 function GetTransactionID: integer;
917 function GetJournalingActive(attachment: IAttachment): boolean;
918 function GetDefaultCompletion: TTransactionCompletion;
919 procedure PrepareForCommit; {Two phase commit - stage 1}
920 procedure Commit(Force: boolean=false);
921 procedure CommitRetaining;
922 function HasActivity: boolean;
923 procedure Rollback(Force: boolean=false);
924 procedure RollbackRetaining;
925 function GetAttachmentCount: integer;
926 function GetAttachment(index: integer): IAttachment;
927 function GetTrInformation(Requests: array of byte): ITrInformation; overload;
928 function GetTrInformation(Request: byte): ITrInformation; overload;
929 function GetTransactionName: AnsiString;
930 procedure SetTransactionName(aValue: AnsiString);
931 property InTransaction: boolean read GetInTransaction;
932 property TransactionName: AnsiString read GetTransactionName write SetTransactionName;
933 end;
934
935 { The IEvents Interface is used to handle events from a single database. The
936 interface is allocated from the IAttachment Interface.
937
938 Note that the EventHandler called when an event occurs following AsynWaitForEvent
939 is called in a different thread to the calling program and TThread.Synchronize
940 may be needed to pass the event back to the main thread.
941
942 Neither AsyncWaitForEvent nor WaitForEvent is intended to be thread safe
943 in a multi-threaded environment and should always be called from the main
944 thread.
945 }
946
947 TEventInfo = record
948 EventName: AnsiString;
949 Count: integer;
950 end;
951
952 TEventCounts = array of TEventInfo;
953 IEvents = interface;
954 TEventHandler = procedure(Sender: IEvents) of object;
955
956 { IEvents }
957
958 IEvents = interface
959 ['{6a0be233-ed08-4524-889c-2e45d0c20e5f}']
960 procedure GetEvents(EventNames: TStrings);
961 procedure SetEvents(EventNames: TStrings); overload;
962 procedure SetEvents(EventName: string); overload;
963 procedure Cancel;
964 function ExtractEventCounts: TEventCounts;
965 procedure WaitForEvent;
966 procedure AsyncWaitForEvent(EventHandler: TEventHandler);
967 function GetAttachment: IAttachment;
968 end;
969
970 TTZTextOptions = (tzOffset, {Time Zone Rendered as an offset to GMT}
971 tzGMT, {No Time Zone. Time part is always rendered in GMT}
972 tzOriginalID); {Time Zone shown as originally entered}
973
974 {The ITimeZoneServices interface provides access to the time zone database
975 used for the attachment. It may be used in support of TIMESTAMP WITH TIME ZONE
976 and TIME WITH TIME ZONE data types.}
977
978 ITimeZoneServices = interface
979 ['{163821f5-ebef-42b9-ac60-8ac4b5c09954}']
980 {utility functions}
981 function TimeZoneID2TimeZoneName(aTimeZoneID: TFBTimeZoneID): AnsiString;
982 function TimeZoneName2TimeZoneID(aTimeZone: AnsiString): TFBTimeZoneID;
983 function LocalTimeToGMT(aLocalTime: TDateTime; aTimeZone: AnsiString): TDateTime; overload;
984 function LocalTimeToGMT(aLocalTime: TDateTime; aTimeZoneID: TFBTimeZoneID): TDateTime; overload;
985 function GMTToLocalTime(aGMTTime: TDateTime; aTimeZone: AnsiString): TDateTime; overload;
986 function GMTToLocalTime(aGMTTime: TDateTime; aTimeZoneID: TFBTimeZoneID): TDateTime; overload;
987 function GetEffectiveOffsetMins(aLocalTime: TDateTime; aTimeZone: AnsiString): integer; overload;
988 function GetEffectiveOffsetMins(aLocalTime: TDateTime; aTimeZoneID: TFBTimeZoneID): integer; overload;
989
990 {Time Zone DB Information}
991 function UsingRemoteTZDB: boolean;
992 procedure SetUseLocalTZDB(useLocalTZDB: boolean);
993 function GetLocalTimeZoneName: AnsiString;
994 function GetLocalTimeZoneID: TFBTimeZoneID;
995 procedure GetTimeZoneInfo(aTimeZone: AnsiString; OnDate: TDateTime;
996 var ZoneOffset, DSTOffset, EffectiveOffset: integer);
997 {Configurable Options}
998 function GetTimeTZDate: TDateTime;
999 procedure SetTimeTZDate(aDate: TDateTime);
1000 function GetTZTextOption: TTZTextOptions;
1001 procedure SetTZTextOption(aOptionValue: TTZTextOptions);
1002 end;
1003
1004 {The IDBInformation Interface.
1005
1006 An IDBInformation interface is returned by the IAttachment GetDBInformation
1007 method. The interface provides access to the information requested and
1008 returned by the method.
1009
1010 IDBInformation itself gives access to a collection of IDBInfoItems. Each one
1011 provides information requested, as indicated by the ItemType and the actual
1012 value of the information. In some cases, the returned item is itself a
1013 colletion of IDBInfoItems.
1014
1015 The IDBInformation items, and the associated symbolic codes and parameter values may be
1016 found in the Interbase 6.0 API Guide.
1017 }
1018
1019 TDBOperationCount = record
1020 TableID: UShort;
1021 Count: cardinal;
1022 end;
1023
1024 TDBOperationCounts = array of TDBOperationCount;
1025
1026 IDBInfoItem = interface
1027 ['{eeb97b51-ec0f-473f-9f75-c1721f055fcb}']
1028 function getItemType: byte;
1029 function getSize: integer;
1030 procedure getRawBytes(var Buffer);
1031 function getAsString: AnsiString;
1032 function getAsInteger: int64;
1033 procedure DecodeIDCluster(var ConnectionType: integer; var DBFileName, DBSiteName: AnsiString);
1034 function getAsBytes: TByteArray;
1035 function getAsDateTime: TDateTime;
1036 procedure DecodeVersionString(var Version: byte; var VersionString: AnsiString);
1037 function getOperationCounts: TDBOperationCounts;
1038 procedure DecodeUserNames(UserNames: TStrings);
1039
1040 {user names only}
1041 function GetCount: integer;
1042 function GetItem(index: integer): IDBInfoItem;
1043 function Find(ItemType: byte): IDBInfoItem;
1044 property AsInteger: int64 read getAsInteger;
1045 property AsString: AnsiString read GetAsString;
1046 property Count: integer read GetCount;
1047 property Items[index: integer]: IDBInfoItem read getItem; default;
1048 end;
1049
1050 { IDBInformation }
1051
1052 IDBInformation = interface
1053 ['{7ac6777f-f0a9-498a-9f5c-4a57a554df81}']
1054 function GetCount: integer;
1055 function GetItem(index: integer): IDBInfoItem;
1056 function Find(ItemType: byte): IDBInfoItem;
1057 procedure PrintBuf; {can be used to print buffer in hex for debugging}
1058 property Count: integer read GetCount;
1059 property Items[index: integer]: IDBInfoItem read getItem; default;
1060 end;
1061
1062 {The Database Information Request Block is used to pass requests for
1063 database information where at least one item requested has a parameter.
1064 At present, this is only fb_info_page_contents which has a single
1065 integer parameter.}
1066
1067 IDIRBItem = interface(IParameterBlockItem)
1068 ['{d34a7511-8435-4a24-81a7-5103d218d234}']
1069 end;
1070
1071 IDIRB = interface(IParameterBlock<IDIRBItem>)
1072 ['{1010e5ac-0a8f-403b-a302-91625e9d9579}']
1073 end;
1074
1075
1076 {The Database Parameter Block (DPB).
1077
1078 The DPB provides the parameters used when connecting to a database. It is allocated
1079 empty by the FirebirdAPI and the parameters are then added to it. Each individual
1080 parameter may be accessed by the IDPBItem interface which can be used to set the
1081 value, if any, of the parameter.
1082
1083 The DPB parameters, and the associated symbolic codes and parameter values may be
1084 found in the Interbase 6.0 API Guide.
1085 }
1086
1087 IDPBItem = interface(IParameterBlockItemWithTypeName)
1088 ['{123d4ad0-087a-4cd1-a344-1b3d03b30673}']
1089 end;
1090
1091 IDPB = interface(IParameterBlockWithTypeNames<IDPBItem>)
1092 ['{e676067b-1cf4-4eba-9256-9724f57e0d16}']
1093 end;
1094
1095 {Journaling options. Default is [joReadWriteTransactions,joModifyQueries] }
1096
1097 TJournalOption = (joReadOnlyTransactions, joReadWriteTransactions,
1098 joModifyQueries, joReadOnlyQueries,joNoServerTable);
1099
1100 TJournalOptions = set of TJournalOption;
1101
1102 {The IAttachment interface provides access to a Database Connection. It may be
1103 used to:
1104
1105 a. Disconnect and reconnect to the database.
1106
1107 b. Start a Transaction on the database
1108
1109 c. Execute directly SQL DDL Statements and others that return no information.
1110
1111 d. OpenCursors (i.e. execute SQL Select statements and return the results)
1112
1113 e. Prepare SQL Statements, returning an IStatement interface for further processing.
1114
1115 f. Provide access to an SQL Event Handler.
1116
1117 g. Access Database Information.
1118
1119 h. Support the handling of Array and Blob data.
1120
1121 Note that SQL statements can be prepared with named parameters (PSQL style).
1122 This then allows the parameters to be accessed by name. The same name can
1123 be used for more than one parameter, allowing a single operation to be used
1124 to set all parameters with the same name.
1125 }
1126
1127 { IAttachment }
1128
1129 IAttachment = interface
1130 ['{466e9b67-9def-4807-b3e7-e08a35e7185c}']
1131 function getFirebirdAPI: IFirebirdAPI;
1132 function getDPB: IDPB;
1133 function AllocateBPB: IBPB;
1134 function AllocateDIRB: IDIRB;
1135 procedure Connect;
1136 procedure Disconnect(Force: boolean=false);
1137 function IsConnected: boolean;
1138 procedure DropDatabase;
1139 function StartTransaction(TPB: array of byte;
1140 DefaultCompletion: TTransactionCompletion=taCommit;
1141 aName: AnsiString=''): ITransaction; overload;
1142 function StartTransaction(TPB: ITPB;
1143 DefaultCompletion: TTransactionCompletion=taCommit;
1144 aName: AnsiString=''): ITransaction; overload;
1145 procedure ExecImmediate(transaction: ITransaction; sql: AnsiString; SQLDialect: integer); overload;
1146 procedure ExecImmediate(TPB: array of byte; sql: AnsiString; SQLDialect: integer); overload;
1147 procedure ExecImmediate(transaction: ITransaction; sql: AnsiString); overload;
1148 procedure ExecImmediate(TPB: array of byte; sql: AnsiString); overload;
1149 function ExecuteSQL(TPB: array of byte; sql: AnsiString; SQLDialect: integer; params: array of const): IResults; overload;
1150 function ExecuteSQL(transaction: ITransaction; sql: AnsiString; SQLDialect: integer; params: array of const): IResults; overload;
1151 function ExecuteSQL(TPB: array of byte; sql: AnsiString; params: array of const): IResults; overload;
1152 function ExecuteSQL(transaction: ITransaction; sql: AnsiString; params: array of const): IResults; overload;
1153 function OpenCursor(transaction: ITransaction; sql: AnsiString; aSQLDialect: integer;
1154 Scrollable: boolean=false): IResultSet; overload;
1155 function OpenCursor(transaction: ITransaction; sql: AnsiString; aSQLDialect: integer;
1156 params: array of const): IResultSet; overload;
1157 function OpenCursor(transaction: ITransaction; sql: AnsiString; Scrollable: boolean=false): IResultSet; overload;
1158 function OpenCursor(transaction: ITransaction; sql: AnsiString; Scrollable: boolean;
1159 params: array of const): IResultSet; overload;
1160 function OpenCursor(transaction: ITransaction; sql: AnsiString;
1161 params: array of const): IResultSet; overload;
1162 function OpenCursor(transaction: ITransaction; sql: AnsiString; aSQLDialect: integer; Scrollable: boolean;
1163 params: array of const): IResultSet; overload;
1164 function OpenCursorAtStart(transaction: ITransaction; sql: AnsiString; aSQLDialect: integer;
1165 Scrollable: boolean=false): IResultSet; overload;
1166 function OpenCursorAtStart(transaction: ITransaction; sql: AnsiString; aSQLDialect: integer;
1167 params: array of const): IResultSet; overload;
1168 function OpenCursorAtStart(transaction: ITransaction; sql: AnsiString; aSQLDialect: integer; Scrollable: boolean;
1169 params: array of const): IResultSet; overload;
1170 function OpenCursorAtStart(transaction: ITransaction; sql: AnsiString; Scrollable: boolean=false): IResultSet; overload;
1171 function OpenCursorAtStart(transaction: ITransaction; sql: AnsiString;
1172 params: array of const): IResultSet; overload;
1173 function OpenCursorAtStart(transaction: ITransaction; sql: AnsiString; Scrollable: boolean;
1174 params: array of const): IResultSet; overload;
1175 function OpenCursorAtStart(sql: AnsiString; Scrollable: boolean=false): IResultSet; overload;
1176 function OpenCursorAtStart(sql: AnsiString; Scrollable: boolean;
1177 params: array of const): IResultSet; overload;
1178 function OpenCursorAtStart(sql: AnsiString;
1179 params: array of const): IResultSet; overload;
1180 function Prepare(transaction: ITransaction; sql: AnsiString; aSQLDialect: integer; CursorName: AnsiString=''): IStatement; overload;
1181 function Prepare(transaction: ITransaction; sql: AnsiString; CursorName: AnsiString=''): IStatement; overload;
1182 function PrepareWithNamedParameters(transaction: ITransaction; sql: AnsiString;
1183 aSQLDialect: integer; GenerateParamNames: boolean=false;
1184 CaseSensitiveParams: boolean = false; CursorName: AnsiString=''): IStatement; overload;
1185 function PrepareWithNamedParameters(transaction: ITransaction; sql: AnsiString;
1186 GenerateParamNames: boolean=false;
1187 CaseSensitiveParams: boolean = false; CursorName: AnsiString=''): IStatement; overload;
1188
1189 {Events}
1190 function GetEventHandler(Events: TStrings): IEvents; overload;
1191 function GetEventHandler(Event: AnsiString): IEvents; overload;
1192
1193 {Blob - may use to open existing Blobs. However, ISQLData.AsBlob is preferred}
1194
1195 function CreateBlob(transaction: ITransaction; RelationName, ColumnName: AnsiString; BPB: IBPB=nil): IBlob; overload;
1196 function CreateBlob(transaction: ITransaction; BlobMetaData: IBlobMetaData; BPB: IBPB=nil): IBlob; overload;
1197 function CreateBlob(transaction: ITransaction; SubType: integer; CharSetID: cardinal=0; BPB: IBPB=nil): IBlob; overload;
1198 function OpenBlob(transaction: ITransaction; RelationName, ColumnName: AnsiString; BlobID: TISC_QUAD; BPB: IBPB=nil): IBlob; overload;
1199 function OpenBlob(transaction: ITransaction; BlobMetaData: IBlobMetaData; BlobID: TISC_QUAD; BPB: IBPB=nil): IBlob; overload;
1200 function GetInlineBlobLimit: integer;
1201 procedure SetInlineBlobLimit(limit: integer);
1202
1203 {Array - may use to open existing arrays. However, ISQLData.AsArray is preferred}
1204
1205 function OpenArray(transaction: ITransaction; RelationName, ColumnName: AnsiString; ArrayID: TISC_QUAD): IArray; overload;
1206 function OpenArray(transaction: ITransaction; ArrayMetaData: IArrayMetaData; ArrayID: TISC_QUAD): IArray; overload;
1207 function CreateArray(transaction: ITransaction; RelationName, ColumnName: AnsiString): IArray; overload;
1208 function CreateArray(transaction: ITransaction; ArrayMetaData: IArrayMetaData): IArray; overload;
1209 function CreateArrayMetaData(SQLType: cardinal; tableName: AnsiString; columnName: AnsiString;
1210 Scale: integer; size: cardinal; charSetID: cardinal; dimensions: cardinal;
1211 bounds: TArrayBounds): IArrayMetaData;
1212
1213 {Database Information}
1214 function GetSQLDialect: integer;
1215 function GetAttachmentID: integer;
1216 function GetBlobMetaData(Transaction: ITransaction; tableName, columnName: AnsiString): IBlobMetaData;
1217 function GetArrayMetaData(Transaction: ITransaction; tableName, columnName: AnsiString): IArrayMetaData;
1218 function GetDBInformation(Requests: array of byte): IDBInformation; overload;
1219 function GetDBInformation(Request: byte): IDBInformation; overload;
1220 function GetDBInformation(Requests: IDIRB): IDBInformation; overload;
1221 function GetConnectString: AnsiString;
1222 function GetRemoteProtocol: AnsiString;
1223 function GetAuthenticationMethod: AnsiString;
1224 function GetSecurityDatabase: AnsiString;
1225 function GetODSMajorVersion: integer;
1226 function GetODSMinorVersion: integer;
1227 procedure getFBVersion(version: TStrings);
1228 function HasActivity: boolean;
1229 function HasDecFloatSupport: boolean;
1230 function HasBatchMode: boolean;
1231 function HasScollableCursors: boolean;
1232 function HasTable(aTableName: AnsiString): boolean; {case sensitive}
1233 function HasFunction(aFunctionName: AnsiString): boolean; {case sensitive}
1234 function HasProcedure(aProcName: AnsiString): boolean; {case sensitive}
1235
1236 {Character Sets}
1237 function GetCharSetID: integer; {connection character set}
1238 function HasDefaultCharSet: boolean;
1239 function GetDefaultCharSetID: integer;
1240 function GetCharsetName(CharSetID: integer): AnsiString;
1241 function CharSetID2CodePage(CharSetID: integer; var CodePage: TSystemCodePage): boolean;
1242 function CodePage2CharSetID(CodePage: TSystemCodePage; var CharSetID: integer): boolean;
1243 function CharSetName2CharSetID(CharSetName: AnsiString; var CharSetID: integer): boolean;
1244 function CharSetWidth(CharSetID: integer; var Width: integer): boolean;
1245 procedure RegisterCharSet(CharSetName: AnsiString; CodePage: TSystemCodePage;
1246 AllowReverseLookup:boolean; out CharSetID: integer);
1247
1248 {Time Zone Database}
1249 function GetTimeZoneServices: ITimeZoneServices;
1250 function HasTimeZoneSupport: boolean;
1251
1252 {Client side Journaling}
1253 function JournalingActive: boolean;
1254 function GetJournalOptions: TJournalOptions;
1255 function StartJournaling(aJournalLogFile: AnsiString): integer; overload;
1256 function StartJournaling(aJournalLogFile: AnsiString; Options: TJournalOptions): integer; overload;
1257 function StartJournaling(S: TStream; Options: TJournalOptions): integer; overload;
1258 procedure StopJournaling(RetainJournal: boolean);
1259 end;
1260
1261 TProtocolAll = (TCP, SPX, NamedPipe, Local, inet, inet4, inet6, wnet, xnet, unknownProtocol);
1262 TProtocol = TCP..xnet;
1263
1264 {Service Parameter Block (SPB).
1265
1266 The SPB provides the parameters used when connecting to a Service Manager. It is
1267 allocated empty by the FirebirdAPI and the parameters are then added to it. Each
1268 individual parameter may be accessed by the ISPBItem interface which can be used
1269 to set the value, if any, of the parameter.
1270
1271 The SPB parameters, and the associated symbolic codes and parameter values may be
1272 found in the Interbase 6.0 API Guide.
1273
1274 }
1275
1276 ISPBItem = interface(IParameterBlockItemWithTypeName)
1277 ['{5d08ae2b-4519-41bd-8b40-97cd451c3f6a}']
1278 end;
1279
1280 ISPB = interface(IParameterBlockWithTypeNames<ISPBItem>)
1281 ['{2c5836fd-41ed-4426-9b7d-5af580ec2659}']
1282 end;
1283
1284 {Service Query Parameter Block (SQPB).
1285
1286 This is a specialised parameter block used to send data to a service manager
1287 in a Query Request.
1288 }
1289
1290 ISQPBItem = interface(IParameterBlockItem)
1291 ['{b07841a6-33b3-47f0-b5a2-028cbc86dc97}']
1292 function CopyFrom(source: TStream; count: integer): integer;
1293 end;
1294
1295 ISQPB = interface(IParameterBlock<ISQPBItem>)
1296 ['{8553e66b-ee62-498b-8431-dff030211447}']
1297 end;
1298
1299 {Service Request Block (SRB).
1300
1301 The SRB specifies what is requested from the Service Manager when starting a
1302 service or querying a service. It is allocated empty by the ServiceManager API and
1303 the parameters are then added to it. Each individual parameter may be accessed
1304 by the ISRBItem interface which can be used to set the value, if any, of the parameter.
1305
1306 The SRB parameters, and the associated symbolic codes and parameter values may be
1307 found in the Interbase 6.0 API Guide.
1308
1309 }
1310
1311 ISRBItem = interface(IParameterBlockItem)
1312 ['{47ec790e-f265-4b30-9dcd-261e51677245}']
1313 end;
1314
1315 ISRB = interface(IParameterBlock<ISRBItem>)
1316 ['{9f2e204f-3c33-4e44-90f9-9135e95dafb9}']
1317 end;
1318
1319 {The Service Query Results Interface.
1320
1321 An IServiceQueryResults interface is returned by the IServiceManager Query
1322 method. The interface provides access to the information requested and
1323 returned by the method.
1324
1325 IServiceQueryResults itself gives access to a collection of IServiceQueryResultItem.
1326 Each one provides information requested, as indicated by the ItemType and the actual
1327 value of the information. In some cases, the returned item is itself a
1328 collection of IServiceQueryResultSubItem.
1329
1330 The IServiceQueryResultItem items, and the associated symbolic codes and parameter values may be
1331 found in the Interbase 6.0 API Guide.
1332 }
1333
1334 IServiceQueryResultSubItem = interface
1335 ['{8a4c381e-9923-4cc9-a96b-553729248640}']
1336 function getItemType: byte;
1337 function getSize: integer;
1338 procedure getRawBytes(var Buffer);
1339 function getAsString: AnsiString;
1340 function getAsInteger: int64;
1341 function getAsByte: byte;
1342 function CopyTo(stream: TStream; count: integer): integer;
1343 property AsString: AnsiString read getAsString;
1344 property AsInteger: int64 read getAsInteger;
1345 property AsByte: byte read getAsByte;
1346 end;
1347
1348 IServiceQueryResultItem = interface(IServiceQueryResultSubItem)
1349 ['{b2806886-206c-4024-8df9-5fe0a7630a5e}']
1350 function getCount: integer;
1351 function getItem(index: integer): IServiceQueryResultSubItem;
1352 function find(ItemType: byte): IServiceQueryResultSubItem;
1353 property Items[index: integer]: IServiceQueryResultSubItem read getItem; default;
1354 property Count: integer read getCount;
1355 end;
1356
1357 IServiceQueryResults = interface
1358 ['{8fbbef7d-fe03-4409-828a-a787d34ef531}']
1359 function getCount: integer;
1360 function getItem(index: integer): IServiceQueryResultItem;
1361 function find(ItemType: byte): IServiceQueryResultItem;
1362 procedure PrintBuf; {can be used to print buffer in hex for debugging}
1363 property Items[index: integer]: IServiceQueryResultItem read getItem; default;
1364 property Count: integer read getCount;
1365 end;
1366
1367 IFirebirdLibrary = interface;
1368
1369 {The IServiceManager interface provides access to a service manager. It can
1370 used to Detach and re-attach to Service Manager, to start services and to
1371 query the service manager.
1372
1373 The interface is returned by the FirebirdAPI GetService Manager method.
1374 }
1375
1376 { IServiceManager }
1377
1378 IServiceManager = interface
1379 ['{905b587d-1e1f-4e40-a3f8-a3519f852e48}']
1380 function getFirebirdAPI: IFirebirdAPI;
1381 function getSPB: ISPB;
1382 function getServerName: AnsiString;
1383 function getProtocol: TProtocol;
1384 function getPortNo: AnsiString;
1385 procedure Attach;
1386 procedure Detach(Force: boolean=false);
1387 function IsAttached: boolean;
1388 function AllocateSRB: ISRB;
1389 function AllocateSQPB: ISQPB;
1390 function Start(Request: ISRB; RaiseExceptionOnError: boolean=true): boolean;
1391 function Query(SQPB: ISQPB; Request: ISRB; RaiseExceptionOnError: boolean=true) :IServiceQueryResults; overload;
1392 function Query(Request: ISRB; RaiseExceptionOnError: boolean=true) :IServiceQueryResults; overload;
1393 end;
1394
1395 {Tbe Firebird Library API used to get information about the Firebird library}
1396
1397
1398 IFirebirdLibrary = interface
1399 ['{3c04e0a1-12e0-428a-b2e1-bc6fcd97b79b}']
1400 function GetHandle: TLibHandle;
1401 function GetLibraryName: string;
1402 function GetLibraryFilePath: string;
1403 function GetFirebirdAPI: IFirebirdAPI;
1404 end;
1405
1406 {The Firebird API.
1407
1408 This is the base interface and is used to create/open a database connection, to
1409 start a transaction on multiple databases and the access the service manager.
1410
1411 The interface is returned by the FirebirdAPI function.
1412 }
1413
1414 { IFirebirdAPI }
1415
1416 IFirebirdAPI = interface
1417 ['{edeee691-c8d3-4dcf-a780-cd7e432821d5}']
1418 {Database connections}
1419 function AllocateDPB: IDPB;
1420 function OpenDatabase(DatabaseName: AnsiString; DPB: IDPB; RaiseExceptionOnConnectError: boolean=true): IAttachment;
1421 function CreateDatabase(DatabaseName: AnsiString; DPB: IDPB; RaiseExceptionOnError: boolean=true): IAttachment; overload;
1422 function CreateDatabase(sql: AnsiString; aSQLDialect: integer; RaiseExceptionOnError: boolean=true): IAttachment; overload;
1423
1424 {Start Transaction against multiple databases}
1425 function AllocateTPB: ITPB;
1426 function StartTransaction(Attachments: array of IAttachment;
1427 TPB: array of byte; DefaultCompletion: TTransactionCompletion=taCommit;
1428 aName: AnsiString=''): ITransaction; overload;
1429 function StartTransaction(Attachments: array of IAttachment;
1430 TPB: ITPB; DefaultCompletion: TTransactionCompletion=taCommit;
1431 aName: AnsiString=''): ITransaction; overload;
1432
1433 {Service Manager}
1434 function HasServiceAPI: boolean;
1435 function AllocateSPB: ISPB;
1436 function GetServiceManager(ServerName: AnsiString; Protocol: TProtocol; SPB: ISPB): IServiceManager; overload;
1437 function GetServiceManager(ServerName: AnsiString; Port: AnsiString; Protocol: TProtocol; SPB: ISPB): IServiceManager; overload;
1438
1439 {Information}
1440 function GetStatus: IStatus;
1441 function HasRollbackRetaining: boolean;
1442 function IsEmbeddedServer: boolean;
1443 function GetImplementationVersion: AnsiString;
1444 function GetClientMajor: integer;
1445 function GetClientMinor: integer;
1446 function HasDecFloatSupport: boolean;
1447 function HasLocalTZDB: boolean;
1448 function HasTimeZoneSupport: boolean;
1449 function HasExtendedTZSupport: boolean;
1450
1451 {Firebird 3 API}
1452 function HasMasterIntf: boolean;
1453 function GetIMaster: TObject; deprecated 'Use FirebirdAPI.QueryInterface and FBClientLib.pas IFBIMasterProvider instead';
1454 function GetFBLibrary: IFirebirdLibrary;
1455 end;
1456
1457 type
1458 TOnGetLibraryName = procedure(var libname: string);
1459
1460 const
1461 OnGetLibraryName: TOnGetLibraryName = nil;
1462 AllowUseOfFBLIB: boolean = false;
1463
1464 type
1465 { EIBError }
1466
1467 EIBError = class(EDatabaseError)
1468 private
1469 FSQLCode: Long;
1470 public
1471 constructor Create(ASQLCode: Long; Msg: AnsiString);
1472 property SQLCode: Long read FSQLCode;
1473 end;
1474
1475 { EIBInterBaseError - Firebird Engine errors}
1476
1477 EIBInterBaseError = class(EIBError)
1478 private
1479 FIBErrorCode: Long;
1480 FStatus: IStatus;
1481 public
1482 constructor Create(aStatus: IStatus); overload;
1483 constructor Create(ASQLCode: Long; AIBErrorCode: Long; Msg: AnsiString); overload;
1484 property IBErrorCode: Long read FIBErrorCode;
1485 property Status: IStatus read FStatus;
1486 end;
1487
1488 {IB Client Exceptions}
1489 EIBClientError = class(EIBError);
1490
1491 {Used to explicitly report a Batch Buffer overflow}
1492 EIBBatchBufferOverflow = class(EIBError);
1493
1494 {The Firebird API function is used to access the IFirebirdAPI interface.
1495
1496 It will load the Firebird Client Library if this is not already loaded and
1497 select an implementation of the Firebird API (legacy 2.5 or 3.0.
1498 }
1499
1500 function FirebirdAPI: IFirebirdAPI;
1501
1502 {IBX support functions. Probably best ignored i.e. always used the FirebirdAPI
1503 function to load the library and check if it's loaded.}
1504
1505 function TryIBLoad: Boolean;
1506 procedure CheckIBLoaded;
1507
1508 {If you want to explicitly load the Firebird library from a
1509 non-default location then use this function and its GetFirebirdAPI function
1510 to get the API.}
1511
1512 function LoadFBLibrary(aLibPathName: string): IFirebirdLibrary;
1513
1514 {$if not declared(Null)} {Needed for Delphi}
1515 function Null: Variant; // Null standard constant
1516 {$define NEEDNULLFUNCTION}
1517 {$ifend}
1518
1519 implementation
1520
1521 uses FBClientAPI {$if not declared(NULL)}, Variants {$ifend}
1522 {$IFDEF USELEGACYFIREBIRDAPI}, FB25ClientAPI {$ENDIF}
1523 {$IFDEF USEFIREBIRD3API}, FB30ClientAPI {$ENDIF};
1524
1525 var FDefaultFBLibrary: IFirebirdLibrary;
1526
1527 type
1528
1529 { TFBLibrary }
1530
1531 TFBLibraryImpl = class(TFBLibrary)
1532 protected
1533 function GetFirebird3API: IFirebirdAPI; override;
1534 function GetLegacyFirebirdAPI: IFirebirdAPI; override;
1535 end;
1536
1537 function TFBLibraryImpl.GetFirebird3API: IFirebirdAPI;
1538 begin
1539 {$IFDEF USEFIREBIRD3API}
1540 Result := TFB30ClientAPI.Create(self);
1541 {$ELSE}
1542 Result := nil;
1543 {$ENDIF}
1544 end;
1545
1546 function TFBLibraryImpl.GetLegacyFirebirdAPI: IFirebirdAPI;
1547 begin
1548 {$IFDEF USELEGACYFIREBIRDAPI}
1549 Result := TFB25ClientAPI.Create(self);
1550 {$ELSE}
1551 Result := nil;
1552 {$ENDIF}
1553 end;
1554
1555 function FirebirdAPI: IFirebirdAPI;
1556 begin
1557 if FDefaultFBLibrary = nil then
1558 CheckIBLoaded;
1559 Result := FDefaultFBLibrary.GetFirebirdAPI;
1560 end;
1561
1562 function TryIBLoad: Boolean;
1563 var fblib: IFirebirdLibrary;
1564 begin
1565 Result := FDefaultFBLibrary <> nil;
1566 try
1567 if not Result then
1568 begin
1569 fblib := TFBLibraryImpl.Create;
1570 if (fblib <> nil) and (fblib.GetFirebirdAPI <> nil) then
1571 FDefaultFBLibrary := fblib;
1572 Result := FDefaultFBLibrary <> nil;
1573 end;
1574 except
1575 SysUtils.showexception(ExceptObject,ExceptAddr);
1576 Result := false;
1577 end;
1578 end;
1579
1580 procedure CheckIBLoaded;
1581 begin
1582 if not TryIBLoad then
1583 IBError(ibxeInterBaseMissing, [nil]);
1584 end;
1585
1586 function LoadFBLibrary(aLibPathName: string): IFirebirdLibrary;
1587 var fblib: IFirebirdLibrary;
1588 begin
1589 if trim(aLibPathName) = '' then
1590 begin
1591 CheckIBLoaded;
1592 Result := FDefaultFBLibrary;
1593 end
1594 else
1595 begin
1596 fblib := TFBLibraryImpl.GetFBLibrary(aLibPathName);
1597 if (fblib = nil) or (fblib.GetFirebirdAPI = nil) then
1598 IBError(ibxeInterBaseMissing, [nil]);
1599 Result := fblib;
1600 end;
1601 end;
1602
1603 { EIBError }
1604
1605 constructor EIBError.Create(ASQLCode: Long; Msg: AnsiString);
1606 begin
1607 inherited Create(Msg);
1608 FSQLCode := ASQLCode;
1609 end;
1610
1611 { EIBInterBaseError }
1612
1613 constructor EIBInterBaseError.Create(aStatus: IStatus);
1614 begin
1615 inherited Create(aStatus.Getsqlcode,aStatus.GetMessage);
1616 FIBErrorCode := aStatus.GetIBErrorCode;
1617 FStatus := aStatus.Clone;
1618 end;
1619
1620 constructor EIBInterBaseError.Create(ASQLCode: Long; AIBErrorCode: Long;
1621 Msg: AnsiString);
1622 begin
1623 inherited Create(ASQLCode,Msg);
1624 FIBErrorCode := AIBErrorCode;
1625 end;
1626
1627 {$ifdef NEEDNULLFUNCTION}
1628 function Null: Variant; // Null standard constant
1629 begin
1630 VarClearProc(TVarData(Result));
1631 TVarData(Result).VType := varnull;
1632 end;
1633 {$endif}
1634
1635 initialization
1636 FDefaultFBLibrary := nil;
1637
1638 finalization
1639 FDefaultFBLibrary := nil;
1640
1641 end.
1642

Properties

Name Value
svn:eol-style native