BufDataSet doesn't support WideString fields in building Index
Original Reporter info from Mantis: havezet
-
Reporter name: Hert Vanz
Original Reporter info from Mantis: havezet
- Reporter name: Hert Vanz
Description:
See the summary.
The procedure TCustomBufDataset.ProcessFieldCompareStruct doesn't include support for WideString typed fields and as a result a "SErrIndexBasedOnInvField" exception is raised
Steps to reproduce:
Create any BufDataset that includes fields that are defined with a DataType ftWideString or ftFixedWideChar
Additional information:
This would be a possible solution:
procedure TCustomBufDataset.ProcessFieldCompareStruct(AField: TField; var ACompareRec : TDBCompareRec);
begin
case AField.DataType of
ftString, ftFixedChar : ACompareRec.Comparefunc := @DBCompareText;
ftWideString, ftFixedWideChar: ACompareRec.Comparefunc := @DBCompareWideText;
ftSmallint : ACompareRec.Comparefunc := @DBCompareSmallInt;
ftInteger, ftBCD, ftAutoInc : ACompareRec.Comparefunc :=
@DBCompareInt;
ftWord : ACompareRec.Comparefunc := @DBCompareWord;
ftBoolean : ACompareRec.Comparefunc := @DBCompareByte;
ftFloat, ftCurrency : ACompareRec.Comparefunc := @DBCompareDouble;
ftDateTime, ftDate, ftTime : ACompareRec.Comparefunc :=
@DBCompareDouble;
ftLargeint : ACompareRec.Comparefunc := @DBCompareLargeInt;
else
DatabaseErrorFmt(SErrIndexBasedOnInvField, [AField.FieldName,Fieldtypenames[AField.DataType]]);
end;
ACompareRec.Off1:=sizeof(TBufRecLinkItem)*FMaxIndexesCount+
FFieldBufPositions[AField.FieldNo-1];
ACompareRec.Off2:=ACompareRec.Off1;
ACompareRec.FieldInd1:=AField.FieldNo-1;
ACompareRec.FieldInd2:=ACompareRec.FieldInd1;
ACompareRec.NullBOff1:=sizeof(TBufRecLinkItem)*MaxIndexesCount;
ACompareRec.NullBOff2:=ACompareRec.NullBOff1;
end;
And DBCompareWideText could be implemented as (this may be implemented in a more efficient way):
function DBCompareWideText(subValue, aValue: pointer; options: TLocateOptions): LargeInt;
begin
if [loCaseInsensitive,loPartialKey]=options then
Result := WideCompareText(pwidechar(subValue),LeftStr(pwidechar(aValue), Length(pwidechar(subValue))))
else if [loPartialKey] = options then
Result := WideCompareStr(pwidechar(subValue),LeftStr(pwidechar(aValue), Length(pwidechar(subValue))))
else if [loCaseInsensitive] = options then
Result := WideCompareText(pwidechar(subValue),pwidechar(aValue))
else
Result := WideCompareStr(pwidechar(subValue),pwidechar(aValue));
end;
Mantis conversion info:
- Mantis ID: 19807
- OS: all
- OS Build: all
- Build: unknown
- Platform: all
- Version: 2.4.2
- Fixed in version: 2.6.0
- Fixed in revision: 18022 (#e7375bf7)