Explorar o código

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

git-svn-id: trunk@30530 -
lacak %!s(int64=10) %!d(string=hai) anos
pai
achega
2afe3138ff
Modificáronse 2 ficheiros con 30 adicións e 25 borrados
  1. 8 15
      packages/fcl-db/src/sdf/sdfdata.pp
  2. 22 10
      packages/fcl-db/tests/tcsdfdata.pp

+ 8 - 15
packages/fcl-db/src/sdf/sdfdata.pp

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

+ 22 - 10
packages/fcl-db/tests/tcsdfdata.pp

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