using System; using System.Collections.Generic; using System.Data; using System.Xml; namespace Xpace { public interface IConverter { object Get(ref Result res); } public class TextConverter : IConverter { public TextConverter() { _reader = new TextResultReader(); } public object Get(ref Result res) { _reader.read(ref res); return _reader.Get; } private TextResultReader _reader; } public class UInt64DoubleConverter : IConverter { public UInt64DoubleConverter() { _reader = new UInt64ResultReader(); } public object Get(ref Result res) { _reader.read(ref res); double val = _reader.getUInt64; return val; } private UInt64ResultReader _reader; } public class Int32DateDateTimeConverter : IConverter { public Int32DateDateTimeConverter() { _reader = new Int32ResultReader(); } public object Get(ref Result res) { _reader.read(ref res); Int32 val = _reader.getInt32; if (val == 0) return new DateTime(0); int y = val / 10000; int m = (val % 10000) / 100; int d = val % 100; return new DateTime(y, m, d); } private Int32ResultReader _reader; } public class Int32TimeDateTimeConverter : IConverter { public Int32TimeDateTimeConverter() { _reader = new Int32ResultReader(); } public object Get(ref Result res) { _reader.read(ref res); Int32 val = _reader.getInt32; int h = val / 10000; int m = (val % 10000) / 100; int s = val % 100; if (s >= 60) { ++m; s -= 60; } if (m >= 60) { ++h; m -= 60; } return new DateTime(1, 1, 1, h, m, s); } private Int32ResultReader _reader; } public class ResultTable : DataTable { public ResultTable(TableCursor tc) { _converters = new List(); for (uint col = 0; col < tc.columnCount; ++col) { string config = tc.getColumnConfig(col); XmlDocument doc = new XmlDocument(); doc.LoadXml(config); XmlElement node = doc["field"]; // todo - a type mapper string type = node.GetAttribute("type"); if (type == "text") { _converters.Add(new TextConverter()); Columns.Add(node.GetAttribute("name"), typeof(string)); } else if (type == "unsigned") { _converters.Add(new UInt64DoubleConverter()); Columns.Add(node.GetAttribute("name"), typeof(double)); } else if (type == "date") { _converters.Add(new Int32DateDateTimeConverter()); Columns.Add(node.GetAttribute("name"), typeof(DateTime)); } else if (type == "time") { _converters.Add(new Int32TimeDateTimeConverter()); Columns.Add(node.GetAttribute("name"), typeof(DateTime)); } else throw new UnknownDataTypeException(type, "Quotes"); } } public void set(Result res, uint maxRows) { Clear(); for (uint r = 0; r < Math.Min(res.Count, maxRows); ++r) { DataRow row = NewRow(); int col = 0; foreach (IConverter c in _converters) row[col++] = c.Get(ref res); Rows.Add(row); } } private List _converters; } }