mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2026-01-08 09:21:42 +01:00
fcl-db: sdfdataset: fix Append vs. Insert + test
git-svn-id: trunk@30530 -
This commit is contained in:
parent
e846457d38
commit
2afe3138ff
@ -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;
|
||||
|
||||
@ -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;
|
||||
|
||||
{
|
||||
|
||||
Loading…
Reference in New Issue
Block a user