* roottypes.cs: Rename from tree.cs.
[mono.git] / mcs / class / System.Data / System.Data / XmlDiffLoader.cs
index 36eff7ff920a62540f2645c899900eb5ccd0209c..45efcb97dfa4d23521c11e560e082b6c46ab88ee 100644 (file)
@@ -39,6 +39,7 @@
 using System;
 using System.Data;
 using System.Xml;
+using System.Xml.Schema;
 using System.Xml.XPath;
 using System.Collections;
 using System.Globalization;
@@ -117,7 +118,7 @@ namespace System.Data {
                private void LoadCurrent (XmlReader reader) 
                {
                        if (reader.IsEmptyElement) {
-                               reader.Skip ();
+                               reader.Skip();
                                return;
                        }
                        reader.ReadStartElement ();             // Dataset root
@@ -211,8 +212,48 @@ namespace System.Data {
                        reader.ReadEndElement ();
                }
 
-               private void LoadColumns (DataTable Table, DataRow Row, XmlReader reader, DataRowVersion loadType) 
+               private void LoadColumns (DataTable Table, DataRow Row, 
+                       XmlReader reader, DataRowVersion loadType)
+               {
+                       // attributes
+                       LoadColumnAttributes (Table, Row, reader, loadType);
+                       LoadColumnChildren (Table, Row, reader, loadType);
+               }
+
+               private void LoadColumnAttributes (DataTable Table, DataRow Row,
+                       XmlReader reader, DataRowVersion loadType)
+               {
+                       if (!reader.HasAttributes // this check will be faster
+                               || !reader.MoveToFirstAttribute ())
+                               return;
+                       do {
+                               switch (reader.NamespaceURI) {
+                               case XmlConstants.XmlnsNS:
+                               case XmlConstants.DiffgrNamespace:
+                               case XmlConstants.MsdataNamespace:
+                               case XmlConstants.MspropNamespace:
+                               case XmlSchema.Namespace:
+                                       continue;
+                               }
+                               DataColumn c = Table.Columns [reader.LocalName];
+                               if (c == null ||
+                                       c.ColumnMapping != MappingType.Attribute)                                       continue;
+                               if (c.Namespace == null && reader.NamespaceURI == String.Empty ||
+                                       c.Namespace == reader.NamespaceURI) {
+                                       object data = XmlDataLoader.StringToObject (c.DataType, reader.Value);
+                                       if (loadType == DataRowVersion.Current)
+                                               Row [c] = data;
+                                       else
+                                               Row.SetOriginalValue (c.ColumnName, data);
+                               } // otherwise just ignore as well as unknown elements.
+                       } while (reader.MoveToNextAttribute ());
+                       reader.MoveToElement ();
+               }
+
+               private void LoadColumnChildren (DataTable Table, DataRow Row,
+                       XmlReader reader, DataRowVersion loadType) 
                {
+                       // children
                        if (reader.IsEmptyElement) {
                                reader.Skip ();
                                return;
@@ -241,7 +282,8 @@ namespace System.Data {
                                                        LoadBeforeTable (t, reader);
                                                else if (loadType == DataRowVersion.Current)
                                                        LoadCurrentTable (t, reader);
-                                       }
+                                       } else
+                                               reader.Skip ();
                                }
                        }