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

Comparing ibx/trunk/runtime/IBQuery.pas (file contents):
Revision 1 by tony, Mon Jul 31 16:43:00 2000 UTC vs.
Revision 21 by tony, Thu Feb 26 10:33:34 2015 UTC

# Line 1 | Line 1
1 < {************************************************************************}
2 < {                                                                        }
3 < {       Borland Delphi Visual Component Library                          }
4 < {       InterBase Express core components                                }
5 < {                                                                        }
6 < {       Copyright (c) 1998-2000 Inprise Corporation                      }
7 < {                                                                        }
8 < {    InterBase Express is based in part on the product                   }
9 < {    Free IB Components, written by Gregory H. Deatz for                 }
10 < {    Hoagland, Longo, Moran, Dunst & Doukas Company.                     }
11 < {    Free IB Components is used under license.                           }
12 < {                                                                        }
13 < {    The contents of this file are subject to the InterBase              }
14 < {    Public License Version 1.0 (the "License"); you may not             }
15 < {    use this file except in compliance with the License. You            }
16 < {    may obtain a copy of the License at http://www.Inprise.com/IPL.html }
17 < {    Software distributed under the License is distributed on            }
18 < {    an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either              }
19 < {    express or implied. See the License for the specific language       }
20 < {    governing rights and limitations under the License.                 }
21 < {    The Original Code was created by InterBase Software Corporation     }
22 < {       and its successors.                                              }
23 < {    Portions created by Inprise Corporation are Copyright (C) Inprise   }
24 < {       Corporation. All Rights Reserved.                                }
25 < {    Contributor(s): Jeff Overcash                                       }
26 < {                                                                        }
27 < {************************************************************************}
28 <
29 < unit IBQuery;
30 <
31 < interface
32 <
33 < uses Windows, SysUtils, Graphics, Classes, Controls, Db, StdVCL,
34 <     IBHeader, IB, IBCustomDataSet, IBSQL;
35 <
36 < type
37 <
38 < { TIBQuery }
39 <
40 <  TIBQuery = class(TIBCustomDataSet)
41 <  private
42 <    FSQL: TStrings;
43 <    FPrepared: Boolean;
44 <    FParams: TParams;
45 <    FText: string;
46 <    FRowsAffected: Integer;
47 <    FCheckRowsAffected: Boolean;
48 <    FGenerateParamNames: Boolean;
49 <    function GetRowsAffected: Integer;
50 <    procedure PrepareSQL(Value: PChar);
51 <    procedure QueryChanged(Sender: TObject);
52 <    procedure ReadParamData(Reader: TReader);
53 <    procedure SetQuery(Value: TStrings);
54 <    procedure SetParamsList(Value: TParams);
55 <    procedure SetParams;
56 <    procedure SetParamsFromCursor;
57 <    procedure SetPrepared(Value: Boolean);
58 <    procedure SetPrepare(Value: Boolean);
59 <    procedure WriteParamData(Writer: TWriter);
60 <    function GetStmtHandle: TISC_STMT_HANDLE;
61 <
62 <  protected
63 <    { IProviderSupport }
64 <    procedure PSExecute; override;
65 <    function PSGetParams: TParams; override;
66 <    function PSGetTableName: string; override;
67 <    procedure PSSetCommandText(const CommandText: string); override;
68 <    procedure PSSetParams(AParams: TParams); override;
69 <
70 <    procedure DefineProperties(Filer: TFiler); override;
71 <    procedure InitFieldDefs; override;
72 <    procedure InternalOpen; override;
73 <    procedure Disconnect; override;
74 <    function GetParamsCount: Word;
75 <    function GenerateQueryForLiveUpdate : Boolean;
76 <    procedure SetFiltered(Value: Boolean); override;
77 <
78 <  public
79 <    constructor Create(AOwner: TComponent); override;
80 <    destructor Destroy; override;
81 <    procedure BatchInput(InputObject: TIBBatchInput);
82 <    procedure BatchOutput(OutputObject: TIBBatchOutput);
83 <    procedure ExecSQL;
84 <    procedure GetDetailLinkFields(MasterFields, DetailFields: TList); override;
85 <    function ParamByName(const Value: string): TParam;
86 <    procedure Prepare;
87 <    procedure UnPrepare;
88 <    property Prepared: Boolean read FPrepared write SetPrepare;
89 <    property ParamCount: Word read GetParamsCount;
90 <    property StmtHandle: TISC_STMT_HANDLE read GetStmtHandle;
91 <    property StatementType;
92 <    property Text: string read FText;
93 <    property RowsAffected: Integer read GetRowsAffected;
94 <    property GenerateParamNames: Boolean read FGenerateParamNames write FGenerateParamNames;
95 <
96 <  published
97 <    property Active;
98 <    property BufferChunks;
99 <    property CachedUpdates;
100 <    property DataSource read GetDataSource write SetDataSource;
101 <    property Constraints stored ConstraintsStored;
102 <    property ParamCheck;
103 <    property SQL: TStrings read FSQL write SetQuery;
104 <    property Params: TParams read FParams write SetParamsList stored False;
105 <    property UniDirectional default False;
106 <    property UpdateObject;
107 <    property Filtered;
108 <
109 <    property BeforeDatabaseDisconnect;
110 <    property AfterDatabaseDisconnect;
111 <    property DatabaseFree;
112 <    property BeforeTransactionEnd;
113 <    property AfterTransactionEnd;
114 <    property TransactionFree;
115 <    property OnFilterRecord;
116 < end;
117 <
118 < implementation
119 <
120 < { TIBQuery }
121 <
122 < constructor TIBQuery.Create(AOwner: TComponent);
123 < begin
124 <  inherited Create(AOwner);
125 <  FSQL := TStringList.Create;
126 <  TStringList(SQL).OnChange := QueryChanged;
127 <  FParams := TParams.Create(Self);
128 <  ParamCheck := True;
129 <  FGenerateParamNames := False;
130 <  FRowsAffected := -1;
131 < end;
132 <
133 < destructor TIBQuery.Destroy;
134 < begin
135 <  Destroying;
136 <  Disconnect;
137 <  SQL.Free;
138 <  FParams.Free;
139 <  inherited Destroy;
140 < end;
141 <
142 < procedure TIBQuery.InitFieldDefs;
143 < begin
144 <  inherited;
145 < end;
146 <
147 < procedure TIBQuery.InternalOpen;
148 < begin
149 <  ActivateConnection();
150 <  ActivateTransaction;
151 <  QSelect.GenerateParamNames := FGenerateParamNames;
152 <  SetPrepared(True);
153 <  if DataSource <> nil then
154 <    SetParamsFromCursor;
155 <  SetParams;
156 <  inherited InternalOpen;
157 < end;
158 <
159 < procedure TIBQuery.Disconnect;
160 < begin
161 <  Close;
162 <  UnPrepare;
163 < end;
164 <
165 < procedure TIBQuery.SetPrepare(Value: Boolean);
166 < begin
167 <  if Value then
168 <    Prepare
169 <  else
170 <    UnPrepare;
171 < end;
172 <
173 < procedure TIBQuery.Prepare;
174 < begin
175 <  SetPrepared(True);
176 < end;
177 <
178 < procedure TIBQuery.UnPrepare;
179 < begin
180 <  SetPrepared(False);
181 < end;
182 <
183 < procedure TIBQuery.SetQuery(Value: TStrings);
184 < begin
185 <  if SQL.Text <> Value.Text then
186 <  begin
187 <    Disconnect;
188 <    SQL.BeginUpdate;
189 <    try
190 <      SQL.Assign(Value);
191 <    finally
192 <      SQL.EndUpdate;
193 <    end;
194 <  end;
195 < end;
196 <
197 < procedure TIBQuery.QueryChanged(Sender: TObject);
198 < var
199 <  List: TParams;
200 < begin
201 <  if not (csReading in ComponentState) then
202 <  begin
203 <    Disconnect;
204 <    if ParamCheck or (csDesigning in ComponentState) then
205 <    begin
206 <      List := TParams.Create(Self);
207 <      try
208 <        FText := List.ParseSQL(SQL.Text, True);
209 <        List.AssignValues(FParams);
210 <        FParams.Clear;
211 <        FParams.Assign(List);
212 <      finally
213 <        List.Free;
214 <      end;
215 <    end else
216 <      FText := SQL.Text;
217 <    DataEvent(dePropertyChange, 0);
218 <  end else
219 <    FText := FParams.ParseSQL(SQL.Text, False);
220 <  SelectSQL.Assign(SQL);
221 < end;
222 <
223 < procedure TIBQuery.SetParamsList(Value: TParams);
224 < begin
225 <  FParams.AssignValues(Value);
226 < end;
227 <
228 < function TIBQuery.GetParamsCount: Word;
229 < begin
230 <  Result := FParams.Count;
231 < end;
232 <
233 < procedure TIBQuery.DefineProperties(Filer: TFiler);
234 <
235 <  function WriteData: Boolean;
236 <  begin
237 <    if Filer.Ancestor <> nil then
238 <      Result := not FParams.IsEqual(TIBQuery(Filer.Ancestor).FParams) else
239 <      Result := FParams.Count > 0;
240 <  end;
241 <
242 < begin
243 <  inherited DefineProperties(Filer);
244 <  Filer.DefineProperty('ParamData', ReadParamData, WriteParamData, WriteData); {do not localize}
245 < end;
246 <
247 < procedure TIBQuery.ReadParamData(Reader: TReader);
248 < begin
249 <  Reader.ReadValue;
250 <  Reader.ReadCollection(FParams);
251 < end;
252 <
253 < procedure TIBQuery.WriteParamData(Writer: TWriter);
254 < begin
255 <  Writer.WriteCollection(Params);
256 < end;
257 <
258 < procedure TIBQuery.SetPrepared(Value: Boolean);
259 < begin
260 <  CheckDatasetClosed;
261 <  if Value <> Prepared then
262 <  begin
263 <    if Value then
264 <    begin
265 <      FRowsAffected := -1;
266 <      FCheckRowsAffected := True;
267 <      if Length(Text) > 1 then PrepareSQL(PChar(Text))
268 <      else IBError(ibxeEmptySQLStatement, [nil]);
269 <    end
270 <    else
271 <    begin
272 <      if FCheckRowsAffected then
273 <        FRowsAffected := RowsAffected;
274 <      InternalUnPrepare;
275 <    end;
276 <    FPrepared := Value;
277 <  end;
278 < end;
279 <
280 < procedure TIBQuery.SetParamsFromCursor;
281 < var
282 <  I: Integer;
283 <  DataSet: TDataSet;
284 <
285 <  procedure CheckRequiredParams;
286 <  var
287 <    I: Integer;
288 <  begin
289 <    for I := 0 to FParams.Count - 1 do
290 <    with FParams[I] do
291 <      if not Bound then
292 <        IBError(ibxeRequiredParamNotSet, [nil]);
293 <  end;
294 <
295 < begin
296 <  if DataSource <> nil then
297 <  begin
298 <    DataSet := DataSource.DataSet;
299 <    if DataSet <> nil then
300 <    begin
301 <      DataSet.FieldDefs.Update;
302 <      for I := 0 to FParams.Count - 1 do
303 <        with FParams[I] do
304 <          if not Bound then
305 <          begin
306 <            AssignField(DataSet.FieldByName(Name));
307 <            Bound := False;
308 <          end;
309 <    end
310 <    else
311 <      CheckRequiredParams;
312 <  end
313 <  else
314 <    CheckRequiredParams;
315 < end;
316 <
317 <
318 < function TIBQuery.ParamByName(const Value: string): TParam;
319 < begin
320 <  Result := FParams.ParamByName(Value);
321 < end;
322 <
323 < procedure TIBQuery.BatchInput(InputObject: TIBBatchInput);
324 < begin
325 <  InternalBatchInput(InputObject);
326 < end;
327 <
328 < procedure TIBQuery.BatchOutput(OutputObject: TIBBatchOutput);
329 < begin
330 <  InternalBatchOutput(OutputObject);
331 < end;
332 <
333 < procedure TIBQuery.ExecSQL;
334 < var
335 <  DidActivate: Boolean;
336 < begin
337 <  CheckInActive;
338 <  if SQL.Count <= 0 then
339 <  begin
340 <    FCheckRowsAffected := False;
341 <    IBError(ibxeEmptySQLStatement, [nil]);
342 <  end;
343 <  ActivateConnection();
344 <  DidActivate := ActivateTransaction;
345 <  try
346 <    SetPrepared(True);
347 <    if DataSource <> nil then SetParamsFromCursor;
348 <    if FParams.Count > 0 then SetParams;
349 <    InternalExecQuery;
350 <  finally
351 <    if DidActivate then
352 <      DeactivateTransaction;
353 <    FCheckRowsAffected := True;
354 <  end;
355 < end;
356 <
357 < procedure TIBQuery.SetParams;
358 <
359 < var
360 < i : integer;
361 < Buffer: Pointer;
362 <
363 < begin
364 <  for I := 0 to FParams.Count - 1 do
365 <  begin
366 <    if Params[i].IsNull then
367 <      SQLParams[i].IsNull := True
368 <    else begin
369 <      SQLParams[i].IsNull := False;
370 <      case Params[i].DataType of
371 <        ftBytes:
372 <        begin
373 <          GetMem(Buffer,Params[i].GetDataSize);
374 <          try
375 <            Params[i].GetData(Buffer);
376 <            SQLParams[i].AsPointer := Buffer;
377 <          finally
378 <            FreeMem(Buffer);
379 <          end;
380 <        end;
381 <        ftString:
382 <          SQLParams[i].AsString := Params[i].AsString;
383 <        ftBoolean, ftSmallint, ftWord:
384 <          SQLParams[i].AsShort := Params[i].AsSmallInt;
385 <        ftInteger:
386 <          SQLParams[i].AsLong := Params[i].AsInteger;
387 < {        ftLargeInt:
388 <          SQLParams[i].AsInt64 := Params[i].AsLargeInt;  }
389 <        ftFloat:
390 <         SQLParams[i].AsDouble := Params[i].AsFloat;
391 <        ftBCD, ftCurrency:
392 <          SQLParams[i].AsCurrency := Params[i].AsCurrency;
393 <        ftDate:
394 <          SQLParams[i].AsDate := Params[i].AsDateTime;
395 <        ftTime:
396 <          SQLParams[i].AsTime := Params[i].AsDateTime;
397 <        ftDateTime:
398 <          SQLParams[i].AsDateTime := Params[i].AsDateTime;
399 <        ftBlob, ftMemo:
400 <          SQLParams[i].AsString := Params[i].AsString;
401 <        else
402 <          IBError(ibxeNotSupported, [nil]);
403 <      end;
404 <    end;
405 <  end;
406 < end;
407 <
408 < procedure TIBQuery.PrepareSQL(Value: PChar);
409 < begin
410 <  QSelect.GenerateParamNames := FGenerateParamNames;
411 <  InternalPrepare;
412 < end;
413 <
414 <
415 < function TIBQuery.GetRowsAffected: Integer;
416 < begin
417 <  Result := -1;
418 <  if Prepared then
419 <   Result := QSelect.RowsAffected
420 < end;
421 <
422 <
423 < procedure TIBQuery.GetDetailLinkFields(MasterFields, DetailFields: TList);
424 <
425 <  function AddFieldToList(const FieldName: string; DataSet: TDataSet;
426 <    List: TList): Boolean;
427 <  var
428 <    Field: TField;
429 <  begin
430 <    Field := DataSet.FindField(FieldName);
431 <    if (Field <> nil) then
432 <      List.Add(Field);
433 <    Result := Field <> nil;
434 <  end;
435 <
436 < var
437 <  i: Integer;
438 < begin
439 <  MasterFields.Clear;
440 <  DetailFields.Clear;
441 <  if (DataSource <> nil) and (DataSource.DataSet <> nil) then
442 <    for i := 0 to Params.Count - 1 do
443 <      if AddFieldToList(Params[i].Name, DataSource.DataSet, MasterFields) then
444 <        AddFieldToList(Params[i].Name, Self, DetailFields);
445 < end;
446 <
447 < function TIBQuery.GetStmtHandle: TISC_STMT_HANDLE;
448 < begin
449 <  Result := SelectStmtHandle;
450 < end;
451 <
452 < function TIBQuery.GenerateQueryForLiveUpdate : Boolean;
453 < begin
454 <  Result := False;
455 < end;
456 <
457 < procedure TIBQuery.SetFiltered(Value: Boolean);
458 < begin
459 <  if(Filtered <> Value) then
460 <  begin
461 <    inherited SetFiltered(value);
462 <    if Active then
463 <    begin
464 <      Close;
465 <      Open;
466 <    end;
467 <  end
468 <  else
469 <    inherited SetFiltered(value);
470 < end;
471 <
472 < { TIBQuery IProviderSupport }
473 <
474 < function TIBQuery.PSGetParams: TParams;
475 < begin
476 <  Result := Params;
477 < end;
478 <
479 < procedure TIBQuery.PSSetParams(AParams: TParams);
480 < begin
481 <  if AParams.Count <> 0 then
482 <    Params.Assign(AParams);
483 <  Close;
484 < end;
485 <
486 < function TIBQuery.PSGetTableName: string;
487 < begin
488 <  Result := inherited PSGetTableName;
489 < end;
490 <
491 < procedure TIBQuery.PSExecute;
492 < begin
493 <  ExecSQL;
494 < end;
495 <
496 < procedure TIBQuery.PSSetCommandText(const CommandText: string);
497 < begin
498 <  if CommandText <> '' then
499 <    SQL.Text := CommandText;
500 < end;
501 <
502 < end.
503 <
1 > {************************************************************************}
2 > {                                                                        }
3 > {       Borland Delphi Visual Component Library                          }
4 > {       InterBase Express core components                                }
5 > {                                                                        }
6 > {       Copyright (c) 1998-2000 Inprise Corporation                      }
7 > {                                                                        }
8 > {    InterBase Express is based in part on the product                   }
9 > {    Free IB Components, written by Gregory H. Deatz for                 }
10 > {    Hoagland, Longo, Moran, Dunst & Doukas Company.                     }
11 > {    Free IB Components is used under license.                           }
12 > {                                                                        }
13 > {    The contents of this file are subject to the InterBase              }
14 > {    Public License Version 1.0 (the "License"); you may not             }
15 > {    use this file except in compliance with the License. You            }
16 > {    may obtain a copy of the License at http://www.Inprise.com/IPL.html }
17 > {    Software distributed under the License is distributed on            }
18 > {    an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either              }
19 > {    express or implied. See the License for the specific language       }
20 > {    governing rights and limitations under the License.                 }
21 > {    The Original Code was created by InterBase Software Corporation     }
22 > {       and its successors.                                              }
23 > {    Portions created by Inprise Corporation are Copyright (C) Inprise   }
24 > {       Corporation. All Rights Reserved.                                }
25 > {    Contributor(s): Jeff Overcash                                       }
26 > {                                                                        }
27 > {    IBX For Lazarus (Firebird Express)                                  }
28 > {    Contributor: Tony Whyman, MWA Software http://www.mwasoftware.co.uk }
29 > {    Portions created by MWA Software are copyright McCallum Whyman      }
30 > {    Associates Ltd 2011                                                 }
31 > {                                                                        }
32 > {************************************************************************}
33 >
34 > unit IBQuery;
35 >
36 > interface
37 >
38 > {$Mode Delphi}
39 >
40 > uses
41 > {$IFDEF WINDOWS }
42 >  Windows,
43 > {$ELSE}
44 >  unix,
45 > {$ENDIF}
46 > SysUtils, Graphics, Classes, Controls, Db,
47 >     IBHeader, IB, IBCustomDataSet, IBSQL, IBSQLParser;
48 >
49 > type
50 >
51 > { TIBQuery }
52 >
53 >  TIBQuery = class(TIBParserDataSet)
54 >  private
55 >    FSQL: TStrings;
56 >    FPrepared: Boolean;
57 >    FParams: TParams;
58 >    FText: string;
59 >    FRowsAffected: Integer;
60 >    FCheckRowsAffected: Boolean;
61 >    FSQLUpdating: boolean;
62 >    function GetRowsAffected: Integer;
63 >    procedure PrepareSQL(Value: PChar);
64 >    procedure QueryChanged(Sender: TObject);
65 >    procedure ReadParamData(Reader: TReader);
66 >    procedure SetQuery(Value: TStrings);
67 >    procedure SetParamsList(Value: TParams);
68 >    procedure SetParams;
69 >    procedure SetParamsFromCursor;
70 >    procedure SetPrepared(Value: Boolean);
71 >    procedure SetPrepare(Value: Boolean);
72 >    procedure WriteParamData(Writer: TWriter);
73 >    function GetStmtHandle: TISC_STMT_HANDLE;
74 >
75 >  protected
76 >    { IProviderSupport }
77 > (*    procedure PSExecute; override;
78 >    function PSGetParams: TParams; override;
79 >    function PSGetTableName: string; override;
80 >    procedure PSSetCommandText(const CommandText: string); override;
81 >    procedure PSSetParams(AParams: TParams); override;  *)
82 >
83 >    function CreateParser: TSelectSQLParser; override;
84 >    procedure DefineProperties(Filer: TFiler); override;
85 >    procedure InitFieldDefs; override;
86 >    procedure InternalOpen; override;
87 >    procedure Disconnect; override;
88 >    function GetParamsCount: Word;
89 >    function GenerateQueryForLiveUpdate : Boolean;
90 >    procedure SetFiltered(Value: Boolean); override;
91 >
92 >  public
93 >    constructor Create(AOwner: TComponent); override;
94 >    destructor Destroy; override;
95 >    procedure BatchInput(InputObject: TIBBatchInput);
96 >    procedure BatchOutput(OutputObject: TIBBatchOutput);
97 >    procedure ExecSQL;
98 >    procedure GetDetailLinkFields(MasterFields, DetailFields: TList);(* override;*)
99 >    function ParamByName(const Value: string): TParam;
100 >    procedure Prepare;
101 >    procedure UnPrepare;
102 >    property Prepared: Boolean read FPrepared write SetPrepare;
103 >    property ParamCount: Word read GetParamsCount;
104 >    property StmtHandle: TISC_STMT_HANDLE read GetStmtHandle;
105 >    property StatementType;
106 >    property Text: string read FText;
107 >    property RowsAffected: Integer read GetRowsAffected;
108 > //   property Params: TParams read FParams write SetParamsList;
109 >    property BaseSQLSelect;
110 >
111 >  published
112 >    property Active;
113 >    property BufferChunks;
114 >    property CachedUpdates;
115 >    property DataSource read GetDataSource write SetDataSource;
116 >    property GenerateParamNames;
117 > //   property Constraints stored ConstraintsStored;
118 >    property GeneratorField;
119 >    property ParamCheck;
120 >    property SQL: TStrings read FSQL write SetQuery;
121 >    property Params: TParams read FParams write SetParamsList;
122 >    property UniDirectional default False;
123 >    property UpdateObject;
124 >    property Filtered;
125 >
126 >    property BeforeDatabaseDisconnect;
127 >    property AfterDatabaseDisconnect;
128 >    property DatabaseFree;
129 >    property BeforeTransactionEnd;
130 >    property AfterTransactionEnd;
131 >    property TransactionFree;
132 >    property OnFilterRecord;
133 > end;
134 >
135 > implementation
136 >
137 > { TIBQuery }
138 >
139 > constructor TIBQuery.Create(AOwner: TComponent);
140 > begin
141 >  inherited Create(AOwner);
142 >  FSQL := TStringList.Create;
143 >  TStringList(SQL).OnChange := QueryChanged;
144 >  FParams := TParams.Create(Self);
145 >  ParamCheck := True;
146 >  FRowsAffected := -1;
147 > end;
148 >
149 > destructor TIBQuery.Destroy;
150 > begin
151 >  Destroying;
152 >  Disconnect;
153 >  SQL.Free;
154 >  FParams.Free;
155 >  inherited Destroy;
156 > end;
157 >
158 > procedure TIBQuery.InitFieldDefs;
159 > begin
160 >  inherited InitFieldDefs;
161 > end;
162 >
163 > procedure TIBQuery.InternalOpen;
164 > begin
165 >  ActivateConnection();
166 >  ActivateTransaction;
167 >  QSelect.GenerateParamNames := GenerateParamNames;
168 >  SetPrepared(True);
169 >  if DataSource <> nil then
170 >    SetParamsFromCursor;
171 >  SetParams;
172 >  inherited InternalOpen;
173 > end;
174 >
175 > procedure TIBQuery.Disconnect;
176 > begin
177 >  Close;
178 >  UnPrepare;
179 > end;
180 >
181 > procedure TIBQuery.SetPrepare(Value: Boolean);
182 > begin
183 >  if Value then
184 >    Prepare
185 >  else
186 >    UnPrepare;
187 > end;
188 >
189 > procedure TIBQuery.Prepare;
190 > begin
191 >  SetPrepared(True);
192 > end;
193 >
194 > procedure TIBQuery.UnPrepare;
195 > begin
196 >  SetPrepared(False);
197 > end;
198 >
199 > procedure TIBQuery.SetQuery(Value: TStrings);
200 > begin
201 >  if SQL.Text <> Value.Text then
202 >  begin
203 >    Disconnect;
204 >    SQL.BeginUpdate;
205 >    try
206 >      SQL.Assign(Value);
207 >    finally
208 >      SQL.EndUpdate;
209 >    end;
210 >  end;
211 > end;
212 >
213 > procedure TIBQuery.QueryChanged(Sender: TObject);
214 > var
215 >  List: TParams;
216 > begin
217 >  if not (csReading in ComponentState) then
218 >  begin
219 >    Disconnect;
220 >    if HasParser and not FSQLUpdating then
221 >    begin
222 >      FSQLUpdating := true;
223 >      try
224 >        SQL.Text := Parser.SQLText;
225 >      finally
226 >        FSQLUpdating := false
227 >      end;
228 >    end;
229 >    if ParamCheck or (csDesigning in ComponentState) then
230 >    begin
231 >      List := TParams.Create(Self);
232 >      try
233 >        FText := List.ParseSQL(SQL.Text, True);
234 >        List.AssignValues(FParams);
235 >        FParams.Clear;
236 >        FParams.Assign(List);
237 >      finally
238 >        List.Free;
239 >      end;
240 >    end else
241 >      FText := SQL.Text;
242 >    DataEvent(dePropertyChange, 0);
243 >  end else
244 >    FText := FParams.ParseSQL(SQL.Text, true);
245 >  SelectSQL.Assign(SQL);
246 > end;
247 >
248 > procedure TIBQuery.SetParamsList(Value: TParams);
249 > begin
250 >  FParams.AssignValues(Value);
251 > end;
252 >
253 > function TIBQuery.GetParamsCount: Word;
254 > begin
255 >  Result := FParams.Count;
256 > end;
257 >
258 > procedure TIBQuery.DefineProperties(Filer: TFiler);
259 >
260 >  function WriteData: Boolean;
261 >  begin
262 >  {The following results in a stream read error with nested frames. Hence commented out until
263 >   someone fixes the LCL }
264 > {    if Filer.Ancestor <> nil then
265 >      Result := not FParams.IsEqual(TIBQuery(Filer.Ancestor).FParams) else}
266 >      Result := FParams.Count > 0;
267 >  end;
268 >
269 > begin
270 >  inherited DefineProperties(Filer);
271 >  Filer.DefineProperty('ParamData', ReadParamData, WriteParamData, WriteData); {do not localize}
272 > end;
273 >
274 >
275 > procedure TIBQuery.ReadParamData(Reader: TReader);
276 > begin
277 >  FParams.Clear;
278 >  Reader.ReadValue;
279 >  Reader.ReadCollection(FParams);
280 > end;
281 >
282 > procedure TIBQuery.WriteParamData(Writer: TWriter);
283 > begin
284 >  Writer.WriteCollection(Params);
285 > end;
286 >
287 > procedure TIBQuery.SetPrepared(Value: Boolean);
288 > begin
289 >  CheckDatasetClosed;
290 >  if Value <> Prepared then
291 >  begin
292 >    if Value then
293 >    begin
294 >      FRowsAffected := -1;
295 >      FCheckRowsAffected := True;
296 >      if Length(Text) > 1 then PrepareSQL(PChar(Text))
297 >      else IBError(ibxeEmptySQLStatement, [nil]);
298 >    end
299 >    else
300 >    begin
301 >      if FCheckRowsAffected then
302 >        FRowsAffected := RowsAffected;
303 >      InternalUnPrepare;
304 >    end;
305 >    FPrepared := Value;
306 >  end;
307 > end;
308 >
309 > procedure TIBQuery.SetParamsFromCursor;
310 > var
311 >  I: Integer;
312 >  DataSet: TDataSet;
313 >  Field: TField;
314 >
315 >  procedure CheckRequiredParams;
316 >  var
317 >    I: Integer;
318 >  begin
319 >    for I := 0 to FParams.Count - 1 do
320 >    with FParams[I] do
321 >      if not Bound then
322 >        IBError(ibxeRequiredParamNotSet, [nil]);
323 >  end;
324 >
325 > begin
326 >  if DataSource <> nil then
327 >  begin
328 >    DataSet := DataSource.DataSet;
329 >    if DataSet <> nil then
330 >    begin
331 >      DataSet.FieldDefs.Update;
332 >      for I := 0 to FParams.Count - 1 do
333 >      if not FParams[I].Bound then
334 >      begin
335 >        Field := DataSet.FindField(FParams[I].Name);
336 >        if assigned(Field) then
337 >        begin
338 >            FParams[I].AssignField(Field);
339 >            FParams[I].Bound := False;
340 >        end;
341 >      end;
342 >    end
343 >    else
344 >      CheckRequiredParams;
345 >  end
346 >  else
347 >    CheckRequiredParams;
348 > end;
349 >
350 >
351 > function TIBQuery.ParamByName(const Value: string): TParam;
352 > begin
353 >  Result := FParams.ParamByName(Value);
354 > end;
355 >
356 > procedure TIBQuery.BatchInput(InputObject: TIBBatchInput);
357 > begin
358 >  InternalBatchInput(InputObject);
359 > end;
360 >
361 > procedure TIBQuery.BatchOutput(OutputObject: TIBBatchOutput);
362 > begin
363 >  InternalBatchOutput(OutputObject);
364 > end;
365 >
366 > procedure TIBQuery.ExecSQL;
367 > var
368 >  DidActivate: Boolean;
369 > begin
370 >  CheckInActive;
371 >  if SQL.Count <= 0 then
372 >  begin
373 >    FCheckRowsAffected := False;
374 >    IBError(ibxeEmptySQLStatement, [nil]);
375 >  end;
376 >  ActivateConnection();
377 >  DidActivate := ActivateTransaction;
378 >  try
379 >    SetPrepared(True);
380 >    if DataSource <> nil then SetParamsFromCursor;
381 >    if FParams.Count > 0 then SetParams;
382 >    InternalExecQuery;
383 >  finally
384 >    if DidActivate then
385 >      DeactivateTransaction;
386 >    FCheckRowsAffected := True;
387 >  end;
388 > end;
389 >
390 > procedure TIBQuery.SetParams;
391 >
392 > var
393 > i : integer;
394 > Buffer: Pointer;
395 > SQLParam: TIBXSQLVAR;
396 >
397 > begin
398 >  for I := 0 to FParams.Count - 1 do
399 >  begin
400 >    SQLParam :=  SQLParams.ByName(Params[i].Name);
401 >    if Params[i].IsNull then
402 >      SQLParam.IsNull := True
403 >    else begin
404 >      SQLParam.IsNull := False;
405 >      case Params[i].DataType of
406 >        ftBytes:
407 >        begin
408 >          GetMem(Buffer,Params[i].GetDataSize);
409 >          try
410 >            Params[i].GetData(Buffer);
411 >            SQLParam.AsPointer := Buffer;
412 >          finally
413 >            FreeMem(Buffer);
414 >          end;
415 >        end;
416 >        ftString:
417 >          SQLParam.AsString := Params[i].AsString;
418 >        ftBoolean, ftSmallint, ftWord:
419 >          SQLParam.AsShort := Params[i].AsSmallInt;
420 >        ftInteger:
421 >          SQLParam.AsLong := Params[i].AsInteger;
422 >        ftLargeInt:
423 >          SQLParam.AsInt64 := Params[i].AsLargeInt;
424 >        ftFloat:
425 >         SQLParam.AsDouble := Params[i].AsFloat;
426 >        ftBCD, ftCurrency:
427 >          SQLParam.AsCurrency := Params[i].AsCurrency;
428 >        ftDate:
429 >          SQLParam.AsDate := Params[i].AsDateTime;
430 >        ftTime:
431 >          SQLParam.AsTime := Params[i].AsDateTime;
432 >        ftDateTime:
433 >          SQLParam.AsDateTime := Params[i].AsDateTime;
434 >        ftBlob, ftMemo:
435 >          SQLParam.AsString := Params[i].AsString;
436 >        else
437 >          IBError(ibxeNotSupported, [nil]);
438 >      end;
439 >    end;
440 >  end;
441 > end;
442 >
443 > procedure TIBQuery.PrepareSQL(Value: PChar);
444 > begin
445 >  QSelect.GenerateParamNames := GenerateParamNames;
446 >  InternalPrepare;
447 > end;
448 >
449 >
450 > function TIBQuery.GetRowsAffected: Integer;
451 > begin
452 >  Result := -1;
453 >  if Prepared then
454 >   Result := QSelect.RowsAffected
455 > end;
456 >
457 >
458 > procedure TIBQuery.GetDetailLinkFields(MasterFields, DetailFields: TList);
459 >
460 >  function AddFieldToList(const FieldName: string; DataSet: TDataSet;
461 >    List: TList): Boolean;
462 >  var
463 >    Field: TField;
464 >  begin
465 >    Field := DataSet.FindField(FieldName);
466 >    if (Field <> nil) then
467 >      List.Add(Field);
468 >    Result := Field <> nil;
469 >  end;
470 >
471 > var
472 >  i: Integer;
473 > begin
474 >  MasterFields.Clear;
475 >  DetailFields.Clear;
476 >  if (DataSource <> nil) and (DataSource.DataSet <> nil) then
477 >    for i := 0 to Params.Count - 1 do
478 >      if AddFieldToList(Params[i].Name, DataSource.DataSet, MasterFields) then
479 >        AddFieldToList(Params[i].Name, Self, DetailFields);
480 > end;
481 >
482 > function TIBQuery.GetStmtHandle: TISC_STMT_HANDLE;
483 > begin
484 >  Result := SelectStmtHandle;
485 > end;
486 >
487 > function TIBQuery.CreateParser: TSelectSQLParser;
488 > begin
489 >  Result := inherited CreateParser;
490 >  Result.OnSQLChanging := QueryChanged;
491 > end;
492 >
493 > function TIBQuery.GenerateQueryForLiveUpdate : Boolean;
494 > begin
495 >  Result := False;
496 > end;
497 >
498 > procedure TIBQuery.SetFiltered(Value: Boolean);
499 > begin
500 >  if(Filtered <> Value) then
501 >  begin
502 >    inherited SetFiltered(value);
503 >    if Active then
504 >    begin
505 >      Close;
506 >      Open;
507 >    end;
508 >  end
509 >  else
510 >    inherited SetFiltered(value);
511 > end;
512 >
513 > { TIBQuery IProviderSupport }
514 > (*
515 > function TIBQuery.PSGetParams: TParams;
516 > begin
517 >  Result := Params;
518 > end;
519 >
520 > procedure TIBQuery.PSSetParams(AParams: TParams);
521 > begin
522 >  if AParams.Count <> 0 then
523 >    Params.Assign(AParams);
524 >  Close;
525 > end;
526 >
527 > function TIBQuery.PSGetTableName: string;
528 > begin
529 >  Result := inherited PSGetTableName;
530 > end;
531 >
532 > procedure TIBQuery.PSExecute;
533 > begin
534 >  ExecSQL;
535 > end;
536 >
537 > procedure TIBQuery.PSSetCommandText(const CommandText: string);
538 > begin
539 >  if CommandText <> '' then
540 >    SQL.Text := CommandText;
541 > end;
542 > *)
543 > end.
544 >

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines