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