Browse Source

fcl-db: bufdataset: add InternalInitFieldDefs for TBufDataset + test (TestFieldDefsUpdate); related also to rev.27021

git-svn-id: trunk@27023 -
lacak 11 years ago
parent
commit
62fdd81cc8
2 changed files with 35 additions and 17 deletions
  1. 23 17
      packages/fcl-db/src/base/bufdataset.pas
  2. 12 0
      packages/fcl-db/tests/testdbbasics.pas

+ 23 - 17
packages/fcl-db/src/base/bufdataset.pas

@@ -525,6 +525,7 @@ type
     function  GetCanModify: Boolean; override;
     function  GetCanModify: Boolean; override;
     function GetRecord(Buffer: TRecordBuffer; GetMode: TGetMode; DoCheck: Boolean): TGetResult; override;
     function GetRecord(Buffer: TRecordBuffer; GetMode: TGetMode; DoCheck: Boolean): TGetResult; override;
     procedure DoBeforeClose; override;
     procedure DoBeforeClose; override;
+    procedure InternalInitFieldDefs; override;
     procedure InternalOpen; override;
     procedure InternalOpen; override;
     procedure InternalClose; override;
     procedure InternalClose; override;
     function GetRecordSize: Word; override;
     function GetRecordSize: Word; override;
@@ -1185,22 +1186,20 @@ begin
     FillByte((Buffer+RecordSize)^,CalcFieldsSize,0);
     FillByte((Buffer+RecordSize)^,CalcFieldsSize,0);
 end;
 end;
 
 
+procedure TCustomBufDataset.InternalInitFieldDefs;
+begin
+  if FileName<>'' then
+    IntLoadFieldDefsFromFile;
+end;
+
 procedure TCustomBufDataset.InternalOpen;
 procedure TCustomBufDataset.InternalOpen;
 
 
 var IndexNr : integer;
 var IndexNr : integer;
     i : integer;
     i : integer;
 
 
 begin
 begin
-  if not Assigned(FDatasetReader) and (FileName<>'') then
-    begin
-    FFileStream := TFileStream.Create(FileName,fmOpenRead);
-    FDatasetReader := GetPacketReader(dfAny, FFileStream);
-    end;
-  if assigned(FDatasetReader) then
-    begin
-    FReadFromFile := True;
-    IntLoadFielddefsFromFile;
-    end;
+  if assigned(FDatasetReader) or (FileName<>'') then
+    IntLoadFieldDefsFromFile;
 
 
   // This checks if the dataset is actually created (by calling CreateDataset,
   // This checks if the dataset is actually created (by calling CreateDataset,
   // or reading from a stream in some other way implemented by a descendent)
   // or reading from a stream in some other way implemented by a descendent)
@@ -1244,6 +1243,13 @@ begin
   if assigned(FDatasetReader) then IntLoadRecordsFromFile;
   if assigned(FDatasetReader) then IntLoadRecordsFromFile;
 end;
 end;
 
 
+procedure TCustomBufDataset.DoBeforeClose;
+begin
+  inherited DoBeforeClose;
+  if FFileName<>'' then
+    SaveToFile(FFileName);
+end;
+
 procedure TCustomBufDataset.InternalClose;
 procedure TCustomBufDataset.InternalClose;
 
 
 var r  : integer;
 var r  : integer;
@@ -1707,13 +1713,6 @@ begin
     until Acceptable;
     until Acceptable;
 end;
 end;
 
 
-procedure TCustomBufDataset.DoBeforeClose;
-begin
-  inherited DoBeforeClose;
-  if FFileName<>'' then
-    SaveToFile(FFileName);
-end;
-
 function TCustomBufDataset.GetActiveRecordUpdateBuffer : boolean;
 function TCustomBufDataset.GetActiveRecordUpdateBuffer : boolean;
 
 
 var ABookmark : TBufBookmark;
 var ABookmark : TBufBookmark;
@@ -3016,6 +3015,13 @@ end;
 procedure TCustomBufDataset.IntLoadFieldDefsFromFile;
 procedure TCustomBufDataset.IntLoadFieldDefsFromFile;
 
 
 begin
 begin
+  FReadFromFile := True;
+  if not assigned(FDatasetReader) then
+    begin
+    FFileStream := TFileStream.Create(FileName, fmOpenRead);
+    FDatasetReader := GetPacketReader(dfAny, FFileStream);
+    end;
+
   FieldDefs.Clear;
   FieldDefs.Clear;
   FDatasetReader.LoadFieldDefs(FAutoIncValue);
   FDatasetReader.LoadFieldDefs(FAutoIncValue);
   if DefaultFields then
   if DefaultFields then

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

@@ -44,6 +44,7 @@ type
     procedure TestSupportMemoFields;
     procedure TestSupportMemoFields;
 
 
     procedure TestDoubleClose;
     procedure TestDoubleClose;
+    procedure TestFieldDefsUpdate;
     procedure TestCalculatedField;
     procedure TestCalculatedField;
     procedure TestAssignFieldftString;
     procedure TestAssignFieldftString;
     procedure TestAssignFieldftFixedChar;
     procedure TestAssignFieldftFixedChar;
@@ -2771,6 +2772,17 @@ begin
     end;
     end;
 end;
 end;
 
 
+procedure TTestDBBasics.TestFieldDefsUpdate;
+begin
+  // FieldDefs.Update is called also by Lazarus IDE Fields editor
+  with DBConnector.GetNDataset(0) do
+    begin
+    // call Update on closed unprepared dataset
+    FieldDefs.Update;
+    CheckEquals(2, FieldDefs.Count);
+    end;
+end;
+
 procedure TTestDBBasics.TestAssignFieldftString;
 procedure TTestDBBasics.TestAssignFieldftString;
 var AParam : TParam;
 var AParam : TParam;
     AField : TField;
     AField : TField;