Locale.cs removed
[mono.git] / mcs / class / System.Data / System.Data / XmlDataLoader.cs
1 //
2 // mcs/class/System.Data/System.Data/XmlDataLoader.cs
3 //
4 // Purpose: Loads XmlDocument to DataSet 
5 //
6 // class: XmlDataLoader
7 // assembly: System.Data.dll
8 // namespace: System.Data
9 //
10 // Author:
11 //     Ville Palo <vi64pa@koti.soon.fi>
12 //
13 // (c)copyright 2002 Ville Palo
14 //
15 // XmlDataLoader is included within the Mono Class Library.
16 //
17
18 using System;
19 using System.Data;
20 using System.Xml;
21 using System.Xml.XPath;
22 using System.Collections;
23 using System.Globalization;
24
25 namespace System.Data {
26
27         internal class XmlDataLoader
28         {
29         
30                 private DataSet DSet;
31                 Hashtable DiffGrRows = new Hashtable ();
32
33                 public XmlDataLoader (DataSet set) 
34                 {
35                         DSet = set;
36                 }
37
38                 public XmlReadMode LoadData (XmlReader reader, XmlReadMode mode)
39                 {
40                         XmlReadMode Result = XmlReadMode.Auto;
41
42                         switch (mode) {
43
44                                 case XmlReadMode.Fragment:
45                                         break;
46                                 case XmlReadMode.ReadSchema:
47                                         Result = XmlReadMode.ReadSchema;
48                                         ReadModeSchema (reader, false);
49                                         break;
50                                 case XmlReadMode.IgnoreSchema:
51                                         Result = XmlReadMode.IgnoreSchema;
52                                         ReadModeSchema (reader, true);
53                                         break;
54                                 case XmlReadMode.InferSchema:
55                                         Result = XmlReadMode.InferSchema;
56                                         ReadModeInferSchema (reader);
57                                         break;
58                                 default:
59                                         break;
60                         }
61
62                         return Result;
63                 }
64
65                 #region reading
66
67                 // XmlReadMode.InferSchema
68                 [MonoTODO]
69                 private void ReadModeInferSchema (XmlReader reader)
70                 {
71                         // root element is DataSets name
72                         reader.MoveToContent ();
73
74                         DSet.DataSetName = reader.LocalName;
75
76                         // And now comes tables
77                         while (reader.Read ()) {
78
79                                 // skip possible inline-schema
80                                 if (String.Compare (reader.LocalName, "schema", true) == 0 && reader.NodeType == XmlNodeType.Element) {
81                                         while (reader.Read () && (reader.NodeType != XmlNodeType.EndElement 
82                                                                   || String.Compare (reader.LocalName, "schema", true) != 0));
83                                 }
84
85
86                                 if (reader.NodeType == XmlNodeType.Element) {
87                                         
88                                         string datatablename = reader.LocalName;
89                                         DataTable table;
90                                         bool NewTable = false;
91
92                                         if (!DSet.Tables.Contains (datatablename)) {
93                                                 table = new DataTable (reader.LocalName);
94                                                 DSet.Tables.Add (table);
95                                                 NewTable = true;
96                                         }
97                                         else {
98                                                 table = DSet.Tables [datatablename];
99                                         }
100
101                                         Hashtable rowValue = new Hashtable ();
102
103                                         while (reader.Read () && (reader.NodeType != XmlNodeType.EndElement 
104                                                                   || reader.LocalName != datatablename))
105                                         {
106                                                 if (reader.NodeType == XmlNodeType.Element) {
107
108                                                         string dataColumnName = reader.LocalName;
109                                                         if (NewTable)
110                                                                 table.Columns.Add (dataColumnName);
111
112                                                         // FIXME: exception?
113                                                         if (!reader.Read ())
114                                                                 return;
115
116                                                         rowValue.Add (dataColumnName, reader.Value);
117                                                 }
118                                         }
119                                         
120                                         DataRow row = table.NewRow ();
121                                         
122                                         IDictionaryEnumerator enumerator = rowValue.GetEnumerator ();
123                                         while (enumerator.MoveNext ()) {
124                                                 row [enumerator.Key.ToString ()] = enumerator.Value.ToString ();
125                                         }
126
127                                         table.Rows.Add (row);
128                                 }
129                         }                       
130                 }
131
132                 // Read Xmldocument. XmlReadMode.ReadSchema and XmlReadMode.IgnoreSchema
133                 [MonoTODO]
134                 private void ReadModeSchema (XmlReader reader, bool IgnoreSchema)
135                 {
136                         /*\
137                          *  Reads any inline schema, but an exception is thrown 
138                          *  if any tables in the inline schema already exist in the DataSet.
139                         \*/
140
141                         reader.MoveToContent ();
142
143                         while (reader.Read ()) {
144
145                                 // FIXME: possible inline-schema should be readed here
146                                 if (String.Compare (reader.LocalName, "schema", true) == 0 && reader.NodeType == XmlNodeType.Element) {
147                                         if (!IgnoreSchema)
148                                                 DSet.ReadXmlSchema (reader);
149                                 }
150
151                                 // find table
152                                 if (reader.NodeType == XmlNodeType.Element && DSet.Tables.Contains (reader.LocalName)) {
153                                         
154                                         DataTable table = DSet.Tables [reader.LocalName];
155                                         DataRow row = table.NewRow ();
156
157                                         ReadColumns (reader, row, table, reader.LocalName);                                     
158
159                                         table.Rows.Add (row);
160                                 }
161                         }
162                 }
163
164                 #endregion // reading
165
166                 #region Private helper methods
167                 
168                 private void ReadColumns (XmlReader reader, DataRow row, DataTable table, string TableName)
169                 {
170                         do {
171                                 if (reader.NodeType == XmlNodeType.Element && 
172                                     table.Columns.Contains (reader.LocalName)) {
173                                         string columName = reader.LocalName;
174                                         reader.Read ();
175                                         row [columName] = reader.Value;
176                                                                 }
177                                 else {
178                                         reader.Read ();
179                                 }
180                                 
181                         } while (table.TableName != reader.LocalName 
182                                  || reader.NodeType != XmlNodeType.EndElement);
183                 }
184
185                 #endregion // Private helper methods
186         }
187 }