fcl-db: sdfdataset: fix Append vs. Insert + test

git-svn-id: trunk@30530 -
This commit is contained in:
lacak 2015-04-10 06:11:23 +00:00
parent e846457d38
commit 2afe3138ff
2 changed files with 30 additions and 25 deletions

View File

@ -399,7 +399,7 @@ begin
if (not FReadOnly) and (FSaveChanges) then // Write any edits to disk
FData.SaveToFile(FileName);
FLoadfromStream := False;
FData.Clear;
FData.Clear; // Clear data
BindFields(FALSE);
if DefaultFields then // Destroy the TField
DestroyFields;
@ -720,14 +720,12 @@ end;
procedure TFixedFormatDataSet.InternalPost;
begin
FSaveChanges := TRUE;
inherited InternalPost;
FSaveChanges := TRUE;
if (State = dsEdit) then // just update the data in the string list
begin
FData[FCurRec] := BufToStore(ActiveBuffer);
end
else
InternalAddRecord(ActiveBuffer, True);
FData[FCurRec] := BufToStore(ActiveBuffer)
else // append or insert
InternalAddRecord(ActiveBuffer, GetBookmarkFlag(ActiveBuffer)=bfEOF);
end;
procedure TFixedFormatDataSet.InternalEdit;
@ -752,16 +750,11 @@ begin
FSaveChanges := TRUE;
Inc(FLastBookmark);
if DoAppend then
begin
InternalLast;
if (FCurRec >= FDataOffset) then
FData.InsertObject(FCurRec, BufToStore(Buffer), TObject(Pointer(FLastBookmark)))
else
FData.AddObject(BufToStore(Buffer), TObject(Pointer(FLastBookmark)));
end
else if (FCurRec >= FDataOffset) then
begin
For I:=FCurRec+FDataOffset to FData.Count-1 do
FData.Objects[i]:=TObject(FCurRec+FDataOffset+1);
FData.InsertObject(FCurRec+FDataOffset, BufToStore(Buffer), TObject(Pointer(FCurRec)))
end
end;
function TFixedFormatDataSet.BookmarkValid(ABookmark: TBookmark): Boolean;

View File

@ -102,6 +102,7 @@ begin
TestDataset.FirstLineAsSchema := True;
TestDataset.FileName:=InputFilename;
TestDataset.Open;
AssertEquals('1', TestDataset.Fields[0].AsString); // just after Open
TestDataset.Last;
TestDataset.First;
@ -133,6 +134,7 @@ begin
TestDataset.FirstLineAsSchema := False;
TestDataset.FileName:=InputFilename;
TestDataset.Open;
AssertEquals('1', TestDataset.Fields[0].AsString);
TestDataset.Last;
TestDataset.First;
@ -144,9 +146,11 @@ end;
procedure Ttestsdfspecific.TestOutput;
// Basic assignment test: assign some difficult data to records and
// see if the recordcount is correct.
// see if the RecordCount is correct.
const
OutputFilename='output.csv';
var
i: integer;
begin
TestDataSet.Close;
@ -169,27 +173,35 @@ begin
TestDataset.Post;
TestDataset.Append;
TestDataset.FieldByName('ID').AsInteger := 3;
TestDataset.FieldByName('ID').AsInteger := 4;
//Data with delimiter and quote (to test 19376)
TestDataset.FieldByName('NAME').AsString := 'Delimiter,"and";quote';
TestDataset.FieldByName('BIRTHDAY').AsDateTime := ScanDateTime('yyyymmdd', '19761231', 1);
TestDataset.Post;
TestDataset.Append;
TestDataset.FieldByName('ID').AsInteger := 4;
TestDataset.Insert;
TestDataset.FieldByName('ID').AsInteger := 3;
// Regular data
TestDataset.FieldByName('NAME').AsString := 'Just a long line of text without anything special';
TestDataset.FieldByName('BIRTHDAY').AsDateTime := ScanDateTime('yyyymmdd', '19761231', 1);
TestDataset.Post;
TestDataset.Last;
AssertEquals('RecNo', 4, TestDataset.RecNo);
TestDataset.RecNo := 2;
AssertEquals('RecNo', 2, TestDataset.RecNo);
AssertEquals(2, TestDataset.FieldByName('ID').AsInteger);
// test sequential order of records
TestDataset.First;
for i:=1 to 4 do begin
AssertEquals('RecNo', i, TestDataset.RecNo);
AssertEquals(i, TestDataset.FieldByName('ID').AsInteger);
TestDataset.Next;
end;
// set/test RecNo
for i:=1 to 4 do begin
TestDataset.RecNo := i;
AssertEquals('RecNo', i, TestDataset.RecNo);
AssertEquals(i, TestDataset.FieldByName('ID').AsInteger);
end;
AssertEquals('RecordCount', 4, TestDataset.RecordCount);
TestDataset.Close;
AssertEquals('RecordCount after Close', 0, TestDataset.RecordCount);
end;
{