ViewVC Help
View File | Revision Log | Show Annotations | Download File | View Changeset | Root Listing
root/public/ibx/branches/journaling/fbintf/IB.pas
Revision: 287
Committed: Thu Apr 11 08:51:23 2019 UTC (5 years ago) by tony
Content type: text/x-pascal
Original Path: ibx/trunk/fbintf/IB.pas
File size: 52703 byte(s)
Log Message:
Fixes Merged

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;
133
134 const
135 {Interface version information}
136 FBIntf_Major = 1;
137 FBIntf_Minor = 1;
138 FBIntf_Release = 5;
139 FBIntf_Version = '1.1.5';
140
141 {These include files are converted from the 'C' originals in the Firebird API
142 and define the various constants used by the API}
143
144 {$I 'include/consts_pub.inc'}
145 {$I 'include/inf_pub.inc'}
146 {$I 'include/configkeys.inc'}
147
148 {The following constants define the values return by calls to the GetSQLType
149 methods provided by several of the interfaces defined below.}
150
151 (*********************)
152 (** SQL definitions **)
153 (*********************)
154 SQL_VARYING = 448;
155 SQL_TEXT = 452;
156 SQL_DOUBLE = 480;
157 SQL_FLOAT = 482;
158 SQL_LONG = 496;
159 SQL_SHORT = 500;
160 SQL_TIMESTAMP = 510;
161 SQL_BLOB = 520;
162 SQL_D_FLOAT = 530;
163 SQL_ARRAY = 540;
164 SQL_QUAD = 550;
165 SQL_TYPE_TIME = 560;
166 SQL_TYPE_DATE = 570;
167 SQL_INT64 = 580;
168 SQL_BOOLEAN = 32764;
169 SQL_DATE = SQL_TIMESTAMP;
170
171 type
172 TGDS_QUAD = record
173 gds_quad_high : ISC_LONG;
174 gds_quad_low : UISC_LONG;
175 end;
176 TGDS__QUAD = TGDS_QUAD;
177 TISC_QUAD = TGDS_QUAD;
178 PGDS_QUAD = ^TGDS_QUAD;
179 PGDS__QUAD = ^TGDS__QUAD;
180 PISC_QUAD = ^TISC_QUAD;
181
182 {$IFNDEF FPC}
183 {Delphi missing definitions}
184 type
185 TLibHandle = THandle;
186
187 const
188 NilHandle = 0;
189 DirectorySeparator = '\';
190
191 {Delphi only seems to define CP_UTF8 and CP_UTF16}
192 const
193 CP_ACP = 0; // default to ANSI code page
194 CP_OEMCP = 1; // default to OEM (console) code page
195 CP_UTF16BE = 1201; // unicodeFFFE
196 CP_UTF7 = 65000; // utf-7
197 CP_ASCII = 20127; // us-ascii
198 CP_NONE = $FFFF; // rawbytestring encoding
199
200 {$ENDIF}
201
202 type
203 {$IF not declared(TSystemCodePage)}
204 TSystemCodePage = word; {not defined in Delphi}
205 {$IFEND}
206
207 TIBSQLStatementTypes =
208 (SQLUnknown, SQLSelect, SQLInsert,
209 SQLUpdate, SQLDelete, SQLDDL,
210 SQLGetSegment, SQLPutSegment,
211 SQLExecProcedure, SQLStartTransaction,
212 SQLCommit, SQLRollback,
213 SQLSelectForUpdate, SQLSetGenerator);
214
215 TFBStatusCode = cardinal;
216 TByteArray = array of byte;
217
218 IFirebirdAPI = interface;
219 IAttachment = interface;
220 ITransaction = interface;
221
222 {The IParameterBlock interface provides the template for all parameter
223 block interfaces}
224
225 IParameterBlock<_IItem> = interface
226 function getCount: integer;
227 function Add(ParamType: byte): _IItem;
228 function getItems(index: integer): _IItem;
229 function Find(ParamType: byte): _IItem;
230 procedure PrintBuf; {can be used to print buffer in hex for debugging}
231 property Count: integer read getCount;
232 property Items[index: integer]: _IItem read getItems; default;
233 end;
234
235 {IParameterBlockItem is not used on its own but instead provides a base type for
236 different parameter block items }
237
238 IParameterBlockItem = interface
239 ['{53b23f7b-abda-46a5-9aa5-07bd5e723266}']
240 function getParamType: byte;
241 function getAsInteger: integer;
242 function getAsString: AnsiString;
243 function getAsByte: byte;
244 procedure setAsString(aValue: AnsiString);
245 procedure setAsByte(aValue: byte);
246 procedure SetAsInteger(aValue: integer);
247 property AsString: AnsiString read getAsString write setAsString;
248 property AsByte: byte read getAsByte write setAsByte;
249 property AsInteger: integer read getAsInteger write SetAsInteger;
250 end;
251
252
253 {The IStatus interface provides access to error information, if any, returned
254 by the last API call. It can also be used to customise the error message
255 returned by a database engine exception - see EIBInterbaseError.
256
257 This interface can be accessed from IFirebirdAPI.
258 }
259
260 IStatus = interface
261 ['{34167722-af38-4831-b08a-93162d58ede3}']
262 function GetIBErrorCode: Long;
263 function Getsqlcode: Long;
264 function GetMessage: AnsiString;
265 function CheckStatusVector(ErrorCodes: array of TFBStatusCode): Boolean;
266 function GetIBDataBaseErrorMessages: TIBDataBaseErrorMessages;
267 procedure SetIBDataBaseErrorMessages(Value: TIBDataBaseErrorMessages);
268 end;
269
270 { The array metadata interface provides access to the metadata used to describe
271 an array column in a Firebird table.
272 }
273
274 TArrayBound = record
275 UpperBound: short;
276 LowerBound: short;
277 end;
278 TArrayBounds = array of TArrayBound;
279
280 IArrayMetaData = interface
281 ['{7dd0aea4-59af-4c2a-b958-565d5025c489}']
282 function GetSQLType: cardinal;
283 function GetSQLTypeName: AnsiString;
284 function GetScale: integer;
285 function GetSize: cardinal;
286 function GetCharSetID: cardinal;
287 function GetTableName: AnsiString;
288 function GetColumnName: AnsiString;
289 function GetDimensions: integer;
290 function GetBounds: TArrayBounds;
291 end;
292
293 {The array interface provides access to and modification of the array data
294 contained in an array field of a Firebird Table. The array element is
295 selected by specifying its co-ordinates using an integer array. The
296 getter and setter methods used should be appropriate for the type of data
297 contained in the array. Automatic conversion is provided to and from strings.
298 That is GetAsString and SetAsString are safe to use for sql types other than
299 boolean.
300
301 The interface is returned by a GetAsArray getter method (see ISQLData). A new array
302 can be obtained from the IAttachment interface. The SetAsArray setter method
303 (See ISQLParam) is used to apply an updated or new array to the database using
304 an UPDATE or INSERT statement.
305
306 }
307
308 TArrayEventReason = (arChanging,arChanged);
309 IArray = interface;
310 TArrayEventHandler = procedure(Sender: IArray; Reason: TArrayEventReason) of object;
311
312 IArray = interface(IArrayMetaData)
313 ['{631c6bb1-fb49-44fb-a64a-c49859632b88}']
314 function GetArrayID: TISC_QUAD;
315 procedure Clear;
316 function IsEmpty: boolean;
317 procedure PreLoad;
318 procedure CancelChanges;
319 procedure SaveChanges;
320 function GetAsInteger(index: array of integer): integer;
321 function GetAsBoolean(index: array of integer): boolean;
322 function GetAsCurrency(index: array of integer): Currency;
323 function GetAsInt64(index: array of integer): Int64;
324 function GetAsDateTime(index: array of integer): TDateTime;
325 function GetAsDouble(index: array of integer): Double;
326 function GetAsFloat(index: array of integer): Float;
327 function GetAsLong(index: array of integer): Long;
328 function GetAsShort(index: array of integer): Short;
329 function GetAsString(index: array of integer): AnsiString;
330 function GetAsVariant(index: array of integer): Variant;
331 procedure SetAsInteger(index: array of integer; AValue: integer);
332 procedure SetAsBoolean(index: array of integer; AValue: boolean);
333 procedure SetAsCurrency(index: array of integer; Value: Currency);
334 procedure SetAsInt64(index: array of integer; Value: Int64);
335 procedure SetAsDate(index: array of integer; Value: TDateTime);
336 procedure SetAsLong(index: array of integer; Value: Long);
337 procedure SetAsTime(index: array of integer; Value: TDateTime);
338 procedure SetAsDateTime(index: array of integer; Value: TDateTime);
339 procedure SetAsDouble(index: array of integer; Value: Double);
340 procedure SetAsFloat(index: array of integer; Value: Float);
341 procedure SetAsShort(index: array of integer; Value: Short);
342 procedure SetAsString(index: array of integer; Value: AnsiString);
343 procedure SetAsVariant(index: array of integer; Value: Variant);
344 procedure SetBounds(dim, UpperBound, LowerBound: integer);
345 function GetAttachment: IAttachment;
346 function GetTransaction: ITransaction;
347 procedure AddEventHandler(Handler: TArrayEventHandler);
348 procedure RemoveEventHandler(Handler: TArrayEventHandler);
349 end;
350
351 { The Blob metadata interface provides access to the metadata used to describe
352 a blob column in a Firebird table.
353 }
354
355 IBlobMetaData = interface
356 ['{575f3c61-bb33-46a5-8975-bb7d1b6e37cc}']
357 function GetSubType: integer;
358 function GetCharSetID: cardinal;
359 function GetCodePage: TSystemCodePage;
360 function GetSegmentSize: cardinal;
361 function GetRelationName: AnsiString;
362 function GetColumnName: AnsiString;
363 end;
364
365 {The Blob Parameter block is used to select a Blob Filter}
366
367 IBPBItem = interface (IParameterBlockItem)
368 ['{660822a5-3114-4c16-b6cb-c1a7b2aba70d}']
369 end;
370
371 IBPB = interface (IParameterBlock<IBPBItem>)
372 ['{e0cb9eb5-17f7-4416-b7d1-3cddd1dfca76}']
373 end;
374
375 { The Blob Interface provides access to a blob data item.
376
377 The interface is returned by a GetAsBlob getter method (see ISQLData). A new Blob
378 can be obtained from the IAttachment interface. The SetAsBlob setter method
379 (See ISQLParam) is used to apply an updated or new array to the database using
380 an UPDATE or INSERT statement.
381 }
382
383 TFBBlobMode = (fbmRead,fbmWrite);
384 TBlobType = (btSegmented,btStream);
385
386 IBlob = interface(IBlobMetaData)
387 ['{3090a145-7780-442b-b15b-efd4568b8611}']
388 function GetBPB: IBPB;
389 procedure Cancel;
390 procedure Close;
391 function GetBlobID: TISC_QUAD;
392 function GetBlobMode: TFBBlobMode;
393 function GetBlobSize: Int64;
394 procedure GetInfo(var NumSegments: Int64; var MaxSegmentSize,
395 TotalSize: Int64; var BlobType: TBlobType);
396 function Read(var Buffer; Count: Longint): Longint;
397 function Write(const Buffer; Count: Longint): Longint;
398 function LoadFromFile(Filename: AnsiString): IBlob;
399 function LoadFromStream(S: TStream) : IBlob;
400 function SaveToFile(Filename: AnsiString): IBlob;
401 function SaveToStream(S: TStream): IBlob;
402 function GetAsString: rawbytestring;
403 procedure SetAsString(aValue: rawbytestring);
404 function SetString(aValue: rawbytestring): IBlob;
405 function GetAttachment: IAttachment;
406 function GetTransaction: ITransaction;
407 property AsString: rawbytestring read GetAsString write SetAsString;
408 end;
409
410 { The IColumnMetaData interface provides access to the per column metadata for
411 the output of an SQL Statement.
412 }
413
414 TIBDateTimeFormats = (dfTimestamp, {SQL TIMESTAMP}
415 dfDateTime, {SQL DATETIME}
416 dfTime); {SQL TIME}
417
418 { IColumnMetaData }
419
420 IColumnMetaData = interface
421 ['{c222e6c3-53c1-469f-9e05-0a5c3ef232d8}']
422 function GetIndex: integer;
423 function GetSQLType: cardinal;
424 function GetSQLTypeName: AnsiString;
425 function getSubtype: integer;
426 function getRelationName: AnsiString;
427 function getOwnerName: AnsiString;
428 function getSQLName: AnsiString; {Name of the column}
429 function getAliasName: AnsiString; {Alias Name of column or Column Name if no alias}
430 function getName: AnsiString; {Disambiguated uppercase Field Name}
431 function getScale: integer;
432 function getCharSetID: cardinal;
433 function getCodePage: TSystemCodePage;
434 function getIsNullable: boolean;
435 function GetSize: cardinal;
436 function GetArrayMetaData: IArrayMetaData; {Valid only for Array SQL Type}
437 function GetBlobMetaData: IBlobMetaData; {Valid only for Blob SQL Type}
438 function GetDateTimeStrLength(DateTimeFormat: TIBDateTimeFormats): integer;
439 property Name: AnsiString read GetName;
440 property Size: cardinal read GetSize;
441 property SQLType: cardinal read GetSQLType;
442 property Scale: integer read getScale;
443 property SQLSubtype: integer read getSubtype;
444 property IsNullable: Boolean read GetIsNullable;
445 end;
446
447 {
448 The IMetaData interface provides access to the set of column metadata
449 for the output of an SQL Statement
450 }
451
452 { IMetaData }
453
454 IMetaData = interface
455 ['{4dafdbb6-0d36-4f1f-9c95-8b132804b965}']
456 function getCount: integer;
457 function getColumnMetaData(index: integer): IColumnMetaData;
458 function GetUniqueRelationName: AnsiString; {Non empty if all columns come from the same table}
459 function ByName(Idx: AnsiString): IColumnMetaData;
460 property ColMetaData[index: integer]: IColumnMetaData read getColumnMetaData; default;
461 property Count: integer read getCount;
462 end;
463
464 {
465 The ISQLData interface provides access to the data returned in a field in the
466 current row returned from a query or the result of an SQL Execute statement.
467
468 It subclasses IColumnMetaData and so also provides access to the metadata
469 associated with the column.
470
471 The getter and setter methods, and the corresponding properties, provide typed
472 access to the field data. The method/property used should be consistent
473 with the SQL Type. Automatic conversion is provided from strings.
474 That is GetAsString is safe to use for sql types other than boolean.
475 }
476
477
478 ISQLData = interface(IColumnMetaData)
479 ['{3f493e31-7e3f-4606-a07c-b210b9e3619d}']
480 function GetAsBoolean: boolean;
481 function GetAsCurrency: Currency;
482 function GetAsInt64: Int64;
483 function GetAsDateTime: TDateTime;
484 function GetAsDouble: Double;
485 function GetAsFloat: Float;
486 function GetAsLong: Long;
487 function GetAsPointer: Pointer;
488 function GetAsQuad: TISC_QUAD;
489 function GetAsShort: short;
490 function GetAsString: AnsiString;
491 function GetIsNull: Boolean;
492 function GetAsVariant: Variant;
493 function GetAsBlob: IBlob; overload;
494 function GetAsBlob(BPB: IBPB): IBlob; overload;
495 function GetAsArray: IArray;
496 property AsDate: TDateTime read GetAsDateTime;
497 property AsBoolean:boolean read GetAsBoolean;
498 property AsTime: TDateTime read GetAsDateTime;
499 property AsDateTime: TDateTime read GetAsDateTime ;
500 property AsDouble: Double read GetAsDouble;
501 property AsFloat: Float read GetAsFloat;
502 property AsCurrency: Currency read GetAsCurrency;
503 property AsInt64: Int64 read GetAsInt64 ;
504 property AsInteger: Integer read GetAsLong;
505 property AsLong: Long read GetAsLong;
506 property AsPointer: Pointer read GetAsPointer;
507 property AsQuad: TISC_QUAD read GetAsQuad;
508 property AsShort: short read GetAsShort;
509 property AsString: AnsiString read GetAsString;
510 property AsVariant: Variant read GetAsVariant ;
511 property AsBlob: IBlob read GetAsBlob;
512 property AsArray: IArray read GetAsArray;
513 property IsNull: Boolean read GetIsNull;
514 property Value: Variant read GetAsVariant;
515 end;
516
517 { An IResults interface is returned as the result of an SQL Execute statement
518 and provides access to the fields returned, if any. It is a collection of
519 ISQLData interfaces which are, in turn, used to access the data returned by
520 each field of the result set.
521 }
522
523 IResults = interface
524 ['{e836b2bb-93d1-4bbf-a8eb-7ce535de3bb5}']
525 function getCount: integer;
526 function GetTransaction: ITransaction;
527 function ByName(Idx: AnsiString): ISQLData;
528 function getSQLData(index: integer): ISQLData;
529 procedure GetData(index: integer; var IsNull:boolean; var len: short; var data: PByte);
530 procedure SetRetainInterfaces(aValue: boolean);
531 property Data[index: integer]: ISQLData read getSQLData; default;
532 property Count: integer read getCount;
533 end;
534
535 { An IResultSet interface is returned as the result of an SQL Open Cursor statement
536 (e.g. Select Statement) and provides access to the fields returned, if any
537 for the current row. It is a collection of ISQLData interfaces which are,
538 in turn, used to access the data returned by each field of the current row.
539 }
540 IResultSet = interface(IResults)
541 ['{0ae4979b-7857-4e8c-8918-ec6f155b51a0}']
542 function FetchNext: boolean;
543 function GetCursorName: AnsiString;
544 function IsEof: boolean;
545 procedure Close;
546 end;
547
548 {The ISQLParam interface is used to provide access to each parameter in a
549 parametised SQL Statement. It subclasses IColumnMetaData and this part of
550 the interface may be used to access information on the expected SQL Type, etc.
551
552 It also subclasses ISQLData and this part of the interface may be used to access
553 current values for each parameter.
554
555 Otherwise, the interface comprises the Setter Methods and properties used to
556 set the value of each parameter.
557
558 Automatic conversion is provided to and from strings. That is GetAsString and
559 SetAsString are safe to use for sql types other than boolean - provided automatic
560 conversion is possible.
561 }
562
563 ISQLParam = interface
564 ['{b22b4578-6d41-4807-a9a9-d2ec8d1d5a14}']
565 function GetIndex: integer;
566 function GetSQLType: cardinal;
567 function GetSQLTypeName: AnsiString;
568 function getSubtype: integer;
569 function getName: AnsiString;
570 function getScale: integer;
571 function getCharSetID: cardinal;
572 function getCodePage: TSystemCodePage;
573 function getIsNullable: boolean;
574 function GetSize: cardinal;
575 function GetAsBoolean: boolean;
576 function GetAsCurrency: Currency;
577 function GetAsInt64: Int64;
578 function GetAsDateTime: TDateTime;
579 function GetAsDouble: Double;
580 function GetAsFloat: Float;
581 function GetAsLong: Long;
582 function GetAsPointer: Pointer;
583 function GetAsQuad: TISC_QUAD;
584 function GetAsShort: short;
585 function GetAsString: AnsiString;
586 function GetIsNull: boolean;
587 function GetAsVariant: Variant;
588 function GetAsBlob: IBlob;
589 function GetAsArray: IArray;
590 procedure Clear;
591 function GetModified: boolean;
592 procedure SetAsBoolean(AValue: boolean);
593 procedure SetAsCurrency(aValue: Currency);
594 procedure SetAsInt64(aValue: Int64);
595 procedure SetAsDate(aValue: TDateTime);
596 procedure SetAsLong(aValue: Long);
597 procedure SetAsTime(aValue: TDateTime);
598 procedure SetAsDateTime(aValue: TDateTime);
599 procedure SetAsDouble(aValue: Double);
600 procedure SetAsFloat(aValue: Float);
601 procedure SetAsPointer(aValue: Pointer);
602 procedure SetAsShort(aValue: Short);
603 procedure SetAsString(aValue: AnsiString);
604 procedure SetAsVariant(aValue: Variant);
605 procedure SetIsNull(aValue: Boolean);
606 procedure SetAsBlob(aValue: IBlob);
607 procedure SetAsArray(anArray: IArray);
608 procedure SetAsQuad(aValue: TISC_QUAD);
609 procedure SetCharSetID(aValue: cardinal);
610 property AsDate: TDateTime read GetAsDateTime write SetAsDate;
611 property AsBoolean:boolean read GetAsBoolean write SetAsBoolean;
612 property AsTime: TDateTime read GetAsDateTime write SetAsTime;
613 property AsDateTime: TDateTime read GetAsDateTime write SetAsDateTime;
614 property AsDouble: Double read GetAsDouble write SetAsDouble;
615 property AsFloat: Float read GetAsFloat write SetAsFloat;
616 property AsCurrency: Currency read GetAsCurrency write SetAsCurrency;
617 property AsInt64: Int64 read GetAsInt64 write SetAsInt64;
618 property AsInteger: Integer read GetAsLong write SetAsLong;
619 property AsLong: Long read GetAsLong write SetAsLong;
620 property AsPointer: Pointer read GetAsPointer write SetAsPointer;
621 property AsShort: Short read GetAsShort write SetAsShort;
622 property AsString: AnsiString read GetAsString write SetAsString;
623 property AsVariant: Variant read GetAsVariant write SetAsVariant;
624 property AsBlob: IBlob read GetAsBlob write SetAsBlob;
625 property AsArray: IArray read GetAsArray write SetAsArray;
626 property AsQuad: TISC_QUAD read GetAsQuad write SetAsQuad;
627 property Value: Variant read GetAsVariant write SetAsVariant;
628 property IsNull: Boolean read GetIsNull write SetIsNull;
629 property IsNullable: Boolean read GetIsNullable;
630 property Modified: Boolean read getModified;
631 property Name: AnsiString read GetName;
632 property SQLType: cardinal read GetSQLType;
633 end;
634
635 {
636 The ISQLParams interface provides access to the collection of parameters used
637 for the input to an SQL Statement
638 }
639
640 ISQLParams = interface
641 ['{c6d95ac7-b2b7-461b-b890-afef0acbb077}']
642 function getCount: integer;
643 function getSQLParam(index: integer): ISQLParam;
644 function ByName(Idx: AnsiString): ISQLParam ;
645 function GetModified: Boolean;
646 function GetHasCaseSensitiveParams: Boolean;
647 property Modified: Boolean read GetModified;
648 property Params[index: integer]: ISQLParam read getSQLParam; default;
649 property Count: integer read getCount;
650 end;
651
652
653 TPerfStats = (psCurrentMemory, psMaxMemory,
654 psRealTime, psUserTime, psBuffers,
655 psReads, psWrites, psFetches,psDeltaMemory);
656
657 TPerfCounters = array[TPerfStats] of Int64;
658
659 {The IStatement interface provides access to an SQL Statement once it has been
660 initially prepared. The interface is returned from the IAttachment interface.
661 }
662
663 IStatement = interface
664 ['{a260576d-a07d-4a66-b02d-1b72543fd7cf}']
665 function GetMetaData: IMetaData; {Output Metadata}
666 function GetSQLParams: ISQLParams;{Statement Parameters}
667 function GetPlan: AnsiString;
668 function GetRowsAffected(var SelectCount, InsertCount, UpdateCount, DeleteCount: integer): boolean;
669 function GetSQLStatementType: TIBSQLStatementTypes;
670 function GetSQLText: AnsiString;
671 function GetProcessedSQLText: AnsiString;
672 function GetSQLDialect: integer;
673 function IsPrepared: boolean;
674 procedure Prepare(aTransaction: ITransaction=nil);
675 function Execute(aTransaction: ITransaction=nil): IResults;
676 function OpenCursor(aTransaction: ITransaction=nil): IResultSet;
677 function GetAttachment: IAttachment;
678 function GetTransaction: ITransaction;
679 procedure SetRetainInterfaces(aValue: boolean);
680 procedure EnableStatistics(aValue: boolean);
681 function GetPerfStatistics(var stats: TPerfCounters): boolean;
682 property MetaData: IMetaData read GetMetaData;
683 property SQLParams: ISQLParams read GetSQLParams;
684 property SQLStatementType: TIBSQLStatementTypes read GetSQLStatementType;
685 end;
686
687 {Transaction Parameter Block: (TPB)
688
689 The TPB provides the parameters used when starting a transaction. It is allocated
690 empty by the FirebirdAPI and the parameters are then added to it. Each individual
691 parameter may be accessed by the ITPBItem interface which can be used to set the
692 value, if any, of the parameter.
693
694 The TPB parameters, and the associated symbolic codes and parameter values may be
695 found in the Interbase 6.0 API Guide.
696 }
697
698 ITPBItem = interface(IParameterBlockItem)
699 ['{544c1f2b-7c12-4a87-a4a5-face7ea72671}']
700 end;
701
702 ITPB = interface(IParameterBlock<ITPBItem>)
703 ['{7369b0ff-defe-437b-81fe-19b211d42d25}']
704 end;
705
706 {The ITransactionAction interface provides access to a Transaction once it
707 has been initially started. After a Commit or Rollback, a transaction
708 may be restarted, optinally with a new TPB.
709
710 A multi-database transaction is started from the FirebirdAPI. A single database
711 transaction is started from the IAttachment interface.
712 }
713
714 TTransactionAction = (TARollback, TACommit, TACommitRetaining, TARollbackRetaining);
715 TTransactionCompletion = TARollback.. TACommit;
716
717 ITransaction = interface
718 ['{30928d0e-a9d7-4c61-b7cf-14f4f38abe2a}']
719 function getTPB: ITPB;
720 procedure Start(DefaultCompletion: TTransactionCompletion=taCommit);
721 function GetInTransaction: boolean;
722 procedure PrepareForCommit; {Two phase commit - stage 1}
723 procedure Commit(Force: boolean=false);
724 procedure CommitRetaining;
725 function HasActivity: boolean;
726 procedure Rollback(Force: boolean=false);
727 procedure RollbackRetaining;
728 function GetAttachmentCount: integer;
729 function GetAttachment(index: integer): IAttachment;
730 property InTransaction: boolean read GetInTransaction;
731 end;
732
733 { The IEvents Interface is used to handle events from a single database. The
734 interface is allocated from the IAttachment Interface.
735
736 Note that the EventHandler called when an event occurs following AsynWaitForEvent
737 is called in a different thread to the calling program and TThread.Synchronize
738 may be needed to pass the event back to the main thread.
739
740 Neither AsyncWaitForEvent nor WaitForEvent is intended to be thread safe
741 in a multi-threaded environment and should always be called from the main
742 thread.
743 }
744
745 TEventInfo = record
746 EventName: AnsiString;
747 Count: integer;
748 end;
749
750 TEventCounts = array of TEventInfo;
751 IEvents = interface;
752 TEventHandler = procedure(Sender: IEvents) of object;
753
754 { IEvents }
755
756 IEvents = interface
757 ['{6a0be233-ed08-4524-889c-2e45d0c20e5f}']
758 procedure GetEvents(EventNames: TStrings);
759 procedure SetEvents(EventNames: TStrings); overload;
760 procedure SetEvents(EventName: AnsiString); overload;
761 procedure Cancel;
762 function ExtractEventCounts: TEventCounts;
763 procedure WaitForEvent;
764 procedure AsyncWaitForEvent(EventHandler: TEventHandler);
765 function GetAttachment: IAttachment;
766 end;
767
768 {The IDBInformation Interface.
769
770 An IDBInformation interface is returned by the IAttachment GetDBInformation
771 method. The interface provides access to the information requested and
772 returned by the method.
773
774 IDBInformation itself gives access to a collection of IDBInfoItems. Each one
775 provides information requested, as indicated by the ItemType and the actual
776 value of the information. In some cases, the returned item is itself a
777 colletion of IDBInfoItems.
778
779 The IDBInformation items, and the associated symbolic codes and parameter values may be
780 found in the Interbase 6.0 API Guide.
781 }
782
783 TDBOperationCount = record
784 TableID: UShort;
785 Count: cardinal;
786 end;
787
788 TDBOperationCounts = array of TDBOperationCount;
789
790 IDBInfoItem = interface
791 ['{eeb97b51-ec0f-473f-9f75-c1721f055fcb}']
792 function getItemType: byte;
793 function getSize: integer;
794 procedure getRawBytes(var Buffer);
795 function getAsString: AnsiString;
796 function getAsInteger: integer;
797 procedure DecodeIDCluster(var ConnectionType: integer; var DBFileName, DBSiteName: AnsiString);
798 function getAsBytes: TByteArray;
799 function getAsDateTime: TDateTime;
800 procedure DecodeVersionString(var Version: byte; var VersionString: AnsiString);
801 function getOperationCounts: TDBOperationCounts;
802 procedure DecodeUserNames(UserNames: TStrings);
803
804 {user names only}
805 function GetCount: integer;
806 function GetItem(index: integer): IDBInfoItem;
807 function Find(ItemType: byte): IDBInfoItem;
808 property AsInteger: integer read getAsInteger;
809 property AsString: AnsiString read GetAsString;
810 property Count: integer read GetCount;
811 property Items[index: integer]: IDBInfoItem read getItem; default;
812 end;
813
814 { IDBInformation }
815
816 IDBInformation = interface
817 ['{7ac6777f-f0a9-498a-9f5c-4a57a554df81}']
818 function GetCount: integer;
819 function GetItem(index: integer): IDBInfoItem;
820 function Find(ItemType: byte): IDBInfoItem;
821 procedure PrintBuf; {can be used to print buffer in hex for debugging}
822 property Count: integer read GetCount;
823 property Items[index: integer]: IDBInfoItem read getItem; default;
824 end;
825
826 {The Database Information Request Block is used to pass requests for
827 database information where at least one item requested has a parameter.
828 At present, this is only fb_info_page_contents which has a single
829 integer parameter.}
830
831 IDIRBItem = interface(IParameterBlockItem)
832 ['{d34a7511-8435-4a24-81a7-5103d218d234}']
833 end;
834
835 IDIRB = interface(IParameterBlock<IDIRBItem>)
836 ['{1010e5ac-0a8f-403b-a302-91625e9d9579}']
837 end;
838
839
840 {The Database Parameter Block (DPB).
841
842 The DPB provides the parameters used when connecting to a database. It is allocated
843 empty by the FirebirdAPI and the parameters are then added to it. Each individual
844 parameter may be accessed by the IDPBItem interface which can be used to set the
845 value, if any, of the parameter.
846
847 The DPB parameters, and the associated symbolic codes and parameter values may be
848 found in the Interbase 6.0 API Guide.
849 }
850
851 IDPBItem = interface(IParameterBlockItem)
852 ['{123d4ad0-087a-4cd1-a344-1b3d03b30673}']
853 end;
854
855 IDPB = interface(IParameterBlock<IDPBItem>)
856 ['{e676067b-1cf4-4eba-9256-9724f57e0d16}']
857 end;
858
859 {The IAttachment interface provides access to a Database Connection. It may be
860 used to:
861
862 a. Disconnect and reconnect to the database.
863
864 b. Start a Transaction on the database
865
866 c. Execute directly SQL DDL Statements and others that return no information.
867
868 d. OpenCursors (i.e. execute SQL Select statements and return the results)
869
870 e. Prepare SQL Statements, returning an IStatement interface for further processing.
871
872 f. Provide access to an SQL Event Handler.
873
874 g. Access Database Information.
875
876 h. Support the handling of Array and Blob data.
877
878 Note that SQL statements can be prepared with named parameters (PSQL style).
879 This then allows the parameters to be accessed by name. The same name can
880 be used for more than one parameter, allowing a single operation to be used
881 to set all parameters with the same name.
882 }
883
884 { IAttachment }
885
886 IAttachment = interface
887 ['{466e9b67-9def-4807-b3e7-e08a35e7185c}']
888 function getFirebirdAPI: IFirebirdAPI;
889 function getDPB: IDPB;
890 function AllocateBPB: IBPB;
891 function AllocateDIRB: IDIRB;
892 procedure Connect;
893 procedure Disconnect(Force: boolean=false);
894 function IsConnected: boolean;
895 procedure DropDatabase;
896 function StartTransaction(TPB: array of byte; DefaultCompletion: TTransactionCompletion=taCommit): ITransaction; overload;
897 function StartTransaction(TPB: ITPB; DefaultCompletion: TTransactionCompletion=taCommit): ITransaction; overload;
898 procedure ExecImmediate(transaction: ITransaction; sql: AnsiString; SQLDialect: integer); overload;
899 procedure ExecImmediate(TPB: array of byte; sql: AnsiString; SQLDialect: integer); overload;
900 procedure ExecImmediate(transaction: ITransaction; sql: AnsiString); overload;
901 procedure ExecImmediate(TPB: array of byte; sql: AnsiString); overload;
902 function ExecuteSQL(TPB: array of byte; sql: AnsiString; SQLDialect: integer; params: array of const): IResults; overload;
903 function ExecuteSQL(transaction: ITransaction; sql: AnsiString; SQLDialect: integer; params: array of const): IResults; overload;
904 function ExecuteSQL(TPB: array of byte; sql: AnsiString; params: array of const): IResults; overload;
905 function ExecuteSQL(transaction: ITransaction; sql: AnsiString; params: array of const): IResults; overload;
906 function OpenCursor(transaction: ITransaction; sql: AnsiString; aSQLDialect: integer): IResultSet; overload;
907 function OpenCursor(transaction: ITransaction; sql: AnsiString; aSQLDialect: integer;
908 params: array of const): IResultSet; overload;
909 function OpenCursor(transaction: ITransaction; sql: AnsiString): IResultSet; overload;
910 function OpenCursor(transaction: ITransaction; sql: AnsiString;
911 params: array of const): IResultSet; overload;
912 function OpenCursorAtStart(transaction: ITransaction; sql: AnsiString; aSQLDialect: integer): IResultSet; overload;
913 function OpenCursorAtStart(transaction: ITransaction; sql: AnsiString; aSQLDialect: integer;
914 params: array of const): IResultSet; overload;
915 function OpenCursorAtStart(transaction: ITransaction; sql: AnsiString): IResultSet; overload;
916 function OpenCursorAtStart(transaction: ITransaction; sql: AnsiString;
917 params: array of const): IResultSet; overload;
918 function OpenCursorAtStart(sql: AnsiString): IResultSet; overload;
919 function OpenCursorAtStart(sql: AnsiString;
920 params: array of const): IResultSet; overload;
921 function Prepare(transaction: ITransaction; sql: AnsiString; aSQLDialect: integer): IStatement; overload;
922 function Prepare(transaction: ITransaction; sql: AnsiString): IStatement; overload;
923 function PrepareWithNamedParameters(transaction: ITransaction; sql: AnsiString;
924 aSQLDialect: integer; GenerateParamNames: boolean=false;
925 CaseSensitiveParams: boolean = false): IStatement; overload;
926 function PrepareWithNamedParameters(transaction: ITransaction; sql: AnsiString;
927 GenerateParamNames: boolean=false;
928 CaseSensitiveParams: boolean = false): IStatement; overload;
929
930 {Events}
931 function GetEventHandler(Events: TStrings): IEvents; overload;
932 function GetEventHandler(Event: AnsiString): IEvents; overload;
933
934 {Blob - may use to open existing Blobs. However, ISQLData.AsBlob is preferred}
935
936 function CreateBlob(transaction: ITransaction; RelationName, ColumnName: AnsiString; BPB: IBPB=nil): IBlob; overload;
937 function CreateBlob(transaction: ITransaction; BlobMetaData: IBlobMetaData; BPB: IBPB=nil): IBlob; overload;
938 function CreateBlob(transaction: ITransaction; SubType: integer; CharSetID: cardinal=0; BPB: IBPB=nil): IBlob; overload;
939 function OpenBlob(transaction: ITransaction; RelationName, ColumnName: AnsiString; BlobID: TISC_QUAD; BPB: IBPB=nil): IBlob;
940
941 {Array - may use to open existing arrays. However, ISQLData.AsArray is preferred}
942
943 function OpenArray(transaction: ITransaction; RelationName, ColumnName: AnsiString; ArrayID: TISC_QUAD): IArray;
944 function CreateArray(transaction: ITransaction; RelationName, ColumnName: AnsiString): IArray; overload;
945 function CreateArray(transaction: ITransaction; ArrayMetaData: IArrayMetaData): IArray; overload;
946 function CreateArrayMetaData(SQLType: cardinal; tableName: AnsiString; columnName: AnsiString;
947 Scale: integer; size: cardinal; charSetID: cardinal; dimensions: cardinal;
948 bounds: TArrayBounds): IArrayMetaData;
949
950 {Database Information}
951 function GetSQLDialect: integer;
952 function GetBlobMetaData(Transaction: ITransaction; tableName, columnName: AnsiString): IBlobMetaData;
953 function GetArrayMetaData(Transaction: ITransaction; tableName, columnName: AnsiString): IArrayMetaData;
954 function GetDBInformation(Requests: array of byte): IDBInformation; overload;
955 function GetDBInformation(Request: byte): IDBInformation; overload;
956 function GetDBInformation(Requests: IDIRB): IDBInformation; overload;
957 function GetConnectString: AnsiString;
958 function GetRemoteProtocol: AnsiString;
959 function GetAuthenticationMethod: AnsiString;
960 function GetSecurityDatabase: AnsiString;
961 function GetODSMajorVersion: integer;
962 function GetODSMinorVersion: integer;
963 procedure getFBVersion(version: TStrings);
964 function HasActivity: boolean;
965
966 {Character Sets}
967 function HasDefaultCharSet: boolean;
968 function GetDefaultCharSetID: integer;
969 function GetCharsetName(CharSetID: integer): AnsiString;
970 function CharSetID2CodePage(CharSetID: integer; var CodePage: TSystemCodePage): boolean;
971 function CodePage2CharSetID(CodePage: TSystemCodePage; var CharSetID: integer): boolean;
972 function CharSetName2CharSetID(CharSetName: AnsiString; var CharSetID: integer): boolean;
973 function CharSetWidth(CharSetID: integer; var Width: integer): boolean;
974 procedure RegisterCharSet(CharSetName: AnsiString; CodePage: TSystemCodePage;
975 AllowReverseLookup:boolean; out CharSetID: integer);
976 end;
977
978 TProtocolAll = (TCP, SPX, NamedPipe, Local, inet, inet4, inet6, wnet, xnet, unknownProtocol);
979 TProtocol = TCP..xnet;
980
981 {Service Parameter Block (SPB).
982
983 The SPB provides the parameters used when connecting to a Service Manager. It is
984 allocated empty by the FirebirdAPI and the parameters are then added to it. Each
985 individual parameter may be accessed by the ISPBItem interface which can be used
986 to set the value, if any, of the parameter.
987
988 The SPB parameters, and the associated symbolic codes and parameter values may be
989 found in the Interbase 6.0 API Guide.
990
991 }
992
993 ISPBItem = interface(IParameterBlockItem)
994 ['{5d08ae2b-4519-41bd-8b40-97cd451c3f6a}']
995 end;
996
997 ISPB = interface(IParameterBlock<ISPBItem>)
998 ['{2c5836fd-41ed-4426-9b7d-5af580ec2659}']
999 end;
1000
1001 {Service Query Parameter Block (SQPB).
1002
1003 This is a specialised parameter block used to send data to a service manager
1004 in a Query Request.
1005 }
1006
1007 ISQPBItem = interface(IParameterBlockItem)
1008 ['{b07841a6-33b3-47f0-b5a2-028cbc86dc97}']
1009 function CopyFrom(source: TStream; count: integer): integer;
1010 end;
1011
1012 ISQPB = interface(IParameterBlock<ISQPBItem>)
1013 ['{8553e66b-ee62-498b-8431-dff030211447}']
1014 end;
1015
1016 {Service Request Block (SRB).
1017
1018 The SRB specifies what is requested from the Service Manager when starting a
1019 service or querying a service. It is allocated empty by the ServiceManager API and
1020 the parameters are then added to it. Each individual parameter may be accessed
1021 by the ISRBItem interface which can be used to set the value, if any, of the parameter.
1022
1023 The SRB parameters, and the associated symbolic codes and parameter values may be
1024 found in the Interbase 6.0 API Guide.
1025
1026 }
1027
1028 ISRBItem = interface(IParameterBlockItem)
1029 ['{47ec790e-f265-4b30-9dcd-261e51677245}']
1030 end;
1031
1032 ISRB = interface(IParameterBlock<ISRBItem>)
1033 ['{9f2e204f-3c33-4e44-90f9-9135e95dafb9}']
1034 end;
1035
1036 {The Service Query Results Interface.
1037
1038 An IServiceQueryResults interface is returned by the IServiceManager Query
1039 method. The interface provides access to the information requested and
1040 returned by the method.
1041
1042 IServiceQueryResults itself gives access to a collection of IServiceQueryResultItem.
1043 Each one provides information requested, as indicated by the ItemType and the actual
1044 value of the information. In some cases, the returned item is itself a
1045 collection of IServiceQueryResultSubItem.
1046
1047 The IServiceQueryResultItem items, and the associated symbolic codes and parameter values may be
1048 found in the Interbase 6.0 API Guide.
1049 }
1050
1051 IServiceQueryResultSubItem = interface
1052 ['{8a4c381e-9923-4cc9-a96b-553729248640}']
1053 function getItemType: byte;
1054 function getSize: integer;
1055 procedure getRawBytes(var Buffer);
1056 function getAsString: AnsiString;
1057 function getAsInteger: integer;
1058 function getAsByte: byte;
1059 function CopyTo(stream: TStream; count: integer): integer;
1060 property AsString: AnsiString read getAsString;
1061 property AsInteger: integer read getAsInteger;
1062 property AsByte: byte read getAsByte;
1063 end;
1064
1065 IServiceQueryResultItem = interface(IServiceQueryResultSubItem)
1066 ['{b2806886-206c-4024-8df9-5fe0a7630a5e}']
1067 function getCount: integer;
1068 function getItem(index: integer): IServiceQueryResultSubItem;
1069 function find(ItemType: byte): IServiceQueryResultSubItem;
1070 property Items[index: integer]: IServiceQueryResultSubItem read getItem; default;
1071 property Count: integer read getCount;
1072 end;
1073
1074 IServiceQueryResults = interface
1075 ['{8fbbef7d-fe03-4409-828a-a787d34ef531}']
1076 function getCount: integer;
1077 function getItem(index: integer): IServiceQueryResultItem;
1078 function find(ItemType: byte): IServiceQueryResultItem;
1079 procedure PrintBuf; {can be used to print buffer in hex for debugging}
1080 property Items[index: integer]: IServiceQueryResultItem read getItem; default;
1081 property Count: integer read getCount;
1082 end;
1083
1084 IFirebirdLibrary = interface;
1085
1086 {The IServiceManager interface provides access to a service manager. It can
1087 used to Detach and re-attach to Service Manager, to start services and to
1088 query the service manager.
1089
1090 The interface is returned by the FirebirdAPI GetService Manager method.
1091 }
1092
1093 { IServiceManager }
1094
1095 IServiceManager = interface
1096 ['{905b587d-1e1f-4e40-a3f8-a3519f852e48}']
1097 function getFirebirdAPI: IFirebirdAPI;
1098 function getSPB: ISPB;
1099 function getServerName: AnsiString;
1100 function getProtocol: TProtocol;
1101 function getPortNo: AnsiString;
1102 procedure Attach;
1103 procedure Detach(Force: boolean=false);
1104 function IsAttached: boolean;
1105 function AllocateSRB: ISRB;
1106 function AllocateSQPB: ISQPB;
1107 function Start(Request: ISRB; RaiseExceptionOnError: boolean=true): boolean;
1108 function Query(SQPB: ISQPB; Request: ISRB; RaiseExceptionOnError: boolean=true) :IServiceQueryResults; overload;
1109 function Query(Request: ISRB; RaiseExceptionOnError: boolean=true) :IServiceQueryResults; overload;
1110 end;
1111
1112 {Tbe Firebird Library API used to get information about the Firebird library}
1113
1114
1115 IFirebirdLibrary = interface
1116 ['{3c04e0a1-12e0-428a-b2e1-bc6fcd97b79b}']
1117 function GetHandle: TLibHandle;
1118 function GetLibraryName: string;
1119 function GetLibraryFilePath: string;
1120 function GetFirebirdAPI: IFirebirdAPI;
1121 end;
1122
1123 {The Firebird API.
1124
1125 This is the base interface and is used to create/open a database connection, to
1126 start a transaction on multiple databases and the access the service manager.
1127
1128 The interface is returned by the FirebirdAPI function.
1129 }
1130
1131 IFirebirdAPI = interface
1132 ['{edeee691-c8d3-4dcf-a780-cd7e432821d5}']
1133 {Database connections}
1134 function AllocateDPB: IDPB;
1135 function OpenDatabase(DatabaseName: AnsiString; DPB: IDPB; RaiseExceptionOnConnectError: boolean=true): IAttachment;
1136 function CreateDatabase(DatabaseName: AnsiString; DPB: IDPB; RaiseExceptionOnError: boolean=true): IAttachment; overload;
1137 function CreateDatabase(sql: AnsiString; aSQLDialect: integer; RaiseExceptionOnError: boolean=true): IAttachment; overload;
1138
1139 {Start Transaction against multiple databases}
1140 function AllocateTPB: ITPB;
1141 function StartTransaction(Attachments: array of IAttachment;
1142 TPB: array of byte; DefaultCompletion: TTransactionCompletion=taCommit): ITransaction; overload;
1143 function StartTransaction(Attachments: array of IAttachment;
1144 TPB: ITPB; DefaultCompletion: TTransactionCompletion=taCommit): ITransaction; overload;
1145
1146 {Service Manager}
1147 function HasServiceAPI: boolean;
1148 function AllocateSPB: ISPB;
1149 function GetServiceManager(ServerName: AnsiString; Protocol: TProtocol; SPB: ISPB): IServiceManager; overload;
1150 function GetServiceManager(ServerName: AnsiString; Port: AnsiString; Protocol: TProtocol; SPB: ISPB): IServiceManager; overload;
1151
1152 {Information}
1153 function GetStatus: IStatus;
1154 function HasRollbackRetaining: boolean;
1155 function IsEmbeddedServer: boolean;
1156 function GetImplementationVersion: AnsiString;
1157
1158 {Firebird 3 API}
1159 function HasMasterIntf: boolean;
1160 function GetIMaster: TObject;
1161 function GetFBLibrary: IFirebirdLibrary;
1162 end;
1163
1164 type
1165 TOnGetLibraryName = procedure(var libname: string);
1166
1167 const
1168 OnGetLibraryName: TOnGetLibraryName = nil;
1169 AllowUseOfFBLIB: boolean = false;
1170
1171 type
1172 { EIBError }
1173
1174 EIBError = class(EDatabaseError)
1175 private
1176 FSQLCode: Long;
1177 public
1178 constructor Create(ASQLCode: Long; Msg: AnsiString);
1179 property SQLCode: Long read FSQLCode;
1180 end;
1181
1182 { EIBInterBaseError - Firebird Engine errors}
1183
1184 EIBInterBaseError = class(EIBError)
1185 private
1186 FIBErrorCode: Long;
1187 public
1188 constructor Create(Status: IStatus); overload;
1189 constructor Create(ASQLCode: Long; AIBErrorCode: Long; Msg: AnsiString); overload;
1190 property IBErrorCode: Long read FIBErrorCode;
1191 end;
1192
1193 {IB Client Exceptions}
1194 EIBClientError = class(EIBError);
1195
1196 {IBError is used internally and by IBX to throw an EIBClientError}
1197
1198 procedure IBError(ErrMess: TIBClientError; const Args: array of const);
1199
1200 {The Firebird API function is used to access the IFirebirdAPI interface.
1201
1202 It will load the Firebird Client Library if this is not already loaded and
1203 select an implementation of the Firebird API (legacy 2.5 or 3.0.
1204 }
1205
1206 function FirebirdAPI: IFirebirdAPI;
1207
1208 {IBX support functions. Probably best ignored i.e. always used the FirebirdAPI
1209 functino to load the library and check if it's loaded.}
1210
1211 function TryIBLoad: Boolean;
1212 procedure CheckIBLoaded;
1213
1214 {If you want to explicitly load the Firebird library from a
1215 non-default location then use this function and its GetFirebirdAPI function
1216 to get the API.}
1217
1218 function LoadFBLibrary(aLibPathName: string): IFirebirdLibrary;
1219
1220 implementation
1221
1222 uses FBClientAPI
1223 {$IFDEF USELEGACYFIREBIRDAPI}, FB25ClientAPI {$ENDIF}
1224 {$IFDEF USEFIREBIRD3API}, FB30ClientAPI {$ENDIF};
1225
1226 var FDefaultFBLibrary: IFirebirdLibrary;
1227
1228 type
1229
1230 { TFBLibrary }
1231
1232 TFBLibraryImpl = class(TFBLibrary)
1233 protected
1234 function GetFirebird3API: IFirebirdAPI; override;
1235 function GetLegacyFirebirdAPI: IFirebirdAPI; override;
1236 end;
1237
1238 function TFBLibraryImpl.GetFirebird3API: IFirebirdAPI;
1239 begin
1240 {$IFDEF USEFIREBIRD3API}
1241 Result := TFB30ClientAPI.Create(self);
1242 {$ELSE}
1243 Result := nil;
1244 {$ENDIF}
1245 end;
1246
1247 function TFBLibraryImpl.GetLegacyFirebirdAPI: IFirebirdAPI;
1248 begin
1249 {$IFDEF USELEGACYFIREBIRDAPI}
1250 Result := TFB25ClientAPI.Create(self);
1251 {$ELSE}
1252 Result := nil;
1253 {$ENDIF}
1254 end;
1255
1256 function FirebirdAPI: IFirebirdAPI;
1257 begin
1258 if FDefaultFBLibrary = nil then
1259 CheckIBLoaded;
1260 Result := FDefaultFBLibrary.GetFirebirdAPI;
1261 end;
1262
1263 function TryIBLoad: Boolean;
1264 var fblib: IFirebirdLibrary;
1265 begin
1266 Result := FDefaultFBLibrary <> nil;
1267 try
1268 if not Result then
1269 begin
1270 fblib := TFBLibraryImpl.Create;
1271 if (fblib <> nil) and (fblib.GetFirebirdAPI <> nil) then
1272 FDefaultFBLibrary := fblib;
1273 Result := FDefaultFBLibrary <> nil;
1274 end;
1275 except
1276 SysUtils.showexception(ExceptObject,ExceptAddr);
1277 Result := false;
1278 end;
1279 end;
1280
1281 procedure CheckIBLoaded;
1282 begin
1283 if not TryIBLoad then
1284 IBError(ibxeInterBaseMissing, [nil]);
1285 end;
1286
1287 function LoadFBLibrary(aLibPathName: string): IFirebirdLibrary;
1288 var fblib: IFirebirdLibrary;
1289 begin
1290 if trim(aLibPathName) = '' then
1291 begin
1292 CheckIBLoaded;
1293 Result := FDefaultFBLibrary;
1294 end
1295 else
1296 begin
1297 fblib := TFBLibraryImpl.GetFBLibrary(aLibPathName);
1298 if (fblib = nil) or (fblib.GetFirebirdAPI = nil) then
1299 IBError(ibxeInterBaseMissing, [nil]);
1300 Result := fblib;
1301 end;
1302 end;
1303
1304 { EIBError }
1305
1306 constructor EIBError.Create(ASQLCode: Long; Msg: AnsiString);
1307 begin
1308 inherited Create(Msg);
1309 FSQLCode := ASQLCode;
1310 end;
1311
1312 { EIBInterBaseError }
1313
1314 constructor EIBInterBaseError.Create(Status: IStatus);
1315 begin
1316 inherited Create(Status.Getsqlcode,Status.GetMessage);
1317 FIBErrorCode := Status.GetIBErrorCode;
1318 end;
1319
1320 constructor EIBInterBaseError.Create(ASQLCode: Long; AIBErrorCode: Long;
1321 Msg: AnsiString);
1322 begin
1323 inherited Create(ASQLCode,Msg);
1324 FIBErrorCode := AIBErrorCode;
1325 end;
1326
1327 procedure IBError(ErrMess: TIBClientError; const Args: array of const);
1328 begin
1329 raise EIBClientError.Create(Ord(ErrMess),
1330 Format(GetErrorMessage(ErrMess), Args));
1331 end;
1332
1333 initialization
1334 FDefaultFBLibrary := nil;
1335
1336 finalization
1337 FDefaultFBLibrary := nil;
1338
1339 end.
1340