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 33 by tony, Sat Jul 18 12:30:52 2015 UTC vs.
Revision 118 by tony, Mon Jan 22 13:58:14 2018 UTC

# Line 56 | Line 56 | type
56      FPrepared: Boolean;
57      FParams: TParams;
58      FText: string;
59    FRowsAffected: Integer;
60    FCheckRowsAffected: Boolean;
59      FSQLUpdating: boolean;
60 +    FInQueryChanged: boolean;
61      function GetRowsAffected: Integer;
62      procedure PrepareSQL;
63      procedure QueryChanged(Sender: TObject);
# Line 70 | Line 69 | type
69      procedure SetPrepared(Value: Boolean);
70      procedure SetPrepare(Value: Boolean);
71      procedure WriteParamData(Writer: TWriter);
72 <    function GetStmtHandle: TISC_STMT_HANDLE;
72 >    function GetStmtHandle: IStatement;
73 >    procedure UpdateSQL;
74  
75    protected
76      { IProviderSupport }
# Line 80 | Line 80 | type
80      procedure PSSetCommandText(const CommandText: string); override;
81      procedure PSSetParams(AParams: TParams); override;  *)
82  
83    function CreateParser: TSelectSQLParser; override;
83      procedure DefineProperties(Filer: TFiler); override;
84      procedure InitFieldDefs; override;
85      procedure InternalOpen; override;
# Line 88 | Line 87 | type
87      function GetParamsCount: Word;
88      function GenerateQueryForLiveUpdate : Boolean;
89      procedure SetFiltered(Value: Boolean); override;
90 +    procedure SQLChanged(Sender: TObject); override;
91 +    procedure SQLChanging(Sender: TObject); override;
92  
93    public
94      constructor Create(AOwner: TComponent); override;
# Line 99 | Line 100 | type
100      function ParamByName(const Value: string): TParam;
101      procedure Prepare;
102      procedure UnPrepare;
103 +    procedure ResetParser; override;
104      property Prepared: Boolean read FPrepared write SetPrepare;
105      property ParamCount: Word read GetParamsCount;
106 <    property StmtHandle: TISC_STMT_HANDLE read GetStmtHandle;
106 >    property StmtHandle: IStatement read GetStmtHandle;
107      property StatementType;
108      property Text: string read FText;
109      property RowsAffected: Integer read GetRowsAffected;
# Line 133 | Line 135 | type
135      property TransactionFree;
136      property OnFilterRecord;
137      property OnValidatePost;
138 +    property OnDeleteReturning;
139   end;
140  
141   implementation
142  
143 + uses FBMessages;
144 +
145   { TIBQuery }
146  
147   constructor TIBQuery.Create(AOwner: TComponent);
# Line 146 | Line 151 | begin
151    TStringList(SQL).OnChange := QueryChanged;
152    FParams := TParams.Create(Self);
153    ParamCheck := True;
149  FRowsAffected := -1;
154   end;
155  
156   destructor TIBQuery.Destroy;
# Line 199 | Line 203 | begin
203    SetPrepared(False);
204   end;
205  
206 + procedure TIBQuery.ResetParser;
207 + begin
208 +  inherited ResetParser;
209 +  UpdateSQL;
210 + end;
211 +
212   procedure TIBQuery.SetQuery(Value: TStrings);
213   begin
214    if SQL.Text <> Value.Text then
# Line 214 | Line 224 | begin
224   end;
225  
226   procedure TIBQuery.QueryChanged(Sender: TObject);
217 var
218  List: TParams;
227   begin
228 <  if not (csReading in ComponentState) then
229 <  begin
230 <    Disconnect;
231 <    if HasParser and not FSQLUpdating then
224 <    begin
225 <      FSQLUpdating := true;
226 <      try
227 <        SQL.Text := Parser.SQLText;
228 <      finally
229 <        FSQLUpdating := false
230 <      end;
231 <    end;
232 <    if ParamCheck or (csDesigning in ComponentState) then
228 >  if FInQueryChanged then Exit;
229 >  FInQueryChanged := true;
230 >  try
231 >    if not (csReading in ComponentState) then
232      begin
233 <      List := TParams.Create(Self);
234 <      try
235 <        FText := List.ParseSQL(SQL.Text, True);
236 <        List.AssignValues(FParams);
237 <        FParams.Clear;
238 <        FParams.Assign(List);
240 <      finally
241 <        List.Free;
242 <      end;
233 >      Disconnect;
234 >      if csDesigning in ComponentState then
235 >        FText := FParams.ParseSQL(SQL.Text, true)
236 >      else
237 >        FText := SQL.Text;
238 >      DataEvent(dePropertyChange, 0);
239      end else
240 <      FText := SQL.Text;
241 <    DataEvent(dePropertyChange, 0);
242 <  end else
243 <    FText := FParams.ParseSQL(SQL.Text, true);
244 <  SelectSQL.Assign(SQL);
240 >      FText := FParams.ParseSQL(SQL.Text, true);
241 >
242 >    if not FSQLUpdating then
243 >    begin
244 >      Prepared := false;
245 >      SelectSQL.Assign(SQL);
246 >    end;
247 >  finally
248 >    FInQueryChanged := false;
249 >  end;
250   end;
251  
252   procedure TIBQuery.SetParamsList(Value: TParams);
# Line 294 | Line 295 | begin
295    begin
296      if Value then
297      begin
297      FRowsAffected := -1;
298      FCheckRowsAffected := True;
298        if Length(Text) > 1 then PrepareSQL
299        else IBError(ibxeEmptySQLStatement, [nil]);
300      end
301      else
302      begin
304      if FCheckRowsAffected then
305        FRowsAffected := RowsAffected;
303        InternalUnPrepare;
304 +      FParams.Clear;
305      end;
306      FPrepared := Value;
307    end;
# Line 353 | Line 351 | end;
351  
352   function TIBQuery.ParamByName(const Value: string): TParam;
353   begin
354 +  if not Prepared then
355 +    Prepare;
356    Result := FParams.ParamByName(Value);
357   end;
358  
# Line 372 | Line 372 | var
372   begin
373    CheckInActive;
374    if SQL.Count <= 0 then
375  begin
376    FCheckRowsAffected := False;
375      IBError(ibxeEmptySQLStatement, [nil]);
376 <  end;
376 >
377    ActivateConnection();
378    DidActivate := ActivateTransaction;
379    try
# Line 386 | Line 384 | begin
384    finally
385      if DidActivate then
386        DeactivateTransaction;
389    FCheckRowsAffected := True;
387    end;
388   end;
389  
# Line 395 | Line 392 | procedure TIBQuery.SetParams;
392   var
393   i : integer;
394   Buffer: Pointer;
395 < SQLParam: TIBXSQLVAR;
395 > SQLParam: ISQLParam;
396  
397   begin
398    for I := 0 to FParams.Count - 1 do
# Line 446 | Line 443 | begin
443   end;
444  
445   procedure TIBQuery.PrepareSQL;
446 + var List: TParams;
447   begin
448    QSelect.GenerateParamNames := GenerateParamNames;
449    InternalPrepare;
450 +  UpdateSQL;
451 +  if ParamCheck  then
452 +  begin
453 +    List := TParams.Create(Self);
454 +    try
455 +      FText := List.ParseSQL(SQL.Text, True);
456 +      List.AssignValues(FParams);
457 +      FParams.Clear;
458 +      FParams.Assign(List);
459 +    finally
460 +      List.Free;
461 +    end;
462 +  end;
463   end;
464  
465  
# Line 484 | Line 495 | begin
495          AddFieldToList(Params[i].Name, Self, DetailFields);
496   end;
497  
498 < function TIBQuery.GetStmtHandle: TISC_STMT_HANDLE;
498 > function TIBQuery.GetStmtHandle: IStatement;
499   begin
500    Result := SelectStmtHandle;
501   end;
502  
503 < function TIBQuery.CreateParser: TSelectSQLParser;
503 > procedure TIBQuery.UpdateSQL;
504   begin
505 <  Result := inherited CreateParser;
506 <  Result.OnSQLChanging := QueryChanged;
505 >  if not FSQLUpdating and not FInQueryChanged and (SQL.Text <> SelectSQL.Text) then
506 >  begin
507 >    FSQLUpdating := true;
508 >    try
509 >      SQL.Text := SelectSQL.Text;
510 >    finally
511 >      FSQLUpdating := false
512 >    end;
513 >  end;
514   end;
515  
516   function TIBQuery.GenerateQueryForLiveUpdate : Boolean;
# Line 515 | Line 533 | begin
533      inherited SetFiltered(value);
534   end;
535  
536 + procedure TIBQuery.SQLChanged(Sender: TObject);
537 + begin
538 +  inherited SQLChanged(Sender);
539 +  UpdateSQL;
540 + end;
541 +
542 + procedure TIBQuery.SQLChanging(Sender: TObject);
543 + begin
544 +  inherited SQLChanging(Sender);
545 +  Prepared := false;
546 + end;
547 +
548   { TIBQuery IProviderSupport }
549   (*
550   function TIBQuery.PSGetParams: TParams;

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines