ViewVC Help
View File | Revision Log | Show Annotations | Download File | View Changeset | Root Listing
root/public/ibx/trunk/runtime/nongui/IBUpdate.pas
Revision: 349
Committed: Mon Oct 18 08:39:40 2021 UTC (3 years, 1 month ago) by tony
Content type: text/x-pascal
File size: 20104 byte(s)
Log Message:
FIxes Merged

File Contents

# User Rev Content
1 tony 209 (*
2     * IBX For Lazarus (Firebird Express)
3     *
4     * The contents of this file are subject to the Initial Developer's
5     * Public License Version 1.0 (the "License"); you may not use this
6     * file except in compliance with the License. You may obtain a copy
7     * of the License here:
8     *
9     * http://www.firebirdsql.org/index.php?op=doc&id=idpl
10     *
11     * Software distributed under the License is distributed on an "AS
12     * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
13     * implied. See the License for the specific language governing rights
14     * and limitations under the License.
15     *
16     * The Initial Developer of the Original Code is Tony Whyman.
17     *
18 tony 315 * The Original Code is (C) 2015-2020 Tony Whyman, MWA Software
19 tony 209 * (http://www.mwasoftware.co.uk).
20     *
21     * All Rights Reserved.
22     *
23     * Contributor(s): ______________________________________.
24     *
25     *)
26    
27     unit IBUpdate;
28    
29     {$mode objfpc}{$H+}
30    
31     interface
32    
33     uses
34 tony 291 Classes, SysUtils, IBCustomDataSet, DB, IB, IBDatabase, IBExternals, IBMessages;
35 tony 209
36     type
37    
38     TOnApplyUpdates = procedure(Sender: TObject; UpdateKind: TUpdateKind; Params: ISQLParams) of object;
39    
40     { TIBUpdate}
41    
42     TIBUpdate = class(TIBDataSetUpdateObject)
43     private
44     FDataSet: TIBCustomDataSet;
45     FDummySQL: TStrings;
46     FOnApplyUpdates: TOnApplyUpdates;
47     protected
48     function GetSQL(UpdateKind: TUpdateKind): TStrings; override;
49     function GetDataSet: TIBCustomDataSet; override;
50     procedure SetDataSet(ADataSet: TIBCustomDataSet); override;
51     procedure Apply(UpdateKind: TUpdateKind; buff: PChar); override;
52     public
53     constructor Create(AOwner: TComponent); override;
54     destructor Destroy; override;
55     property DataSet;
56     published
57     property OnApplyUpdates: TOnApplyUpdates read FOnApplyUpdates write FOnApplyUpdates;
58     end;
59    
60    
61     implementation
62    
63 tony 315 uses variants, FmtBCD, DateUtils;
64 tony 209
65     type
66    
67     { TParamListIntf }
68    
69     TParamListIntf = class(TInterfacedObject,ISQLParams)
70     private
71     type TParamRec = record
72     Name: string;
73     Value: variant;
74     Modified: boolean;
75 tony 315 TimeZoneID: TFBTimeZoneID;
76     DataSet: TDataSet;
77 tony 209 end;
78     private
79     FDatabase: TIBDatabase;
80     FModified: boolean;
81     FParams: array of TParamRec;
82     procedure SetParam(index: integer; aValue: variant);
83 tony 315 procedure SetTimeZoneID(index: integer; aValue: TFBTimeZoneID);
84 tony 209 public
85     constructor Create(aFields: TFields; aDatabase: TIBDatabase);
86     destructor Destroy; override;
87     property Database: TIBDatabase read FDatabase;
88     public
89     {ISQLParams}
90     function getCount: integer;
91     function getSQLParam(index: integer): ISQLParam;
92     function ByName(Idx: AnsiString): ISQLParam ;
93     function GetModified: Boolean;
94 tony 287 function GetHasCaseSensitiveParams: Boolean;
95 tony 209 end;
96    
97     { TParamIntf }
98    
99     TParamIntf = class(TInterfacedObject,ISQLParam)
100     private
101     FIndex: integer;
102     FOwner: TParamListIntf;
103 tony 315 function GetDataSet: TDataSet;
104 tony 209 public
105     constructor Create(aOwner: TParamListIntf; aIndex: integer);
106 tony 349 function getColMetadata: IParamMetaData;
107 tony 209 function GetIndex: integer;
108     function GetSQLType: cardinal;
109     function GetSQLTypeName: AnsiString;
110     function getSubtype: integer;
111     function getName: AnsiString;
112     function getScale: integer;
113     function getCharSetID: cardinal;
114     function getCodePage: TSystemCodePage;
115     function getIsNullable: boolean;
116     function GetSize: cardinal;
117     function GetAsBoolean: boolean;
118     function GetAsCurrency: Currency;
119     function GetAsInt64: Int64;
120 tony 315 function GetAsDateTime: TDateTime; overload;
121     procedure GetAsDateTime(var aDateTime: TDateTime; var dstOffset: smallint; var aTimezoneID: TFBTimeZoneID); overload;
122     procedure GetAsDateTime(var aDateTime: TDateTime; var dstOffset: smallint; var aTimezone: AnsiString); overload;
123     procedure GetAsTime(var aTime: TDateTime; var dstOffset: smallint; var aTimezoneID: TFBTimeZoneID; OnDate: TDateTime); overload;
124     procedure GetAsTime(var aTime: TDateTime; var dstOffset: smallint; var aTimezone: AnsiString; OnDate: TDateTime); overload;
125     procedure GetAsTime(var aTime: TDateTime; var dstOffset: smallint; var aTimezoneID: TFBTimeZoneID); overload;
126     procedure GetAsTime(var aTime: TDateTime; var dstOffset: smallint; var aTimezone: AnsiString); overload;
127     function GetAsUTCDateTime: TDateTime;
128 tony 209 function GetAsDouble: Double;
129     function GetAsFloat: Float;
130     function GetAsLong: Long;
131     function GetAsPointer: Pointer;
132     function GetAsQuad: TISC_QUAD;
133     function GetAsShort: short;
134     function GetAsString: AnsiString;
135     function GetIsNull: boolean;
136     function GetAsVariant: Variant;
137     function GetAsBlob: IBlob;
138     function GetAsArray: IArray;
139 tony 315 function GetAsBCD: tBCD;
140     function GetStatement: IStatement;
141     function GetTransaction: ITransaction;
142 tony 209 procedure Clear;
143     function GetModified: boolean;
144     procedure SetAsBoolean(AValue: boolean);
145     procedure SetAsCurrency(aValue: Currency);
146     procedure SetAsInt64(aValue: Int64);
147     procedure SetAsDate(aValue: TDateTime);
148     procedure SetAsLong(aValue: Long);
149 tony 315 procedure SetAsTime(aValue: TDateTime); overload;
150     procedure SetAsTime(aValue: TDateTime; aTimeZoneID: TFBTimeZoneID); overload;
151     procedure SetAsTime(aValue: TDateTime; aTimeZone: AnsiString); overload;
152     procedure SetAsTime(aValue: TDateTime; OnDate: TDateTime; aTimeZoneID: TFBTimeZoneID); overload;
153     procedure SetAsTime(aValue: TDateTime; OnDate: TDateTime; aTimeZone: AnsiString); overload;
154     procedure SetAsDateTime(aValue: TDateTime); overload;
155     procedure SetAsDateTime(aValue: TDateTime; aTimeZoneID: TFBTimeZoneID); overload;
156     procedure SetAsDateTime(aValue: TDateTime; aTimeZone: AnsiString); overload;
157     procedure SetAsUTCDateTime(aUTCTime: TDateTime);
158 tony 209 procedure SetAsDouble(aValue: Double);
159     procedure SetAsFloat(aValue: Float);
160     procedure SetAsPointer(aValue: Pointer);
161     procedure SetAsShort(aValue: Short);
162     procedure SetAsString(aValue: AnsiString);
163     procedure SetAsVariant(aValue: Variant);
164     procedure SetIsNull(aValue: Boolean);
165     procedure SetAsBlob(aValue: IBlob);
166     procedure SetAsArray(anArray: IArray);
167     procedure SetAsQuad(aValue: TISC_QUAD);
168     procedure SetCharSetID(aValue: cardinal);
169 tony 315 procedure SetAsBcd(aValue: tBCD);
170 tony 209 end;
171    
172     { TParamIntf }
173    
174 tony 315 function TParamIntf.GetDataSet: TDataSet;
175     begin
176     Result := FOwner.FParams[FIndex].DataSet;
177     end;
178    
179 tony 209 constructor TParamIntf.Create(aOwner: TParamListIntf; aIndex: integer);
180     begin
181     FOwner := aOwner;
182     FIndex := aIndex;
183     end;
184    
185 tony 349 function TParamIntf.getColMetadata: IParamMetaData;
186     begin
187     IBError(ibxeNotSupported,[]);
188     end;
189    
190 tony 209 function TParamIntf.GetIndex: integer;
191     begin
192     Result := Findex;
193     end;
194    
195     function TParamIntf.GetSQLType: cardinal;
196     begin
197     IBError(ibxeNotSupported,[]);
198     end;
199    
200     function TParamIntf.GetSQLTypeName: AnsiString;
201     begin
202     IBError(ibxeNotSupported,[]);
203     end;
204    
205     function TParamIntf.getSubtype: integer;
206     begin
207     IBError(ibxeNotSupported,[]);
208     end;
209    
210     function TParamIntf.getName: AnsiString;
211     begin
212     Result := FOwner.FParams[FIndex].Name;
213     end;
214    
215     function TParamIntf.getScale: integer;
216     begin
217     IBError(ibxeNotSupported,[]);
218     end;
219    
220     function TParamIntf.getCharSetID: cardinal;
221     var id: integer;
222     begin
223     FOwner.Database.Attachment.CodePage2CharSetID(StringCodePage(FOwner.FParams[FIndex].Value),id);
224     Result := id;
225     end;
226    
227     function TParamIntf.getCodePage: TSystemCodePage;
228     begin
229     Result := StringCodePage(FOwner.FParams[FIndex].Value);
230     end;
231    
232     function TParamIntf.getIsNullable: boolean;
233     begin
234     Result := true;
235     end;
236    
237     function TParamIntf.GetSize: cardinal;
238     begin
239     IBError(ibxeNotSupported,[]);
240     end;
241    
242     function TParamIntf.GetAsBoolean: boolean;
243     begin
244     Result := FOwner.FParams[FIndex].Value;
245     end;
246    
247     function TParamIntf.GetAsCurrency: Currency;
248     begin
249     Result := FOwner.FParams[FIndex].Value;
250     end;
251    
252     function TParamIntf.GetAsInt64: Int64;
253     begin
254     Result := FOwner.FParams[FIndex].Value;
255     end;
256    
257     function TParamIntf.GetAsDateTime: TDateTime;
258     begin
259     Result := FOwner.FParams[FIndex].Value;
260     end;
261    
262 tony 315 procedure TParamIntf.GetAsDateTime(var aDateTime: TDateTime;
263     var dstOffset: smallint; var aTimezoneID: TFBTimeZoneID);
264     begin
265     with FOwner.FParams[FIndex] do
266     if VarIsArray(Value) then
267     begin
268     aDateTime := Value[0];
269     dstOffset := Value[1];
270     if VarType(Value[2]) in [varSmallint, varInteger, varByte, varWord, varShortInt] then
271     aTimezoneID := Value[2]
272     else
273     aTimeZoneID := FOwner.DataBase.attachment.GetTimeZoneServices.TimeZoneName2TimeZoneID(Value[2]);
274     end
275     else
276     begin
277     aDateTime := FOwner.FParams[FIndex].Value;
278     dstOffset := 0;
279     aTimeZoneID := TimeZoneID_GMT;
280     end;
281     end;
282    
283     procedure TParamIntf.GetAsDateTime(var aDateTime: TDateTime;
284     var dstOffset: smallint; var aTimezone: AnsiString);
285     begin
286     with FOwner.FParams[FIndex] do
287     if VarIsArray(Value) then
288     begin
289     aDateTime := Value[0];
290     dstOffset := Value[1];
291     if VarType(Value[2]) in [varSmallint, varInteger, varByte, varWord, varShortInt] then
292     aTimeZone := FOwner.DataBase.attachment.GetTimeZoneServices.TimeZoneID2TimeZoneName(Value[2])
293     else
294     aTimezone := Value[2];
295     end
296     else
297     begin
298     aDateTime := FOwner.FParams[FIndex].Value;
299     dstOffset := 0;
300     aTimeZone := 'GMT';
301     end;
302     end;
303    
304     procedure TParamIntf.GetAsTime(var aTime: TDateTime; var dstOffset: smallint;
305     var aTimezoneID: TFBTimeZoneID; OnDate: TDateTime);
306     var LocalTime: TDateTime;
307     begin
308     with FOwner.FParams[FIndex] do
309     if VarIsArray(Value) then
310     begin
311     LocalTime := OnDate + TimeOf(Value[0]);
312     dstOffset := Value[1];
313     if VarType(Value[2]) in [varSmallint, varInteger, varByte, varWord, varShortInt] then
314     aTimezoneID := Value[2]
315     else
316     aTimeZoneID := FOwner.DataBase.attachment.GetTimeZoneServices.TimeZoneName2TimeZoneID(Value[2]);
317     aTime := TimeOf(FOwner.DataBase.attachment.GetTimeZoneServices.GMTToLocalTime(IncMinute(LocalTime,-dstOffset),aTimeZoneID))
318     end
319     else
320     begin
321     aTime := FOwner.FParams[FIndex].Value;
322     dstOffset := 0;
323     aTimeZoneID := TimeZoneID_GMT;
324     end;
325     end;
326    
327     procedure TParamIntf.GetAsTime(var aTime: TDateTime; var dstOffset: smallint;
328     var aTimezone: AnsiString; OnDate: TDateTime);
329     var LocalTime: TDateTime;
330     begin
331     with FOwner.FParams[FIndex] do
332     if VarIsArray(Value) then
333     begin
334     LocalTime := OnDate + TimeOf(Value[0]);
335     dstOffset := Value[1];
336     if VarType(Value[2]) in [varSmallint, varInteger, varByte, varWord, varShortInt] then
337     aTimeZone := FOwner.DataBase.attachment.GetTimeZoneServices.TimeZoneID2TimeZoneName(Value[2])
338     else
339     aTimezone := Value[2];
340     aTime := TimeOf(FOwner.DataBase.attachment.GetTimeZoneServices.GMTToLocalTime(IncMinute(LocalTime,-dstOffset),aTimeZone))
341     end
342     else
343     begin
344     aTime := FOwner.FParams[FIndex].Value;
345     dstOffset := 0;
346     aTimeZone := 'GMT';
347     end;
348     end;
349    
350     procedure TParamIntf.GetAsTime(var aTime: TDateTime; var dstOffset: smallint;
351     var aTimezoneID: TFBTimeZoneID);
352     begin
353     GetAsTime(aTime,dstOffset,aTimeZoneID,(GetDataSet as TIBCustomDataSet).DefaultTZDate);
354     end;
355    
356     procedure TParamIntf.GetAsTime(var aTime: TDateTime; var dstOffset: smallint;
357     var aTimezone: AnsiString);
358     begin
359     GetAsTime(aTime,dstOffset,aTimeZone,(GetDataSet as TIBCustomDataSet).DefaultTZDate);
360     end;
361    
362     function TParamIntf.GetAsUTCDateTime: TDateTime;
363     begin
364     with FOwner.FParams[FIndex] do
365     if VarIsArray(Value) then
366     Result := IncMinute(Value[0],-Value[1])
367     else
368     Result := FOwner.FParams[FIndex].Value;
369     end;
370    
371 tony 209 function TParamIntf.GetAsDouble: Double;
372     begin
373     Result := FOwner.FParams[FIndex].Value;
374     end;
375    
376     function TParamIntf.GetAsFloat: Float;
377     begin
378     Result := FOwner.FParams[FIndex].Value;
379     end;
380    
381     function TParamIntf.GetAsLong: Long;
382     begin
383     Result := FOwner.FParams[FIndex].Value;
384     end;
385    
386     function TParamIntf.GetAsPointer: Pointer;
387     begin
388     IBError(ibxeNotSupported,[]);
389     end;
390    
391     function TParamIntf.GetAsQuad: TISC_QUAD;
392     begin
393     IBError(ibxeNotSupported,[]);
394     end;
395    
396     function TParamIntf.GetAsShort: short;
397     begin
398     Result := FOwner.FParams[FIndex].Value;
399     end;
400    
401     function TParamIntf.GetAsString: AnsiString;
402     var v: variant;
403     begin
404     v := FOwner.FParams[FIndex].Value;
405     Case varType(v) of
406     varEmpty,
407     varNull:
408     Result := '';
409     varShortInt,
410     varSmallint,
411     varInteger,
412     varInt64,
413     varByte,
414     varWord,
415     varDecimal,
416     varLongWord,
417     varQWord,
418     varSingle:
419     Result := IntToStr(v);
420     varCurrency,
421     varDouble:
422     Result := FloatToStr(v);
423     varDate:
424     Result := DateTimeToStr(v);
425     varStrArg,
426     varString:
427     Result := v;
428     varBoolean:
429     if v then
430     Result := 'true'
431     else
432     Result := 'false';
433     varVariant:
434     Result := v;
435     else
436     Result := v;
437     end;
438     end;
439    
440     function TParamIntf.GetIsNull: boolean;
441     begin
442     Result := VarIsNull(FOwner.FParams[FIndex].Value);
443     end;
444    
445     function TParamIntf.GetAsVariant: Variant;
446     begin
447     Result := FOwner.FParams[FIndex].Value;
448     end;
449    
450     function TParamIntf.GetAsBlob: IBlob;
451     begin
452     IBError(ibxeNotSupported,[]);
453     end;
454    
455     function TParamIntf.GetAsArray: IArray;
456     begin
457     IBError(ibxeNotSupported,[]);
458     end;
459    
460 tony 315 function TParamIntf.GetAsBCD: tBCD;
461     begin
462     Result := VarToBCD(FOwner.FParams[FIndex].Value);
463     end;
464    
465     function TParamIntf.GetStatement: IStatement;
466     begin
467     IBError(ibxeNotSupported,[]);
468     end;
469    
470     function TParamIntf.GetTransaction: ITransaction;
471     begin
472     IBError(ibxeNotSupported,[]);
473     end;
474    
475 tony 209 procedure TParamIntf.Clear;
476     begin
477     FOwner.SetParam(FIndex,NULL);
478     end;
479    
480     function TParamIntf.GetModified: boolean;
481     begin
482     Result := FOwner.FParams[FIndex].Modified;
483     end;
484    
485     procedure TParamIntf.SetAsBoolean(AValue: boolean);
486     begin
487     FOwner.SetParam(FIndex,AValue);
488     end;
489    
490     procedure TParamIntf.SetAsCurrency(aValue: Currency);
491     begin
492     FOwner.SetParam(FIndex,AValue);
493     end;
494    
495     procedure TParamIntf.SetAsInt64(aValue: Int64);
496     begin
497     FOwner.SetParam(FIndex,AValue);
498     end;
499    
500     procedure TParamIntf.SetAsDate(aValue: TDateTime);
501     begin
502     FOwner.SetParam(FIndex,AValue);
503     end;
504    
505     procedure TParamIntf.SetAsLong(aValue: Long);
506     begin
507     FOwner.SetParam(FIndex,AValue);
508     end;
509    
510     procedure TParamIntf.SetAsTime(aValue: TDateTime);
511     begin
512     FOwner.SetParam(FIndex,AValue);
513     end;
514    
515 tony 315 procedure TParamIntf.SetAsTime(aValue: TDateTime; aTimeZoneID: TFBTimeZoneID);
516     begin
517     SetAsTime(aValue,(GetDataSet as TIBCustomDataSet).DefaultTZDate,aTimeZoneID);
518     end;
519    
520     procedure TParamIntf.SetAsTime(aValue: TDateTime; aTimeZone: AnsiString);
521     begin
522     SetAsTime(aValue,(GetDataSet as TIBCustomDataSet).DefaultTZDate,aTimeZone);
523     end;
524    
525     procedure TParamIntf.SetAsTime(aValue: TDateTime; OnDate: TDateTime;
526     aTimeZoneID: TFBTimeZoneID);
527     var dstOffset: smallint;
528     begin
529     aValue := TimeOf(aValue);
530     dstOffset := FOwner.Database.Attachment.GetTimeZoneServices.GetEffectiveOffsetMins(OnDate + aValue,aTimeZoneID);
531     FOwner.SetParam(FIndex,VarArrayOf([aValue,dstOffset,aTimeZoneID]));
532     end;
533    
534     procedure TParamIntf.SetAsTime(aValue: TDateTime; OnDate: TDateTime;
535     aTimeZone: AnsiString);
536     var dstOffset: smallint;
537     begin
538     aValue := TimeOf(aValue);
539     dstOffset := FOwner.Database.Attachment.GetTimeZoneServices.GetEffectiveOffsetMins(OnDate + aValue,aTimeZone);
540     FOwner.SetParam(FIndex,VarArrayOf([aValue,dstOffset,aTimeZone]));
541     end;
542    
543 tony 209 procedure TParamIntf.SetAsDateTime(aValue: TDateTime);
544     begin
545     FOwner.SetParam(FIndex,AValue);
546     end;
547    
548 tony 315 procedure TParamIntf.SetAsDateTime(aValue: TDateTime; aTimeZoneID: TFBTimeZoneID
549     );
550     var dstOffset: smallint;
551     begin
552     with FOwner.DataBase.attachment.GetTimeZoneServices do
553     begin
554     dstOffset := GetEffectiveOffsetMins(aValue,aTimeZoneID);
555     FOwner.SetParam(FIndex,VarArrayOf([aValue,aTimeZoneID]));
556     end;
557     end;
558    
559     procedure TParamIntf.SetAsDateTime(aValue: TDateTime; aTimeZone: AnsiString);
560     var dstOffset: smallint;
561     begin
562     with FOwner.DataBase.attachment.GetTimeZoneServices do
563     begin
564     dstOffset := GetEffectiveOffsetMins(aValue,aTimeZone);
565     FOwner.SetParam(FIndex,VarArrayOf([aValue,aTimeZone]));
566     end;
567     end;
568    
569     procedure TParamIntf.SetAsUTCDateTime(aUTCTime: TDateTime);
570     begin
571     IBError(ibxeNotSupported,[]);
572     end;
573    
574 tony 209 procedure TParamIntf.SetAsDouble(aValue: Double);
575     begin
576     FOwner.SetParam(FIndex,AValue);
577     end;
578    
579     procedure TParamIntf.SetAsFloat(aValue: Float);
580     begin
581     FOwner.SetParam(FIndex,AValue);
582     end;
583    
584     procedure TParamIntf.SetAsPointer(aValue: Pointer);
585     begin
586     IBError(ibxeNotSupported,[]);
587     end;
588    
589     procedure TParamIntf.SetAsShort(aValue: Short);
590     begin
591     FOwner.SetParam(FIndex,AValue);
592     end;
593    
594     procedure TParamIntf.SetAsString(aValue: AnsiString);
595     begin
596     FOwner.SetParam(FIndex,AValue);
597     end;
598    
599     procedure TParamIntf.SetAsVariant(aValue: Variant);
600     begin
601     FOwner.SetParam(FIndex,AValue);
602     end;
603    
604     procedure TParamIntf.SetIsNull(aValue: Boolean);
605     begin
606     if aValue then
607     FOwner.SetParam(FIndex,NULL)
608     end;
609    
610     procedure TParamIntf.SetAsBlob(aValue: IBlob);
611     begin
612     IBError(ibxeNotSupported,[]);
613     end;
614    
615     procedure TParamIntf.SetAsArray(anArray: IArray);
616     begin
617     IBError(ibxeNotSupported,[]);
618     end;
619    
620     procedure TParamIntf.SetAsQuad(aValue: TISC_QUAD);
621     begin
622     IBError(ibxeNotSupported,[]);
623     end;
624    
625     procedure TParamIntf.SetCharSetID(aValue: cardinal);
626     var s: RawByteString;
627     codepage: TSystemCodePage;
628     str: string;
629     begin
630     str := FOwner.FParams[FIndex].Value;
631     s := str;
632     if FOwner.Database.Attachment.CharSetID2CodePage(aValue,codepage) then
633     SetCodePage(s,codepage,codepage <> cp_none);
634     end;
635    
636 tony 315 procedure TParamIntf.SetAsBcd(aValue: tBCD);
637     begin
638     FOwner.SetParam(FIndex,VarFmtBCDCreate(AValue));
639     end;
640    
641 tony 209 { TParamListIntf }
642    
643     procedure TParamListIntf.SetParam(index: integer; aValue: variant);
644     begin
645     FParams[index].Value := aValue;
646     FParams[index].Modified := true;
647 tony 315 FParams[index].TimeZoneID := TimeZoneID_GMT;
648 tony 209 FModified := true;
649     end;
650    
651 tony 315 procedure TParamListIntf.SetTimeZoneID(index: integer; aValue: TFBTimeZoneID);
652     begin
653     if FParams[index].Modified then
654     FParams[index].TimeZoneID := aValue;
655     end;
656    
657 tony 209 constructor TParamListIntf.Create(aFields: TFields; aDatabase: TIBDatabase);
658     var i,j: integer;
659     begin
660     inherited Create;
661     FDatabase := aDatabase;
662     SetLength(FParams,aFields.Count*2);
663     j := 0;
664     {set up both current and "OLD" parameters from Field Names}
665     for i := 0 to aFields.Count - 1 do
666     if aFields[i].FieldKind = fkData then
667     begin
668     FParams[j].Name := aFields[i].FieldName;
669     FParams[j].Value := NULL;
670     FParams[j].Modified := false;
671 tony 315 FParams[j].DataSet := aFields[i].DataSet;
672 tony 209 Inc(j);
673     FParams[j].Name := 'OLD_' + aFields[i].FieldName;
674     FParams[j].Value := NULL;
675     FParams[j].Modified := false;
676 tony 315 FParams[j].DataSet := aFields[i].DataSet;
677 tony 209 Inc(j);
678     end;
679     SetLength(FParams,j);
680     end;
681    
682     destructor TParamListIntf.Destroy;
683     begin
684     SetLength(FParams,0);
685     inherited Destroy;
686     end;
687    
688     function TParamListIntf.getCount: integer;
689     begin
690     Result := Length(FParams);
691     end;
692    
693     function TParamListIntf.getSQLParam(index: integer): ISQLParam;
694     begin
695     if (index < 0) or (index >= getCount) then
696     IBError(ibxeInvalidColumnIndex,[nil]);
697     Result := TParamIntf.Create(self,index);
698     end;
699    
700     function TParamListIntf.ByName(Idx: AnsiString): ISQLParam;
701     var i: integer;
702     begin
703     Result := nil;
704     for i := 0 to getCount - 1 do
705     if CompareText(FParams[i].Name,Idx) = 0 then
706     begin
707     Result := getSQLParam(i);
708     Exit;
709     end;
710     end;
711    
712     function TParamListIntf.GetModified: Boolean;
713     begin
714     Result := FModified;
715     end;
716    
717 tony 287 function TParamListIntf.GetHasCaseSensitiveParams: Boolean;
718     begin
719     Result := false;
720     end;
721    
722 tony 209 { TIBUpdate }
723    
724     function TIBUpdate.GetSQL(UpdateKind: TUpdateKind): TStrings;
725     begin
726     Result := FDummySQL; {non empty result}
727     end;
728    
729     function TIBUpdate.GetDataSet: TIBCustomDataSet;
730     begin
731     Result := FDataSet;
732     end;
733    
734     procedure TIBUpdate.SetDataSet(ADataSet: TIBCustomDataSet);
735     begin
736     FDataSet := ADataset;
737     end;
738    
739     procedure TIBUpdate.Apply(UpdateKind: TUpdateKind; buff: PChar);
740     var Params: ISQLParams;
741     begin
742     Params := TParamListIntf.Create(Dataset.Fields,(DataSet.Database as TIBDatabase));
743     InternalSetParams(Params,buff);
744     if assigned(FOnApplyUpdates) then
745     OnApplyUpdates(self,UpdateKind,Params);
746     end;
747    
748     constructor TIBUpdate.Create(AOwner: TComponent);
749     begin
750     inherited Create(AOwner);
751     FDummySQL := TStringList.Create;
752     FDummySQL.Text := '*';
753     end;
754    
755     destructor TIBUpdate.Destroy;
756     begin
757     if assigned(FDummySQL) then FDummySQL.Free;
758     inherited Destroy;
759     end;
760    
761     end.
762