Parcourir la source

* Fix bug #0030379: detect circular refences

git-svn-id: trunk@43143 -
michael il y a 5 ans
Parent
commit
7e9e0e1965
2 fichiers modifiés avec 15 ajouts et 2 suppressions
  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;
 
 
-Function TDataSource.IsLinkedTo(ADataSet: TDataSet): Boolean;
+Function TDataSource.IsLinkedTo(ADataset: TDataSet): Boolean;
+
+var
+  DS: TDataSource;
 
 begin
   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;
 
 
@@ -615,6 +626,8 @@ begin
     End;
   If ADataset<>Nil Then
     begin
+    if IsLinkedTo(aDataset) then
+      DatabaseError(SErrCircularDataSourceReferenceNotAllowed,Self);
     FDataSet:=ADataset;
     ADataset.RegisterDatasource(Self);
     ProcessEvent(deUpdateState,0);

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

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