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 -
This commit is contained in:
lacak 2013-09-23 11:09:07 +00:00
parent 22e9cb48dd
commit 9013ff6724
2 changed files with 29 additions and 23 deletions

View File

@ -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);

View File

@ -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