ViewVC Help
View File | Revision Log | Show Annotations | Download File | View Changeset | Root Listing
root/public/ibx/branches/udr/client/IB.pas
(Generate patch)

Comparing:
ibx/trunk/fbintf/IB.pas (file contents), Revision 308 by tony, Sat Jul 18 10:26:30 2020 UTC vs.
ibx/branches/udr/client/IB.pas (file contents), Revision 391 by tony, Thu Jan 27 16:34:24 2022 UTC

# Line 129 | Line 129 | uses
129    Classes,
130    {$IFDEF WINDOWS}Windows, {$ENDIF}
131    {$IFDEF FPC} Dynlibs, {$ENDIF}
132 <  SysUtils, DB, FBMessages, IBExternals;
132 >  SysUtils, DB, FBMessages, IBExternals, FmtBcd;
133  
134   const
135    {Interface version information}
136    FBIntf_Major = 1;
137 <  FBIntf_Minor = 1;
138 <  FBIntf_Release = 6;
139 <  FBIntf_Version = '1.1.6';
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.}
# Line 165 | Line 182 | const
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
# Line 215 | Line 241 | type
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  
# Line 234 | Line 278 | type
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  
# Line 251 | Line 301 | type
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
# Line 265 | Line 318 | type
318  
319     TIBDataBaseErrorMessages   = set of TIBDataBaseErrorMessage;
320  
321 +   TStatusCode = long;
322 +
323    IStatus = interface
324      ['{34167722-af38-4831-b08a-93162d58ede3}']
325 <    function GetIBErrorCode: Long;
326 <    function Getsqlcode: Long;
325 >    function InErrorState: boolean;
326 >    function GetIBErrorCode: TStatusCode;
327 >    function Getsqlcode: TStatusCode;
328      function GetMessage: AnsiString;
329      function CheckStatusVector(ErrorCodes: array of TFBStatusCode): Boolean;
330      function GetIBDataBaseErrorMessages: TIBDataBaseErrorMessages;
331 +    function Clone: IStatus;
332      procedure SetIBDataBaseErrorMessages(Value: TIBDataBaseErrorMessages);
333    end;
334  
# Line 291 | Line 348 | type
348      function GetSQLTypeName: AnsiString;
349      function GetScale: integer;
350      function GetSize: cardinal;
351 +    function GetCharSetWidth: integer;
352      function GetCharSetID: cardinal;
353      function GetTableName: AnsiString;
354      function GetColumnName: AnsiString;
# Line 329 | Line 387 | type
387      function GetAsBoolean(index: array of integer): boolean;
388      function GetAsCurrency(index: array of integer): Currency;
389      function GetAsInt64(index: array of integer): Int64;
390 <    function GetAsDateTime(index: array of integer): TDateTime;
390 >    function GetAsDateTime(index: array of integer): TDateTime; overload;
391 >    procedure GetAsDateTime(index: array of integer; var aDateTime: TDateTime; var dstOffset: smallint; var aTimezoneID: TFBTimeZoneID); overload;
392 >    procedure GetAsDateTime(index: array of integer; var aDateTime: TDateTime; var dstOffset: smallint; var aTimezone: AnsiString); overload;
393 >    procedure GetAsTime(index: array of integer; var aTime: TDateTime; var dstOffset: smallint; var aTimezoneID: TFBTimeZoneID; OnDate: TDateTime); overload;
394 >    procedure GetAsTime(index: array of integer; var aTime: TDateTime; var dstOffset: smallint; var aTimezone: AnsiString; OnDate: TDateTime); overload;
395 >    function GetAsUTCDateTime(index: array of integer): TDateTime;
396      function GetAsDouble(index: array of integer): Double;
397      function GetAsFloat(index: array of integer): Float;
398      function GetAsLong(index: array of integer): Long;
399      function GetAsShort(index: array of integer): Short;
400      function GetAsString(index: array of integer): AnsiString;
401      function GetAsVariant(index: array of integer): Variant;
402 +    function GetAsBCD(index: array of integer): tBCD;
403      procedure SetAsInteger(index: array of integer; AValue: integer);
404      procedure SetAsBoolean(index: array of integer; AValue: boolean);
405      procedure SetAsCurrency(index: array of integer; Value: Currency);
406      procedure SetAsInt64(index: array of integer; Value: Int64);
407      procedure SetAsDate(index: array of integer; Value: TDateTime);
408 +    procedure SetAsDateTime(index: array of integer; Value: TDateTime); overload;
409 +    procedure SetAsDateTime(index: array of integer; aValue: TDateTime; aTimeZoneID: TFBTimeZoneID); overload;
410 +    procedure SetAsDateTime(index: array of integer; aValue: TDateTime; aTimeZone: AnsiString); overload;
411 +    procedure SetAsTime(index: array of integer; Value: TDateTime); overload;
412 +    procedure SetAsTime(index: array of integer; aValue: TDateTime; OnDate: TDateTime; aTimeZoneID: TFBTimeZoneID); overload;
413 +    procedure SetAsTime(index: array of integer; aValue: TDateTime; OnDate: TDateTime; aTimeZone: AnsiString); overload;
414 +    procedure SetAsUTCDateTime(index: array of integer; aUTCTime: TDateTime);
415      procedure SetAsLong(index: array of integer; Value: Long);
345    procedure SetAsTime(index: array of integer; Value: TDateTime);
346    procedure SetAsDateTime(index: array of integer; Value: TDateTime);
416      procedure SetAsDouble(index: array of integer; Value: Double);
417      procedure SetAsFloat(index: array of integer; Value: Float);
418      procedure SetAsShort(index: array of integer; Value: Short);
419      procedure SetAsString(index: array of integer; Value: AnsiString);
420      procedure SetAsVariant(index: array of integer; Value: Variant);
421 +    procedure SetAsBcd(index: array of integer; aValue: tBCD);
422      procedure SetBounds(dim, UpperBound, LowerBound: integer);
423      function GetAttachment: IAttachment;
424      function GetTransaction: ITransaction;
# Line 421 | Line 491 | type
491  
492    TIBDateTimeFormats = (dfTimestamp, {SQL TIMESTAMP}
493                          dfDateTime,   {SQL DATETIME}
494 <                        dfTime);      {SQL TIME}
494 >                        dfTime,      {SQL TIME}
495 >                        dfTimestampTZ, {SQL_TIMESTAMP_TZ}
496 >                        dfTimeTZ);       {SQLTIME_TZ
497  
498    { IColumnMetaData }
499  
# Line 439 | Line 511 | type
511      function getScale: integer;
512      function getCharSetID: cardinal;
513      function getCodePage: TSystemCodePage;
514 +    function GetCharSetWidth: integer;
515      function getIsNullable: boolean;
516      function GetSize: cardinal;
517      function GetArrayMetaData: IArrayMetaData; {Valid only for Array SQL Type}
# Line 446 | Line 519 | type
519      function GetDateTimeStrLength(DateTimeFormat: TIBDateTimeFormats): integer;
520      function GetStatement: IStatement;
521      function GetTransaction: ITransaction;
522 +    function GetAttachment: IAttachment;
523      property Name: AnsiString read GetName;
524      property Size: cardinal read GetSize;
525      property SQLType: cardinal read GetSQLType;
# Line 491 | Line 565 | type
565      function GetAsBoolean: boolean;
566      function GetAsCurrency: Currency;
567      function GetAsInt64: Int64;
568 <    function GetAsDateTime: TDateTime;
568 >    function GetAsDateTime: TDateTime; overload;
569 >    procedure GetAsDateTime(var aDateTime: TDateTime; var dstOffset: smallint; var aTimezoneID: TFBTimeZoneID); overload;
570 >    procedure GetAsDateTime(var aDateTime: TDateTime; var dstOffset: smallint; var aTimezone: AnsiString); overload;
571 >    procedure GetAsTime(var aTime: TDateTime; var dstOffset: smallint; var aTimezoneID: TFBTimeZoneID; OnDate: TDateTime); overload;
572 >    procedure GetAsTime(var aTime: TDateTime; var dstOffset: smallint; var aTimezone: AnsiString; OnDate: TDateTime); overload;
573 >    procedure GetAsTime(var aTime: TDateTime; var dstOffset: smallint; var aTimezoneID: TFBTimeZoneID); overload;
574 >    procedure GetAsTime(var aTime: TDateTime; var dstOffset: smallint; var aTimezone: AnsiString); overload;
575 >    function GetAsUTCDateTime: TDateTime;
576      function GetAsDouble: Double;
577      function GetAsFloat: Float;
578      function GetAsLong: Long;
# Line 504 | Line 585 | type
585      function GetAsBlob: IBlob; overload;
586      function GetAsBlob(BPB: IBPB): IBlob; overload;
587      function GetAsArray: IArray;
588 +    function GetAsBCD: tBCD;
589 +    function GetAsNumeric: IFBNumeric;
590      property AsDate: TDateTime read GetAsDateTime;
591      property AsBoolean:boolean read GetAsBoolean;
592      property AsTime: TDateTime read GetAsDateTime;
# Line 521 | Line 604 | type
604      property AsVariant: Variant read GetAsVariant ;
605      property AsBlob: IBlob read GetAsBlob;
606      property AsArray: IArray read GetAsArray;
607 +    property AsBCD: tBCD read GetAsBCD;
608 +    property AsNumeric: IFBNumeric read GetAsNumeric;
609      property IsNull: Boolean read GetIsNull;
610      property Value: Variant read GetAsVariant;
611    end;
# Line 536 | Line 621 | type
621     function getCount: integer;
622     function GetStatement: IStatement;
623     function GetTransaction: ITransaction;
624 +   function GetAttachment: IAttachment;
625 +   function FieldExists(Idx: AnsiString): boolean;
626     function ByName(Idx: AnsiString): ISQLData;
627     function getSQLData(index: integer): ISQLData;
628     procedure GetData(index: integer; var IsNull:boolean; var len: short; var data: PByte);
# Line 551 | Line 638 | type
638    }
639    IResultSet = interface(IResults)
640      ['{0ae4979b-7857-4e8c-8918-ec6f155b51a0}']
641 <    function FetchNext: boolean;
641 >    function FetchNext: boolean; {fetch next record}
642 >    function FetchPrior: boolean; {fetch previous record}
643 >    function FetchFirst:boolean; {fetch first record}
644 >    function FetchLast: boolean; {fetch last record}
645 >    function FetchAbsolute(position: Integer): boolean; {fetch record by its absolute position in result set}
646 >    function FetchRelative(offset: Integer): boolean; {fetch record by position relative to current}
647      function GetCursorName: AnsiString;
648 +    function IsBof: boolean;
649      function IsEof: boolean;
650      procedure Close;
651    end;
652  
653    {The ISQLParam interface is used to provide access to each parameter in a
654 <   parametised SQL Statement. It subclasses IColumnMetaData and this part of
562 <   the interface may be used to access information on the expected SQL Type, etc.
563 <
564 <   It also subclasses ISQLData and this part of the interface may be used to access
565 <   current values for each parameter.
566 <
567 <   Otherwise, the interface comprises the Setter Methods and properties used to
654 >   parametised SQL Statement. The interface comprises the Setter Methods and properties used to
655     set the value of each parameter.
656  
657     Automatic conversion is provided to and from strings. That is GetAsString and
658     SetAsString are safe to use for sql types other than boolean - provided automatic
659     conversion is possible.
660 +
661 +   ISQLParam is subclassed from the IParamMetaData interface. This interface provides
662 +   access to the parameter metadata. This metadata is mutable and can change after
663 +   a parameter is set to a given value. This is acceptable as long as the parameter
664 +   metadata is type compatible with the underlying column metadata and hence the
665 +   parameter value can be converted by Firebird into a value acceptable by the
666 +   underlying column. The column metadata, which is unmutable, can be obtained
667 +   by the ISQLParam.getColMetadata interface. When a statement is prepared, the
668 +   parameter metadata is always initialised to the column metadata.
669    }
670  
671 <  ISQLParam = interface
672 <    ['{b22b4578-6d41-4807-a9a9-d2ec8d1d5a14}']
577 <    function GetIndex: integer;
671 >  IParamMetaData = interface
672 >  ['{4e148c4e-2d48-4991-a263-f66eca05c6aa}']
673      function GetSQLType: cardinal;
674      function GetSQLTypeName: AnsiString;
675      function getSubtype: integer;
581    function getName: AnsiString;
676      function getScale: integer;
677      function getCharSetID: cardinal;
678      function getCodePage: TSystemCodePage;
679      function getIsNullable: boolean;
680      function GetSize: cardinal;
681 +    property SQLType: cardinal read GetSQLType;
682 +  end;
683 +
684 +  ISQLParam = interface(IParamMetaData)
685 +    ['{b22b4578-6d41-4807-a9a9-d2ec8d1d5a14}']
686 +    function getColMetadata: IParamMetaData;
687 +    function GetStatement: IStatement;
688 +    function GetTransaction: ITransaction;
689 +    function GetAttachment: IAttachment;
690 +    function GetIndex: integer;
691 +    function getName: AnsiString;
692      function GetAsBoolean: boolean;
693      function GetAsCurrency: Currency;
694      function GetAsInt64: Int64;
695 <    function GetAsDateTime: TDateTime;
695 >    function GetAsDateTime: TDateTime; overload;
696 >    procedure GetAsDateTime(var aDateTime: TDateTime; var dstOffset: smallint; var aTimezoneID: TFBTimeZoneID); overload;
697 >    procedure GetAsDateTime(var aDateTime: TDateTime; var dstOffset: smallint; var aTimezone: AnsiString); overload;
698 >    procedure GetAsTime(var aTime: TDateTime; var dstOffset: smallint; var aTimezoneID: TFBTimeZoneID; OnDate: TDateTime); overload;
699 >    procedure GetAsTime(var aTime: TDateTime; var dstOffset: smallint; var aTimezone: AnsiString; OnDate: TDateTime); overload;
700 >    procedure GetAsTime(var aTime: TDateTime; var dstOffset: smallint; var aTimezoneID: TFBTimeZoneID); overload;
701 >    procedure GetAsTime(var aTime: TDateTime; var dstOffset: smallint; var aTimezone: AnsiString); overload;
702 >    function GetAsUTCDateTime: TDateTime;
703      function GetAsDouble: Double;
704      function GetAsFloat: Float;
705      function GetAsLong: Long;
# Line 599 | Line 711 | type
711      function GetAsVariant: Variant;
712      function GetAsBlob: IBlob;
713      function GetAsArray: IArray;
714 +    function GetAsBCD: tBCD;
715 +    function GetAsNumeric: IFBNumeric;
716      procedure Clear;
717      function GetModified: boolean;
718      procedure SetAsBoolean(AValue: boolean);
# Line 606 | Line 720 | type
720      procedure SetAsInt64(aValue: Int64);
721      procedure SetAsDate(aValue: TDateTime);
722      procedure SetAsLong(aValue: Long);
723 <    procedure SetAsTime(aValue: TDateTime);
724 <    procedure SetAsDateTime(aValue: TDateTime);
723 >    procedure SetAsTime(aValue: TDateTime); overload;
724 >    procedure SetAsTime(aValue: TDateTime; OnDate: TDateTime; aTimeZoneID: TFBTimeZoneID); overload;
725 >    procedure SetAsTime(aValue: TDateTime; OnDate: TDateTime; aTimeZone: AnsiString); overload;
726 >    procedure SetAsTime(aValue: TDateTime; aTimeZoneID: TFBTimeZoneID); overload;
727 >    procedure SetAsTime(aValue: TDateTime; aTimeZone: AnsiString); overload;
728 >    procedure SetAsDateTime(aValue: TDateTime); overload;
729 >    procedure SetAsDateTime(aValue: TDateTime; aTimeZoneID: TFBTimeZoneID); overload;
730 >    procedure SetAsDateTime(aValue: TDateTime; aTimeZone: AnsiString); overload;
731 >    procedure SetAsUTCDateTime(aUTCTime: TDateTime);
732      procedure SetAsDouble(aValue: Double);
733      procedure SetAsFloat(aValue: Float);
734      procedure SetAsPointer(aValue: Pointer);
# Line 619 | Line 740 | type
740      procedure SetAsArray(anArray: IArray);
741      procedure SetAsQuad(aValue: TISC_QUAD);
742      procedure SetCharSetID(aValue: cardinal);
743 +    procedure SetAsBcd(aValue: tBCD);
744 +    procedure SetAsNumeric(Value: IFBNumeric);
745      property AsDate: TDateTime read GetAsDateTime write SetAsDate;
746      property AsBoolean:boolean read GetAsBoolean write SetAsBoolean;
747      property AsTime: TDateTime read GetAsDateTime write SetAsTime;
# Line 635 | Line 758 | type
758      property AsVariant: Variant read GetAsVariant write SetAsVariant;
759      property AsBlob: IBlob read GetAsBlob write SetAsBlob;
760      property AsArray: IArray read GetAsArray write SetAsArray;
761 +    property AsBCD: tBCD read GetAsBCD write SetAsBCD;
762 +    property AsNumeric: IFBNumeric read GetAsNumeric write SetAsNumeric;
763      property AsQuad: TISC_QUAD read GetAsQuad write SetAsQuad;
764      property Value: Variant read GetAsVariant write SetAsVariant;
765      property IsNull: Boolean read GetIsNull write SetIsNull;
766      property IsNullable: Boolean read GetIsNullable;
767      property Modified: Boolean read getModified;
768      property Name: AnsiString read GetName;
644    property SQLType: cardinal read GetSQLType;
769    end;
770  
771     {
# Line 649 | Line 773 | type
773     for the input to an SQL Statement
774    }
775  
776 +  { ISQLParams }
777 +
778    ISQLParams = interface
779      ['{c6d95ac7-b2b7-461b-b890-afef0acbb077}']
780      function getCount: integer;
781      function getSQLParam(index: integer): ISQLParam;
782 +    function ParamExists(Idx: AnsiString): boolean;
783      function ByName(Idx: AnsiString): ISQLParam ;
784      function GetModified: Boolean;
785      function GetHasCaseSensitiveParams: Boolean;
786 +    function GetStatement: IStatement;
787 +    function GetTransaction: ITransaction;
788 +    function GetAttachment: IAttachment;
789 +    procedure Clear;
790      property Modified: Boolean read GetModified;
791      property Params[index: integer]: ISQLParam read getSQLParam; default;
792      property Count: integer read getCount;
# Line 668 | Line 799 | type
799  
800    TPerfCounters = array[TPerfStats] of Int64;
801  
802 +  {Batch Query Execution Support}
803 +
804 +  TBatchCompletionState = (bcExecuteFailed, bcSuccessNoInfo, bcNoMoreErrors);
805 +
806 +  IBatchCompletion = interface
807 +  ['{9bc3d49d-16d9-4606-94e5-ee987103ad92}']
808 +    function getTotalProcessed: cardinal;
809 +    function getState(updateNo: cardinal): TBatchCompletionState;
810 +    function getStatusMessage(updateNo: cardinal): AnsiString;
811 +    function getUpdated: integer;
812 +    function getErrorStatus(var RowNo: integer; var status: IStatus): boolean;
813 +    end;
814 +
815    {The IStatement interface provides access to an SQL Statement once it has been
816     initially prepared. The interface is returned from the IAttachment interface.
817     }
818  
819 +  TStatementFlag = (stHasCursor,stRepeatExecute,stScrollable);
820 +  TStatementFlags = set of TStatementFlag;
821 +
822    IStatement = interface
823      ['{a260576d-a07d-4a66-b02d-1b72543fd7cf}']
824      function GetMetaData: IMetaData;  {Output Metadata}
# Line 679 | Line 826 | type
826      function GetPlan: AnsiString;
827      function GetRowsAffected(var SelectCount, InsertCount, UpdateCount, DeleteCount: integer): boolean;
828      function GetSQLStatementType: TIBSQLStatementTypes;
829 +    function GetSQLStatementTypeName: AnsiString;
830      function GetSQLText: AnsiString;
831      function GetProcessedSQLText: AnsiString;
832      function GetSQLDialect: integer;
833 +    function GetFlags: TStatementFlags;
834      function IsPrepared: boolean;
835 <    procedure Prepare(aTransaction: ITransaction=nil);
835 >    function HasBatchMode: boolean;
836 >    function IsInBatchMode: boolean;
837 >    procedure Prepare(aTransaction: ITransaction=nil); overload;
838 >    procedure Prepare(CursorName: AnsiString; aTransaction: ITransaction=nil); overload;
839      function Execute(aTransaction: ITransaction=nil): IResults;
840 <    function OpenCursor(aTransaction: ITransaction=nil): IResultSet;
840 >    function OpenCursor(aTransaction: ITransaction=nil): IResultSet; overload;
841 >    function OpenCursor(Scrollable: boolean; aTransaction: ITransaction=nil): IResultSet; overload;
842      function GetAttachment: IAttachment;
843      function GetTransaction: ITransaction;
844      procedure SetRetainInterfaces(aValue: boolean);
845      procedure EnableStatistics(aValue: boolean);
846      function GetPerfStatistics(var stats: TPerfCounters): boolean;
847 +    {IBatch interface support}
848 +    procedure AddToBatch;
849 +    function ExecuteBatch(aTransaction: ITransaction=nil): IBatchCompletion;
850 +    procedure CancelBatch;
851 +    function GetBatchCompletion: IBatchCompletion;
852 +    function GetBatchRowLimit: integer;
853 +    procedure SetBatchRowLimit(aLimit: integer);
854 +    {Stale Reference Check}
855 +    procedure SetStaleReferenceChecks(Enable:boolean); {default true}
856 +    function GetStaleReferenceChecks: boolean;
857 +
858      property MetaData: IMetaData read GetMetaData;
859      property SQLParams: ISQLParams read GetSQLParams;
860      property SQLStatementType: TIBSQLStatementTypes read GetSQLStatementType;
861    end;
862  
863 +  ITrInfoItem = interface
864 +    ['{41455e1a-f84e-4e26-aff0-1a78e8b69cfe}']
865 +    function getItemType: byte;
866 +    function getSize: integer;
867 +    function getAsString: AnsiString;
868 +    function getAsInteger: int64;
869 +    procedure DecodeTraIsolation(var IsolationType, RecVersion: byte);
870 +  end;
871 +
872 +  { ITrInformation }
873 +
874 +  ITrInformation = interface
875 +    ['{e6ea4a52-c1a1-44ba-9609-c8bcc7cba7b2}']
876 +    function GetCount: integer;
877 +    function GetItem(index: integer): ITrInfoItem;
878 +    function Find(ItemType: byte): ITrInfoItem;
879 +    procedure PrintBuf; {can be used to print buffer in hex for debugging}
880 +    property Count: integer read GetCount;
881 +    property Items[index: integer]: ITrInfoItem read getItem; default;
882 +  end;
883 +
884    {Transaction Parameter Block: (TPB)
885  
886     The TPB provides the parameters used when starting a transaction. It is allocated
# Line 707 | Line 892 | type
892     found in the Interbase 6.0 API Guide.
893    }
894  
895 <  ITPBItem = interface(IParameterBlockItem)
895 >  ITPBItem = interface(IParameterBlockItemWithTypeName)
896      ['{544c1f2b-7c12-4a87-a4a5-face7ea72671}']
897    end;
898  
899 <  ITPB = interface(IParameterBlock<ITPBItem>)
899 >  ITPB = interface(IParameterBlockWithTypeNames<ITPBItem>)
900      ['{7369b0ff-defe-437b-81fe-19b211d42d25}']
901 +    function AsText: AnsiString;
902    end;
903  
904    {The ITransactionAction interface provides access to a Transaction once it
# Line 725 | Line 911 | type
911  
912    TTransactionAction  = (TARollback, TACommit, TACommitRetaining, TARollbackRetaining);
913    TTransactionCompletion = TARollback.. TACommit;
914 +  TTrCompletionState = (trCommitted, trRolledback, trCommitFailed, trRollbackFailed);
915 +
916  
917    ITransaction = interface
918      ['{30928d0e-a9d7-4c61-b7cf-14f4f38abe2a}']
919      function getTPB: ITPB;
920      procedure Start(DefaultCompletion: TTransactionCompletion=taCommit);
921      function GetInTransaction: boolean;
922 +    function GetIsReadOnly: boolean;
923 +    function GetTransactionID: integer;
924 +    function GetJournalingActive(attachment: IAttachment): boolean;
925 +    function GetDefaultCompletion: TTransactionCompletion;
926      procedure PrepareForCommit; {Two phase commit - stage 1}
927 <    procedure Commit(Force: boolean=false);
927 >    function Commit(Force: boolean=false): TTrCompletionState;
928      procedure CommitRetaining;
929      function HasActivity: boolean;
930 <    procedure Rollback(Force: boolean=false);
930 >    function Rollback(Force: boolean=false): TTrCompletionState;
931      procedure RollbackRetaining;
932      function GetAttachmentCount: integer;
933      function GetAttachment(index: integer): IAttachment;
934 +    function GetTrInformation(Requests: array of byte): ITrInformation; overload;
935 +    function GetTrInformation(Request: byte): ITrInformation; overload;
936 +    function GetTransactionName: AnsiString;
937 +    procedure SetTransactionName(aValue: AnsiString);
938      property InTransaction: boolean read GetInTransaction;
939 +    property TransactionName: AnsiString read GetTransactionName write SetTransactionName;
940    end;
941  
942    { The IEvents Interface is used to handle events from a single database. The
# Line 769 | Line 966 | type
966      ['{6a0be233-ed08-4524-889c-2e45d0c20e5f}']
967      procedure GetEvents(EventNames: TStrings);
968      procedure SetEvents(EventNames: TStrings); overload;
969 <    procedure SetEvents(EventName: AnsiString); overload;
969 >    procedure SetEvents(EventName: string); overload;
970      procedure Cancel;
971      function ExtractEventCounts: TEventCounts;
972      procedure WaitForEvent;
# Line 777 | Line 974 | type
974      function GetAttachment: IAttachment;
975    end;
976  
977 +  TTZTextOptions = (tzOffset,      {Time Zone Rendered as an offset to GMT}
978 +                    tzGMT,         {No Time Zone. Time part is always rendered in GMT}
979 +                    tzOriginalID); {Time Zone shown as originally entered}
980 +
981 +  {The ITimeZoneServices interface provides access to the time zone database
982 +   used for the attachment. It may be used in support of TIMESTAMP WITH TIME ZONE
983 +   and TIME WITH TIME ZONE data types.}
984 +
985 +  ITimeZoneServices = interface
986 +    ['{163821f5-ebef-42b9-ac60-8ac4b5c09954}']
987 +    {utility functions}
988 +    function TimeZoneID2TimeZoneName(aTimeZoneID: TFBTimeZoneID): AnsiString;
989 +    function TimeZoneName2TimeZoneID(aTimeZone: AnsiString): TFBTimeZoneID;
990 +    function LocalTimeToGMT(aLocalTime: TDateTime; aTimeZone: AnsiString): TDateTime; overload;
991 +    function LocalTimeToGMT(aLocalTime: TDateTime; aTimeZoneID: TFBTimeZoneID): TDateTime; overload;
992 +    function GMTToLocalTime(aGMTTime: TDateTime; aTimeZone: AnsiString): TDateTime; overload;
993 +    function GMTToLocalTime(aGMTTime: TDateTime; aTimeZoneID: TFBTimeZoneID): TDateTime; overload;
994 +    function GetEffectiveOffsetMins(aLocalTime: TDateTime; aTimeZone: AnsiString): integer; overload;
995 +    function GetEffectiveOffsetMins(aLocalTime: TDateTime; aTimeZoneID: TFBTimeZoneID): integer; overload;
996 +
997 +    {Time Zone DB Information}
998 +    function UsingRemoteTZDB: boolean;
999 +    procedure SetUseLocalTZDB(useLocalTZDB: boolean);
1000 +    function GetLocalTimeZoneName: AnsiString;
1001 +    function GetLocalTimeZoneID: TFBTimeZoneID;
1002 +    procedure GetTimeZoneInfo(aTimeZone: AnsiString; OnDate: TDateTime;
1003 +                           var ZoneOffset, DSTOffset, EffectiveOffset: integer);
1004 +    {Configurable Options}
1005 +    function GetTimeTZDate: TDateTime;
1006 +    procedure SetTimeTZDate(aDate: TDateTime);
1007 +    function GetTZTextOption: TTZTextOptions;
1008 +    procedure SetTZTextOption(aOptionValue: TTZTextOptions);
1009 +  end;
1010 +
1011    {The IDBInformation Interface.
1012  
1013     An IDBInformation interface is returned by the  IAttachment GetDBInformation
# Line 805 | Line 1036 | type
1036      function getSize: integer;
1037      procedure getRawBytes(var Buffer);
1038      function getAsString: AnsiString;
1039 <    function getAsInteger: integer;
1039 >    function getAsInteger: int64;
1040      procedure DecodeIDCluster(var ConnectionType: integer; var DBFileName, DBSiteName: AnsiString);
1041      function getAsBytes: TByteArray;
1042      function getAsDateTime: TDateTime;
# Line 817 | Line 1048 | type
1048      function GetCount: integer;
1049      function GetItem(index: integer): IDBInfoItem;
1050      function Find(ItemType: byte): IDBInfoItem;
1051 <    property AsInteger: integer read getAsInteger;
1051 >    property AsInteger: int64 read getAsInteger;
1052      property AsString: AnsiString read GetAsString;
1053      property Count: integer read GetCount;
1054      property Items[index: integer]: IDBInfoItem read getItem; default;
# Line 860 | Line 1091 | type
1091     found in the Interbase 6.0 API Guide.
1092     }
1093  
1094 <  IDPBItem = interface(IParameterBlockItem)
1094 >  IDPBItem = interface(IParameterBlockItemWithTypeName)
1095      ['{123d4ad0-087a-4cd1-a344-1b3d03b30673}']
1096    end;
1097  
1098 <  IDPB = interface(IParameterBlock<IDPBItem>)
1099 <    ['{e676067b-1cf4-4eba-9256-9724f57e0d16}']
1100 <  end;
1098 >   IDPB = interface(IParameterBlockWithTypeNames<IDPBItem>)
1099 >     ['{e676067b-1cf4-4eba-9256-9724f57e0d16}']
1100 >   end;
1101 >
1102 >   {Journaling options. Default is [joReadWriteTransactions,joModifyQueries] }
1103 >
1104 >   TJournalOption = (joReadOnlyTransactions, joReadWriteTransactions,
1105 >                     joModifyQueries, joReadOnlyQueries,joNoServerTable);
1106 >
1107 >   TJournalOptions = set of TJournalOption;
1108  
1109    {The IAttachment interface provides access to a Database Connection. It may be
1110     used to:
# Line 905 | Line 1143 | type
1143      procedure Disconnect(Force: boolean=false);
1144      function IsConnected: boolean;
1145      procedure DropDatabase;
1146 <    function StartTransaction(TPB: array of byte; DefaultCompletion: TTransactionCompletion=taCommit): ITransaction; overload;
1147 <    function StartTransaction(TPB: ITPB; DefaultCompletion: TTransactionCompletion=taCommit): ITransaction; overload;
1146 >    function StartTransaction(TPB: array of byte;
1147 >                              DefaultCompletion: TTransactionCompletion=taCommit;
1148 >                              aName: AnsiString=''): ITransaction; overload;
1149 >    function StartTransaction(TPB: ITPB;
1150 >                              DefaultCompletion: TTransactionCompletion=taCommit;
1151 >                              aName: AnsiString=''): ITransaction; overload;
1152      procedure ExecImmediate(transaction: ITransaction; sql: AnsiString; SQLDialect: integer); overload;
1153      procedure ExecImmediate(TPB: array of byte; sql: AnsiString; SQLDialect: integer); overload;
1154      procedure ExecImmediate(transaction: ITransaction; sql: AnsiString); overload;
# Line 915 | Line 1157 | type
1157      function ExecuteSQL(transaction: ITransaction; sql: AnsiString; SQLDialect: integer; params: array of const): IResults; overload;
1158      function ExecuteSQL(TPB: array of byte; sql: AnsiString; params: array of const): IResults; overload;
1159      function ExecuteSQL(transaction: ITransaction; sql: AnsiString; params: array of const): IResults; overload;
918    function OpenCursor(transaction: ITransaction; sql: AnsiString; aSQLDialect: integer): IResultSet; overload;
1160      function OpenCursor(transaction: ITransaction; sql: AnsiString; aSQLDialect: integer;
1161 +                             Scrollable: boolean=false): IResultSet; overload;
1162 +    function OpenCursor(transaction: ITransaction; sql: AnsiString; aSQLDialect: integer;
1163 +                             params: array of const): IResultSet; overload;
1164 +    function OpenCursor(transaction: ITransaction; sql: AnsiString; Scrollable: boolean=false): IResultSet; overload;
1165 +    function OpenCursor(transaction: ITransaction; sql: AnsiString; Scrollable: boolean;
1166                               params: array of const): IResultSet; overload;
921    function OpenCursor(transaction: ITransaction; sql: AnsiString): IResultSet; overload;
1167      function OpenCursor(transaction: ITransaction; sql: AnsiString;
1168                               params: array of const): IResultSet; overload;
1169 <    function OpenCursorAtStart(transaction: ITransaction; sql: AnsiString; aSQLDialect: integer): IResultSet; overload;
1169 >    function OpenCursor(transaction: ITransaction; sql: AnsiString; aSQLDialect: integer; Scrollable: boolean;
1170 >                             params: array of const): IResultSet; overload;
1171 >    function OpenCursorAtStart(transaction: ITransaction; sql: AnsiString; aSQLDialect: integer;
1172 >                             Scrollable: boolean=false): IResultSet; overload;
1173      function OpenCursorAtStart(transaction: ITransaction; sql: AnsiString; aSQLDialect: integer;
1174                               params: array of const): IResultSet; overload;
1175 <    function OpenCursorAtStart(transaction: ITransaction; sql: AnsiString): IResultSet; overload;
1175 >    function OpenCursorAtStart(transaction: ITransaction; sql: AnsiString; aSQLDialect: integer; Scrollable: boolean;
1176 >                             params: array of const): IResultSet; overload;
1177 >    function OpenCursorAtStart(transaction: ITransaction; sql: AnsiString; Scrollable: boolean=false): IResultSet; overload;
1178      function OpenCursorAtStart(transaction: ITransaction; sql: AnsiString;
1179                               params: array of const): IResultSet; overload;
1180 <    function OpenCursorAtStart(sql: AnsiString): IResultSet; overload;
1180 >    function OpenCursorAtStart(transaction: ITransaction; sql: AnsiString; Scrollable: boolean;
1181 >                             params: array of const): IResultSet; overload;
1182 >    function OpenCursorAtStart(sql: AnsiString; Scrollable: boolean=false): IResultSet; overload;
1183 >    function OpenCursorAtStart(sql: AnsiString; Scrollable: boolean;
1184 >                             params: array of const): IResultSet; overload;
1185      function OpenCursorAtStart(sql: AnsiString;
1186                               params: array of const): IResultSet; overload;
1187 <    function Prepare(transaction: ITransaction; sql: AnsiString; aSQLDialect: integer): IStatement; overload;
1188 <    function Prepare(transaction: ITransaction; sql: AnsiString): IStatement; overload;
1187 >    function Prepare(transaction: ITransaction; sql: AnsiString; aSQLDialect: integer; CursorName: AnsiString=''): IStatement; overload;
1188 >    function Prepare(transaction: ITransaction; sql: AnsiString; CursorName: AnsiString=''): IStatement; overload;
1189      function PrepareWithNamedParameters(transaction: ITransaction; sql: AnsiString;
1190                         aSQLDialect: integer; GenerateParamNames: boolean=false;
1191 <                       CaseSensitiveParams: boolean = false): IStatement; overload;
1191 >                       CaseSensitiveParams: boolean = false; CursorName: AnsiString=''): IStatement; overload;
1192      function PrepareWithNamedParameters(transaction: ITransaction; sql: AnsiString;
1193                         GenerateParamNames: boolean=false;
1194 <                       CaseSensitiveParams: boolean = false): IStatement; overload;
1194 >                       CaseSensitiveParams: boolean = false; CursorName: AnsiString=''): IStatement; overload;
1195  
1196      {Events}
1197      function GetEventHandler(Events: TStrings): IEvents; overload;
# Line 950 | Line 1204 | type
1204      function CreateBlob(transaction: ITransaction; SubType: integer; CharSetID: cardinal=0; BPB: IBPB=nil): IBlob; overload;
1205      function OpenBlob(transaction: ITransaction; RelationName, ColumnName: AnsiString; BlobID: TISC_QUAD; BPB: IBPB=nil): IBlob; overload;
1206      function OpenBlob(transaction: ITransaction; BlobMetaData: IBlobMetaData; BlobID: TISC_QUAD; BPB: IBPB=nil): IBlob;  overload;
1207 +    function GetInlineBlobLimit: integer;
1208 +    procedure SetInlineBlobLimit(limit: integer);
1209  
1210      {Array - may use to open existing arrays. However, ISQLData.AsArray is preferred}
1211  
# Line 963 | Line 1219 | type
1219  
1220      {Database Information}
1221      function GetSQLDialect: integer;
1222 +    function GetAttachmentID: integer;
1223      function GetBlobMetaData(Transaction: ITransaction; tableName, columnName: AnsiString): IBlobMetaData;
1224      function GetArrayMetaData(Transaction: ITransaction; tableName, columnName: AnsiString): IArrayMetaData;
1225      function GetDBInformation(Requests: array of byte): IDBInformation; overload;
# Line 976 | Line 1233 | type
1233      function GetODSMinorVersion: integer;
1234      procedure getFBVersion(version: TStrings);
1235      function HasActivity: boolean;
1236 +    function HasDecFloatSupport: boolean;
1237 +    function HasBatchMode: boolean;
1238 +    function HasScollableCursors: boolean;
1239 +    function HasTable(aTableName: AnsiString): boolean;  {case sensitive}
1240 +    function HasFunction(aFunctionName: AnsiString): boolean; {case sensitive}
1241 +    function HasProcedure(aProcName: AnsiString): boolean; {case sensitive}
1242  
1243      {Character Sets}
1244 +    function GetCharSetID: integer; {connection character set}
1245      function HasDefaultCharSet: boolean;
1246      function GetDefaultCharSetID: integer;
1247      function GetCharsetName(CharSetID: integer): AnsiString;
# Line 987 | Line 1251 | type
1251      function CharSetWidth(CharSetID: integer; var Width: integer): boolean;
1252      procedure RegisterCharSet(CharSetName: AnsiString; CodePage: TSystemCodePage;
1253        AllowReverseLookup:boolean; out CharSetID: integer);
1254 <  end;
1254 >
1255 >    {Time Zone Database}
1256 >    function GetTimeZoneServices: ITimeZoneServices;
1257 >    function HasTimeZoneSupport: boolean;
1258 >
1259 >    {Client side Journaling}
1260 >    function JournalingActive: boolean;
1261 >    function GetJournalOptions: TJournalOptions;
1262 >    function StartJournaling(aJournalLogFile: AnsiString): integer; overload;
1263 >    function StartJournaling(aJournalLogFile: AnsiString; Options: TJournalOptions): integer; overload;
1264 >    function StartJournaling(S: TStream; Options: TJournalOptions): integer; overload;
1265 >    procedure StopJournaling(RetainJournal: boolean);
1266 > end;
1267  
1268    TProtocolAll = (TCP, SPX, NamedPipe, Local, inet, inet4, inet6, wnet, xnet, unknownProtocol);
1269    TProtocol = TCP..xnet;
# Line 1004 | Line 1280 | type
1280  
1281    }
1282  
1283 <  ISPBItem = interface(IParameterBlockItem)
1283 >  ISPBItem = interface(IParameterBlockItemWithTypeName)
1284      ['{5d08ae2b-4519-41bd-8b40-97cd451c3f6a}']
1285    end;
1286  
1287 <  ISPB = interface(IParameterBlock<ISPBItem>)
1287 >  ISPB = interface(IParameterBlockWithTypeNames<ISPBItem>)
1288      ['{2c5836fd-41ed-4426-9b7d-5af580ec2659}']
1289    end;
1290  
# Line 1068 | Line 1344 | type
1344      function getSize: integer;
1345      procedure getRawBytes(var Buffer);
1346      function getAsString: AnsiString;
1347 <    function getAsInteger: integer;
1347 >    function getAsInteger: int64;
1348      function getAsByte: byte;
1349      function CopyTo(stream: TStream; count: integer): integer;
1350      property AsString: AnsiString read getAsString;
1351 <    property AsInteger: integer read getAsInteger;
1351 >    property AsInteger: int64 read getAsInteger;
1352      property AsByte: byte read getAsByte;
1353    end;
1354  
# Line 1142 | Line 1418 | type
1418     The interface is returned by the FirebirdAPI function.
1419    }
1420  
1421 +  { IFirebirdAPI }
1422 +
1423    IFirebirdAPI = interface
1424      ['{edeee691-c8d3-4dcf-a780-cd7e432821d5}']
1425      {Database connections}
# Line 1153 | Line 1431 | type
1431      {Start Transaction against multiple databases}
1432      function AllocateTPB: ITPB;
1433      function StartTransaction(Attachments: array of IAttachment;
1434 <             TPB: array of byte; DefaultCompletion: TTransactionCompletion=taCommit): ITransaction; overload;
1434 >             TPB: array of byte; DefaultCompletion: TTransactionCompletion=taCommit;
1435 >             aName: AnsiString=''): ITransaction; overload;
1436      function StartTransaction(Attachments: array of IAttachment;
1437 <             TPB: ITPB; DefaultCompletion: TTransactionCompletion=taCommit): ITransaction; overload;
1437 >             TPB: ITPB; DefaultCompletion: TTransactionCompletion=taCommit;
1438 >             aName: AnsiString=''): ITransaction; overload;
1439  
1440      {Service Manager}
1441      function HasServiceAPI: boolean;
# Line 1170 | Line 1450 | type
1450      function GetImplementationVersion: AnsiString;
1451      function GetClientMajor: integer;
1452      function GetClientMinor: integer;
1453 +    function HasDecFloatSupport: boolean;
1454 +    function HasLocalTZDB: boolean;
1455 +    function HasTimeZoneSupport: boolean;
1456 +    function HasExtendedTZSupport: boolean;
1457  
1458      {Firebird 3 API}
1459      function HasMasterIntf: boolean;
1460 <    function GetIMaster: TObject;
1460 >    function GetIMaster: TObject;  deprecated 'Use FirebirdAPI.QueryInterface and FBClientLib.pas IFBIMasterProvider instead';
1461      function GetFBLibrary: IFirebirdLibrary;
1462   end;
1463  
# Line 1200 | Line 1484 | type
1484     EIBInterBaseError = class(EIBError)
1485     private
1486       FIBErrorCode: Long;
1487 +     FStatus: IStatus;
1488     public
1489 <     constructor Create(Status: IStatus); overload;
1489 >     constructor Create(aStatus: IStatus); overload;
1490       constructor Create(ASQLCode: Long; AIBErrorCode: Long; Msg: AnsiString); overload;
1491       property IBErrorCode: Long read FIBErrorCode;
1492 +     property Status: IStatus read FStatus;
1493     end;
1494  
1495     {IB Client Exceptions}
1496     EIBClientError = class(EIBError);
1497  
1498 +   {Used to explicitly report a Batch Buffer overflow}
1499 +   EIBBatchBufferOverflow = class(EIBError);
1500 +
1501   {The Firebird API function is used to access the IFirebirdAPI interface.
1502  
1503   It will load the Firebird Client Library if this is not already loaded and
# Line 1218 | Line 1507 | type
1507   function FirebirdAPI: IFirebirdAPI;
1508  
1509   {IBX support functions. Probably best ignored i.e. always used the FirebirdAPI
1510 < functino to load the library and check if it's loaded.}
1510 > function to load the library and check if it's loaded.}
1511  
1512   function TryIBLoad: Boolean;
1513   procedure CheckIBLoaded;
# Line 1229 | Line 1518 | procedure CheckIBLoaded;
1518  
1519   function LoadFBLibrary(aLibPathName: string): IFirebirdLibrary;
1520  
1521 + {$if not declared(Null)} {Needed for Delphi}
1522 + function Null: Variant;       // Null standard constant
1523 + {$define NEEDNULLFUNCTION}
1524 + {$ifend}
1525 +
1526   implementation
1527  
1528 < uses FBClientAPI
1528 > uses FBClientAPI {$if not declared(NULL)}, Variants {$ifend}
1529    {$IFDEF USELEGACYFIREBIRDAPI}, FB25ClientAPI {$ENDIF}
1530    {$IFDEF USEFIREBIRD3API}, FB30ClientAPI {$ENDIF};
1531  
# Line 1323 | Line 1617 | end;
1617  
1618   { EIBInterBaseError }
1619  
1620 < constructor EIBInterBaseError.Create(Status: IStatus);
1620 > constructor EIBInterBaseError.Create(aStatus: IStatus);
1621   begin
1622 <  inherited Create(Status.Getsqlcode,Status.GetMessage);
1623 <  FIBErrorCode := Status.GetIBErrorCode;
1622 >  inherited Create(aStatus.Getsqlcode,aStatus.GetMessage);
1623 >  FIBErrorCode := aStatus.GetIBErrorCode;
1624 >  FStatus := aStatus.Clone;
1625   end;
1626  
1627   constructor EIBInterBaseError.Create(ASQLCode: Long; AIBErrorCode: Long;
# Line 1336 | Line 1631 | begin
1631    FIBErrorCode := AIBErrorCode;
1632   end;
1633  
1634 + {$ifdef NEEDNULLFUNCTION}
1635 + function Null: Variant;       // Null standard constant
1636 +   begin
1637 +     VarClearProc(TVarData(Result));
1638 +     TVarData(Result).VType := varnull;
1639 +   end;
1640 + {$endif}
1641  
1642   initialization
1643    FDefaultFBLibrary := nil;

Comparing:
ibx/trunk/fbintf/IB.pas (property svn:eol-style), Revision 308 by tony, Sat Jul 18 10:26:30 2020 UTC vs.
ibx/branches/udr/client/IB.pas (property svn:eol-style), Revision 391 by tony, Thu Jan 27 16:34:24 2022 UTC

# Line 0 | Line 1
1 + native

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines