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

Comparing ibx/trunk/fbintf/IB.pas (file contents):
Revision 209 by tony, Wed Mar 14 12:48:51 2018 UTC vs.
Revision 309 by tony, Tue Jul 21 08:00:42 2020 UTC

# Line 73 | Line 73 | unit IB;
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
# Line 122 | Line 126 | unit IB;
126   interface
127  
128   uses
129 <  Classes, SysUtils, DB, FBMessages, IBExternals;
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 = 1;
139 <  FBIntf_Version = '1.1.1';
138 >  FBIntf_Release = 6;
139 >  FBIntf_Version = '1.1.6';
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}
# Line 173 | Line 180 | type
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
# Line 195 | Line 210 | type
210                    SQLGetSegment, SQLPutSegment,
211                    SQLExecProcedure, SQLStartTransaction,
212                    SQLCommit, SQLRollback,
213 <                  SQLSelectForUpdate, SQLSetGenerator);
213 >                  SQLSelectForUpdate, SQLSetGenerator,
214 >                  SQLSavePoint);
215  
216    TFBStatusCode = cardinal;
217    TByteArray = array of byte;
218  
219 +  IFirebirdAPI = interface;
220    IAttachment = interface;
221    ITransaction = interface;
222 +  IStatement = interface;
223  
224    {The IParameterBlock interface provides the template for all parameter
225     block interfaces}
# Line 241 | Line 259 | type
259     This interface can be accessed from IFirebirdAPI.
260     }
261  
262 +   TIBDataBaseErrorMessage    = (ShowSQLCode,
263 +                                   ShowIBMessage,
264 +                                   ShowSQLMessage);
265 +
266 +   TIBDataBaseErrorMessages   = set of TIBDataBaseErrorMessage;
267 +
268    IStatus = interface
269      ['{34167722-af38-4831-b08a-93162d58ede3}']
270      function GetIBErrorCode: Long;
# Line 267 | Line 291 | type
291      function GetSQLTypeName: AnsiString;
292      function GetScale: integer;
293      function GetSize: cardinal;
294 +    function GetCharSetWidth: integer;
295      function GetCharSetID: cardinal;
296      function GetTableName: AnsiString;
297      function GetColumnName: AnsiString;
# Line 395 | Line 420 | type
420      the output of an SQL Statement.
421    }
422  
423 +  TIBDateTimeFormats = (dfTimestamp, {SQL TIMESTAMP}
424 +                        dfDateTime,   {SQL DATETIME}
425 +                        dfTime);      {SQL TIME}
426 +
427    { IColumnMetaData }
428  
429    IColumnMetaData = interface
# Line 415 | Line 444 | type
444      function GetSize: cardinal;
445      function GetArrayMetaData: IArrayMetaData; {Valid only for Array SQL Type}
446      function GetBlobMetaData: IBlobMetaData; {Valid only for Blob SQL Type}
447 +    function GetDateTimeStrLength(DateTimeFormat: TIBDateTimeFormats): integer;
448 +    function GetStatement: IStatement;
449 +    function GetTransaction: ITransaction;
450      property Name: AnsiString read GetName;
451      property Size: cardinal read GetSize;
452      property SQLType: cardinal read GetSQLType;
# Line 456 | Line 488 | type
488  
489    ISQLData = interface(IColumnMetaData)
490      ['{3f493e31-7e3f-4606-a07c-b210b9e3619d}']
491 +    function GetStrDataLength: short;
492      function GetAsBoolean: boolean;
493      function GetAsCurrency: Currency;
494      function GetAsInt64: Int64;
# Line 502 | Line 535 | type
535    IResults = interface
536      ['{e836b2bb-93d1-4bbf-a8eb-7ce535de3bb5}']
537     function getCount: integer;
538 +   function GetStatement: IStatement;
539     function GetTransaction: ITransaction;
540     function ByName(Idx: AnsiString): ISQLData;
541     function getSQLData(index: integer): ISQLData;
# Line 622 | Line 656 | type
656      function getSQLParam(index: integer): ISQLParam;
657      function ByName(Idx: AnsiString): ISQLParam ;
658      function GetModified: Boolean;
659 +    function GetHasCaseSensitiveParams: Boolean;
660      property Modified: Boolean read GetModified;
661      property Params[index: integer]: ISQLParam read getSQLParam; default;
662      property Count: integer read getCount;
# Line 646 | Line 681 | type
681      function GetRowsAffected(var SelectCount, InsertCount, UpdateCount, DeleteCount: integer): boolean;
682      function GetSQLStatementType: TIBSQLStatementTypes;
683      function GetSQLText: AnsiString;
684 +    function GetProcessedSQLText: AnsiString;
685      function GetSQLDialect: integer;
686      function IsPrepared: boolean;
687      procedure Prepare(aTransaction: ITransaction=nil);
# Line 862 | Line 898 | type
898  
899    IAttachment = interface
900      ['{466e9b67-9def-4807-b3e7-e08a35e7185c}']
901 +    function getFirebirdAPI: IFirebirdAPI;
902      function getDPB: IDPB;
903      function AllocateBPB: IBPB;
904      function AllocateDIRB: IDIRB;
# Line 897 | Line 934 | type
934      function Prepare(transaction: ITransaction; sql: AnsiString; aSQLDialect: integer): IStatement; overload;
935      function Prepare(transaction: ITransaction; sql: AnsiString): IStatement; overload;
936      function PrepareWithNamedParameters(transaction: ITransaction; sql: AnsiString;
937 <                       aSQLDialect: integer; GenerateParamNames: boolean=false): IStatement; overload;
937 >                       aSQLDialect: integer; GenerateParamNames: boolean=false;
938 >                       CaseSensitiveParams: boolean = false): IStatement; overload;
939      function PrepareWithNamedParameters(transaction: ITransaction; sql: AnsiString;
940 <                       GenerateParamNames: boolean=false): IStatement; overload;
940 >                       GenerateParamNames: boolean=false;
941 >                       CaseSensitiveParams: boolean = false): IStatement; overload;
942  
943      {Events}
944      function GetEventHandler(Events: TStrings): IEvents; overload;
# Line 910 | Line 949 | type
949      function CreateBlob(transaction: ITransaction; RelationName, ColumnName: AnsiString; BPB: IBPB=nil): IBlob; overload;
950      function CreateBlob(transaction: ITransaction; BlobMetaData: IBlobMetaData; BPB: IBPB=nil): IBlob; overload;
951      function CreateBlob(transaction: ITransaction; SubType: integer; CharSetID: cardinal=0; BPB: IBPB=nil): IBlob; overload;
952 <    function OpenBlob(transaction: ITransaction; RelationName, ColumnName: AnsiString; BlobID: TISC_QUAD; BPB: IBPB=nil): IBlob;
952 >    function OpenBlob(transaction: ITransaction; RelationName, ColumnName: AnsiString; BlobID: TISC_QUAD; BPB: IBPB=nil): IBlob; overload;
953 >    function OpenBlob(transaction: ITransaction; BlobMetaData: IBlobMetaData; BlobID: TISC_QUAD; BPB: IBPB=nil): IBlob;  overload;
954  
955      {Array - may use to open existing arrays. However, ISQLData.AsArray is preferred}
956  
957 <    function OpenArray(transaction: ITransaction; RelationName, ColumnName: AnsiString; ArrayID: TISC_QUAD): IArray;
957 >    function OpenArray(transaction: ITransaction; RelationName, ColumnName: AnsiString; ArrayID: TISC_QUAD): IArray; overload;
958 >    function OpenArray(transaction: ITransaction; ArrayMetaData: IArrayMetaData; ArrayID: TISC_QUAD): IArray; overload;
959      function CreateArray(transaction: ITransaction; RelationName, ColumnName: AnsiString): IArray; overload;
960      function CreateArray(transaction: ITransaction; ArrayMetaData: IArrayMetaData): IArray; overload;
961      function CreateArrayMetaData(SQLType: cardinal; tableName: AnsiString; columnName: AnsiString;
# Line 934 | Line 975 | type
975      function GetSecurityDatabase: AnsiString;
976      function GetODSMajorVersion: integer;
977      function GetODSMinorVersion: integer;
978 +    procedure getFBVersion(version: TStrings);
979      function HasActivity: boolean;
980  
981      {Character Sets}
# Line 948 | Line 990 | type
990        AllowReverseLookup:boolean; out CharSetID: integer);
991    end;
992  
993 <  TProtocolAll = (TCP, SPX, NamedPipe, Local, inet, wnet, xnet, unknownProtocol);
993 >  TProtocolAll = (TCP, SPX, NamedPipe, Local, inet, inet4, inet6, wnet, xnet, unknownProtocol);
994    TProtocol = TCP..xnet;
995  
996    {Service Parameter Block (SPB).
# Line 1054 | Line 1096 | type
1096      property Count: integer read getCount;
1097    end;
1098  
1099 +  IFirebirdLibrary = interface;
1100 +
1101    {The IServiceManager interface provides access to a service manager. It can
1102     used to Detach and re-attach to Service Manager, to start services and to
1103     query the service manager.
# Line 1065 | Line 1109 | type
1109  
1110    IServiceManager = interface
1111      ['{905b587d-1e1f-4e40-a3f8-a3519f852e48}']
1112 +    function getFirebirdAPI: IFirebirdAPI;
1113      function getSPB: ISPB;
1114      function getServerName: AnsiString;
1115      function getProtocol: TProtocol;
# Line 1079 | Line 1124 | type
1124      function Query(Request: ISRB; RaiseExceptionOnError: boolean=true) :IServiceQueryResults; overload;
1125    end;
1126  
1127 +  {Tbe Firebird Library API used to get information about the Firebird library}
1128 +
1129 +
1130 +  IFirebirdLibrary = interface
1131 +    ['{3c04e0a1-12e0-428a-b2e1-bc6fcd97b79b}']
1132 +    function GetHandle: TLibHandle;
1133 +    function GetLibraryName: string;
1134 +    function GetLibraryFilePath: string;
1135 +    function GetFirebirdAPI: IFirebirdAPI;
1136 +  end;
1137 +
1138    {The Firebird API.
1139  
1140     This is the base interface and is used to create/open a database connection, to
# Line 1110 | Line 1166 | type
1166  
1167      {Information}
1168      function GetStatus: IStatus;
1113    function GetLibraryName: string;
1169      function HasRollbackRetaining: boolean;
1170      function IsEmbeddedServer: boolean;
1171      function GetImplementationVersion: AnsiString;
1172 +    function GetClientMajor: integer;
1173 +    function GetClientMinor: integer;
1174  
1175      {Firebird 3 API}
1176      function HasMasterIntf: boolean;
1177      function GetIMaster: TObject;
1178 +    function GetFBLibrary: IFirebirdLibrary;
1179   end;
1180  
1181   type
# Line 1152 | Line 1210 | type
1210     {IB Client Exceptions}
1211     EIBClientError = class(EIBError);
1212  
1155 {IBError is used internally and by IBX to throw an EIBClientError}
1156
1157 procedure IBError(ErrMess: TIBClientError; const Args: array of const);
1158
1213   {The Firebird API function is used to access the IFirebirdAPI interface.
1214  
1215   It will load the Firebird Client Library if this is not already loaded and
# Line 1170 | Line 1224 | function FirebirdAPI: IFirebirdAPI;
1224   function TryIBLoad: Boolean;
1225   procedure CheckIBLoaded;
1226  
1227 + {If you want to explicitly load the Firebird library from a
1228 + non-default location then use this function and its GetFirebirdAPI function
1229 + to get the API.}
1230 +
1231 + function LoadFBLibrary(aLibPathName: string): IFirebirdLibrary;
1232 +
1233   implementation
1234  
1235   uses FBClientAPI
1236    {$IFDEF USELEGACYFIREBIRDAPI}, FB25ClientAPI {$ENDIF}
1237    {$IFDEF USEFIREBIRD3API}, FB30ClientAPI {$ENDIF};
1238  
1239 < var FFirebirdAPI: IFirebirdAPI;
1239 > var FDefaultFBLibrary: IFirebirdLibrary;
1240 >
1241 > type
1242 >
1243 >  { TFBLibrary }
1244 >
1245 >  TFBLibraryImpl = class(TFBLibrary)
1246 >  protected
1247 >    function GetFirebird3API: IFirebirdAPI; override;
1248 >    function GetLegacyFirebirdAPI: IFirebirdAPI; override;
1249 >  end;
1250 >
1251 > function TFBLibraryImpl.GetFirebird3API: IFirebirdAPI;
1252 > begin
1253 > {$IFDEF USEFIREBIRD3API}
1254 > Result := TFB30ClientAPI.Create(self);
1255 > {$ELSE}
1256 > Result := nil;
1257 > {$ENDIF}
1258 > end;
1259 >
1260 > function TFBLibraryImpl.GetLegacyFirebirdAPI: IFirebirdAPI;
1261 > begin
1262 >  {$IFDEF USELEGACYFIREBIRDAPI}
1263 >  Result := TFB25ClientAPI.Create(self);
1264 >  {$ELSE}
1265 >  Result := nil;
1266 >  {$ENDIF}
1267 > end;
1268  
1269   function FirebirdAPI: IFirebirdAPI;
1270   begin
1271 <  if FFirebirdAPI = nil then
1271 >  if FDefaultFBLibrary = nil then
1272      CheckIBLoaded;
1273 <  Result := FFirebirdAPI;
1273 >  Result := FDefaultFBLibrary.GetFirebirdAPI;
1274   end;
1275  
1276   function TryIBLoad: Boolean;
1277 + var fblib: IFirebirdLibrary;
1278   begin
1279 < Result := FFirebirdAPI <> nil;
1279 > Result := FDefaultFBLibrary <> nil;
1280   try
1192  {$IFDEF USEFIREBIRD3API}
1193  if not Result then
1194  begin
1195    FFirebirdAPI := TFB30ClientAPI.Create;
1196    Result := FFirebirdAPI.HasMasterIntf;
1197  end;
1198  {$ENDIF}
1199  {$IFDEF USELEGACYFIREBIRDAPI}
1281    if not Result then
1282    begin
1283 <    FFirebirdAPI := nil;
1284 <    FFirebirdAPI := TFB25ClientAPI.Create;
1285 <    Result := true;
1286 <  end;
1206 <  {$ENDIF}
1207 <  if Result and not (FFirebirdAPI as TFBClientAPI).IsLibraryLoaded then
1208 <  begin
1209 <    Result := false;
1210 <    FFirebirdAPI := nil;
1283 >    fblib := TFBLibraryImpl.Create;
1284 >    if (fblib <> nil) and (fblib.GetFirebirdAPI <> nil) then
1285 >      FDefaultFBLibrary := fblib;
1286 >    Result := FDefaultFBLibrary <> nil;
1287    end;
1288   except
1289     SysUtils.showexception(ExceptObject,ExceptAddr);
# Line 1221 | Line 1297 | begin
1297      IBError(ibxeInterBaseMissing, [nil]);
1298   end;
1299  
1300 + function LoadFBLibrary(aLibPathName: string): IFirebirdLibrary;
1301 + var fblib: IFirebirdLibrary;
1302 + begin
1303 +  if trim(aLibPathName) = '' then
1304 +  begin
1305 +    CheckIBLoaded;
1306 +    Result := FDefaultFBLibrary;
1307 +  end
1308 +  else
1309 +  begin
1310 +    fblib := TFBLibraryImpl.GetFBLibrary(aLibPathName);
1311 +    if (fblib = nil) or (fblib.GetFirebirdAPI = nil) then
1312 +      IBError(ibxeInterBaseMissing, [nil]);
1313 +    Result := fblib;
1314 +  end;
1315 + end;
1316 +
1317   { EIBError }
1318  
1319   constructor EIBError.Create(ASQLCode: Long; Msg: AnsiString);
# Line 1244 | Line 1337 | begin
1337    FIBErrorCode := AIBErrorCode;
1338   end;
1339  
1247 procedure IBError(ErrMess: TIBClientError; const Args: array of const);
1248 begin
1249  raise EIBClientError.Create(Ord(ErrMess),
1250                              Format(GetErrorMessage(ErrMess), Args));
1251 end;
1340  
1341   initialization
1342 <  FFirebirdAPI := nil;
1342 >  FDefaultFBLibrary := nil;
1343  
1344   finalization
1345 <  FFirebirdAPI := nil;
1345 >  FDefaultFBLibrary := nil;
1346  
1347   end.
1348  

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines