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

Comparing ibx/trunk/fbintf/client/3.0/FB30Attachment.pas (file contents):
Revision 270 by tony, Fri Jan 18 11:10:37 2019 UTC vs.
Revision 315 by tony, Thu Feb 25 11:56:36 2021 UTC

# Line 37 | Line 37 | unit FB30Attachment;
37   interface
38  
39   uses
40 <  Classes, SysUtils, FBAttachment, FB30ClientAPI, Firebird, IB, FBActivityMonitor, FBParamBlock;
40 >  Classes, SysUtils, FBAttachment, FBClientAPI, FB30ClientAPI, Firebird, IB,
41 >  FBActivityMonitor, FBParamBlock;
42  
43   type
44  
# Line 47 | Line 48 | type
48    private
49      FAttachmentIntf: Firebird.IAttachment;
50      FFirebird30ClientAPI: TFB30ClientAPI;
51 +    FTimeZoneServices: ITimeZoneServices;
52 +    FUsingRemoteICU: boolean;
53 +    procedure SetUseRemoteICU(aValue: boolean);
54    protected
55      procedure CheckHandle; override;
56    public
# Line 80 | Line 84 | type
84  
85      {Blob - may use to open existing Blobs. However, ISQLData.AsBlob is preferred}
86  
87 <    function CreateBlob(transaction: ITransaction; RelationName, ColumnName: AnsiString; BPB: IBPB=nil): IBlob; overload;
84 <    function CreateBlob(transaction: ITransaction; BlobMetaData: IBlobMetaData; BPB: IBPB=nil): IBlob; overload;
87 >    function CreateBlob(transaction: ITransaction; BlobMetaData: IBlobMetaData; BPB: IBPB=nil): IBlob; overload; override;
88      function CreateBlob(transaction: ITransaction; SubType: integer; aCharSetID: cardinal=0; BPB: IBPB=nil): IBlob; overload;
86    function OpenBlob(transaction: ITransaction; RelationName, ColumnName: AnsiString; BlobID: TISC_QUAD; BPB: IBPB=nil): IBlob; overload;
89      function OpenBlob(transaction: ITransaction; BlobMetaData: IBlobMetaData; BlobID: TISC_QUAD; BPB: IBPB=nil): IBlob;  overload; override;
90  
91      {Array}
92 <    function OpenArray(transaction: ITransaction; RelationName, ColumnName: AnsiString; ArrayID: TISC_QUAD): IArray;
93 <    function CreateArray(transaction: ITransaction; RelationName, ColumnName: AnsiString): IArray; overload;
92 <    function CreateArray(transaction: ITransaction; ArrayMetaData: IArrayMetaData): IArray; overload;
92 >    function OpenArray(transaction: ITransaction; ArrayMetaData: IArrayMetaData; ArrayID: TISC_QUAD): IArray; overload; override;
93 >    function CreateArray(transaction: ITransaction; ArrayMetaData: IArrayMetaData): IArray; overload; override;
94      function CreateArrayMetaData(SQLType: cardinal; tableName: AnsiString;
95        columnName: AnsiString; Scale: integer; size: cardinal; aCharSetID: cardinal;
96        dimensions: cardinal; bounds: TArrayBounds): IArrayMetaData;
97  
98  
99      {Database Information}
100 <    function GetBlobMetaData(Transaction: ITransaction; tableName, columnName: AnsiString): IBlobMetaData;
101 <    function GetArrayMetaData(Transaction: ITransaction; tableName, columnName: AnsiString): IArrayMetaData;
100 >    function GetBlobMetaData(Transaction: ITransaction; tableName, columnName: AnsiString): IBlobMetaData; override;
101 >    function GetArrayMetaData(Transaction: ITransaction; tableName, columnName: AnsiString): IArrayMetaData; override;
102      procedure getFBVersion(version: TStrings);
103 +    function HasDecFloatSupport: boolean; override;
104 +
105 +    {Time Zone Support}
106 +    function GetTimeZoneServices: ITimeZoneServices; override;
107 +    function HasTimeZoneSupport: boolean; override;
108    end;
109  
110   implementation
111  
112   uses FB30Transaction, FB30Statement, FB30Array, FB30Blob, FBMessages,
113 <  FBOutputBlock, FB30Events, IBUtils;
113 >  FBOutputBlock, FB30Events, IBUtils, FB30TimeZoneServices;
114  
115   type
116    { TVersionCallback }
# Line 112 | Line 118 | type
118    TVersionCallback = class(Firebird.IVersionCallbackImpl)
119    private
120      FOutput: TStrings;
121 +    FFirebirdClientAPI: TFBClientAPI;
122    public
123 <    constructor Create(output: TStrings);
123 >    constructor Create(FirebirdClientAPI: TFBClientAPI; output: TStrings);
124      procedure callback(status: Firebird.IStatus; text: PAnsiChar); override;
125    end;
126  
127   { TVersionCallback }
128  
129 < constructor TVersionCallback.Create(output: TStrings);
129 > constructor TVersionCallback.Create(FirebirdClientAPI: TFBClientAPI;
130 >  output: TStrings);
131   begin
132    inherited Create;
133 +  FFirebirdClientAPI := FirebirdClientAPI;
134    FOutput := output;
135   end;
136  
137   procedure TVersionCallback.callback(status: Firebird.IStatus; text: PAnsiChar);
138 + var StatusObj: TFB30StatusObject;
139   begin
140 +  if ((status.getState and status.STATE_ERRORS) <> 0) then
141 +  begin
142 +    StatusObj := TFB30StatusObject.Create(FFirebirdClientAPI,status);
143 +    try
144 +      raise EIBInterBaseError.Create(StatusObj);
145 +    finally
146 +      StatusObj.Free;
147 +    end;
148 +  end;
149    FOutput.Add(text);
150   end;
151  
152  
153   { TFB30Attachment }
154  
155 + procedure TFB30Attachment.SetUseRemoteICU(aValue: boolean);
156 + begin
157 +  if (FUsingRemoteICU <> aValue) and (GetODSMajorVersion >= 13) then
158 +  begin
159 +    if aValue then
160 +      ExecImmediate([isc_tpb_write,isc_tpb_wait,isc_tpb_concurrency],'SET BIND OF TIME ZONE TO EXTENDED')
161 +    else
162 +      ExecImmediate([isc_tpb_write,isc_tpb_wait,isc_tpb_concurrency],'SET BIND OF TIME ZONE TO NATIVE');
163 +    FUsingRemoteICU := aValue;
164 +  end;
165 + end;
166 +
167   procedure TFB30Attachment.CheckHandle;
168   begin
169    if FAttachmentIntf = nil then
# Line 238 | Line 269 | begin
269        FAttachmentIntf := nil
270      else
271        GetODSAndConnectionInfo;
272 +
273    end;
274   end;
275  
# Line 254 | Line 286 | begin
286        FHasDefaultCharSet := false;
287        FCodePage := CP_NONE;
288        FCharSetID := 0;
289 +      FTimeZoneServices := nil;
290      end;
291   end;
292  
# Line 322 | Line 355 | begin
355    Result := TFB30Events.Create(self,Events);
356   end;
357  
325 function TFB30Attachment.CreateBlob(transaction: ITransaction; RelationName,
326  ColumnName: AnsiString; BPB: IBPB): IBlob;
327 begin
328  CheckHandle;
329  Result := TFB30Blob.Create(self,transaction as TFB30Transaction,
330              TFB30BlobMetaData.Create(self,Transaction as TFB30Transaction,RelationName,ColumnName),BPB);
331 end;
332
358   function TFB30Attachment.CreateBlob(transaction: ITransaction;
359    BlobMetaData: IBlobMetaData; BPB: IBPB): IBlob;
360   begin
# Line 344 | Line 369 | begin
369    Result := TFB30Blob.Create(self,transaction as TFB30Transaction, SubType,aCharSetID,BPB);
370   end;
371  
347 function TFB30Attachment.OpenBlob(transaction: ITransaction; RelationName,
348  ColumnName: AnsiString; BlobID: TISC_QUAD; BPB: IBPB): IBlob;
349 begin
350  CheckHandle;
351  Result := TFB30Blob.Create(self,transaction as TFB30transaction,
352                TFB30BlobMetaData.Create(self,Transaction as TFB30Transaction,RelationName,ColumnName),
353                BlobID,BPB);
354 end;
355
372   function TFB30Attachment.OpenBlob(transaction: ITransaction;
373    BlobMetaData: IBlobMetaData; BlobID: TISC_QUAD; BPB: IBPB): IBlob;
374   begin
# Line 360 | Line 376 | begin
376    Result :=  TFB30Blob.Create(self,transaction as TFB30transaction,BlobMetaData,BlobID,BPB);
377   end;
378  
379 < function TFB30Attachment.OpenArray(transaction: ITransaction; RelationName,
380 <  ColumnName: AnsiString; ArrayID: TISC_QUAD): IArray;
379 > function TFB30Attachment.OpenArray(transaction: ITransaction;
380 >  ArrayMetaData: IArrayMetaData; ArrayID: TISC_QUAD): IArray;
381   begin
382    CheckHandle;
383    Result := TFB30Array.Create(self,transaction as TFB30Transaction,
384 <                    GetArrayMetaData(transaction,RelationName,ColumnName),ArrayID);
369 < end;
370 <
371 < function TFB30Attachment.CreateArray(transaction: ITransaction; RelationName,
372 <  ColumnName: AnsiString): IArray;
373 < begin
374 <  CheckHandle;
375 <  Result := TFB30Array.Create(self,transaction as TFB30Transaction,
376 <                    GetArrayMetaData(transaction,RelationName,ColumnName));
384 >                    ArrayMetaData,ArrayID);
385   end;
386  
387   function TFB30Attachment.CreateArray(transaction: ITransaction;
# Line 408 | Line 416 | procedure TFB30Attachment.getFBVersion(v
416   var bufferObj: TVersionCallback;
417   begin
418    version.Clear;
419 <  bufferObj := TVersionCallback.Create(version);
419 >  bufferObj := TVersionCallback.Create(Firebird30ClientAPI,version);
420    try
421      with FFirebird30ClientAPI do
422      begin
# Line 420 | Line 428 | begin
428    end;
429   end;
430  
431 + function TFB30Attachment.HasDecFloatSupport: boolean;
432 + begin
433 +  Result := (FFirebird30ClientAPI.GetClientMajor >= 4) and
434 +   (GetODSMajorVersion >= 13);
435 + end;
436 +
437 + function TFB30Attachment.GetTimeZoneServices: ITimeZoneServices;
438 + begin
439 +  if not HasTimeZoneSupport then
440 +    IBError(ibxeNotSupported,[]);
441 +
442 +  if FTimeZoneServices = nil then
443 +    FTimeZoneServices := TFB30TimeZoneServices.Create(self);
444 +  Result := FTimeZoneServices;
445 + end;
446 +
447 + function TFB30Attachment.HasTimeZoneSupport: boolean;
448 + begin
449 +  Result := (FFirebird30ClientAPI.GetClientMajor >= 4) and
450 +   (GetODSMajorVersion >= 13);
451 + end;
452 +
453   end.
454  

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines