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

Comparing ibx/trunk/runtime/IBUpdateSQL.pas (file contents):
Revision 5 by tony, Fri Feb 18 16:26:16 2011 UTC vs.
Revision 7 by tony, Sun Aug 5 18:28:19 2012 UTC

# Line 24 | Line 24
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 IBUpdateSQL;
# Line 32 | Line 37 | unit IBUpdateSQL;
37  
38   interface
39  
40 < uses SysUtils, Classes, DB, IB, IBCustomDataSet, IBQuery;
40 > uses SysUtils, Classes, DB, IB, IBCustomDataSet, IBSQL;
41  
42   type
43   { TIBUpdateSQL }
# Line 40 | Line 45 | type
45    TIBUpdateSQL = class(TIBDataSetUpdateObject)
46    private
47      FDataSet: TIBCustomDataSet;
48 <    FQueries: array[TUpdateKind] of TIBQuery;
48 >    FQueries: array[TUpdateKind] of TIBSQL;
49      FSQLText: array[TUpdateKind] of TStrings;
50 <    function GetQuery(UpdateKind: TUpdateKind): TIBQuery;
50 >    function GetQuery(UpdateKind: TUpdateKind): TIBSQL;
51      function GetSQLIndex(Index: Integer): TStrings;
52      procedure SetSQL(UpdateKind: TUpdateKind; Value: TStrings);
53      procedure SetSQLIndex(Index: Integer; Value: TStrings);
54    protected
55 +    procedure InternalPrepare(UpdateKind: TUpdateKind);
56      function GetSQL(UpdateKind: TUpdateKind): TStrings; override;
57      function GetDataSet: TIBCustomDataSet; override;
58      procedure SetDataSet(ADataSet: TIBCustomDataSet); override;
59      procedure SQLChanged(Sender: TObject);
60 +    procedure Apply(UpdateKind: TUpdateKind; buff: PChar); override;
61 +    procedure ExecSQL(UpdateKind: TUpdateKind);
62    public
63      constructor Create(AOwner: TComponent); override;
64      destructor Destroy; override;
57    procedure Apply(UpdateKind: TUpdateKind); override;
58    procedure ExecSQL(UpdateKind: TUpdateKind);
59    procedure SetParams(UpdateKind: TUpdateKind);
65      property DataSet;
66 <    property Query[UpdateKind: TUpdateKind]: TIBQuery read GetQuery;
66 >    property Query[UpdateKind: TUpdateKind]: TIBSQL read GetQuery;
67      property SQL[UpdateKind: TUpdateKind]: TStrings read GetSQL write SetSQL;
68    published
69      property ModifySQL: TStrings index 0 read GetSQLIndex write SetSQLIndex;
# Line 97 | Line 102 | end;
102  
103   procedure TIBUpdateSQL.ExecSQL(UpdateKind: TUpdateKind);
104   begin
105 +  InternalPrepare(UpdateKind);
106    with Query[UpdateKind] do
107    begin
108 <    Prepare;
103 <    ExecSQL;
108 >    ExecQuery;
109      if RowsAffected <> 1 then IBError(ibxeUpdateFailed, [nil]);
110    end;
111   end;
112  
113 < function TIBUpdateSQL.GetQuery(UpdateKind: TUpdateKind): TIBQuery;
113 > function TIBUpdateSQL.GetQuery(UpdateKind: TUpdateKind): TIBSQL;
114   begin
115    if not Assigned(FQueries[UpdateKind]) then
116    begin
117 <    FQueries[UpdateKind] := TIBQuery.Create(Self);
117 >    FQueries[UpdateKind] := TIBSQL.Create(Self);
118      FQueries[UpdateKind].SQL.Assign(FSQLText[UpdateKind]);
119      if (FDataSet is TIBCustomDataSet) then
120      begin
# Line 150 | Line 155 | begin
155    SetSQL(TUpdateKind(Index), Value);
156   end;
157  
158 + procedure TIBUpdateSQL.InternalPrepare(UpdateKind: TUpdateKind);
159 + begin
160 +  with Query[UpdateKind] do
161 +  begin
162 +    with Transaction do
163 +      if not InTransaction then StartTransaction;
164 +    if not Prepared then Prepare;
165 +  end;
166 + end;
167 +
168   procedure TIBUpdateSQL.SQLChanged(Sender: TObject);
169   var
170    UpdateKind: TUpdateKind;
# Line 158 | Line 173 | begin
173      if Sender = FSQLText[UpdateKind] then
174      begin
175        if Assigned(FQueries[UpdateKind]) then
161      begin
162        FQueries[UpdateKind].Params.Clear;
176          FQueries[UpdateKind].SQL.Assign(FSQLText[UpdateKind]);
164      end;
177        Break;
178      end;
179   end;
180  
181 < procedure TIBUpdateSQL.SetParams(UpdateKind: TUpdateKind);
170 < var
171 <  I: Integer;
172 <  Old: Boolean;
173 <  Param: TParam;
174 <  PName: string;
175 <  Field: TField;
176 <  Value: Variant;
181 > procedure TIBUpdateSQL.Apply(UpdateKind: TUpdateKind; buff: PChar);
182   begin
183    if not Assigned(FDataSet) then Exit;
184 <  with Query[UpdateKind] do
185 <  begin
181 <    for I := 0 to Params.Count - 1 do
182 <    begin
183 <      Param := Params[I];
184 <      PName := Param.Name;
185 <      Old := CompareText(Copy(PName, 1, 4), 'OLD_') = 0; {do not localize}
186 <      if Old then
187 <        System.Delete(PName, 1, 4);
188 <      Field := FDataSet.FindField(PName);
189 <      if not Assigned(Field) then
190 <        Continue;
191 <      if Old then
192 <        Param.AssignFieldValue(Field, Field.OldValue) else
193 <      begin
194 <        Value := Field.NewValue;
195 <        if VarIsEmpty(Value) then
196 <          Value := Field.OldValue;
197 <        Param.AssignFieldValue(Field, Value);
198 <      end;
199 <    end;
200 <  end;
201 < end;
202 <
203 < procedure TIBUpdateSQL.Apply(UpdateKind: TUpdateKind);
204 < begin
205 <  SetParams(UpdateKind);
184 >  InternalPrepare(UpdateKind);
185 >  InternalSetParams(Query[UpdateKind],buff);
186    ExecSQL(UpdateKind);
187   end;
188  

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines