Mercurial > pub > bltoolkit
comparison Source/Mapping/TextDataReader.cs @ 0:f990fcb411a9
Копия текущей версии из github
author | cin |
---|---|
date | Thu, 27 Mar 2014 21:46:09 +0400 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:f990fcb411a9 |
---|---|
1 using System; | |
2 using System.Data; | |
3 #if !SILVERLIGHT | |
4 using System.Data.Common; | |
5 #endif | |
6 using System.IO; | |
7 using System.Text; | |
8 | |
9 namespace BLToolkit.Mapping | |
10 { | |
11 public class TextDataReader : IDataReader | |
12 { | |
13 #region Constructors | |
14 | |
15 public TextDataReader(Stream stream) | |
16 : this(stream, Map.DefaultSchema) | |
17 { | |
18 } | |
19 | |
20 public TextDataReader(Stream stream, MappingSchema mappingSchema) | |
21 { | |
22 GC.SuppressFinalize(this); | |
23 | |
24 if (mappingSchema == null) throw new ArgumentNullException("mappingSchema"); | |
25 | |
26 _reader = new StreamReader(stream); | |
27 _mappingSchema = mappingSchema; | |
28 | |
29 ReadHeader(); | |
30 } | |
31 | |
32 #endregion | |
33 | |
34 #region Protected Members | |
35 | |
36 private readonly StreamReader _reader; | |
37 private readonly MappingSchema _mappingSchema; | |
38 private string _line = string.Empty; | |
39 private string[] _names = _empty; | |
40 private string[] _values = _empty; | |
41 private int _lineNumber = 0; | |
42 | |
43 private static readonly string[] _empty = new string[0]; | |
44 | |
45 private bool IsEof | |
46 { | |
47 get { return _line == null; } | |
48 } | |
49 | |
50 private bool ReadNextLine() | |
51 { | |
52 while (!IsEof) | |
53 { | |
54 _line = _reader.ReadLine(); | |
55 _lineNumber++; | |
56 | |
57 if (!string.IsNullOrEmpty(_line) && _line[0] == '*') | |
58 return true; | |
59 } | |
60 | |
61 return false; | |
62 } | |
63 | |
64 private void ReadHeader() | |
65 { | |
66 while (ReadNextLine()) | |
67 { | |
68 if (_line.StartsWith("*:")) | |
69 { | |
70 _names = _line.Substring(2).Split(':'); | |
71 _values = new string[_names.Length]; | |
72 | |
73 for (int i = 0; i < _names.Length; i++) | |
74 _names[i] = _names[i].Trim(); | |
75 } | |
76 else if (_line.StartsWith("**") || _line.StartsWith("*-")) | |
77 break; | |
78 } | |
79 } | |
80 | |
81 static string Encode(string value) | |
82 { | |
83 var arr = Convert.FromBase64String(value.Substring(1)); | |
84 | |
85 #if SILVERLIGHT | |
86 return new UnicodeEncoding(false, true).GetString(arr, 0, arr.Length); | |
87 #else | |
88 return Encoding.Unicode.GetString(arr); | |
89 #endif | |
90 } | |
91 | |
92 bool ReadRecord() | |
93 { | |
94 if (!IsEof) | |
95 { | |
96 if (_line.StartsWith("*-")) | |
97 return false; | |
98 | |
99 if (_line.StartsWith("**") && _line.Length > 3) | |
100 { | |
101 var values = _line.Substring(3).Split(_line[2]); | |
102 | |
103 for (var i = 0; i < _values.Length && i < values.Length; i++) | |
104 { | |
105 var value = values[i]; | |
106 | |
107 _values[i] = | |
108 value.Length == 0? null: | |
109 value[0] == '*'? value.Substring(1): | |
110 value[0] == '+'? Encode(value.Substring(1)) : value; | |
111 } | |
112 | |
113 ReadNextLine(); | |
114 | |
115 return true; | |
116 } | |
117 | |
118 throw new MappingException( | |
119 string.Format("Invalid data format in the line {0}.", _lineNumber)); | |
120 } | |
121 | |
122 return false; | |
123 } | |
124 | |
125 #endregion | |
126 | |
127 #region IDataReader Members | |
128 | |
129 public virtual void Close() | |
130 { | |
131 _line = null; | |
132 } | |
133 | |
134 public virtual int Depth | |
135 { | |
136 get { return 0; } | |
137 } | |
138 | |
139 public virtual Type GetFieldType(int index) | |
140 { | |
141 return typeof(string); | |
142 } | |
143 | |
144 public virtual string GetName(int index) | |
145 { | |
146 return _names[index]; | |
147 } | |
148 | |
149 #if !SILVERLIGHT | |
150 private DataTable _schemaTable; | |
151 | |
152 public virtual DataTable GetSchemaTable() | |
153 { | |
154 if (_schemaTable == null) | |
155 { | |
156 _schemaTable = new DataTable("SchemaTable"); | |
157 | |
158 _schemaTable.Columns.AddRange(new DataColumn[] | |
159 { | |
160 new DataColumn(SchemaTableColumn.ColumnName, typeof(string)), | |
161 new DataColumn(SchemaTableColumn.ColumnOrdinal, typeof(int)), | |
162 new DataColumn(SchemaTableColumn.ColumnSize, typeof(int)), | |
163 new DataColumn(SchemaTableColumn.NumericPrecision, typeof(short)), | |
164 new DataColumn(SchemaTableColumn.NumericScale, typeof(short)), | |
165 new DataColumn(SchemaTableColumn.DataType, typeof(Type)), | |
166 new DataColumn(SchemaTableColumn.NonVersionedProviderType, typeof(int)), | |
167 new DataColumn(SchemaTableColumn.ProviderType, typeof(int)), | |
168 new DataColumn(SchemaTableColumn.IsLong, typeof(bool)), | |
169 new DataColumn(SchemaTableColumn.AllowDBNull, typeof(bool)), | |
170 new DataColumn(SchemaTableColumn.IsUnique, typeof(bool)), | |
171 new DataColumn(SchemaTableColumn.IsKey, typeof(bool)), | |
172 new DataColumn(SchemaTableColumn.BaseSchemaName, typeof(string)), | |
173 new DataColumn(SchemaTableColumn.BaseTableName, typeof(string)), | |
174 new DataColumn(SchemaTableColumn.BaseColumnName, typeof(string)), | |
175 new DataColumn(SchemaTableColumn.IsAliased, typeof(bool)), | |
176 new DataColumn(SchemaTableColumn.IsExpression, typeof(bool)), | |
177 }); | |
178 | |
179 for (int i = 0; i < _names.Length; i++) | |
180 { | |
181 DataRow row = _schemaTable.NewRow(); | |
182 | |
183 row[SchemaTableColumn.ColumnName] = _names[i]; | |
184 row[SchemaTableColumn.ColumnOrdinal] = i; | |
185 row[SchemaTableColumn.ColumnSize] = (int)byte.MaxValue; | |
186 row[SchemaTableColumn.NumericPrecision] = (short)0; | |
187 row[SchemaTableColumn.NumericScale] = (short)0; | |
188 row[SchemaTableColumn.DataType] = typeof(string); | |
189 row[SchemaTableColumn.NonVersionedProviderType] = 1; | |
190 row[SchemaTableColumn.ProviderType] = 1; | |
191 row[SchemaTableColumn.IsLong] = false; | |
192 row[SchemaTableColumn.AllowDBNull] = true; | |
193 row[SchemaTableColumn.IsUnique] = false; | |
194 row[SchemaTableColumn.IsKey] = false; | |
195 row[SchemaTableColumn.BaseSchemaName] = string.Empty; | |
196 row[SchemaTableColumn.BaseTableName] = string.Empty; | |
197 row[SchemaTableColumn.BaseColumnName] = string.Empty; | |
198 row[SchemaTableColumn.IsAliased] = false; | |
199 row[SchemaTableColumn.IsExpression] = false; | |
200 | |
201 _schemaTable.Rows.Add(row); | |
202 } | |
203 } | |
204 | |
205 return _schemaTable; | |
206 } | |
207 | |
208 #endif | |
209 | |
210 public virtual int FieldCount | |
211 { | |
212 get { return _names.Length; } | |
213 } | |
214 | |
215 public virtual bool IsClosed | |
216 { | |
217 get { return IsEof; } | |
218 } | |
219 | |
220 public virtual bool NextResult() | |
221 { | |
222 ReadHeader(); | |
223 return !IsEof; | |
224 } | |
225 | |
226 public virtual bool Read() | |
227 { | |
228 return ReadRecord(); | |
229 } | |
230 | |
231 public virtual int RecordsAffected | |
232 { | |
233 get { return -1; } | |
234 } | |
235 | |
236 #endregion | |
237 | |
238 #region IDisposable Members | |
239 | |
240 public virtual void Dispose() | |
241 { | |
242 } | |
243 | |
244 #endregion | |
245 | |
246 #region IDataRecord Members | |
247 | |
248 public virtual bool GetBoolean(int i) | |
249 { | |
250 return _mappingSchema.ConvertToBoolean(_values[i]); | |
251 } | |
252 | |
253 public virtual byte GetByte(int i) | |
254 { | |
255 return _mappingSchema.ConvertToByte(_values[i]); | |
256 } | |
257 | |
258 public virtual long GetBytes(int i, long fieldOffset, byte[] buffer, int bufferoffset, int length) | |
259 { | |
260 throw new Exception("The method or operation is not implemented."); | |
261 } | |
262 | |
263 public virtual char GetChar(int i) | |
264 { | |
265 return _mappingSchema.ConvertToChar(_values[i]); | |
266 } | |
267 | |
268 public virtual long GetChars(int i, long fieldoffset, char[] buffer, int bufferoffset, int length) | |
269 { | |
270 throw new Exception("The method or operation is not implemented."); | |
271 } | |
272 | |
273 public virtual IDataReader GetData(int i) | |
274 { | |
275 throw new Exception("The method or operation is not implemented."); | |
276 } | |
277 | |
278 public virtual string GetDataTypeName(int i) | |
279 { | |
280 return typeof(string).FullName; | |
281 } | |
282 | |
283 public virtual DateTime GetDateTime(int i) | |
284 { | |
285 return _mappingSchema.ConvertToDateTime(_values[i]); | |
286 } | |
287 | |
288 public virtual DateTimeOffset GetDateTimeOffset(int i) | |
289 { | |
290 return _mappingSchema.ConvertToDateTimeOffset(_values[i]); | |
291 } | |
292 | |
293 public virtual decimal GetDecimal(int i) | |
294 { | |
295 return _mappingSchema.ConvertToDecimal(_values[i]); | |
296 } | |
297 | |
298 public virtual double GetDouble(int i) | |
299 { | |
300 return _mappingSchema.ConvertToDouble(_values[i]); | |
301 } | |
302 | |
303 public virtual float GetFloat(int i) | |
304 { | |
305 return _mappingSchema.ConvertToSingle(_values[i]); | |
306 } | |
307 | |
308 public virtual Guid GetGuid(int i) | |
309 { | |
310 return _mappingSchema.ConvertToGuid(_values[i]); | |
311 } | |
312 | |
313 public virtual short GetInt16(int i) | |
314 { | |
315 return _mappingSchema.ConvertToInt16(_values[i]); | |
316 } | |
317 | |
318 public virtual int GetInt32(int i) | |
319 { | |
320 return _mappingSchema.ConvertToInt32(_values[i]); | |
321 } | |
322 | |
323 public virtual long GetInt64(int i) | |
324 { | |
325 return _mappingSchema.ConvertToInt64(_values[i]); | |
326 } | |
327 | |
328 public virtual int GetOrdinal(string name) | |
329 { | |
330 for (int i = 0; i < _names.Length; i++) | |
331 if (_names[i] == name) | |
332 return i; | |
333 | |
334 return -1; | |
335 } | |
336 | |
337 public virtual string GetString(int i) | |
338 { | |
339 return _values[i]; | |
340 } | |
341 | |
342 public virtual object GetValue(int i) | |
343 { | |
344 return _values[i]; | |
345 } | |
346 | |
347 public virtual int GetValues(object[] values) | |
348 { | |
349 int n = Math.Min(values.Length, _values.Length); | |
350 | |
351 for (int i = 0; i < n; i++) | |
352 values[i] = _values[i]; | |
353 | |
354 return n; | |
355 } | |
356 | |
357 public virtual bool IsDBNull(int i) | |
358 { | |
359 return _values[i] == null; | |
360 } | |
361 | |
362 public virtual object this[string name] | |
363 { | |
364 get | |
365 { | |
366 for (int i = 0; i < _names.Length; i++) | |
367 if (_names[i] == name) | |
368 return _values[i]; | |
369 | |
370 throw new ArgumentException(string.Format("Invalid field name '{0}'", name)); | |
371 } | |
372 } | |
373 | |
374 public virtual object this[int i] | |
375 { | |
376 get { return _values[i]; } | |
377 } | |
378 | |
379 #endregion | |
380 } | |
381 } |