Browse Source

* Fixed accessing TCustomBufDataset.IndexFieldNames from a new instance (bug 16695 + test)
* Fixed problems when closing a dataset that was opened using the FileName property, when the FileName property was cleared in between

git-svn-id: trunk@15409 -

joost 15 years ago
parent
commit
73bfdcf8b8
2 changed files with 14 additions and 2 deletions
  1. 5 2
      packages/fcl-db/src/base/bufdataset.pas
  2. 9 0
      packages/fcl-db/tests/testdbbasics.pas

+ 5 - 2
packages/fcl-db/src/base/bufdataset.pas

@@ -396,6 +396,7 @@ type
   TCustomBufDataset = class(TDBDataSet)
   private
     FFileName: string;
+    FReadFromFile   : boolean;
     FFileStream     : TFileStream;
     FDatasetReader  : TDataPacketReader;
     FIndexes        : array of TBufIndex;
@@ -1061,6 +1062,7 @@ begin
     begin
     FFileStream := TFileStream.Create(FileName,fmOpenRead);
     FDatasetReader := TFpcBinaryDatapacketReader.Create(FFileStream);
+    FReadFromFile := True;
     end;
   if assigned(FDatasetReader) then IntLoadFielddefsFromFile;
   CalcRecordSize;
@@ -1132,6 +1134,7 @@ begin
   SetLength(FFieldBufPositions,0);
 
   if assigned(FParser) then FreeAndNil(FParser);
+  FReadFromFile:=false;
 end;
 
 procedure TCustomBufDataset.InternalFirst;
@@ -2195,7 +2198,7 @@ end;
 
 function TCustomBufDataset.GetIndexFieldNames: String;
 begin
-  if FCurrentIndex<>FIndexes[1] then
+  if (FIndexesCount=0) or (FCurrentIndex<>FIndexes[1]) then
     result := ''
   else
     result := FCurrentIndex.FieldsName;
@@ -2865,7 +2868,7 @@ end;
 
 function TCustomBufDataset.IsReadFromPacket: Boolean;
 begin
-  Result := (FDatasetReader<>nil) or (FFileName<>'');
+  Result := (FDatasetReader<>nil) or (FFileName<>'') or FReadFromFile;
 end;
 
 procedure TCustomBufDataset.ParseFilter(const AFilter: string);

+ 9 - 0
packages/fcl-db/tests/testdbbasics.pas

@@ -28,6 +28,7 @@ type
     procedure SetUp; override;
     procedure TearDown; override;
   published
+    procedure TestClosedIndexFieldNames; // bug 16695
     procedure TestFileNameProperty;
     procedure TestClientDatasetAsMemDataset;
     procedure TestCancelUpdDelete1;
@@ -536,6 +537,14 @@ begin
   DBConnector.StopTest;
 end;
 
+procedure TTestDBBasics.TestClosedIndexFieldNames;
+var s : string;
+    bufds: TCustomBufDataset;
+begin
+  bufds := DBConnector.GetNDataset(5) as TCustomBufDataset;
+  s := bufds.IndexFieldNames;
+end;
+
 procedure TTestDBBasics.TestCanModifySpecialFields;
 var ds    : TDataset;
     lds   : TDataset;