浏览代码

fcl-db: mysql: when checking for max. field buffer size take into account also CharSize. Bug#31445

git-svn-id: trunk@35544 -
lacak 8 年之前
父节点
当前提交
94b8beb3c2
共有 1 个文件被更改,包括 9 次插入7 次删除
  1. 9 7
      packages/fcl-db/src/sqldb/mysql/mysqlconn.inc

+ 9 - 7
packages/fcl-db/src/sqldb/mysql/mysqlconn.inc

@@ -1042,9 +1042,6 @@ begin
     exit;
   SetString(Src, Source, Len);
 
-  if Len > FieldDef.Size then
-    Len := FieldDef.Size;
-
   case FieldDef.DataType of
     ftSmallint:
       begin
@@ -1072,10 +1069,10 @@ begin
         end
       else
       {$ENDIF}
-      if Src <> '' then
-        VL := StrToInt64(Src)
-      else
-        VL := 0;
+        if Src <> '' then
+          VL := StrToInt64(Src)
+        else
+          VL := 0;
       Move(VL, Dest^, SizeOf(LargeInt));
       end;
     ftFloat:
@@ -1127,16 +1124,21 @@ begin
       // String-fields which can contain more then dsMaxStringSize characters
       // are mapped to ftBlob fields, while their mysql-datatype is FIELD_TYPE_BLOB
       begin
+      if Len > FieldDef.Size*FieldDef.CharSize then Len := FieldDef.Size*FieldDef.CharSize;
       Move(Source^, Dest^, Len);
       (Dest+Len)^ := #0;
       end;
     ftVarBytes:
       begin
+      if Len > FieldDef.Size then Len := FieldDef.Size;
       PWord(Dest)^ := Len;
       Move(Source^, (Dest+sizeof(Word))^, Len);
       end;
     ftBytes:
+      begin
+      if Len > FieldDef.Size then Len := FieldDef.Size;
       Move(Source^, Dest^, Len);
+      end;
     ftBlob, ftMemo:
       CreateBlob := True;
   end;