Browse Source

fcl-db: sdfdataset: fix RecordCount for closed dataset with headers + test

git-svn-id: trunk@30529 -
lacak 10 years ago
parent
commit
e846457d38
2 changed files with 48 additions and 56 deletions
  1. 46 56
      packages/fcl-db/src/sdf/sdfdata.pp
  2. 2 0
      packages/fcl-db/tests/tcsdfdata.pp

+ 46 - 56
packages/fcl-db/src/sdf/sdfdata.pp

@@ -199,8 +199,7 @@ type
     function GetRecNo: Integer; override;
     function GetRecNo: Integer; override;
     procedure SetRecNo(Value: Integer); override;
     procedure SetRecNo(Value: Integer); override;
     function GetCanModify: boolean; override;
     function GetCanModify: boolean; override;
-    function TxtGetRecord(Buffer : TRecordBuffer; GetMode: TGetMode): TGetResult;
-    function RecordFilter(RecBuf: Pointer): Boolean;
+    function RecordFilter(RecBuf: TRecordBuffer): Boolean;
     function BufToStore(Buffer: TRecordBuffer): String; virtual;
     function BufToStore(Buffer: TRecordBuffer): String; virtual;
     function StoreToBuf(Source: String): String; virtual;
     function StoreToBuf(Source: String): String; virtual;
   public
   public
@@ -476,26 +475,59 @@ end;
 
 
 function TFixedFormatDataSet.GetRecord(Buffer: TRecordBuffer; GetMode: TGetMode;
 function TFixedFormatDataSet.GetRecord(Buffer: TRecordBuffer; GetMode: TGetMode;
   DoCheck: Boolean): TGetResult;
   DoCheck: Boolean): TGetResult;
+var
+  Accepted : Boolean;
 begin
 begin
   if (FData.Count <= FDataOffset) then
   if (FData.Count <= FDataOffset) then
     Result := grEOF
     Result := grEOF
   else
   else
   begin
   begin
-    Result := TxtGetRecord(Buffer, GetMode);
-    if Result = grOK then
-    begin
-      if (CalcFieldsSize > 0) then
-        GetCalcFields(Buffer);
-    end
-    else
-      if (Result = grError) and DoCheck then
+    Result := grOK;
+    repeat
+      Accepted := TRUE;
+      case GetMode of
+        gmNext:
+          if FCurRec >= FData.Count - 1  then
+            Result := grEOF
+          else
+            Inc(FCurRec);
+        gmPrior:
+          if FCurRec <= FDataOffset then
+            Result := grBOF
+          else
+            Dec(FCurRec);
+        gmCurrent:
+          if (FCurRec < FDataOffset) or (FCurRec >= FData.Count) then
+            Result := grError;
+      end;
+
+      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 CalcFieldsSize > 0 then GetCalcFields(Buffer);
+
+        if Filtered then
+        begin
+          Accepted := RecordFilter(Buffer);
+          if not Accepted and (GetMode = gmCurrent) then
+            Inc(FCurRec);
+        end;
+      end
+      else if (Result = grError) and DoCheck then
         DatabaseError('No Records');
         DatabaseError('No Records');
+    until (Result <> grOK) or Accepted;
   end;
   end;
 end;
 end;
 
 
 function TFixedFormatDataSet.GetRecordCount: Longint;
 function TFixedFormatDataSet.GetRecordCount: Longint;
 begin
 begin
   Result := FData.Count - FDataOffset;
   Result := FData.Count - FDataOffset;
+  if Result < 0 then Result := 0; // closed dataset
 end;
 end;
 
 
 function TFixedFormatDataSet.GetRecNo: Longint;
 function TFixedFormatDataSet.GetRecNo: Longint;
@@ -540,58 +572,16 @@ begin
   Result := RecBuf <> nil;
   Result := RecBuf <> nil;
 end;
 end;
 
 
-function TFixedFormatDataSet.TxtGetRecord(Buffer : TRecordBuffer; GetMode: TGetMode): TGetResult;
-var
-  Accepted : Boolean;
-begin
-  Result := grOK;
-  repeat
-    Accepted := TRUE;
-    case GetMode of
-      gmNext:
-        if FCurRec >= FData.Count - 1  then
-          Result := grEOF
-        else
-          Inc(FCurRec);
-      gmPrior:
-        if FCurRec <= FDataOffset then
-          Result := grBOF
-        else
-          Dec(FCurRec);
-      gmCurrent:
-        if (FCurRec < FDataOffset) or (FCurRec >= FData.Count) then
-          Result := grError;
-    end;
-    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);
-        if not Accepted and (GetMode = gmCurrent) then
-          Inc(FCurRec);
-      end;
-    end;
-  until Accepted;
-end;
-
-function TFixedFormatDataSet.RecordFilter(RecBuf: Pointer): Boolean;
+function TFixedFormatDataSet.RecordFilter(RecBuf: TRecordBuffer): Boolean;
 var
 var
-  Accept: Boolean;
   SaveState: TDataSetState;
   SaveState: TDataSetState;
 begin                          // Returns true if accepted in the filter
 begin                          // Returns true if accepted in the filter
   SaveState := SetTempState(dsFilter);
   SaveState := SetTempState(dsFilter);
   FFilterBuffer := RecBuf;
   FFilterBuffer := RecBuf;
-  Accept := TRUE;
-  if Accept and Assigned(OnFilterRecord) then
-    OnFilterRecord(Self, Accept);
+  Result := TRUE;
+  if Result and Assigned(OnFilterRecord) then
+    OnFilterRecord(Self, Result);
   RestoreState(SaveState);
   RestoreState(SaveState);
-  Result := Accept;
 end;
 end;
 
 
 function TFixedFormatDataSet.GetCanModify: boolean;
 function TFixedFormatDataSet.GetCanModify: boolean;

+ 2 - 0
packages/fcl-db/tests/tcsdfdata.pp

@@ -108,6 +108,7 @@ begin
   AssertEquals('RecNo', 1, TestDataset.RecNo);
   AssertEquals('RecNo', 1, TestDataset.RecNo);
   AssertEquals('RecordCount', 1, TestDataset.RecordCount);
   AssertEquals('RecordCount', 1, TestDataset.RecordCount);
   TestDataset.Close;
   TestDataset.Close;
+  AssertEquals('RecordCount after Close', 0, TestDataset.RecordCount);
 end;
 end;
 
 
 procedure Ttestsdfspecific.TestSingleLineNoHeader;
 procedure Ttestsdfspecific.TestSingleLineNoHeader;
@@ -138,6 +139,7 @@ begin
   AssertEquals('RecNo', 1, TestDataset.RecNo);
   AssertEquals('RecNo', 1, TestDataset.RecNo);
   AssertEquals('RecordCount', 1, TestDataset.RecordCount);
   AssertEquals('RecordCount', 1, TestDataset.RecordCount);
   TestDataset.Close;
   TestDataset.Close;
+  AssertEquals('RecordCount after Close', 0, TestDataset.RecordCount);
 end;
 end;
 
 
 procedure Ttestsdfspecific.TestOutput;
 procedure Ttestsdfspecific.TestOutput;