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 7 by tony, Sun Aug 5 18:28:19 2012 UTC vs.
Revision 19 by tony, Mon Jul 7 13:00:15 2014 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 < {    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;
48 <
49 < type
50 <
51 < { TIBQuery }
52 <
53 <  TIBQuery = class(TIBCustomDataSet)
54 <  private
55 <    FSQL: TStrings;
56 <    FPrepared: Boolean;
57 <    FParams: TParams;
58 <    FText: string;
59 <    FRowsAffected: Integer;
60 <    FCheckRowsAffected: Boolean;
61 <    FGenerateParamNames: 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 <    procedure DefineProperties(Filer: TFiler); override;
84 <    procedure InitFieldDefs; override;
85 <    procedure InternalOpen; override;
86 <    procedure Disconnect; override;
87 <    function GetParamsCount: Word;
88 <    function GenerateQueryForLiveUpdate : Boolean;
89 <    procedure SetFiltered(Value: Boolean); override;
90 <
91 <  public
92 <    constructor Create(AOwner: TComponent); override;
93 <    destructor Destroy; override;
94 <    procedure BatchInput(InputObject: TIBBatchInput);
95 <    procedure BatchOutput(OutputObject: TIBBatchOutput);
96 <    procedure ExecSQL;
97 <    procedure GetDetailLinkFields(MasterFields, DetailFields: TList);(* override;*)
98 <    function ParamByName(const Value: string): TParam;
99 <    procedure Prepare;
100 <    procedure UnPrepare;
101 <    property Prepared: Boolean read FPrepared write SetPrepare;
102 <    property ParamCount: Word read GetParamsCount;
103 <    property StmtHandle: TISC_STMT_HANDLE read GetStmtHandle;
104 <    property StatementType;
105 <    property Text: string read FText;
106 <    property RowsAffected: Integer read GetRowsAffected;
107 <    property GenerateParamNames: Boolean read FGenerateParamNames write FGenerateParamNames;
108 < //   property Params: TParams read FParams write SetParamsList;
109 <
110 <  published
111 <    property Active;
112 <    property BufferChunks;
113 <    property CachedUpdates;
114 <    property DataSource read GetDataSource write SetDataSource;
115 < //   property Constraints stored ConstraintsStored;
116 <    property GeneratorField;
117 <    property ParamCheck;
118 <    property SQL: TStrings read FSQL write SetQuery;
119 <   property Params: TParams read FParams write SetParamsList;
120 <    property UniDirectional default False;
121 <    property UpdateObject;
122 <    property Filtered;
123 <
124 <    property BeforeDatabaseDisconnect;
125 <    property AfterDatabaseDisconnect;
126 <    property DatabaseFree;
127 <    property BeforeTransactionEnd;
128 <    property AfterTransactionEnd;
129 <    property TransactionFree;
130 <    property OnFilterRecord;
131 < end;
132 <
133 < implementation
134 <
135 < { TIBQuery }
136 <
137 < constructor TIBQuery.Create(AOwner: TComponent);
138 < begin
139 <  inherited Create(AOwner);
140 <  FSQL := TStringList.Create;
141 <  TStringList(SQL).OnChange := QueryChanged;
142 <  FParams := TParams.Create(Self);
143 <  ParamCheck := True;
144 <  FGenerateParamNames := False;
145 <  FRowsAffected := -1;
146 < end;
147 <
148 < destructor TIBQuery.Destroy;
149 < begin
150 <  Destroying;
151 <  Disconnect;
152 <  SQL.Free;
153 <  FParams.Free;
154 <  inherited Destroy;
155 < end;
156 <
157 < procedure TIBQuery.InitFieldDefs;
158 < begin
159 <  inherited InitFieldDefs;
160 < end;
161 <
162 < procedure TIBQuery.InternalOpen;
163 < begin
164 <  ActivateConnection();
165 <  ActivateTransaction;
166 <  QSelect.GenerateParamNames := FGenerateParamNames;
167 <  SetPrepared(True);
168 <  if DataSource <> nil then
169 <    SetParamsFromCursor;
170 <  SetParams;
171 <  inherited InternalOpen;
172 < end;
173 <
174 < procedure TIBQuery.Disconnect;
175 < begin
176 <  Close;
177 <  UnPrepare;
178 < end;
179 <
180 < procedure TIBQuery.SetPrepare(Value: Boolean);
181 < begin
182 <  if Value then
183 <    Prepare
184 <  else
185 <    UnPrepare;
186 < end;
187 <
188 < procedure TIBQuery.Prepare;
189 < begin
190 <  SetPrepared(True);
191 < end;
192 <
193 < procedure TIBQuery.UnPrepare;
194 < begin
195 <  SetPrepared(False);
196 < end;
197 <
198 < procedure TIBQuery.SetQuery(Value: TStrings);
199 < begin
200 <  if SQL.Text <> Value.Text then
201 <  begin
202 <    Disconnect;
203 <    SQL.BeginUpdate;
204 <    try
205 <      SQL.Assign(Value);
206 <    finally
207 <      SQL.EndUpdate;
208 <    end;
209 <  end;
210 < end;
211 <
212 < procedure TIBQuery.QueryChanged(Sender: TObject);
213 < var
214 <  List: TParams;
215 < begin
216 <  if not (csReading in ComponentState) then
217 <  begin
218 <    Disconnect;
219 <    if ParamCheck or (csDesigning in ComponentState) then
220 <    begin
221 <      List := TParams.Create(Self);
222 <      try
223 <        FText := List.ParseSQL(SQL.Text, True);
224 <        List.AssignValues(FParams);
225 <        FParams.Clear;
226 <        FParams.Assign(List);
227 <      finally
228 <        List.Free;
229 <      end;
230 <    end else
231 <      FText := SQL.Text;
232 <    DataEvent(dePropertyChange, 0);
233 <  end else
234 <    FText := FParams.ParseSQL(SQL.Text, true);
235 <  SelectSQL.Assign(SQL);
236 < end;
237 <
238 < procedure TIBQuery.SetParamsList(Value: TParams);
239 < begin
240 <  FParams.AssignValues(Value);
241 < end;
242 <
243 < function TIBQuery.GetParamsCount: Word;
244 < begin
245 <  Result := FParams.Count;
246 < end;
247 <
248 < procedure TIBQuery.DefineProperties(Filer: TFiler);
249 <
250 <  function WriteData: Boolean;
251 <  begin
252 <  {The following results in a stream read error with nested frames. Hence commented out until
253 <   someone fixes the LCL }
254 < {    if Filer.Ancestor <> nil then
255 <      Result := not FParams.IsEqual(TIBQuery(Filer.Ancestor).FParams) else}
256 <      Result := FParams.Count > 0;
257 <  end;
258 <
259 < begin
260 <  inherited DefineProperties(Filer);
261 <  Filer.DefineProperty('ParamData', ReadParamData, WriteParamData, WriteData); {do not localize}
262 < end;
263 <
264 < procedure TIBQuery.ReadParamData(Reader: TReader);
265 < begin
266 <  FParams.Clear;
267 <  Reader.ReadValue;
268 <  Reader.ReadCollection(FParams);
269 < end;
270 <
271 < procedure TIBQuery.WriteParamData(Writer: TWriter);
272 < begin
273 <  Writer.WriteCollection(Params);
274 < end;
275 <
276 < procedure TIBQuery.SetPrepared(Value: Boolean);
277 < begin
278 <  CheckDatasetClosed;
279 <  if Value <> Prepared then
280 <  begin
281 <    if Value then
282 <    begin
283 <      FRowsAffected := -1;
284 <      FCheckRowsAffected := True;
285 <      if Length(Text) > 1 then PrepareSQL(PChar(Text))
286 <      else IBError(ibxeEmptySQLStatement, [nil]);
287 <    end
288 <    else
289 <    begin
290 <      if FCheckRowsAffected then
291 <        FRowsAffected := RowsAffected;
292 <      InternalUnPrepare;
293 <    end;
294 <    FPrepared := Value;
295 <  end;
296 < end;
297 <
298 < procedure TIBQuery.SetParamsFromCursor;
299 < var
300 <  I: Integer;
301 <  DataSet: TDataSet;
302 <  Field: TField;
303 <
304 <  procedure CheckRequiredParams;
305 <  var
306 <    I: Integer;
307 <  begin
308 <    for I := 0 to FParams.Count - 1 do
309 <    with FParams[I] do
310 <      if not Bound then
311 <        IBError(ibxeRequiredParamNotSet, [nil]);
312 <  end;
313 <
314 < begin
315 <  if DataSource <> nil then
316 <  begin
317 <    DataSet := DataSource.DataSet;
318 <    if DataSet <> nil then
319 <    begin
320 <      DataSet.FieldDefs.Update;
321 <      for I := 0 to FParams.Count - 1 do
322 <      if not FParams[I].Bound then
323 <      begin
324 <        Field := DataSet.FindField(FParams[I].Name);
325 <        if assigned(Field) then
326 <        begin
327 <            FParams[I].AssignField(Field);
328 <            FParams[I].Bound := False;
329 <        end;
330 <      end;
331 <    end
332 <    else
333 <      CheckRequiredParams;
334 <  end
335 <  else
336 <    CheckRequiredParams;
337 < end;
338 <
339 <
340 < function TIBQuery.ParamByName(const Value: string): TParam;
341 < begin
342 <  Result := FParams.ParamByName(Value);
343 < end;
344 <
345 < procedure TIBQuery.BatchInput(InputObject: TIBBatchInput);
346 < begin
347 <  InternalBatchInput(InputObject);
348 < end;
349 <
350 < procedure TIBQuery.BatchOutput(OutputObject: TIBBatchOutput);
351 < begin
352 <  InternalBatchOutput(OutputObject);
353 < end;
354 <
355 < procedure TIBQuery.ExecSQL;
356 < var
357 <  DidActivate: Boolean;
358 < begin
359 <  CheckInActive;
360 <  if SQL.Count <= 0 then
361 <  begin
362 <    FCheckRowsAffected := False;
363 <    IBError(ibxeEmptySQLStatement, [nil]);
364 <  end;
365 <  ActivateConnection();
366 <  DidActivate := ActivateTransaction;
367 <  try
368 <    SetPrepared(True);
369 <    if DataSource <> nil then SetParamsFromCursor;
370 <    if FParams.Count > 0 then SetParams;
371 <    InternalExecQuery;
372 <  finally
373 <    if DidActivate then
374 <      DeactivateTransaction;
375 <    FCheckRowsAffected := True;
376 <  end;
377 < end;
378 <
379 < procedure TIBQuery.SetParams;
380 <
381 < var
382 < i : integer;
383 < Buffer: Pointer;
384 <
385 < begin
386 <  for I := 0 to FParams.Count - 1 do
387 <  begin
388 <    if Params[i].IsNull then
389 <      SQLParams[i].IsNull := True
390 <    else begin
391 <      SQLParams[i].IsNull := False;
392 <      case Params[i].DataType of
393 <        ftBytes:
394 <        begin
395 <          GetMem(Buffer,Params[i].GetDataSize);
396 <          try
397 <            Params[i].GetData(Buffer);
398 <            SQLParams[i].AsPointer := Buffer;
399 <          finally
400 <            FreeMem(Buffer);
401 <          end;
402 <        end;
403 <        ftString:
404 <          SQLParams[i].AsString := Params[i].AsString;
405 <        ftBoolean, ftSmallint, ftWord:
406 <          SQLParams[i].AsShort := Params[i].AsSmallInt;
407 <        ftInteger:
408 <          SQLParams[i].AsLong := Params[i].AsInteger;
409 < {        ftLargeInt:
410 <          SQLParams[i].AsInt64 := Params[i].AsLargeInt;  }
411 <        ftFloat:
412 <         SQLParams[i].AsDouble := Params[i].AsFloat;
413 <        ftBCD, ftCurrency:
414 <          SQLParams[i].AsCurrency := Params[i].AsCurrency;
415 <        ftDate:
416 <          SQLParams[i].AsDate := Params[i].AsDateTime;
417 <        ftTime:
418 <          SQLParams[i].AsTime := Params[i].AsDateTime;
419 <        ftDateTime:
420 <          SQLParams[i].AsDateTime := Params[i].AsDateTime;
421 <        ftBlob, ftMemo:
422 <          SQLParams[i].AsString := Params[i].AsString;
423 <        else
424 <          IBError(ibxeNotSupported, [nil]);
425 <      end;
426 <    end;
427 <  end;
428 < end;
429 <
430 < procedure TIBQuery.PrepareSQL(Value: PChar);
431 < begin
432 <  QSelect.GenerateParamNames := FGenerateParamNames;
433 <  InternalPrepare;
434 < end;
435 <
436 <
437 < function TIBQuery.GetRowsAffected: Integer;
438 < begin
439 <  Result := -1;
440 <  if Prepared then
441 <   Result := QSelect.RowsAffected
442 < end;
443 <
444 <
445 < procedure TIBQuery.GetDetailLinkFields(MasterFields, DetailFields: TList);
446 <
447 <  function AddFieldToList(const FieldName: string; DataSet: TDataSet;
448 <    List: TList): Boolean;
449 <  var
450 <    Field: TField;
451 <  begin
452 <    Field := DataSet.FindField(FieldName);
453 <    if (Field <> nil) then
454 <      List.Add(Field);
455 <    Result := Field <> nil;
456 <  end;
457 <
458 < var
459 <  i: Integer;
460 < begin
461 <  MasterFields.Clear;
462 <  DetailFields.Clear;
463 <  if (DataSource <> nil) and (DataSource.DataSet <> nil) then
464 <    for i := 0 to Params.Count - 1 do
465 <      if AddFieldToList(Params[i].Name, DataSource.DataSet, MasterFields) then
466 <        AddFieldToList(Params[i].Name, Self, DetailFields);
467 < end;
468 <
469 < function TIBQuery.GetStmtHandle: TISC_STMT_HANDLE;
470 < begin
471 <  Result := SelectStmtHandle;
472 < end;
473 <
474 < function TIBQuery.GenerateQueryForLiveUpdate : Boolean;
475 < begin
476 <  Result := False;
477 < end;
478 <
479 < procedure TIBQuery.SetFiltered(Value: Boolean);
480 < begin
481 <  if(Filtered <> Value) then
482 <  begin
483 <    inherited SetFiltered(value);
484 <    if Active then
485 <    begin
486 <      Close;
487 <      Open;
488 <    end;
489 <  end
490 <  else
491 <    inherited SetFiltered(value);
492 < end;
493 <
494 < { TIBQuery IProviderSupport }
495 < (*
496 < function TIBQuery.PSGetParams: TParams;
497 < begin
498 <  Result := Params;
499 < end;
500 <
501 < procedure TIBQuery.PSSetParams(AParams: TParams);
502 < begin
503 <  if AParams.Count <> 0 then
504 <    Params.Assign(AParams);
505 <  Close;
506 < end;
507 <
508 < function TIBQuery.PSGetTableName: string;
509 < begin
510 <  Result := inherited PSGetTableName;
511 < end;
512 <
513 < procedure TIBQuery.PSExecute;
514 < begin
515 <  ExecSQL;
516 < end;
517 <
518 < procedure TIBQuery.PSSetCommandText(const CommandText: string);
519 < begin
520 <  if CommandText <> '' then
521 <    SQL.Text := CommandText;
522 < end;
523 < *)
524 < end.
525 <
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;
48 >
49 > type
50 >
51 > { TIBQuery }
52 >
53 >  TIBQuery = class(TIBCustomDataSet)
54 >  private
55 >    FSQL: TStrings;
56 >    FPrepared: Boolean;
57 >    FParams: TParams;
58 >    FText: string;
59 >    FRowsAffected: Integer;
60 >    FCheckRowsAffected: Boolean;
61 >    function GetRowsAffected: Integer;
62 >    procedure PrepareSQL(Value: PChar);
63 >    procedure QueryChanged(Sender: TObject);
64 >    procedure ReadParamData(Reader: TReader);
65 >    procedure SetQuery(Value: TStrings);
66 >    procedure SetParamsList(Value: TParams);
67 >    procedure SetParams;
68 >    procedure SetParamsFromCursor;
69 >    procedure SetPrepared(Value: Boolean);
70 >    procedure SetPrepare(Value: Boolean);
71 >    procedure WriteParamData(Writer: TWriter);
72 >    function GetStmtHandle: TISC_STMT_HANDLE;
73 >
74 >  protected
75 >    { IProviderSupport }
76 > (*    procedure PSExecute; override;
77 >    function PSGetParams: TParams; override;
78 >    function PSGetTableName: string; override;
79 >    procedure PSSetCommandText(const CommandText: string); override;
80 >    procedure PSSetParams(AParams: TParams); override;  *)
81 >
82 >    procedure DefineProperties(Filer: TFiler); override;
83 >    procedure InitFieldDefs; override;
84 >    procedure InternalOpen; override;
85 >    procedure Disconnect; override;
86 >    function GetParamsCount: Word;
87 >    function GenerateQueryForLiveUpdate : Boolean;
88 >    procedure SetFiltered(Value: Boolean); override;
89 >
90 >  public
91 >    constructor Create(AOwner: TComponent); override;
92 >    destructor Destroy; override;
93 >    procedure BatchInput(InputObject: TIBBatchInput);
94 >    procedure BatchOutput(OutputObject: TIBBatchOutput);
95 >    procedure ExecSQL;
96 >    procedure GetDetailLinkFields(MasterFields, DetailFields: TList);(* override;*)
97 >    function ParamByName(const Value: string): TParam;
98 >    procedure Prepare;
99 >    procedure UnPrepare;
100 >    property Prepared: Boolean read FPrepared write SetPrepare;
101 >    property ParamCount: Word read GetParamsCount;
102 >    property StmtHandle: TISC_STMT_HANDLE read GetStmtHandle;
103 >    property StatementType;
104 >    property Text: string read FText;
105 >    property RowsAffected: Integer read GetRowsAffected;
106 > //   property Params: TParams read FParams write SetParamsList;
107 >
108 >  published
109 >    property Active;
110 >    property BufferChunks;
111 >    property CachedUpdates;
112 >    property DataSource read GetDataSource write SetDataSource;
113 >    property GenerateParamNames;
114 > //   property Constraints stored ConstraintsStored;
115 >    property GeneratorField;
116 >    property ParamCheck;
117 >    property SQL: TStrings read FSQL write SetQuery;
118 >    property Params: TParams read FParams write SetParamsList;
119 >    property UniDirectional default False;
120 >    property UpdateObject;
121 >    property Filtered;
122 >
123 >    property BeforeDatabaseDisconnect;
124 >    property AfterDatabaseDisconnect;
125 >    property DatabaseFree;
126 >    property BeforeTransactionEnd;
127 >    property AfterTransactionEnd;
128 >    property TransactionFree;
129 >    property OnFilterRecord;
130 > end;
131 >
132 > implementation
133 >
134 > { TIBQuery }
135 >
136 > constructor TIBQuery.Create(AOwner: TComponent);
137 > begin
138 >  inherited Create(AOwner);
139 >  FSQL := TStringList.Create;
140 >  TStringList(SQL).OnChange := QueryChanged;
141 >  FParams := TParams.Create(Self);
142 >  ParamCheck := True;
143 >  FRowsAffected := -1;
144 > end;
145 >
146 > destructor TIBQuery.Destroy;
147 > begin
148 >  Destroying;
149 >  Disconnect;
150 >  SQL.Free;
151 >  FParams.Free;
152 >  inherited Destroy;
153 > end;
154 >
155 > procedure TIBQuery.InitFieldDefs;
156 > begin
157 >  inherited InitFieldDefs;
158 > end;
159 >
160 > procedure TIBQuery.InternalOpen;
161 > begin
162 >  ActivateConnection();
163 >  ActivateTransaction;
164 >  QSelect.GenerateParamNames := GenerateParamNames;
165 >  SetPrepared(True);
166 >  if DataSource <> nil then
167 >    SetParamsFromCursor;
168 >  SetParams;
169 >  inherited InternalOpen;
170 > end;
171 >
172 > procedure TIBQuery.Disconnect;
173 > begin
174 >  Close;
175 >  UnPrepare;
176 > end;
177 >
178 > procedure TIBQuery.SetPrepare(Value: Boolean);
179 > begin
180 >  if Value then
181 >    Prepare
182 >  else
183 >    UnPrepare;
184 > end;
185 >
186 > procedure TIBQuery.Prepare;
187 > begin
188 >  SetPrepared(True);
189 > end;
190 >
191 > procedure TIBQuery.UnPrepare;
192 > begin
193 >  SetPrepared(False);
194 > end;
195 >
196 > procedure TIBQuery.SetQuery(Value: TStrings);
197 > begin
198 >  if SQL.Text <> Value.Text then
199 >  begin
200 >    Disconnect;
201 >    SQL.BeginUpdate;
202 >    try
203 >      SQL.Assign(Value);
204 >    finally
205 >      SQL.EndUpdate;
206 >    end;
207 >  end;
208 > end;
209 >
210 > procedure TIBQuery.QueryChanged(Sender: TObject);
211 > var
212 >  List: TParams;
213 > begin
214 >  if not (csReading in ComponentState) then
215 >  begin
216 >    Disconnect;
217 >    if ParamCheck or (csDesigning in ComponentState) then
218 >    begin
219 >      List := TParams.Create(Self);
220 >      try
221 >        FText := List.ParseSQL(SQL.Text, True);
222 >        List.AssignValues(FParams);
223 >        FParams.Clear;
224 >        FParams.Assign(List);
225 >      finally
226 >        List.Free;
227 >      end;
228 >    end else
229 >      FText := SQL.Text;
230 >    DataEvent(dePropertyChange, 0);
231 >  end else
232 >    FText := FParams.ParseSQL(SQL.Text, true);
233 >  SelectSQL.Assign(SQL);
234 > end;
235 >
236 > procedure TIBQuery.SetParamsList(Value: TParams);
237 > begin
238 >  FParams.AssignValues(Value);
239 > end;
240 >
241 > function TIBQuery.GetParamsCount: Word;
242 > begin
243 >  Result := FParams.Count;
244 > end;
245 >
246 > procedure TIBQuery.DefineProperties(Filer: TFiler);
247 >
248 >  function WriteData: Boolean;
249 >  begin
250 >  {The following results in a stream read error with nested frames. Hence commented out until
251 >   someone fixes the LCL }
252 > {    if Filer.Ancestor <> nil then
253 >      Result := not FParams.IsEqual(TIBQuery(Filer.Ancestor).FParams) else}
254 >      Result := FParams.Count > 0;
255 >  end;
256 >
257 > begin
258 >  inherited DefineProperties(Filer);
259 >  Filer.DefineProperty('ParamData', ReadParamData, WriteParamData, WriteData); {do not localize}
260 > end;
261 >
262 > procedure TIBQuery.ReadParamData(Reader: TReader);
263 > begin
264 >  FParams.Clear;
265 >  Reader.ReadValue;
266 >  Reader.ReadCollection(FParams);
267 > end;
268 >
269 > procedure TIBQuery.WriteParamData(Writer: TWriter);
270 > begin
271 >  Writer.WriteCollection(Params);
272 > end;
273 >
274 > procedure TIBQuery.SetPrepared(Value: Boolean);
275 > begin
276 >  CheckDatasetClosed;
277 >  if Value <> Prepared then
278 >  begin
279 >    if Value then
280 >    begin
281 >      FRowsAffected := -1;
282 >      FCheckRowsAffected := True;
283 >      if Length(Text) > 1 then PrepareSQL(PChar(Text))
284 >      else IBError(ibxeEmptySQLStatement, [nil]);
285 >    end
286 >    else
287 >    begin
288 >      if FCheckRowsAffected then
289 >        FRowsAffected := RowsAffected;
290 >      InternalUnPrepare;
291 >    end;
292 >    FPrepared := Value;
293 >  end;
294 > end;
295 >
296 > procedure TIBQuery.SetParamsFromCursor;
297 > var
298 >  I: Integer;
299 >  DataSet: TDataSet;
300 >  Field: TField;
301 >
302 >  procedure CheckRequiredParams;
303 >  var
304 >    I: Integer;
305 >  begin
306 >    for I := 0 to FParams.Count - 1 do
307 >    with FParams[I] do
308 >      if not Bound then
309 >        IBError(ibxeRequiredParamNotSet, [nil]);
310 >  end;
311 >
312 > begin
313 >  if DataSource <> nil then
314 >  begin
315 >    DataSet := DataSource.DataSet;
316 >    if DataSet <> nil then
317 >    begin
318 >      DataSet.FieldDefs.Update;
319 >      for I := 0 to FParams.Count - 1 do
320 >      if not FParams[I].Bound then
321 >      begin
322 >        Field := DataSet.FindField(FParams[I].Name);
323 >        if assigned(Field) then
324 >        begin
325 >            FParams[I].AssignField(Field);
326 >            FParams[I].Bound := False;
327 >        end;
328 >      end;
329 >    end
330 >    else
331 >      CheckRequiredParams;
332 >  end
333 >  else
334 >    CheckRequiredParams;
335 > end;
336 >
337 >
338 > function TIBQuery.ParamByName(const Value: string): TParam;
339 > begin
340 >  Result := FParams.ParamByName(Value);
341 > end;
342 >
343 > procedure TIBQuery.BatchInput(InputObject: TIBBatchInput);
344 > begin
345 >  InternalBatchInput(InputObject);
346 > end;
347 >
348 > procedure TIBQuery.BatchOutput(OutputObject: TIBBatchOutput);
349 > begin
350 >  InternalBatchOutput(OutputObject);
351 > end;
352 >
353 > procedure TIBQuery.ExecSQL;
354 > var
355 >  DidActivate: Boolean;
356 > begin
357 >  CheckInActive;
358 >  if SQL.Count <= 0 then
359 >  begin
360 >    FCheckRowsAffected := False;
361 >    IBError(ibxeEmptySQLStatement, [nil]);
362 >  end;
363 >  ActivateConnection();
364 >  DidActivate := ActivateTransaction;
365 >  try
366 >    SetPrepared(True);
367 >    if DataSource <> nil then SetParamsFromCursor;
368 >    if FParams.Count > 0 then SetParams;
369 >    InternalExecQuery;
370 >  finally
371 >    if DidActivate then
372 >      DeactivateTransaction;
373 >    FCheckRowsAffected := True;
374 >  end;
375 > end;
376 >
377 > procedure TIBQuery.SetParams;
378 >
379 > var
380 > i : integer;
381 > Buffer: Pointer;
382 >
383 > begin
384 >  for I := 0 to FParams.Count - 1 do
385 >  begin
386 >    if Params[i].IsNull then
387 >      SQLParams[i].IsNull := True
388 >    else begin
389 >      SQLParams[i].IsNull := False;
390 >      case Params[i].DataType of
391 >        ftBytes:
392 >        begin
393 >          GetMem(Buffer,Params[i].GetDataSize);
394 >          try
395 >            Params[i].GetData(Buffer);
396 >            SQLParams[i].AsPointer := Buffer;
397 >          finally
398 >            FreeMem(Buffer);
399 >          end;
400 >        end;
401 >        ftString:
402 >          SQLParams[i].AsString := Params[i].AsString;
403 >        ftBoolean, ftSmallint, ftWord:
404 >          SQLParams[i].AsShort := Params[i].AsSmallInt;
405 >        ftInteger:
406 >          SQLParams[i].AsLong := Params[i].AsInteger;
407 >        ftLargeInt:
408 >          SQLParams[i].AsInt64 := Params[i].AsLargeInt;
409 >        ftFloat:
410 >         SQLParams[i].AsDouble := Params[i].AsFloat;
411 >        ftBCD, ftCurrency:
412 >          SQLParams[i].AsCurrency := Params[i].AsCurrency;
413 >        ftDate:
414 >          SQLParams[i].AsDate := Params[i].AsDateTime;
415 >        ftTime:
416 >          SQLParams[i].AsTime := Params[i].AsDateTime;
417 >        ftDateTime:
418 >          SQLParams[i].AsDateTime := Params[i].AsDateTime;
419 >        ftBlob, ftMemo:
420 >          SQLParams[i].AsString := Params[i].AsString;
421 >        else
422 >          IBError(ibxeNotSupported, [nil]);
423 >      end;
424 >    end;
425 >  end;
426 > end;
427 >
428 > procedure TIBQuery.PrepareSQL(Value: PChar);
429 > begin
430 >  QSelect.GenerateParamNames := GenerateParamNames;
431 >  InternalPrepare;
432 > end;
433 >
434 >
435 > function TIBQuery.GetRowsAffected: Integer;
436 > begin
437 >  Result := -1;
438 >  if Prepared then
439 >   Result := QSelect.RowsAffected
440 > end;
441 >
442 >
443 > procedure TIBQuery.GetDetailLinkFields(MasterFields, DetailFields: TList);
444 >
445 >  function AddFieldToList(const FieldName: string; DataSet: TDataSet;
446 >    List: TList): Boolean;
447 >  var
448 >    Field: TField;
449 >  begin
450 >    Field := DataSet.FindField(FieldName);
451 >    if (Field <> nil) then
452 >      List.Add(Field);
453 >    Result := Field <> nil;
454 >  end;
455 >
456 > var
457 >  i: Integer;
458 > begin
459 >  MasterFields.Clear;
460 >  DetailFields.Clear;
461 >  if (DataSource <> nil) and (DataSource.DataSet <> nil) then
462 >    for i := 0 to Params.Count - 1 do
463 >      if AddFieldToList(Params[i].Name, DataSource.DataSet, MasterFields) then
464 >        AddFieldToList(Params[i].Name, Self, DetailFields);
465 > end;
466 >
467 > function TIBQuery.GetStmtHandle: TISC_STMT_HANDLE;
468 > begin
469 >  Result := SelectStmtHandle;
470 > end;
471 >
472 > function TIBQuery.GenerateQueryForLiveUpdate : Boolean;
473 > begin
474 >  Result := False;
475 > end;
476 >
477 > procedure TIBQuery.SetFiltered(Value: Boolean);
478 > begin
479 >  if(Filtered <> Value) then
480 >  begin
481 >    inherited SetFiltered(value);
482 >    if Active then
483 >    begin
484 >      Close;
485 >      Open;
486 >    end;
487 >  end
488 >  else
489 >    inherited SetFiltered(value);
490 > end;
491 >
492 > { TIBQuery IProviderSupport }
493 > (*
494 > function TIBQuery.PSGetParams: TParams;
495 > begin
496 >  Result := Params;
497 > end;
498 >
499 > procedure TIBQuery.PSSetParams(AParams: TParams);
500 > begin
501 >  if AParams.Count <> 0 then
502 >    Params.Assign(AParams);
503 >  Close;
504 > end;
505 >
506 > function TIBQuery.PSGetTableName: string;
507 > begin
508 >  Result := inherited PSGetTableName;
509 > end;
510 >
511 > procedure TIBQuery.PSExecute;
512 > begin
513 >  ExecSQL;
514 > end;
515 >
516 > procedure TIBQuery.PSSetCommandText(const CommandText: string);
517 > begin
518 >  if CommandText <> '' then
519 >    SQL.Text := CommandText;
520 > end;
521 > *)
522 > end.
523 >

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines