[genmdesc] Fixed generator to allow instructions lengths equal to 0.
[mono.git] / mcs / class / System.Data / System.Data / XmlDataInferenceLoader.cs
index 1c35c87e8af67bdc8c354dd81405f6e87dab5253..03e2737d127a7ebf398f46a9ce9a9472cb2eddee 100644 (file)
@@ -78,9 +78,7 @@ namespace System.Data
                public DataColumn SimpleContent;\r
                public DataColumn PrimaryKey;\r
                public DataColumn ReferenceKey;\r
-#if NET_2_0\r
                public int lastElementIndex = -1;\r
-#endif\r
 \r
                // Parent TableMapping\r
                public TableMapping ParentTable;\r
@@ -207,19 +205,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
@@ -287,9 +286,7 @@ namespace System.Data
                        if (col != null) {\r
                                if (col.ColumnMapping != MappingType.Element)\r
                                        throw new DataException (String.Format ("Column {0} is already mapped to {1}.", localName, col.ColumnMapping));\r
-#if NET_2_0\r
                                table.lastElementIndex = table.Elements.IndexOf (col);\r
-#endif\r
                                return;\r
                        }\r
                        if (table.ChildTables [localName] != null)\r
@@ -301,11 +298,7 @@ namespace System.Data
                        col = new DataColumn (localName, typeof (string));\r
                        col.Namespace = el.NamespaceURI;\r
                        col.Prefix = el.Prefix;\r
-#if NET_2_0\r
                        table.Elements.Insert (++table.lastElementIndex, col);\r
-#else\r
-                       table.Elements.Add (col);\r
-#endif\r
                }\r
 \r
                private void CheckExtraneousElementColumn (TableMapping parentTable, XmlElement el)\r
@@ -320,11 +313,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 +323,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 +353,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
@@ -386,9 +374,7 @@ namespace System.Data
 \r
                        foreach (XmlAttribute attr in el.Attributes) {\r
                                if (attr.NamespaceURI == XmlConstants.XmlnsNS\r
-#if NET_2_0\r
                                        || attr.NamespaceURI == XmlConstants.XmlNS\r
-#endif\r
                                        )\r
                                        continue;\r
                                if (ignoredNamespaces != null &&\r
@@ -396,11 +382,12 @@ namespace System.Data
                                        continue;\r
 \r
                                hasAttributes = true;\r
-                               DataColumn col = GetMappedColumn (table,\r
+                               GetMappedColumn (table,\r
                                        XmlHelper.Decode (attr.LocalName),\r
                                        attr.Prefix,\r
-                                       attr.NamespaceURI,\r
-                                       MappingType.Attribute);\r
+                                       attr.NamespaceURI,\r
+                                       MappingType.Attribute,\r
+                                       null); \r
                        }\r
 \r
                        foreach (XmlNode n in el.ChildNodes) {\r
@@ -423,13 +410,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 +429,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 +458,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 +479,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
@@ -528,9 +517,7 @@ namespace System.Data
 \r
                        foreach (XmlAttribute attr in el.Attributes) {\r
                                if (attr.NamespaceURI == XmlConstants.XmlnsNS \r
-#if NET_2_0\r
                                        || attr.NamespaceURI == XmlConstants.XmlNS\r
-#endif\r
                                        )\r
                                        continue;\r
                                if (ignoredNamespaces != null && ignoredNamespaces.Contains (attr.NamespaceURI))\r
@@ -571,9 +558,7 @@ namespace System.Data
                {\r
                        foreach (XmlAttribute attr in top.Attributes) {\r
                                if (attr.NamespaceURI == XmlConstants.XmlnsNS\r
-#if NET_2_0\r
                                        || attr.NamespaceURI == XmlConstants.XmlNS\r
-#endif\r
                                        )\r
                                        continue;\r
                                if (ignoredNamespaces != null &&\r
@@ -598,13 +583,12 @@ namespace System.Data
                // Returns if it "might" be a column element (this method is\r
                // called per child element, thus it might still consist of\r
                // table, since it might be repeated).\r
+               /*\r
                private bool IsPossibleColumnElement (XmlElement el)\r
                {\r
                        foreach (XmlAttribute attr in el.Attributes) {\r
                                if (attr.NamespaceURI == XmlConstants.XmlnsNS\r
-#if NET_2_0\r
                                        || attr.NamespaceURI == XmlConstants.XmlNS\r
-#endif\r
                                        )\r
                                        continue;\r
                                return false;\r
@@ -614,6 +598,7 @@ namespace System.Data
                                        return false;\r
                        return true;\r
                }\r
+               */\r
        }\r
 }\r
 \r