Jelajahi Sumber

* applied patch from Lacak2
Mantis #22858 TCustomBufDataset.SaveToFile in XML format fails if fields are ftBytes or ftVarBytes and contain binary data


git-svn-id: trunk@22633 -

marco 12 tahun lalu
induk
melakukan
287adff8a1
1 mengubah file dengan 6 tambahan dan 6 penghapusan
  1. 6 6
      packages/fcl-db/src/base/xmldatapacketreader.pp

+ 6 - 6
packages/fcl-db/src/base/xmldatapacketreader.pp

@@ -347,20 +347,20 @@ begin
     AFieldNode := FRecordNode.Attributes.GetNamedItem(FieldDefs[FieldNr].Name);
     AFieldNode := FRecordNode.Attributes.GetNamedItem(FieldDefs[FieldNr].Name);
     if assigned(AFieldNode) then
     if assigned(AFieldNode) then
       begin
       begin
-      if FieldDefs[FieldNr].DataType in [ftMemo,ftBlob] then
+       s := AFieldNode.NodeValue;
+       if (FieldDefs[FieldNr].DataType in [ftBlob, ftBytes, ftVarBytes]) and (s <> '') then
+         s := DecodeStringBase64(s);
+       if FieldDefs[FieldNr].DataType in [ftBlob, ftMemo] then
         begin
         begin
         ABufBlobField.BlobBuffer:=ADataset.GetNewBlobBuffer;
         ABufBlobField.BlobBuffer:=ADataset.GetNewBlobBuffer;
         afield := Fields.FieldByNumber(FieldDefs[FieldNr].FieldNo);
         afield := Fields.FieldByNumber(FieldDefs[FieldNr].FieldNo);
         AField.SetData(@ABufBlobField);
         AField.SetData(@ABufBlobField);
-        s := AFieldNode.NodeValue;
-        if (FieldDefs[FieldNr].DataType = ftBlob) and (s<>'') then
-          s := DecodeStringBase64(s);
         ABufBlobField.BlobBuffer^.Size:=length(s);
         ABufBlobField.BlobBuffer^.Size:=length(s);
         ReAllocMem(ABufBlobField.BlobBuffer^.Buffer,ABufBlobField.BlobBuffer^.Size);
         ReAllocMem(ABufBlobField.BlobBuffer^.Buffer,ABufBlobField.BlobBuffer^.Size);
         move(s[1],ABufBlobField.BlobBuffer^.Buffer^,ABufBlobField.BlobBuffer^.Size);
         move(s[1],ABufBlobField.BlobBuffer^.Buffer^,ABufBlobField.BlobBuffer^.Size);
         end
         end
       else
       else
-        Fields.FieldByNumber(FieldDefs[FieldNr].FieldNo).AsString := AFieldNode.NodeValue;  // set it to the filterbuffer
+        Fields.FieldByNumber(FieldDefs[FieldNr].FieldNo).AsString := s;  // set it to the filterbuffer
       end
       end
     end;
     end;
 end;
 end;
@@ -375,7 +375,7 @@ begin
   for FieldNr := 0 to ADataset.FieldDefs.Count-1 do
   for FieldNr := 0 to ADataset.FieldDefs.Count-1 do
     begin
     begin
     AField := ADataset.Fields.FieldByNumber(ADataset.FieldDefs[FieldNr].FieldNo);
     AField := ADataset.Fields.FieldByNumber(ADataset.FieldDefs[FieldNr].FieldNo);
-    if AField.DataType=ftBlob then
+    if AField.DataType in [ftBlob, ftBytes, ftVarBytes] then
       ARecordNode.SetAttribute(AField.FieldName,EncodeStringBase64(AField.AsString))
       ARecordNode.SetAttribute(AField.FieldName,EncodeStringBase64(AField.AsString))
     else
     else
       ARecordNode.SetAttribute(AField.FieldName,AField.AsString);
       ARecordNode.SetAttribute(AField.FieldName,AField.AsString);