* DataSet.cs :
[mono.git] / mcs / class / System.Data / System.Data / DataSet.cs
index 2bf8268c043699acf913f796776330902129e4d9..741c6a2b74738a50f467a028ca6b225e1cc1fc52 100644 (file)
@@ -81,11 +81,6 @@ namespace System.Data {
                                return caseSensitive;
                        } 
                        set {
-                               foreach (DataTable T in Tables) {
-                                       if (T.VirginCaseSensitive)
-                                               T.CaseSensitive = value;
-                               }
-
                                caseSensitive = value; 
                                if (!caseSensitive) {
                                        foreach (DataTable table in Tables) {
@@ -235,12 +230,12 @@ namespace System.Data {
                [DataSysDescription ("Indicates the XML uri namespace for the root element pointed at by this DataSet.")]
                [DefaultValue ("")]
                public string Namespace {
-                       [MonoTODO]
                        get { return _namespace; } 
-                       [MonoTODO]
                        set {
                                //TODO - trigger an event if this happens?
-                               _namespace = value;
+                                if (value != this._namespace)
+                                        RaisePropertyChanging ("Namespace");
+                               _namespace = value;
                        }
                }
 
@@ -248,11 +243,14 @@ namespace System.Data {
                [DataSysDescription ("Indicates the prefix of the namespace used for this DataSet.")]
                [DefaultValue ("")]
                public string Prefix {
-                       [MonoTODO]
                        get { return prefix; } 
-                       [MonoTODO]
                        set {
-                               //TODO - trigger an event if this happens?
+                              // Prefix cannot contain any special characters other than '_' and ':'
+                               for (int i = 0; i < value.Length; i++) {
+                                       if (!(Char.IsLetterOrDigit (value [i])) && (value [i] != '_') && (value [i] != ':'))
+                                               throw new DataException ("Prefix '" + value + "' is not valid, because it contains special characters.");
+                               }
+
 
                                if (value == null)
                                        value = string.Empty;
@@ -346,7 +344,6 @@ namespace System.Data {
                        return Copy;
                }
 
-               [MonoTODO]
                private void CopyProperties (DataSet Copy)
                {
                        Copy.CaseSensitive = CaseSensitive;
@@ -355,12 +352,17 @@ namespace System.Data {
                        //Copy.DefaultViewManager
                        //Copy.DesignMode
                        Copy.EnforceConstraints = EnforceConstraints;
-                       //Copy.ExtendedProperties 
-                       //Copy.HasErrors
-                       //Copy.Locale = Locale;
+                       if(ExtendedProperties.Count > 0) {
+                               //  Cannot copy extended properties directly as the property does not have a set accessor
+                Array tgtArray = Array.CreateInstance( typeof (object), ExtendedProperties.Count);
+                ExtendedProperties.Keys.CopyTo (tgtArray, 0);
+                for (int i=0; i < ExtendedProperties.Count; i++)
+                                       Copy.ExtendedProperties.Add (tgtArray.GetValue (i), ExtendedProperties[tgtArray.GetValue (i)]);
+                       }
+            Copy.Locale = Locale;
                        Copy.Namespace = Namespace;
                        Copy.Prefix = Prefix;                   
-                       //Copy.Site = Site;
+                       //Copy.Site = Site; // FIXME : Not sure of this.
 
                }
                
@@ -520,10 +522,11 @@ namespace System.Data {
                        return false;           
                }
 
-               [MonoTODO]
+               [MonoTODO ("Consider ignored namespace array")]
                public void InferXmlSchema (XmlReader reader, string[] nsArray)
                {
-                       throw new NotImplementedException ();
+                       XmlDataLoader Loader = new XmlDataLoader (this);
+                       Loader.LoadData (reader, XmlReadMode.InferSchema);
                }
 
                public void InferXmlSchema (Stream stream, string[] nsArray)
@@ -746,8 +749,12 @@ namespace System.Data {
 
                public void ReadXmlSchema (XmlReader reader)
                {
+#if true
+                       new XmlSchemaDataImporter (this, reader);
+#else
                        XmlSchemaMapper SchemaMapper = new XmlSchemaMapper (this);
                        SchemaMapper.Read (reader);
+#endif
                }
 
                public XmlReadMode ReadXml (Stream stream)
@@ -832,7 +839,6 @@ namespace System.Data {
                                        return mode;
                                }
                        }
-                       XmlSchemaMapper SchemaMapper = null;
                        // If schema, then read the first element as schema 
                        if (reader.LocalName == "schema" && reader.NamespaceURI == XmlSchema.Namespace) {
                                switch (mode) {
@@ -842,15 +848,22 @@ namespace System.Data {
                                        // (and break up read)
                                        return mode;
                                case XmlReadMode.Fragment:
-                                       SchemaMapper = new XmlSchemaMapper (this);
-                                       SchemaMapper.Read (reader);
+                                       ReadXmlSchema (reader);
                                        // (and continue to read)
                                        break;
+                               case XmlReadMode.Auto:
+                                       if (Tables.Count == 0) {
+                                               ReadXmlSchema (reader);
+                                               return XmlReadMode.ReadSchema;
+                                       } else {
+                                       // otherwise just ignore and return IgnoreSchema
+                                               reader.Skip ();
+                                               return XmlReadMode.IgnoreSchema;
+                                       }
                                default:
-                                       SchemaMapper = new XmlSchemaMapper (this);
-                                       SchemaMapper.Read (reader);
+                                       ReadXmlSchema (reader);
                                        // (and leave rest of the reader as is)
-                                       return XmlReadMode.ReadSchema;
+                                       return mode; // When DiffGram, return DiffGram
                                }
                        }
                        // Otherwise, read as dataset... but only when required.