* Fix size issue for UTF8, bug ID #37370, patch by Luca Olivetti

git-svn-id: trunk@48931 -
This commit is contained in:
michael 2021-03-10 10:58:55 +00:00
parent dc3bb933ee
commit 45dc6d1ef1

View File

@ -378,9 +378,14 @@ begin
FFileName := Value; FFileName := Value;
end; end;
function FieldDefDataSize(fd:TFieldDef):integer;
begin
result:=fd.Size*fd.CharSize+1;
end;
procedure TFixedFormatDataSet.InternalInitFieldDefs; procedure TFixedFormatDataSet.InternalInitFieldDefs;
var var
i, Len, MaxLen :Integer; i, Len, DataLen, MaxLen :Integer;
LstFields :TStrings; LstFields :TStrings;
FEnc : TSystemCodePage; FEnc : TSystemCodePage;
@ -410,12 +415,11 @@ begin
Fenc:=FEncoding.CodePage Fenc:=FEncoding.CodePage
else else
FEnc:=DefaultSystemCodePage; FEnc:=DefaultSystemCodePage;
FieldDefs.Add(Trim(LstFields.Names[i]), ftString, Len, 0, False,False,FieldDefs.Count+1,FEnc); DataLen:=FieldDefDataSize(FieldDefs.Add(Trim(LstFields.Names[i]), ftString, Len, 0, False,False,FieldDefs.Count+1,FEnc));
Inc(Len);
{$IFDEF FPC_REQUIRES_PROPER_ALIGNMENT} {$IFDEF FPC_REQUIRES_PROPER_ALIGNMENT}
Len := Align(Len, SizeOf(PtrInt)); DataLen := Align(DataLen, SizeOf(PtrInt));
{$ENDIF} {$ENDIF}
Inc(FRecordSize, Len); Inc(FRecordSize, DataLen);
end; end;
finally finally
LstFields.Free; LstFields.Free;
@ -696,7 +700,7 @@ begin
Result := RecBuf < StrEnd(RecBuf); // just ''=Null Result := RecBuf < StrEnd(RecBuf); // just ''=Null
if Result and Assigned(Buffer) then if Result and Assigned(Buffer) then
begin begin
StrLCopy(Buffer, RecBuf, Field.Size); StrLCopy(Buffer, RecBuf, Field.DataSize);
if FTrimSpace then // trim trailing spaces if FTrimSpace then // trim trailing spaces
begin begin
BufEnd := StrEnd(Buffer); BufEnd := StrEnd(Buffer);
@ -759,7 +763,7 @@ begin
i := 1; i := 1;
while (i < FieldNo) and (i < FieldDefs.Count) do while (i < FieldNo) and (i < FieldDefs.Count) do
begin begin
Len := FieldDefs.Items[i-1].Size + 1; Len := FieldDefDataSize(FieldDefs[i-1]);
{$IFDEF FPC_REQUIRES_PROPER_ALIGNMENT} {$IFDEF FPC_REQUIRES_PROPER_ALIGNMENT}
Len := Align(Len, SizeOf(PtrInt)); Len := Align(Len, SizeOf(PtrInt));
{$ENDIF} {$ENDIF}
@ -912,7 +916,7 @@ begin
Dest := PChar(Result); Dest := PChar(Result);
for i := 0 to FieldDefs.Count - 1 do for i := 0 to FieldDefs.Count - 1 do
begin begin
Len := FieldDefs[i].Size; Len := FieldDefDataSize(FieldDefs[i])-1;
Move(Src^, Dest^, Len); Move(Src^, Dest^, Len);
Inc(Src, Len); Inc(Src, Len);
Inc(Dest, Len); Inc(Dest, Len);
@ -928,14 +932,14 @@ begin
// calculate fixed length record size // calculate fixed length record size
Len := 0; Len := 0;
for i := 0 to FieldDefs.Count - 1 do for i := 0 to FieldDefs.Count - 1 do
Inc(Len, FieldDefs[i].Size); Inc(Len, FieldDefDataSize(FieldDefs[i])-1);
SetLength(Result, Len); SetLength(Result, Len);
Src := PChar(Buffer); Src := PChar(Buffer);
Dest := PChar(Result); Dest := PChar(Result);
for i := 0 to FieldDefs.Count - 1 do for i := 0 to FieldDefs.Count - 1 do
begin begin
Len := FieldDefs[i].Size; Len := FieldDefDataSize(FieldDefs[i])-1;
Move(Src^, Dest^, Len); Move(Src^, Dest^, Len);
// fields in record buffer are null-terminated, but pad them with spaces to fixed length // fields in record buffer are null-terminated, but pad them with spaces to fixed length
SrcLen := StrLen(Src); SrcLen := StrLen(Src);
@ -1142,7 +1146,7 @@ begin
for i := 0 to FieldDefs.Count - 1 do for i := 0 to FieldDefs.Count - 1 do
begin begin
MaxLen := FieldDefs[i].Size; MaxLen := FieldDefDataSize(FieldDefs[i])-1;
S := ExtractDelimited(Source, Pos); S := ExtractDelimited(Source, Pos);
Len := Length(S); Len := Length(S);
@ -1152,8 +1156,7 @@ begin
if Len = 0 then // bug in StrPLCopy if Len = 0 then // bug in StrPLCopy
Dest^ := #0 Dest^ := #0
else else
StrPLCopy(Dest, S, Len); // null-terminate StrPLCopy(Dest, S, Len+1); // null-terminate
Inc(Dest, MaxLen+1); Inc(Dest, MaxLen+1);
end; end;
end; end;
@ -1173,7 +1176,7 @@ begin
Src := PChar(Buffer); Src := PChar(Buffer);
for i := 0 to FieldDefs.Count - 1 do for i := 0 to FieldDefs.Count - 1 do
begin begin
MaxLen := FieldDefs[i].Size; MaxLen := FieldDefDataSize(FieldDefs[i])-1;
Len := StrLen(Src); // field values are null-terminated in record buffer Len := StrLen(Src); // field values are null-terminated in record buffer
if Len > MaxLen then if Len > MaxLen then
Len := MaxLen; Len := MaxLen;