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

Comparing ibx/trunk/fbintf/client/FBStatement.pas (file contents):
Revision 47 by tony, Mon Jan 9 15:31:51 2017 UTC vs.
Revision 315 by tony, Thu Feb 25 11:56:36 2021 UTC

# Line 28 | Line 28
28   *
29   *)
30   unit FBStatement;
31 + {$IFDEF MSWINDOWS}
32 + {$DEFINE WINDOWS}
33 + {$ENDIF}
34  
35   {$IFDEF FPC}
36 < {$mode objfpc}{$H+}
36 > {$mode delphi}
37   {$codepage UTF8}
38   {$interfaces COM}
39   {$ENDIF}
# Line 46 | Line 49 | type
49  
50    { TFBStatement }
51  
52 <  TFBStatement = class(TActivityReporter)
52 >  TFBStatement = class(TActivityReporter,ITransactionUser)
53    private
54      FAttachmentIntf: IAttachment;
55 +    FFirebirdClientAPI: TFBClientAPI;
56    protected
57      FTransactionIntf: ITransaction;
58      FExecTransactionIntf: ITransaction;
# Line 57 | Line 61 | type
61      FOpen: boolean;
62      FPrepared: boolean;
63      FPrepareSeqNo: integer; {used to check for out of date references from interfaces}
64 <    FSQL: string;
65 <    FProcessedSQL: string;
64 >    FSQL: AnsiString;
65 >    FProcessedSQL: AnsiString;
66      FHasParamNames: boolean;
67      FBOF: boolean;
68      FEOF: boolean;
# Line 69 | Line 73 | type
73      FStatisticsAvailable: boolean;
74      FBeforeStats: TPerfStatistics;
75      FAfterStats: TPerfStatistics;
76 +    FCaseSensitiveParams: boolean;
77      procedure CheckHandle; virtual; abstract;
78      procedure CheckTransaction(aTransaction: ITransaction);
79      procedure GetDsqlInfo(info_request: byte; buffer: ISQLInfoResults); overload; virtual; abstract;
80      procedure InternalPrepare;  virtual; abstract;
81      function InternalExecute(aTransaction: ITransaction): IResults;  virtual; abstract;
82      function InternalOpenCursor(aTransaction: ITransaction): IResultSet;   virtual; abstract;
83 +    procedure ProcessSQL(sql: AnsiString; GenerateParamNames: boolean; var processedSQL: AnsiString); virtual; abstract;
84      procedure FreeHandle;  virtual; abstract;
85      procedure InternalClose(Force: boolean); virtual; abstract;
86 +    function TimeStampToMSecs(const TimeStamp: TTimeStamp): Int64;
87    public
88      constructor Create(Attachment: IAttachment; Transaction: ITransaction;
89 <      sql: string; SQLDialect: integer);
89 >      sql: AnsiString; SQLDialect: integer);
90      constructor CreateWithParameterNames(Attachment: IAttachment; Transaction: ITransaction;
91 <      sql: string;  SQLDialect: integer; GenerateParamNames: boolean =false);
91 >      sql: AnsiString;  SQLDialect: integer; GenerateParamNames: boolean =false;
92 >      CaseSensitiveParams: boolean = false);
93      destructor Destroy; override;
94      procedure Close;
95      procedure TransactionEnding(aTransaction: ITransaction; Force: boolean);
96      property SQLDialect: integer read FSQLDialect;
97 +    property FirebirdClientAPI: TFBClientAPI read FFirebirdClientAPI;
98  
99    public
100      function GetSQLParams: ISQLParams; virtual; abstract;
# Line 93 | Line 102 | type
102      function GetRowsAffected(var SelectCount, InsertCount, UpdateCount,
103        DeleteCount: integer): boolean;
104      function GetSQLStatementType: TIBSQLStatementTypes;
105 <    function GetSQLText: string;
105 >    function GetSQLText: AnsiString;
106 >    function GetProcessedSQLText: AnsiString;
107      function GetSQLDialect: integer;
108  
109      {GetDSQLInfo only supports isc_info_sql_stmt_type, isc_info_sql_get_plan, isc_info_sql_records}
110      procedure Prepare(aTransaction: ITransaction=nil); virtual;
111      function Execute(aTransaction: ITransaction=nil): IResults;
112      function OpenCursor(aTransaction: ITransaction=nil): IResultSet;
113 <    function CreateBlob(paramName: string): IBlob; overload;
113 >    function CreateBlob(paramName: AnsiString): IBlob; overload;
114      function CreateBlob(index: integer): IBlob; overload;
115      function CreateBlob(column: TColumnMetaData): IBlob; overload; virtual; abstract;
116 <    function CreateArray(paramName: string): IArray; overload;
116 >    function CreateArray(paramName: AnsiString): IArray; overload;
117      function CreateArray(index: integer): IArray;  overload;
118      function CreateArray(column: TColumnMetaData): IArray; overload; virtual; abstract;
119      function GetAttachment: IAttachment;
# Line 132 | Line 142 | begin
142      IBError(ibxeNotInTransaction,[]);
143   end;
144  
145 + function TFBStatement.TimeStampToMSecs(const TimeStamp: TTimeStamp): Int64;
146 + begin
147 +  Result := TimeStamp.Time + Int64(timestamp.date)*msecsperday;
148 + end;
149 +
150   constructor TFBStatement.Create(Attachment: IAttachment;
151 <  Transaction: ITransaction; sql: string; SQLDialect: integer);
151 >  Transaction: ITransaction; sql: AnsiString; SQLDialect: integer);
152   begin
153    inherited Create(Transaction as TFBTransaction,2);
154    FAttachmentIntf := Attachment;
155    FTransactionIntf := Transaction;
156 +  FFirebirdClientAPI := Attachment.getFirebirdAPI as TFBClientAPI;
157    FSQLDialect := SQLDialect;
158    FSQL := sql;
159   end;
160  
161   constructor TFBStatement.CreateWithParameterNames(Attachment: IAttachment;
162 <  Transaction: ITransaction; sql: string; SQLDialect: integer;
163 <  GenerateParamNames: boolean);
162 >  Transaction: ITransaction; sql: AnsiString; SQLDialect: integer;
163 >  GenerateParamNames: boolean; CaseSensitiveParams: boolean);
164   begin
165    FHasParamNames := true;
166    FGenerateParamNames := GenerateParamNames;
167 +  FCaseSensitiveParams := CaseSensitiveParams;
168    Create(Attachment,Transaction,sql,SQLDialect);
169   end;
170  
# Line 166 | Line 183 | end;
183   procedure TFBStatement.TransactionEnding(aTransaction: ITransaction;
184    Force: boolean);
185   begin
186 <  if FOpen and (FExecTransactionIntf = aTransaction) then
186 >  if FOpen and ((FExecTransactionIntf as TObject) = (aTransaction as TObject)) then
187      InternalClose(Force);
188  
189    if FTransactionIntf = aTransaction then
# Line 214 | Line 231 | begin
231    Result := FSQLStatementType;
232   end;
233  
234 < function TFBStatement.GetSQLText: string;
234 > function TFBStatement.GetSQLText: AnsiString;
235   begin
236    Result := FSQL;
237   end;
238  
239 + function TFBStatement.GetProcessedSQLText: AnsiString;
240 + begin
241 +  if FProcessedSQL = '' then
242 +    ProcessSQL(FSQL,FGenerateParamNames,FProcessedSQL);
243 +  Result := FProcessedSQL
244 + end;
245 +
246   function TFBStatement.GetSQLDialect: integer;
247   begin
248    Result := FSQLDialect;
# Line 253 | Line 277 | begin
277      Result := InternalOpenCursor(aTransaction);
278   end;
279  
280 < function TFBStatement.CreateBlob(paramName: string): IBlob;
280 > function TFBStatement.CreateBlob(paramName: AnsiString): IBlob;
281   var column: TColumnMetaData;
282   begin
283    InternalPrepare;
# Line 269 | Line 293 | begin
293    Result := CreateBlob(SQLParams[index] as TSQLParam);
294   end;
295  
296 < function TFBStatement.CreateArray(paramName: string): IArray;
296 > function TFBStatement.CreateArray(paramName: AnsiString): IArray;
297   var column: TColumnMetaData;
298   begin
299    InternalPrepare;
# Line 297 | Line 321 | end;
321  
322   function TFBStatement.GetDSQLInfo(Request: byte): ISQLInfoResults;
323   begin
324 <  Result := TSQLInfoResultsBuffer.Create;
324 >  Result := TSQLInfoResultsBuffer.Create(FFirebirdClientAPI);
325    GetDsqlInfo(Request,Result);
326   end;
327  

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines