Author: senga
Date: 2006-01-31 11:24:59 -0500 (Tue, 31 Jan 2006)
New Revision: 56340

Modified:
   branches/mono-1-1-13/mcs/class/System.Data/System.Data/ChangeLog
   branches/mono-1-1-13/mcs/class/System.Data/System.Data/DataSet.cs
   branches/mono-1-1-13/mcs/class/System.Data/Test/ChangeLog
   branches/mono-1-1-13/mcs/class/System.Data/Test/System.Data/DataSetTest.cs
Log:
2006-01-31  Senganal  <[EMAIL PROTECTED]>
        
        * Test/DataSetTest.cs : Added testcase for #77411.
        * System.Data/DataSet.cs : Modified CopyRelations ()
                - Added code to copy ForeignKeyConstraints. Fixes #77411.



Modified: branches/mono-1-1-13/mcs/class/System.Data/System.Data/ChangeLog
===================================================================
--- branches/mono-1-1-13/mcs/class/System.Data/System.Data/ChangeLog    
2006-01-31 16:02:18 UTC (rev 56339)
+++ branches/mono-1-1-13/mcs/class/System.Data/System.Data/ChangeLog    
2006-01-31 16:24:59 UTC (rev 56340)
@@ -1,3 +1,8 @@
+2006-01-31  Senganal T  <[EMAIL PROTECTED]>
+
+       * DataSet.cs : Modified CopyRelations ()
+               - Added code to copy ForeignKeyConstraints. Fixes #77411.
+       
 2006-01-18 Boris Kirzner <[EMAIL PROTECTED]>
        * DataColumn.cs: added PropertyCchangedEvent handling.
 

Modified: branches/mono-1-1-13/mcs/class/System.Data/System.Data/DataSet.cs
===================================================================
--- branches/mono-1-1-13/mcs/class/System.Data/System.Data/DataSet.cs   
2006-01-31 16:02:18 UTC (rev 56339)
+++ branches/mono-1-1-13/mcs/class/System.Data/System.Data/DataSet.cs   
2006-01-31 16:24:59 UTC (rev 56340)
@@ -479,20 +479,30 @@
                                }
                                
                                DataRelation cRel = new DataRelation 
(MyRelation.RelationName, P_DC, C_DC);
-                               //cRel.ChildColumns = MyRelation.ChildColumns;
-                               //cRel.ChildTable = MyRelation.ChildTable;
-                               //cRel.ExtendedProperties = 
cRel.ExtendedProperties; 
-                               //cRel.Nested = MyRelation.Nested;
-                               //cRel.ParentColumns = MyRelation.ParentColumns;
-                               //cRel.ParentTable = MyRelation.ParentTable;
-                                                               
                                Copy.Relations.Add (cRel);
                        }
+                       
+                       // Foreign Key constraints are not cloned in 
DataTable.Clone
+                       // so, these constraints should be cloned when copying 
the relations.
+                       foreach (DataTable table in this.Tables) {
+                               foreach (Constraint c in table.Constraints) {
+                                       if (!(c is ForeignKeyConstraint) 
+                                               || 
Copy.Tables[table.TableName].Constraints.Contains (c.ConstraintName))
+                                               continue;
+                                       ForeignKeyConstraint fc = 
(ForeignKeyConstraint)c;
+                                       DataTable parentTable = Copy.Tables 
[fc.RelatedTable.TableName];
+                                       DataTable currTable = Copy.Tables 
[table.TableName];
+                                       DataColumn[] parentCols = new 
DataColumn [fc.RelatedColumns.Length];
+                                       DataColumn[] childCols = new DataColumn 
[fc.Columns.Length];
+                                       for (int j=0; j < parentCols.Length; 
++j)
+                                               parentCols [j] = 
parentTable.Columns[fc.RelatedColumns[j].ColumnName];
+                                       for (int j=0; j < childCols.Length; ++j)
+                                               childCols [j] = 
currTable.Columns[fc.Columns[j].ColumnName];
+                                       currTable.Constraints.Add 
(fc.ConstraintName, parentCols, childCols);
+                               }
+                       }
                }
 
-               
-
-
                public DataSet GetChanges ()
                {
                        return GetChanges (DataRowState.Added | 
DataRowState.Deleted | DataRowState.Modified);

Modified: branches/mono-1-1-13/mcs/class/System.Data/Test/ChangeLog
===================================================================
--- branches/mono-1-1-13/mcs/class/System.Data/Test/ChangeLog   2006-01-31 
16:02:18 UTC (rev 56339)
+++ branches/mono-1-1-13/mcs/class/System.Data/Test/ChangeLog   2006-01-31 
16:24:59 UTC (rev 56340)
@@ -1,3 +1,7 @@
+2006-01-31  Senganal  <[EMAIL PROTECTED]>
+       
+       * DataSetTest.cs : Added testcase for #77411.
+
 2006-01-02 Boris Kirzner <[EMAIL PROTECTED]>
        
        * System.Data.Test.vmwcsproj: added new tests to TARGET_JVM project 
file.

Modified: 
branches/mono-1-1-13/mcs/class/System.Data/Test/System.Data/DataSetTest.cs
===================================================================
--- branches/mono-1-1-13/mcs/class/System.Data/Test/System.Data/DataSetTest.cs  
2006-01-31 16:02:18 UTC (rev 56339)
+++ branches/mono-1-1-13/mcs/class/System.Data/Test/System.Data/DataSetTest.cs  
2006-01-31 16:24:59 UTC (rev 56340)
@@ -1285,6 +1285,78 @@
                }
 
                [Test]
+               public void CloneCopy_TestForeignKeyConstraints ()
+               {
+                       DataTable dirTable = new DataTable("Directories");
+
+                       DataColumn dir_UID = new DataColumn("UID", typeof(int));
+                       dir_UID.Unique = true;
+                       dir_UID.AllowDBNull = false;
+
+                       dirTable.Columns.Add(dir_UID);
+
+                       // Build a simple Files table
+                       DataTable fileTable = new DataTable("Files");
+
+                       DataColumn file_DirID = new DataColumn("DirectoryID", 
typeof(int));
+                       file_DirID.Unique = false;
+                       file_DirID.AllowDBNull = false;
+
+                       fileTable.Columns.Add(file_DirID);
+
+                       // Build the DataSet
+                       DataSet ds = new DataSet("TestDataset");
+                       ds.Tables.Add(dirTable);
+                       ds.Tables.Add(fileTable);
+
+                       // Add a foreign key constraint
+                       DataColumn[] parentColumns = new DataColumn[1];
+                       parentColumns[0] = 
ds.Tables["Directories"].Columns["UID"];
+
+                       DataColumn[] childColumns = new DataColumn[1];
+                       childColumns[0] = 
ds.Tables["Files"].Columns["DirectoryID"];
+
+                       ForeignKeyConstraint fk = new 
ForeignKeyConstraint("FK_Test", parentColumns, childColumns);
+                       ds.Tables["Files"].Constraints.Add(fk);         
+                       ds.EnforceConstraints = true;
+
+                       AssertEquals ("#1", 1, 
ds.Tables["Directories"].Constraints.Count);
+                       AssertEquals ("#2", 1, 
ds.Tables["Files"].Constraints.Count);
+
+                       // check clone works fine
+                       DataSet cloned_ds = ds.Clone ();
+                       AssertEquals ("#3", 1, 
cloned_ds.Tables["Directories"].Constraints.Count);
+                       AssertEquals ("#4", 1, 
cloned_ds.Tables["Files"].Constraints.Count);
+
+                       ForeignKeyConstraint clonedFk =  
(ForeignKeyConstraint)cloned_ds.Tables["Files"].Constraints[0];
+                       AssertEquals ("#5", "FK_Test", clonedFk.ConstraintName);
+                       AssertEquals ("#6", 1, clonedFk.Columns.Length);
+                       AssertEquals ("#7", "DirectoryID", 
clonedFk.Columns[0].ColumnName);
+
+                       UniqueConstraint clonedUc = 
(UniqueConstraint)cloned_ds.Tables ["Directories"].Constraints[0];
+                       UniqueConstraint origUc = (UniqueConstraint)ds.Tables 
["Directories"].Constraints[0];
+                       AssertEquals ("#8", origUc.ConstraintName, 
clonedUc.ConstraintName);
+                       AssertEquals ("#9", 1, clonedUc.Columns.Length);
+                       AssertEquals ("#10", "UID", 
clonedUc.Columns[0].ColumnName);
+
+                       // check copy works fine
+                       DataSet copy_ds = ds.Copy ();
+                       AssertEquals ("#11", 1, 
copy_ds.Tables["Directories"].Constraints.Count);
+                       AssertEquals ("#12", 1, 
copy_ds.Tables["Files"].Constraints.Count);
+
+                       ForeignKeyConstraint copyFk =  
(ForeignKeyConstraint)copy_ds.Tables["Files"].Constraints[0];
+                       AssertEquals ("#13", "FK_Test", copyFk.ConstraintName);
+                       AssertEquals ("#14", 1, copyFk.Columns.Length);
+                       AssertEquals ("#15", "DirectoryID", 
copyFk.Columns[0].ColumnName);
+
+                       UniqueConstraint copyUc = 
(UniqueConstraint)copy_ds.Tables ["Directories"].Constraints[0];
+                       origUc = (UniqueConstraint)ds.Tables 
["Directories"].Constraints[0];
+                       AssertEquals ("#16", origUc.ConstraintName, 
copyUc.ConstraintName);
+                       AssertEquals ("#17", 1, copyUc.Columns.Length);
+                       AssertEquals ("#18", "UID", 
copyUc.Columns[0].ColumnName);
+               }
+
+               [Test]
                public void WriteNestedTableXml ()
                {
                        string xml = @"<NewDataSet>

_______________________________________________
Mono-patches maillist  -  [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches

Reply via email to