Browse Source

fcl-db:fcl-db: base: fix streaming (restoring) of ftWideMemo fields in XMLDatapacketReader
+ extend test of streaming of "FieldDataset" to test all fields (not only Blob and Memo)

git-svn-id: trunk@25538 -

lacak 12 years ago
parent
commit
9013ff6724

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

@@ -341,6 +341,7 @@ var FieldNr      : integer;
     ABufBlobField: TBufBlobField;
     AField: TField;
     s: string;
+    ws: widestring;
 begin
   with ADataset do for FieldNr:=0 to FieldDefs.Count-1 do
     begin
@@ -348,19 +349,20 @@ begin
     AFieldNode := FRecordNode.Attributes.GetNamedItem(FieldDefs[FieldNr].Name);
     if assigned(AFieldNode) then
       begin
-       s := AFieldNode.NodeValue;
-       if (FieldDefs[FieldNr].DataType in [ftBlob, ftBytes, ftVarBytes]) and (s <> '') then
-         s := DecodeStringBase64(s);
-       if FieldDefs[FieldNr].DataType in [ftBlob, ftMemo, ftWideMemo] then
-        begin
-        ABufBlobField.BlobBuffer:=ADataset.GetNewBlobBuffer;
-        ABufBlobField.BlobBuffer^.Size:=length(s);
-        ReAllocMem(ABufBlobField.BlobBuffer^.Buffer,ABufBlobField.BlobBuffer^.Size);
-        move(s[1],ABufBlobField.BlobBuffer^.Buffer^,ABufBlobField.BlobBuffer^.Size);
-        AField.SetData(@ABufBlobField);
-        end
-      else
-        AField.AsString := s;  // set it to the filterbuffer
+      s := AFieldNode.NodeValue;
+      if (FieldDefs[FieldNr].DataType in [ftBlob, ftBytes, ftVarBytes]) and (s <> '') then
+        s := DecodeStringBase64(s);
+      case FieldDefs[FieldNr].DataType of
+        ftBlob, ftMemo:
+          RestoreBlobField(ADataset, AField, @s[1], length(s));
+        ftWideMemo:
+          begin
+          ws := s;
+          RestoreBlobField(ADataset, AField, @ws[1], length(ws)*sizeof(WideChar));
+          end
+        else;
+          AField.AsString := s;  // set it to the filterbuffer
+      end;
       end
     else
       AField.SetData(nil);

+ 14 - 10
packages/fcl-db/tests/testbufdatasetstreams.pas

@@ -37,7 +37,7 @@ type
     procedure NullEditChange(ADataset: TCustomBufDataset);
     procedure AppendDeleteChange(ADataset: TCustomBufDataset);
 
-    procedure TestStreamingBlobFields(AFormat: TDataPacketFormat);
+    procedure TestStreamingDataFields(AFormat: TDataPacketFormat);
     procedure TestStreamingNullFields(AFormat: TDataPacketFormat);
   protected
     procedure SetUp; override;
@@ -72,8 +72,8 @@ type
     procedure TestSeveralEditsXML;
     procedure TestDeleteAllXML;
     procedure TestDeleteAllInsertXML;
-    procedure TestStreamingBlobFieldsBIN;
-    procedure TestStreamingBlobFieldsXML;
+    procedure TestStreamingDataFieldsBIN;
+    procedure TestStreamingDataFieldsXML;
     procedure TestStreamingBigBlobFieldsXML;
     procedure TestStreamingNullFieldsBIN;
     procedure TestStreamingNullFieldsXML;
@@ -462,9 +462,10 @@ begin
   TestChangesXML(@DeleteAllInsertChange);
 end;
 
-procedure TTestBufDatasetStreams.TestStreamingBlobFields(AFormat: TDataPacketFormat);
+procedure TTestBufDatasetStreams.TestStreamingDataFields(AFormat: TDataPacketFormat);
 var SaveDs: TCustomBufDataset;
     LoadDs: TCustomBufDataset;
+    i: integer;
 begin
   SaveDs := DBConnector.GetFieldDataset as TCustomBufDataset;
   SaveDs.Open;
@@ -472,13 +473,15 @@ begin
 
   LoadDs := TCustomBufDataset.Create(nil);
   LoadDs.LoadFromFile(TestFileNames[AFormat]);
+  AssertEquals(SaveDs.FieldCount, LoadDs.FieldCount);
 
   LoadDS.First;
   SaveDS.First;
   while not LoadDS.EOF do
     begin
-    AssertEquals(SaveDS.FieldByName('FBLOB').AsString, LoadDS.FieldByName('FBLOB').AsString);
-    AssertEquals(SaveDS.FieldByName('FMEMO').AsString, LoadDS.FieldByName('FMEMO').AsString);
+    for i:=0 to LoadDS.FieldCount-1 do
+      // all FieldTypes supports GetAsString
+      AssertEquals(LoadDS.Fields[i].FieldName, SaveDS.Fields[i].AsString, LoadDS.Fields[i].AsString);
     LoadDS.Next;
     SaveDS.Next;
     end;
@@ -486,14 +489,14 @@ begin
   LoadDs.Free;
 end;
 
-procedure TTestBufDatasetStreams.TestStreamingBlobFieldsBIN;
+procedure TTestBufDatasetStreams.TestStreamingDataFieldsBIN;
 begin
-  TestStreamingBlobFields(dfBinary);
+  TestStreamingDataFields(dfBinary);
 end;
 
-procedure TTestBufDatasetStreams.TestStreamingBlobFieldsXML;
+procedure TTestBufDatasetStreams.TestStreamingDataFieldsXML;
 begin
-  TestStreamingBlobFields(dfXML);
+  TestStreamingDataFields(dfXML);
 end;
 
 procedure TTestBufDatasetStreams.TestStreamingBigBlobFieldsXML;
@@ -588,6 +591,7 @@ begin
   LoadDs := TCustomBufDataset.Create(nil);
   try
     LoadDs.LoadFromFile(TestFileNames[AFormat]);
+    AssertEquals(SaveDs.FieldCount, LoadDs.FieldCount);
     SaveDs.First;
     while not SaveDs.EOF do
       begin