Browse Source

fcl-db: sdfdataset: better RecNo testing.

git-svn-id: trunk@30513 -
lacak 10 years ago
parent
commit
5ba4a65fe3
2 changed files with 49 additions and 65 deletions
  1. 30 51
      packages/fcl-db/src/sdf/sdfdata.pp
  2. 19 14
      packages/fcl-db/tests/tcsdfdata.pp

+ 30 - 51
packages/fcl-db/src/sdf/sdfdata.pp

@@ -137,7 +137,7 @@ type
 // TRecInfo
   PRecInfo = ^TRecInfo;
   TRecInfo = packed record
-    RecordNumber: PtrInt;
+    Bookmark: PtrInt;
     BookmarkFlag: TBookmarkFlag;
   end;
 //-----------------------------------------------------------------------------
@@ -200,7 +200,7 @@ type
     procedure SetRecNo(Value: Integer); override;
     function GetCanModify: boolean; override;
     function TxtGetRecord(Buffer : TRecordBuffer; GetMode: TGetMode): TGetResult;
-    function RecordFilter(RecBuf: Pointer; ARecNo: Integer): Boolean;
+    function RecordFilter(RecBuf: Pointer): Boolean;
     function BufToStore(Buffer: TRecordBuffer): String; virtual;
     function StoreToBuf(Source: String): String; virtual;
   public
@@ -266,8 +266,6 @@ type
     procedure SetDelimiter(Value : Char);
   protected
     procedure InternalInitFieldDefs; override;
-    function GetRecord(Buffer: TRecordBuffer; GetMode: TGetMode; DoCheck: Boolean)
-             : TGetResult; override;
     function BufToStore(Buffer: TRecordBuffer): String; override;
     function StoreToBuf(Source: String): String; override;
   public
@@ -373,7 +371,6 @@ procedure TFixedFormatDataSet.InternalOpen;
 var
   Stream : TStream;
 begin
-  FCurRec := -1;
   FSaveChanges := FALSE;
   if not Assigned(FData) then
     FData := TStringList.Create;
@@ -395,6 +392,7 @@ begin
   FRecInfoOfs := FRecordSize + CalcFieldsSize; // Initialize the offset for TRecInfo in the buffer
   FRecBufSize := FRecInfoOfs + SizeOf(TRecInfo);
   FLastBookmark := FData.Count;
+  FCurRec := FDataOffset - 1;
 end;
 
 procedure TFixedFormatDataSet.InternalClose;
@@ -482,20 +480,17 @@ begin
   if (FData.Count <= FDataOffset) then
     Result := grEOF
   else
-    Result := TxtGetRecord(Buffer, GetMode);
-  if Result = grOK then
   begin
-    if (CalcFieldsSize > 0) then
-      GetCalcFields(Buffer);
-    with PRecInfo(Buffer + FRecInfoOfs)^ do
+    Result := TxtGetRecord(Buffer, GetMode);
+    if Result = grOK then
     begin
-      BookmarkFlag := bfCurrent;
-      RecordNumber := PtrInt(FData.Objects[FCurRec]);
-    end;
-  end
-  else
-    if (Result = grError) and DoCheck then
-      DatabaseError('No Records');
+      if (CalcFieldsSize > 0) then
+        GetCalcFields(Buffer);
+    end
+    else
+      if (Result = grError) and DoCheck then
+        DatabaseError('No Records');
+  end;
 end;
 
 function TFixedFormatDataSet.GetRecordCount: Longint;
@@ -509,7 +504,10 @@ var
 begin
   Result := 0;
   if GetActiveRecBuf(RecBuf) and (State <> dsInsert) then
-    Result := PRecInfo(RecBuf + FRecInfoOfs)^.RecordNumber;
+  begin
+    InternalSetToRecord(RecBuf);
+    Result := FCurRec + 1 - FDataOffset;
+  end;
 end;
 
 procedure TFixedFormatDataSet.SetRecNo(Value: Integer);
@@ -518,7 +516,7 @@ begin
   if (Value >= 0) and (Value <= RecordCount) and (Value <> RecNo) then
   begin
     DoBeforeScroll;
-    FCurRec := Value - 1;
+    FCurRec := Value - 1 + FDataOffset;
     Resync([]);
     DoAfterScroll;
   end;
@@ -551,7 +549,7 @@ begin
     Accepted := TRUE;
     case GetMode of
       gmNext:
-        if FCurRec >= RecordCount - 1  then
+        if FCurRec >= FData.Count - 1  then
           Result := grEOF
         else
           Inc(FCurRec);
@@ -561,15 +559,20 @@ begin
         else
           Dec(FCurRec);
       gmCurrent:
-        if (FCurRec < FDataOffset) or (FCurRec >= RecordCount) then
+        if (FCurRec < FDataOffset) or (FCurRec >= FData.Count) then
           Result := grError;
     end;
-    if (Result = grOk) then
+    if Result = grOk then
     begin
       Move(PChar(StoreToBuf(FData[FCurRec]))^, Buffer[0], FRecordSize);
+      with PRecInfo(Buffer + FRecInfoOfs)^ do
+      begin
+        Bookmark := PtrInt(FData.Objects[FCurRec]);
+        BookmarkFlag := bfCurrent;
+      end;
       if Filtered then
       begin
-        Accepted := RecordFilter(Buffer, FCurRec +1);
+        Accepted := RecordFilter(Buffer);
         if not Accepted and (GetMode = gmCurrent) then
           Inc(FCurRec);
       end;
@@ -577,14 +580,13 @@ begin
   until Accepted;
 end;
 
-function TFixedFormatDataSet.RecordFilter(RecBuf: Pointer; ARecNo: Integer): Boolean;
+function TFixedFormatDataSet.RecordFilter(RecBuf: Pointer): Boolean;
 var
   Accept: Boolean;
   SaveState: TDataSetState;
 begin                          // Returns true if accepted in the filter
   SaveState := SetTempState(dsFilter);
   FFilterBuffer := RecBuf;
-  PRecInfo(FFilterBuffer + FRecInfoOfs)^.RecordNumber := ARecNo;
   Accept := TRUE;
   if Accept and Assigned(OnFilterRecord) then
     OnFilterRecord(Self, Accept);
@@ -718,7 +720,7 @@ end;
 // Navigation / Editing
 procedure TFixedFormatDataSet.InternalFirst;
 begin
-  FCurRec := -1;
+  FCurRec := FDataOffset - 1;
 end;
 
 procedure TFixedFormatDataSet.InternalLast;
@@ -764,7 +766,7 @@ begin
     InternalLast;
     FData.AddObject(BufToStore(Buffer), TObject(Pointer(FLastBookmark)));
     end
-  else if (FCurRec-FDataOffset>=0) then
+  else if (FCurRec >= FDataOffset) then
     begin
     For I:=FCurRec+FDataOffset to FData.Count-1 do
       FData.Objects[i]:=TObject(FCurRec+FDataOffset+1);
@@ -791,7 +793,7 @@ end;
 procedure TFixedFormatDataSet.InternalSetToRecord(Buffer: TRecordBuffer);
 begin
   if (State <> dsInsert) then
-    InternalGotoBookmark(@PRecInfo(Buffer + FRecInfoOfs)^.RecordNumber);
+    InternalGotoBookmark(@PRecInfo(Buffer + FRecInfoOfs)^.Bookmark);
 end;
 
 function TFixedFormatDataSet.GetBookmarkFlag(Buffer: TRecordBuffer): TBookmarkFlag;
@@ -936,29 +938,6 @@ begin
   inherited;
 end;
 
-function TSdfDataSet.GetRecord(Buffer: TRecordBuffer; GetMode: TGetMode;
-  DoCheck: Boolean): TGetResult;
-begin
-  if FirstLineAsSchema then
-  begin
-    if (FData.Count < 2) then
-      begin
-      if GetMode=gmPrior then
-       Result := grBOF
-      else
-       Result := grEOF
-      end
-    else
-      begin
-      If (FCurrec=-1) and (GetMode=gmNext) then
-        inc(FCurRec);
-      Result := inherited GetRecord(Buffer, GetMode, DoCheck);
-      end;
-  end
-  else
-    Result := inherited GetRecord(Buffer, GetMode, DoCheck);
-end;
-
 function TSdfDataSet.StoreToBuf(Source: String): String;
 const
  CR    :char = #13;

+ 19 - 14
packages/fcl-db/tests/tcsdfdata.pp

@@ -99,13 +99,14 @@ begin
   end;
 
   TestDataset.FileMustExist:=false;
-  TestDataset.FirstLineAsSchema := true;
+  TestDataset.FirstLineAsSchema := True;
   TestDataset.FileName:=InputFilename;
   TestDataset.Open;
 
   TestDataset.Last;
   TestDataset.First;
-  AssertEquals('Number of records in test dataset', 1, TestDataset.RecordCount);
+  AssertEquals('RecNo', 1, TestDataset.RecNo);
+  AssertEquals('RecordCount', 1, TestDataset.RecordCount);
   TestDataset.Close;
 end;
 
@@ -128,13 +129,14 @@ begin
   end;
 
   TestDataset.FileMustExist:=false;
-  TestDataset.FirstLineAsSchema := false;
+  TestDataset.FirstLineAsSchema := False;
   TestDataset.FileName:=InputFilename;
   TestDataset.Open;
 
   TestDataset.Last;
   TestDataset.First;
-  AssertEquals('Number of records in test dataset', 1, TestDataset.RecordCount);
+  AssertEquals('RecNo', 1, TestDataset.RecNo);
+  AssertEquals('RecordCount', 1, TestDataset.RecordCount);
   TestDataset.Close;
 end;
 
@@ -180,9 +182,11 @@ begin
   TestDataset.Post;
 
   TestDataset.Last;
-  TestDataset.First;
-  // This fails - seems it sees the header as a record, too?
-  AssertEquals('Number of records in test dataset', 4, TestDataset.RecordCount);
+  AssertEquals('RecNo', 4, TestDataset.RecNo);
+  TestDataset.RecNo := 2;
+  AssertEquals('RecNo', 2, TestDataset.RecNo);
+  AssertEquals(2, TestDataset.FieldByName('ID').AsInteger);
+  AssertEquals('RecordCount', 4, TestDataset.RecordCount);
   TestDataset.Close;
 end;
 
@@ -268,8 +272,6 @@ const
   Value7='Some "random" quotes';
 Var
   F : Text;
-  FileStrings: TStringList;
-  OneRecord: TStringList;
 begin
   TestDataset.Close;
   TestDataset.AllowMultiLine:=true;
@@ -315,7 +317,8 @@ begin
   TestDataset.Delimiter := ';';
   TestDataset.FileName:=OutputFileName;
   TestDataset.Open;
-  AssertEquals('Correct field count',5,TestDataset.FieldDefs.Count);
+  AssertEquals('FieldDefs.Count',5,TestDataset.FieldDefs.Count);
+  AssertEquals('RecordCount', 0, TestDataset.RecordCount);
 end;
 
 procedure Ttestsdfspecific.TestEmptyHeader2;
@@ -340,7 +343,8 @@ begin
   TestDataset.FileName:=OutputFileName;
   TestDataset.Schema.Clear;
   TestDataset.Open;
-  AssertEquals('Correct field count',5,TestDataset.FieldDefs.Count);
+  AssertEquals('FieldDefs.Count',5,TestDataset.FieldDefs.Count);
+  AssertEquals('RecordCount', 1, TestDataset.RecordCount);
   TestDataset.Edit;
   TestDataset.Fields[0].AsString:='Value1';
   TestDataset.Post;
@@ -374,7 +378,7 @@ begin
   TestDataset.FileName:=OutputFileName;
   TestDataset.Schema.Clear;
   TestDataset.Open;
-  AssertEquals('Correct field count',2,TestDataset.FieldDefs.Count);
+  AssertEquals('FieldDefs.Count',2,TestDataset.FieldDefs.Count);
   TestDataset.Edit;
   TestDataset.Fields[0].AsString:='Value1';
   TestDataset.Post;
@@ -409,7 +413,7 @@ begin
   TestDataset.FileName:=OutputFileName;
   TestDataset.Schema.Clear;
   TestDataset.Open;
-  AssertEquals('Correct field count',2,TestDataset.FieldDefs.Count);
+  AssertEquals('FieldDefs.Count',2,TestDataset.FieldDefs.Count);
   TestDataset.Edit;
   TestDataset.Fields[0].AsString:='Value1';
   TestDataset.Post;
@@ -443,7 +447,8 @@ begin
   TestDataset.Delimiter := ';';
   TestDataset.FileName:=OutputFileName;
   TestDataset.Open;
-  AssertEquals('Correct field count',5,TestDataset.FieldDefs.Count);
+  AssertEquals('FieldDefs.Count',5,TestDataset.FieldDefs.Count);
+  AssertEquals('RecordCount',1,TestDataset.RecordCount);
 end;