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

Comparing:
ibx/trunk/fbintf/client/2.5/FB25Attachment.pas (file contents), Revision 117 by tony, Mon Jan 22 13:58:11 2018 UTC vs.
ibx/branches/journaling/fbintf/client/2.5/FB25Attachment.pas (file contents), Revision 363 by tony, Tue Dec 7 13:30:05 2021 UTC

# Line 46 | Line 46 | type
46    TFB25Attachment = class(TFBAttachment, IAttachment, IActivityMonitor)
47    private
48      FHandle: TISC_DB_HANDLE;
49 +    FFirebird25ClientAPI: TFB25ClientAPI;
50    protected
51      procedure CheckHandle; override;
52 +    function GetAttachment: IAttachment; override;
53    public
54 <    constructor Create(DatabaseName: AnsiString; aDPB: IDPB;
54 >    constructor Create(api: TFB25ClientAPI; DatabaseName: AnsiString; aDPB: IDPB;
55        RaiseExceptionOnConnectError: boolean);
56 <    constructor CreateDatabase(DatabaseName: AnsiString; aDPB: IDPB; RaiseExceptionOnError: boolean); overload;
57 <    constructor CreateDatabase(sql: AnsiString; aSQLDialect: integer;
56 >    constructor CreateDatabase(api: TFB25ClientAPI; DatabaseName: AnsiString; aDPB: IDPB; RaiseExceptionOnError: boolean); overload;
57 >    constructor CreateDatabase(api: TFB25ClientAPI; sql: AnsiString; aSQLDialect: integer;
58        RaiseExceptionOnError: boolean); overload;
59 +    function GetDBInfo(ReqBuffer: PByte; ReqBufLen: integer): IDBInformation; override;
60      property Handle: TISC_DB_HANDLE read FHandle;
61 +    property Firebird25ClientAPI: TFB25ClientAPI read FFirebird25ClientAPI;
62  
63    public
64      {IAttachment}
# Line 62 | Line 66 | type
66      procedure Disconnect(Force: boolean=false); override;
67      function IsConnected: boolean; override;
68      procedure DropDatabase;
69 <    function StartTransaction(TPB: array of byte; DefaultCompletion: TTransactionCompletion): ITransaction; override;
70 <    function StartTransaction(TPB: ITPB; DefaultCompletion: TTransactionCompletion): ITransaction; override;
69 >    function StartTransaction(TPB: array of byte; DefaultCompletion: TTransactionCompletion; aName: AnsiString): ITransaction; override;
70 >    function StartTransaction(TPB: ITPB; DefaultCompletion: TTransactionCompletion; aName: AnsiString): ITransaction; override;
71      procedure ExecImmediate(transaction: ITransaction; sql: AnsiString; aSQLDialect: integer); override;
72 <    function Prepare(transaction: ITransaction; sql: AnsiString; aSQLDialect: integer): IStatement; override;
72 >    function Prepare(transaction: ITransaction; sql: AnsiString; aSQLDialect: integer; CursorName: AnsiString=''): IStatement; override;
73      function PrepareWithNamedParameters(transaction: ITransaction; sql: AnsiString;
74 <                       aSQLDialect: integer; GenerateParamNames: boolean=false): IStatement; override;
74 >                       aSQLDialect: integer; GenerateParamNames: boolean=false;
75 >                       CaseSensitiveParams: boolean=false; CursorName: AnsiString=''): IStatement; override;
76      function GetEventHandler(Events: TStrings): IEvents; override;
77 <    function CreateBlob(transaction: ITransaction; RelationName, ColumnName: AnsiString; BPB: IBPB=nil): IBlob; overload;
73 <    function CreateBlob(transaction: ITransaction; BlobMetaData: IBlobMetaData; BPB: IBPB=nil): IBlob; overload;
77 >    function CreateBlob(transaction: ITransaction; BlobMetaData: IBlobMetaData; BPB: IBPB=nil): IBlob; overload; override;
78      function CreateBlob(transaction: ITransaction; SubType: integer; aCharSetID: cardinal=0; BPB: IBPB=nil): IBlob; overload;
75    function OpenBlob(transaction: ITransaction; RelationName, ColumnName: AnsiString; BlobID: TISC_QUAD; BPB: IBPB=nil): IBlob; overload;
79      function OpenBlob(transaction: ITransaction; BlobMetaData: IBlobMetaData; BlobID: TISC_QUAD; BPB: IBPB=nil): IBlob; overload; override;
80  
81 <    function OpenArray(transaction: ITransaction; RelationName, ColumnName: AnsiString;
82 <      ArrayID: TISC_QUAD): IArray;
80 <    function CreateArray(transaction: ITransaction; RelationName, ColumnName: AnsiString
81 <      ): IArray; overload;
82 <    function CreateArray(transaction: ITransaction; ArrayMetaData: IArrayMetaData): IArray; overload;
81 >    function OpenArray(transaction: ITransaction; ArrayMetaData: IArrayMetaData; ArrayID: TISC_QUAD): IArray; overload; override;
82 >    function CreateArray(transaction: ITransaction; ArrayMetaData: IArrayMetaData): IArray; overload; override;
83      function CreateArrayMetaData(SQLType: cardinal; tableName: AnsiString; columnName: AnsiString;
84        Scale: integer; size: cardinal;
85        acharSetID: cardinal; dimensions: cardinal; bounds: TArrayBounds
# Line 87 | Line 87 | type
87  
88      {Database Information}
89  
90 <    function GetBlobMetaData(Transaction: ITransaction; tableName, columnName: AnsiString): IBlobMetaData;
91 <    function GetArrayMetaData(Transaction: ITransaction; tableName, columnName: AnsiString): IArrayMetaData;
92 <    function GetDBInformation(Requests: array of byte): IDBInformation; overload; override;
93 <    function GetDBInformation(Request: byte): IDBInformation; overload; override;
90 >    function GetBlobMetaData(Transaction: ITransaction; tableName, columnName: AnsiString): IBlobMetaData; override;
91 >    function GetArrayMetaData(Transaction: ITransaction; tableName, columnName: AnsiString): IArrayMetaData; override;
92 >    procedure getFBVersion(version: TStrings);
93 >    function HasScollableCursors: boolean;
94    end;
95  
96   implementation
97  
98   uses FB25Events,FB25Transaction, FBMessages, FB25Blob,
99 <  FB25Statement, FB25Array, IBUtils;
99 >  FB25Statement, FB25Array, IBUtils, IBExternals;
100  
101    { TFB25Attachment }
102  
# Line 106 | Line 106 | begin
106      IBError(ibxeDatabaseClosed,[nil]);
107   end;
108  
109 < constructor TFB25Attachment.Create(DatabaseName: AnsiString; aDPB: IDPB;
109 > function TFB25Attachment.GetAttachment: IAttachment;
110 > begin
111 >  Result := self;
112 > end;
113 >
114 > constructor TFB25Attachment.Create(api: TFB25ClientAPI; DatabaseName: AnsiString; aDPB: IDPB;
115    RaiseExceptionOnConnectError: boolean);
116   begin
117 +  FFirebird25ClientAPI := api;
118    if aDPB = nil then
119    begin
120      if RaiseExceptionOnConnectError then
121         IBError(ibxeNoDPB,[nil]);
122      Exit;
123    end;
124 <  inherited Create(DatabaseName,aDPB,RaiseExceptionOnConnectError);
124 >  inherited Create(api,DatabaseName,aDPB,RaiseExceptionOnConnectError);
125    Connect;
126   end;
127  
128 < constructor TFB25Attachment.CreateDatabase(DatabaseName: AnsiString; aDPB: IDPB;
128 > constructor TFB25Attachment.CreateDatabase(api: TFB25ClientAPI; DatabaseName: AnsiString; aDPB: IDPB;
129    RaiseExceptionOnError: boolean);
130   var sql: AnsiString;
131      tr_handle: TISC_TR_HANDLE;
132   begin
133 <  inherited Create(DatabaseName,aDPB,RaiseExceptionOnError);
133 >  inherited Create(api,DatabaseName,aDPB,RaiseExceptionOnError);
134 >  FFirebird25ClientAPI := api;
135    sql := GenerateCreateDatabaseSQL(DatabaseName,aDPB);
136    tr_handle := nil;
137 <  with Firebird25ClientAPI do
137 >  with FFirebird25ClientAPI do
138    if (isc_dsql_execute_immediate(StatusVector, @FHandle, @tr_handle, 0, PAnsiChar(sql),
139                                    SQLDialect, nil) > 0) and RaiseExceptionOnError then
140      IBDataBaseError;
# Line 141 | Line 148 | begin
148      GetODSAndConnectionInfo;
149   end;
150  
151 < constructor TFB25Attachment.CreateDatabase(sql: AnsiString; aSQLDialect: integer;
151 > constructor TFB25Attachment.CreateDatabase(api: TFB25ClientAPI; sql: AnsiString; aSQLDialect: integer;
152      RaiseExceptionOnError: boolean);
153   var tr_handle: TISC_TR_HANDLE;
154   begin
155 <  inherited Create('',nil,RaiseExceptionOnError);
155 >  inherited Create(api,'',nil,RaiseExceptionOnError);
156 >  FFirebird25ClientAPI := api;
157    FSQLDialect := aSQLDialect;
158    tr_handle := nil;
159 <  with Firebird25ClientAPI do
159 >  with FFirebird25ClientAPI do
160    begin
161      if (isc_dsql_execute_immediate(StatusVector, @FHandle, @tr_handle, 0, PAnsiChar(sql),
162                                    aSQLDialect, nil) > 0) and RaiseExceptionOnError then
# Line 160 | Line 168 | begin
168    DPBFromCreateSQL(sql);
169   end;
170  
171 + function TFB25Attachment.GetDBInfo(ReqBuffer: PByte; ReqBufLen: integer
172 +  ): IDBInformation;
173 + begin
174 +  Result := TDBInformation.Create(FFirebird25ClientAPI);
175 +  with FFirebird25ClientAPI, Result as TDBInformation do
176 +     if isc_database_info(StatusVector, @(FHandle), ReqBufLen, ReqBuffer,
177 +                               getBufSize, Buffer) > 0 then
178 +          IBDataBaseError;
179 + end;
180 +
181   procedure TFB25Attachment.Connect;
182   begin
183    FSQLDialect := 3;
184  
185 <  with Firebird25ClientAPI do
185 >  with FFirebird25ClientAPI do
186    if DPB = nil then
187    begin
188      if (isc_attach_database(StatusVector, Length(FDatabaseName),
# Line 185 | Line 203 | end;
203  
204   procedure TFB25Attachment.Disconnect(Force: boolean);
205   begin
206 +  inherited Disconnect(Force);
207    if FHandle = nil then
208      Exit;
209  
210    EndAllTransactions;
211    {Disconnect}
212 <  with Firebird25ClientAPI do
212 >  with FFirebird25ClientAPI do
213      if (isc_detach_database(StatusVector, @FHandle) > 0) and not Force then
214        IBDatabaseError;
215    FHandle := nil;
# Line 206 | Line 225 | end;
225  
226   procedure TFB25Attachment.DropDatabase;
227   begin
228 <  CheckHandle;
229 <  EndAllTransactions;
230 <  with Firebird25ClientAPI do
231 <    if isc_drop_database(StatusVector, @FHandle) > 0 then
232 <      IBDatabaseError;
233 <  FHandle := nil;
228 >  if IsConnected then
229 >  begin
230 >    EndAllTransactions;
231 >    EndSession(false);
232 >    with FFirebird25ClientAPI do
233 >      if isc_drop_database(StatusVector, @FHandle) > 0 then
234 >        IBDatabaseError;
235 >    FHandle := nil;
236 >  end;
237   end;
238  
239   function TFB25Attachment.StartTransaction(TPB: array of byte;
240 <  DefaultCompletion: TTransactionCompletion): ITransaction;
240 >  DefaultCompletion: TTransactionCompletion; aName: AnsiString): ITransaction;
241   begin
242    CheckHandle;
243 <  Result := TFB25Transaction.Create(self,TPB,DefaultCompletion);
243 >  Result := TFB25Transaction.Create(FFirebird25ClientAPI,self,TPB,DefaultCompletion,aName);
244   end;
245  
246   function TFB25Attachment.StartTransaction(TPB: ITPB;
247 <  DefaultCompletion: TTransactionCompletion): ITransaction;
247 >  DefaultCompletion: TTransactionCompletion; aName: AnsiString): ITransaction;
248   begin
249    CheckHandle;
250 <  Result := TFB25Transaction.Create(self,TPB,DefaultCompletion);
229 < end;
230 <
231 < function TFB25Attachment.CreateBlob(transaction: ITransaction; RelationName,
232 <  ColumnName: AnsiString; BPB: IBPB): IBlob;
233 < begin
234 <  CheckHandle;
235 <  Result := TFB25Blob.Create(self,transaction as TFB25transaction,
236 <                TFB25BlobMetaData.Create(self,Transaction as TFB25Transaction,RelationName,ColumnName),BPB);
250 >  Result := TFB25Transaction.Create(FFirebird25ClientAPI,self,TPB,DefaultCompletion,aName);
251   end;
252  
253   function TFB25Attachment.CreateBlob(transaction: ITransaction;
# Line 250 | Line 264 | begin
264    Result := TFB25Blob.Create(self,transaction as TFB25transaction,SubType,aCharSetID,BPB);
265   end;
266  
253 function TFB25Attachment.OpenBlob(transaction: ITransaction; RelationName,
254  ColumnName: AnsiString; BlobID: TISC_QUAD; BPB: IBPB=nil): IBlob;
255 begin
256  CheckHandle;
257  Result := TFB25Blob.Create(self,transaction as TFB25transaction,
258                TFB25BlobMetaData.Create(self,Transaction as TFB25Transaction,RelationName,ColumnName),
259                BlobID,BPB);
260 end;
261
267   function TFB25Attachment.OpenBlob(transaction: ITransaction;
268    BlobMetaData: IBlobMetaData; BlobID: TISC_QUAD; BPB: IBPB=nil): IBlob;
269   begin
# Line 272 | Line 277 | var TRHandle: TISC_TR_HANDLE;
277   begin
278    CheckHandle;
279    TRHandle := (Transaction as TFB25Transaction).Handle;
280 <  with Firebird25ClientAPI do
280 >  with FFirebird25ClientAPI do
281      if isc_dsql_execute_immediate(StatusVector, @fHandle, @TRHandle, 0,PAnsiChar(sql), aSQLDialect, nil) > 0 then
282        IBDatabaseError;
283    SignalActivity;
284   end;
285  
286   function TFB25Attachment.Prepare(transaction: ITransaction; sql: AnsiString;
287 <  aSQLDialect: integer): IStatement;
287 >  aSQLDialect: integer; CursorName: AnsiString): IStatement;
288   begin
289    CheckHandle;
290    Result := TFB25Statement.Create(self,transaction,sql,aSQLDialect);
291   end;
292  
293   function TFB25Attachment.PrepareWithNamedParameters(transaction: ITransaction;
294 <  sql: AnsiString; aSQLDialect: integer; GenerateParamNames: boolean): IStatement;
294 >  sql: AnsiString; aSQLDialect: integer; GenerateParamNames: boolean;
295 >  CaseSensitiveParams: boolean; CursorName: AnsiString): IStatement;
296   begin
297    CheckHandle;
298    Result := TFB25Statement.CreateWithParameterNames(self,transaction,sql,aSQLDialect,
299 <         GenerateParamNames);
299 >         GenerateParamNames,CaseSensitiveParams,CursorName);
300   end;
301  
302   function TFB25Attachment.GetEventHandler(Events: TStrings): IEvents;
# Line 299 | Line 305 | begin
305    Result := TFB25Events.Create(self,Events);
306   end;
307  
308 < function TFB25Attachment.OpenArray(transaction: ITransaction; RelationName, ColumnName: AnsiString;
308 > function TFB25Attachment.OpenArray(transaction: ITransaction; ArrayMetaData: IArrayMetaData;
309    ArrayID: TISC_QUAD): IArray;
310   begin
311    CheckHandle;
312    Result := TFB25Array.Create(self,transaction as TFB25Transaction,
313 <                    GetArrayMetaData(transaction,RelationName,ColumnName),ArrayID);
308 < end;
309 <
310 < function TFB25Attachment.CreateArray(transaction: ITransaction; RelationName, ColumnName: AnsiString): IArray;
311 < begin
312 <  CheckHandle;
313 <  Result := TFB25Array.Create(self,transaction as TFB25Transaction,
314 <                    GetArrayMetaData(transaction,RelationName,ColumnName));
313 >                    ArrayMetaData,ArrayID);
314   end;
315  
316   function TFB25Attachment.CreateArray(transaction: ITransaction;
# Line 343 | Line 342 | begin
342    Result := TFB25ArrayMetaData.Create(self,Transaction as TFB25Transaction,tableName,columnName);
343   end;
344  
345 < function TFB25Attachment.GetDBInformation(Requests: array of byte
347 <  ): IDBInformation;
348 < var ReqBuffer: PByte;
349 <    i: integer;
345 > procedure ISCVersionCallback(userArg: pointer; text: PAnsiChar); cdecl;
346   begin
347 <  CheckHandle;
352 <  if Length(Requests) = 1 then
353 <    Result := GetDBInformation(Requests[0])
354 <  else
355 <  begin
356 <    Result := TDBInformation.Create;
357 <    GetMem(ReqBuffer,Length(Requests));
358 <    try
359 <      for i := 0 to Length(Requests) - 1 do
360 <        ReqBuffer[i] := Requests[i];
361 <
362 <      with Firebird25ClientAPI, Result as TDBInformation do
363 <          if isc_database_info(StatusVector, @(FHandle), Length(Requests), ReqBuffer,
364 <                                 getBufSize, Buffer) > 0 then
365 <            IBDataBaseError;
366 <
367 <    finally
368 <      FreeMem(ReqBuffer);
369 <    end;
370 <  end;
347 >  TStrings(userArg).Add(text);
348   end;
349  
350 < function TFB25Attachment.GetDBInformation(Request: byte): IDBInformation;
350 > procedure TFB25Attachment.getFBVersion(version: TStrings);
351 > var callback: pointer;
352   begin
353 <  CheckHandle;
354 <  Result := TDBInformation.Create;
355 <  with Firebird25ClientAPI, Result as TDBInformation do
356 <    if isc_database_info(StatusVector, @(FHandle), 1, @Request,
357 <                           getBufSize, Buffer) > 0 then
358 <      IBDataBaseError;
353 >  callback := @ISCVersionCallback;
354 >  version.Clear;
355 >  with FFirebird25ClientAPI do
356 >    if isc_version(@FHandle,TISC_CALLBACK(callback),PVoid(version)) > 0 then
357 >       IBDataBaseError;
358 > end;
359 >
360 > function TFB25Attachment.HasScollableCursors: boolean;
361 > begin
362 >  Result := false;
363   end;
364  
365   end.

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines