Browse Source

* Merging revisions 43143 from trunk:
------------------------------------------------------------------------
r43143 | michael | 2019-10-06 15:11:17 +0200 (Sun, 06 Oct 2019) | 1 line

* Fix bug #0030379: detect circular refences
------------------------------------------------------------------------

git-svn-id: branches/fixes_3_2@43248 -

michael 5 years ago
parent
commit
e3a1461bd9
2 changed files with 15 additions and 2 deletions
  1. 14 1
      packages/fcl-db/src/base/datasource.inc
  2. 1 1
      packages/fcl-db/src/base/db.pas

+ 14 - 1
packages/fcl-db/src/base/datasource.inc

@@ -559,10 +559,21 @@ begin
 end;
 end;
 
 
 
 
-Function TDataSource.IsLinkedTo(ADataSet: TDataSet): Boolean;
+Function TDataSource.IsLinkedTo(ADataset: TDataSet): Boolean;
+
+var
+  DS: TDataSource;
 
 
 begin
 begin
   Result:=False;
   Result:=False;
+  Repeat
+    DS:=aDataset.GetDataSource;
+    Result:=(DS=Self);
+    if Assigned(DS) then
+      aDataSet := DS.DataSet
+    else
+      aDataSet := Nil;
+  Until Result or (aDataset=Nil)
 end;
 end;
 
 
 
 
@@ -615,6 +626,8 @@ begin
     End;
     End;
   If ADataset<>Nil Then
   If ADataset<>Nil Then
     begin
     begin
+    if IsLinkedTo(aDataset) then
+      DatabaseError(SErrCircularDataSourceReferenceNotAllowed,Self);
     FDataSet:=ADataset;
     FDataSet:=ADataset;
     ADataset.RegisterDatasource(Self);
     ADataset.RegisterDatasource(Self);
     ProcessEvent(deUpdateState,0);
     ProcessEvent(deUpdateState,0);

+ 1 - 1
packages/fcl-db/src/base/db.pas

@@ -1921,7 +1921,7 @@ type
     constructor Create(AOwner: TComponent); override;
     constructor Create(AOwner: TComponent); override;
     destructor Destroy; override;
     destructor Destroy; override;
     procedure Edit;
     procedure Edit;
-    function IsLinkedTo(ADataSet: TDataSet): Boolean;
+    function IsLinkedTo(ADataset: TDataSet): Boolean;
     property State: TDataSetState read FState;
     property State: TDataSetState read FState;
   published
   published
     property AutoEdit: Boolean read FAutoEdit write FAutoEdit default True;
     property AutoEdit: Boolean read FAutoEdit write FAutoEdit default True;