2008-06-18 Atsushi Enomoto <atsushi@ximian.com>
authorAtsushi Eno <atsushieno@gmail.com>
Wed, 18 Jun 2008 04:09:46 +0000 (04:09 -0000)
committerAtsushi Eno <atsushieno@gmail.com>
Wed, 18 Jun 2008 04:09:46 +0000 (04:09 -0000)
* DataSet.cs : when InferSchema mode, ReadXml() should do "merging
  inference".
* XmlDataInferenceLoader.cs : fixed primary key processing in
  merging inference mode. Reuse existing one, instead of rejecting
  such a table.

* DataSetInferXmlSchemaTest.cs: correction in code comment.

svn path=/trunk/mcs/; revision=106084

mcs/class/System.Data/System.Data/ChangeLog
mcs/class/System.Data/System.Data/DataSet.cs
mcs/class/System.Data/System.Data/XmlDataInferenceLoader.cs
mcs/class/System.Data/Test/System.Data/ChangeLog
mcs/class/System.Data/Test/System.Data/DataSetInferXmlSchemaTest.cs

index 67b2ec15b9912f5ea895f3f9aa3ff581a481f87c..345da2a0cb09b9e1641f3133ce777d6b17c0c297 100644 (file)
@@ -1,3 +1,11 @@
+2008-06-18  Atsushi Enomoto  <atsushi@ximian.com>
+
+       * DataSet.cs : when InferSchema mode, ReadXml() should do "merging
+         inference".
+       * XmlDataInferenceLoader.cs : fixed primary key processing in
+         merging inference mode. Reuse existing one, instead of rejecting
+         such a table.
+
 2008-06-17  Atsushi Enomoto  <atsushi@ximian.com>
 
        * XmlSchemaWriter.cs, DataSet.cs, XmlTableWriter.cs, DataTable.cs,
index 9d3a67685e9b64dc92e24fd0ecc8ef71bac42af7..d1dda56463db65471e34e464d333bd1ebf709e5b 100644 (file)
@@ -1166,7 +1166,7 @@ namespace System.Data
                                retMode != XmlReadMode.ReadSchema &&\r
                                mode != XmlReadMode.IgnoreSchema &&\r
                                mode != XmlReadMode.Fragment &&\r
-                               Tables.Count == 0) {\r
+                               (Tables.Count == 0 || mode == XmlReadMode.InferSchema)) {\r
                                InferXmlSchema(doc, null);\r
                                if (mode == XmlReadMode.Auto)\r
                                        retMode = XmlReadMode.InferSchema;\r
index 1c35c87e8af67bdc8c354dd81405f6e87dab5253..fa52b7d743cedbe62c8fedcd960e3b4e0e62cea8 100644 (file)
@@ -207,19 +207,20 @@ namespace System.Data
 \r
                        int count = 0;                  \r
                        foreach (TableMapping map in tables) {\r
+                               string baseName = map.PrimaryKey != null ? map.PrimaryKey.ColumnName : map.Table.TableName + "_Id";\r
                                \r
                                // Make sure name of RK column is unique\r
-                               string rkName = map.Table.TableName + "_Id";\r
+                               string rkName = baseName;\r
                                if (map.ChildTables [map.Table.TableName] != null) {\r
-                                       rkName = map.Table.TableName + "_Id_" + count;\r
+                                       rkName = baseName + '_' + count;\r
                                        while (map.GetColumn (rkName) != null) {\r
                                                count++;\r
-                                               rkName = map.Table.TableName + "_Id_" + count;\r
+                                               rkName = baseName + '_' + count;\r
                                        }\r
                                }\r
                                \r
                                foreach (TableMapping ct in map.ChildTables) {\r
-                                       ct.ReferenceKey = GetMappedColumn (ct, rkName, map.Table.Prefix, map.Table.Namespace, MappingType.Hidden);\r
+                                       ct.ReferenceKey = GetMappedColumn (ct, rkName, map.Table.Prefix, map.Table.Namespace, MappingType.Hidden, map.PrimaryKey != null ? map.PrimaryKey.DataType : typeof (int));\r
                                }\r
                        }\r
 \r
@@ -320,11 +321,6 @@ namespace System.Data
 \r
                private void PopulatePrimaryKey (TableMapping table)\r
                {\r
-                       if (table.PrimaryKey != null) {\r
-                               if (table.PrimaryKey.ColumnName != table.Table.TableName + "_Id")\r
-                                       throw new DataException ("There is already a primary key column.");\r
-                               return;\r
-                       }\r
                        DataColumn col = new DataColumn (table.Table.TableName + "_Id");\r
                        col.ColumnMapping = MappingType.Hidden;\r
                        col.DataType = typeof (int);\r
@@ -335,15 +331,15 @@ namespace System.Data
                        table.PrimaryKey = col;\r
                }\r
 \r
-               private void PopulateRelationStructure (string parent, string child)\r
+               private void PopulateRelationStructure (string parent, string child, string pkeyColumn)\r
                {\r
                        if (relations [parent, child] != null)\r
                                return;\r
                        RelationStructure rs = new RelationStructure ();\r
                        rs.ParentTableName = parent;\r
                        rs.ChildTableName = child;\r
-                       rs.ParentColumnName = parent + "_Id";\r
-                       rs.ChildColumnName = parent + "_Id";\r
+                       rs.ParentColumnName = pkeyColumn;\r
+                       rs.ChildColumnName = pkeyColumn;\r
                        rs.CreateConstraint = true;\r
                        rs.IsNested = true;\r
                        relations.Add (rs);\r
@@ -365,7 +361,7 @@ namespace System.Data
                        if (table.SimpleContent != null)\r
                                return;\r
 \r
-                       GetMappedColumn (table, localName + "_Column", el.Prefix, el.NamespaceURI, MappingType.SimpleContent);\r
+                       GetMappedColumn (table, localName + "_Column", el.Prefix, el.NamespaceURI, MappingType.SimpleContent, null);\r
                }\r
 \r
                private void InferTableElement (TableMapping parentTable, XmlElement el)\r
@@ -400,7 +396,8 @@ namespace System.Data
                                        XmlHelper.Decode (attr.LocalName),\r
                                        attr.Prefix,\r
                                        attr.NamespaceURI,\r
-                                       MappingType.Attribute);\r
+                                       MappingType.Attribute,\r
+                                       null);\r
                        }\r
 \r
                        foreach (XmlNode n in el.ChildNodes) {\r
@@ -423,13 +420,15 @@ namespace System.Data
                                                InferColumnElement (table, cel);\r
                                                break;\r
                                        case ElementMappingType.Repeated:\r
-                                               PopulatePrimaryKey (table);\r
-                                               PopulateRelationStructure (table.Table.TableName, childLocalName);\r
+                                               if (table.PrimaryKey == null)\r
+                                                       PopulatePrimaryKey (table);\r
+                                               PopulateRelationStructure (table.Table.TableName, childLocalName, table.PrimaryKey.ColumnName);\r
                                                InferRepeatedElement (table, cel);\r
                                                break;\r
                                        case ElementMappingType.Complex:\r
-                                               PopulatePrimaryKey (table);\r
-                                               PopulateRelationStructure (table.Table.TableName, childLocalName);\r
+                                               if (table.PrimaryKey == null)\r
+                                                       PopulatePrimaryKey (table);\r
+                                               PopulateRelationStructure (table.Table.TableName, childLocalName, table.PrimaryKey.ColumnName);\r
                                                InferTableElement (table, cel);\r
                                                break;\r
                                        }\r
@@ -440,7 +439,7 @@ namespace System.Data
                        // Attributes + !Children + Text = SimpleContent\r
                        if (table.SimpleContent == null // no need to create\r
                                && !hasChildElements && hasText && (hasAttributes || isElementRepeated)) {\r
-                               GetMappedColumn (table, table.Table.TableName + "_Text", String.Empty, String.Empty, MappingType.SimpleContent);\r
+                               GetMappedColumn (table, table.Table.TableName + "_Text", String.Empty, String.Empty, MappingType.SimpleContent, null);\r
                        }\r
                }\r
 \r
@@ -469,7 +468,7 @@ namespace System.Data
                        return map;\r
                }\r
 \r
-               private DataColumn GetMappedColumn (TableMapping table, string name, string prefix, string ns, MappingType type)\r
+               private DataColumn GetMappedColumn (TableMapping table, string name, string prefix, string ns, MappingType type, Type optColType)\r
                {\r
                        DataColumn col = table.GetColumn (name);\r
                        // Infer schema\r
@@ -490,7 +489,7 @@ namespace System.Data
                                        break;\r
                                case MappingType.Hidden:\r
                                        // To generate parent key\r
-                                       col.DataType = typeof (int);\r
+                                       col.DataType = optColType;\r
                                        table.ReferenceKey = col;\r
                                        break;\r
                                }\r
index 3d7cd18f71bbccaaa03ad997311e3d67cdc17f07..e7cc5dfd2f58e937b5c8707373f22a0988389679 100644 (file)
@@ -1,3 +1,7 @@
+2008-06-18  Atsushi Enomoto  <atsushi@ximian.com>
+
+       * DataSetInferXmlSchemaTest.cs: correction in code comment.
+
 2008-06-17  Atsushi Enomoto  <atsushi@ximian.com>
 
        * TestFile3.xml, TestFile5.xml : they do not match what should be
index fbbcf38e34c74205d37a783cafe286333ee361b6..204a6ee9a7105313275a6024db49119859495925 100644 (file)
@@ -482,7 +482,7 @@ namespace MonoTests.System.Data
                [ExpectedException (typeof (ConstraintException))]
                public void ConflictExistingPrimaryKey ()
                {
-                       // The 'col' DataTable tries to create another primary key (and fails)
+                       // <wrong>The 'col' DataTable tries to create another primary key (and fails)</wrong> The data violates key constraint.
                        DataSet ds = new DataSet ();
                        ds.Tables.Add (new DataTable ("table"));
                        DataColumn c = new DataColumn ("pk");