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 45 by tony, Tue Dec 6 10:33:46 2016 UTC

# Line 59 | Line 59 | type
59      FRowsAffected: Integer;
60      FCheckRowsAffected: Boolean;
61      FSQLUpdating: boolean;
62 +    FInQueryChanged: boolean;
63      function GetRowsAffected: Integer;
64      procedure PrepareSQL;
65      procedure QueryChanged(Sender: TObject);
# Line 70 | Line 71 | type
71      procedure SetPrepared(Value: Boolean);
72      procedure SetPrepare(Value: Boolean);
73      procedure WriteParamData(Writer: TWriter);
74 <    function GetStmtHandle: TISC_STMT_HANDLE;
74 >    function GetStmtHandle: IStatement;
75 >    procedure UpdateSQL;
76  
77    protected
78      { IProviderSupport }
# Line 80 | Line 82 | type
82      procedure PSSetCommandText(const CommandText: string); override;
83      procedure PSSetParams(AParams: TParams); override;  *)
84  
83    function CreateParser: TSelectSQLParser; override;
85      procedure DefineProperties(Filer: TFiler); override;
86      procedure InitFieldDefs; override;
87      procedure InternalOpen; override;
# Line 88 | Line 89 | type
89      function GetParamsCount: Word;
90      function GenerateQueryForLiveUpdate : Boolean;
91      procedure SetFiltered(Value: Boolean); override;
92 +    procedure SQLChanged(Sender: TObject); override;
93 +    procedure SQLChanging(Sender: TObject); override;
94  
95    public
96      constructor Create(AOwner: TComponent); override;
# Line 99 | Line 102 | type
102      function ParamByName(const Value: string): TParam;
103      procedure Prepare;
104      procedure UnPrepare;
105 +    procedure ResetParser; override;
106      property Prepared: Boolean read FPrepared write SetPrepare;
107      property ParamCount: Word read GetParamsCount;
108 <    property StmtHandle: TISC_STMT_HANDLE read GetStmtHandle;
108 >    property StmtHandle: IStatement read GetStmtHandle;
109      property StatementType;
110      property Text: string read FText;
111      property RowsAffected: Integer read GetRowsAffected;
# Line 137 | Line 141 | end;
141  
142   implementation
143  
144 + uses FBMessages;
145 +
146   { TIBQuery }
147  
148   constructor TIBQuery.Create(AOwner: TComponent);
# Line 199 | Line 205 | begin
205    SetPrepared(False);
206   end;
207  
208 + procedure TIBQuery.ResetParser;
209 + begin
210 +  inherited ResetParser;
211 +  UpdateSQL;
212 + end;
213 +
214   procedure TIBQuery.SetQuery(Value: TStrings);
215   begin
216    if SQL.Text <> Value.Text then
# Line 214 | Line 226 | begin
226   end;
227  
228   procedure TIBQuery.QueryChanged(Sender: TObject);
217 var
218  List: TParams;
229   begin
230 <  if not (csReading in ComponentState) then
231 <  begin
232 <    Disconnect;
233 <    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
230 >  if FInQueryChanged then Exit;
231 >  FInQueryChanged := true;
232 >  try
233 >    if not (csReading in ComponentState) then
234      begin
235 <      List := TParams.Create(Self);
236 <      try
237 <        FText := List.ParseSQL(SQL.Text, True);
238 <        List.AssignValues(FParams);
239 <        FParams.Clear;
240 <        FParams.Assign(List);
240 <      finally
241 <        List.Free;
242 <      end;
235 >      Disconnect;
236 >      if csDesigning in ComponentState then
237 >        FText := FParams.ParseSQL(SQL.Text, true)
238 >      else
239 >        FText := SQL.Text;
240 >      DataEvent(dePropertyChange, 0);
241      end else
242 <      FText := SQL.Text;
243 <    DataEvent(dePropertyChange, 0);
244 <  end else
245 <    FText := FParams.ParseSQL(SQL.Text, true);
246 <  SelectSQL.Assign(SQL);
242 >      FText := FParams.ParseSQL(SQL.Text, true);
243 >
244 >    if not FSQLUpdating then
245 >    begin
246 >      Prepared := false;
247 >      SelectSQL.Assign(SQL);
248 >    end;
249 >  finally
250 >    FInQueryChanged := false;
251 >  end;
252   end;
253  
254   procedure TIBQuery.SetParamsList(Value: TParams);
# Line 304 | Line 307 | begin
307        if FCheckRowsAffected then
308          FRowsAffected := RowsAffected;
309        InternalUnPrepare;
310 +      FParams.Clear;
311      end;
312      FPrepared := Value;
313    end;
# Line 353 | Line 357 | end;
357  
358   function TIBQuery.ParamByName(const Value: string): TParam;
359   begin
360 +  if not Prepared then
361 +    Prepare;
362    Result := FParams.ParamByName(Value);
363   end;
364  
# Line 395 | Line 401 | procedure TIBQuery.SetParams;
401   var
402   i : integer;
403   Buffer: Pointer;
404 < SQLParam: TIBXSQLVAR;
404 > SQLParam: ISQLParam;
405  
406   begin
407    for I := 0 to FParams.Count - 1 do
# Line 446 | Line 452 | begin
452   end;
453  
454   procedure TIBQuery.PrepareSQL;
455 + var List: TParams;
456   begin
457    QSelect.GenerateParamNames := GenerateParamNames;
458    InternalPrepare;
459 +  UpdateSQL;
460 +  if ParamCheck  then
461 +  begin
462 +    List := TParams.Create(Self);
463 +    try
464 +      FText := List.ParseSQL(SQL.Text, True);
465 +      List.AssignValues(FParams);
466 +      FParams.Clear;
467 +      FParams.Assign(List);
468 +    finally
469 +      List.Free;
470 +    end;
471 +  end;
472   end;
473  
474  
# Line 484 | Line 504 | begin
504          AddFieldToList(Params[i].Name, Self, DetailFields);
505   end;
506  
507 < function TIBQuery.GetStmtHandle: TISC_STMT_HANDLE;
507 > function TIBQuery.GetStmtHandle: IStatement;
508   begin
509    Result := SelectStmtHandle;
510   end;
511  
512 < function TIBQuery.CreateParser: TSelectSQLParser;
512 > procedure TIBQuery.UpdateSQL;
513   begin
514 <  Result := inherited CreateParser;
515 <  Result.OnSQLChanging := QueryChanged;
514 >  if not FSQLUpdating and not FInQueryChanged and (SQL.Text <> SelectSQL.Text) then
515 >  begin
516 >    FSQLUpdating := true;
517 >    try
518 >      SQL.Text := SelectSQL.Text;
519 >    finally
520 >      FSQLUpdating := false
521 >    end;
522 >  end;
523   end;
524  
525   function TIBQuery.GenerateQueryForLiveUpdate : Boolean;
# Line 515 | Line 542 | begin
542      inherited SetFiltered(value);
543   end;
544  
545 + procedure TIBQuery.SQLChanged(Sender: TObject);
546 + begin
547 +  inherited SQLChanged(Sender);
548 +  UpdateSQL;
549 + end;
550 +
551 + procedure TIBQuery.SQLChanging(Sender: TObject);
552 + begin
553 +  inherited SQLChanging(Sender);
554 +  Prepared := false;
555 + end;
556 +
557   { TIBQuery IProviderSupport }
558   (*
559   function TIBQuery.PSGetParams: TParams;

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines