Browse Source

--- Merging r22633 into '.':
U packages/fcl-db/src/base/xmldatapacketreader.pp
--- Merging r22710 into '.':
G packages/fcl-db/src/base/xmldatapacketreader.pp

# revisions: 22633,22710
r22633 | marco | 2012-10-13 13:25:05 +0200 (Sat, 13 Oct 2012) | 4 lines
Changed paths:
M /trunk/packages/fcl-db/src/base/xmldatapacketreader.pp

* applied patch from Lacak2
Mantis #22858 TCustomBufDataset.SaveToFile in XML format fails if fields are ftBytes or ftVarBytes and contain binary data
r22710 | ludob | 2012-10-17 21:58:28 +0200 (Wed, 17 Oct 2012) | 1 line
Changed paths:
M /trunk/packages/fcl-db/src/base/xmldatapacketreader.pp

TXMLDatapacketReader.StoreRecord uses TFieldDef.Name to match TXMLDatapacketReader.RestoreRecord. Fixes case mismatch in PG tests. Patch by Lacak2, mantis #22367

git-svn-id: branches/fixes_2_6@22717 -

marco 12 years ago
parent
commit
98c061e821
1 changed files with 13 additions and 11 deletions
  1. 13 11
      packages/fcl-db/src/base/xmldatapacketreader.pp

+ 13 - 11
packages/fcl-db/src/base/xmldatapacketreader.pp

@@ -347,38 +347,40 @@ begin
     AFieldNode := FRecordNode.Attributes.GetNamedItem(FieldDefs[FieldNr].Name);
     if assigned(AFieldNode) then
       begin
-      if FieldDefs[FieldNr].DataType in [ftMemo,ftBlob] then
+       s := AFieldNode.NodeValue;
+       AField := Fields.FieldByNumber(FieldDefs[FieldNr].FieldNo);
+       if (FieldDefs[FieldNr].DataType in [ftBlob, ftBytes, ftVarBytes]) and (s <> '') then
+         s := DecodeStringBase64(s);
+       if FieldDefs[FieldNr].DataType in [ftBlob, ftMemo] then
         begin
         ABufBlobField.BlobBuffer:=ADataset.GetNewBlobBuffer;
-        afield := Fields.FieldByNumber(FieldDefs[FieldNr].FieldNo);
         AField.SetData(@ABufBlobField);
-        s := AFieldNode.NodeValue;
-        if (FieldDefs[FieldNr].DataType = ftBlob) and (s<>'') then
-          s := DecodeStringBase64(s);
         ABufBlobField.BlobBuffer^.Size:=length(s);
         ReAllocMem(ABufBlobField.BlobBuffer^.Buffer,ABufBlobField.BlobBuffer^.Size);
         move(s[1],ABufBlobField.BlobBuffer^.Buffer^,ABufBlobField.BlobBuffer^.Size);
         end
       else
-        Fields.FieldByNumber(FieldDefs[FieldNr].FieldNo).AsString := AFieldNode.NodeValue;  // set it to the filterbuffer
+        AField.AsString := s;  // set it to the filterbuffer
       end
     end;
 end;
 
 procedure TXMLDatapacketReader.StoreRecord(ADataset : TCustomBufDataset; ARowState : TRowState; AUpdOrder : integer = 0);
 var FieldNr : Integer;
-    AField: TField;
+    AFieldDef: TFieldDef;
+    s: string;
     ARecordNode : TDOMElement;
 begin
   inc(FEntryNr);
   ARecordNode := XMLDocument.CreateElement('ROW');
   for FieldNr := 0 to ADataset.FieldDefs.Count-1 do
     begin
-    AField := ADataset.Fields.FieldByNumber(ADataset.FieldDefs[FieldNr].FieldNo);
-    if AField.DataType=ftBlob then
-      ARecordNode.SetAttribute(AField.FieldName,EncodeStringBase64(AField.AsString))
+    AFieldDef := ADataset.FieldDefs[FieldNr];
+    s := ADataset.Fields.FieldByNumber(AFieldDef.FieldNo).AsString;
+    if AFieldDef.DataType in [ftBlob, ftBytes, ftVarBytes] then
+      ARecordNode.SetAttribute(AFieldDef.Name, EncodeStringBase64(s))
     else
-      ARecordNode.SetAttribute(AField.FieldName,AField.AsString);
+      ARecordNode.SetAttribute(AFieldDef.Name, s);
     end;
   if ARowState<>[] then
     begin