2
0
Эх сурвалжийг харах

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

git-svn-id: trunk@48931 -
michael 4 жил өмнө
parent
commit
45dc6d1ef1

+ 17 - 14
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;