1 //------------------------------------------------------------------------------
2 // <copyright file="SQLSingleStorage.cs" company="Microsoft">
3 // Copyright (c) Microsoft Corporation. All rights reserved.
5 // <owner current="true" primary="true">[....]</owner>
6 // <owner current="true" primary="false">[....]</owner>
7 // <owner current="false" primary="false">[....]</owner>
8 //------------------------------------------------------------------------------
10 namespace System.Data.Common {
13 using System.Data.SqlTypes;
14 using System.Diagnostics;
15 using System.Globalization;
17 using System.Xml.Serialization;
18 using System.Collections;
20 internal sealed class SqlSingleStorage : DataStorage {
22 private SqlSingle[] values;
24 public SqlSingleStorage(DataColumn column)
25 : base(column, typeof(SqlSingle), SqlSingle.Null, SqlSingle.Null, StorageType.SqlSingle) {
28 override public Object Aggregate(int[] records, AggregateType kind) {
32 case AggregateType.Sum:
34 foreach (int record in records) {
37 checked { sum += values[record];}
45 case AggregateType.Mean:
46 SqlDouble meanSum = (SqlDouble) 0.0f;
48 foreach (int record in records) {
52 checked { meanSum += values[record].ToSqlDouble();}
58 checked {mean = (meanSum /(SqlDouble) meanCount).ToSqlSingle();}
63 case AggregateType.Var:
64 case AggregateType.StDev:
66 SqlDouble var = (SqlDouble)0;
67 SqlDouble prec = (SqlDouble)0;
68 SqlDouble dsum = (SqlDouble)0;
69 SqlDouble sqrsum = (SqlDouble)0;
71 foreach (int record in records) {
74 dsum += values[record].ToSqlDouble();
75 sqrsum += (values[record]).ToSqlDouble() * (values[record]).ToSqlDouble();
80 var = ((SqlDouble)count * sqrsum - (dsum * dsum));
81 prec = var / (dsum * dsum);
83 // we are dealing with the risk of a cancellation error
84 // double is guaranteed only for 15 digits so a difference
85 // with a result less than 1e-15 should be considered as zero
87 if ((prec < 1e-15) || (var <0))
90 var = var / (count * (count -1));
92 if (kind == AggregateType.StDev) {
93 return Math.Sqrt(var.Value);
99 case AggregateType.Min:
100 SqlSingle min = SqlSingle.MaxValue;
101 for (int i = 0; i < records.Length; i++) {
102 int record = records[i];
106 if ((SqlSingle.LessThan(values[record], min)).IsTrue)
107 min = values[record];
114 case AggregateType.Max:
115 SqlSingle max = SqlSingle.MinValue;
116 for (int i = 0; i < records.Length; i++) {
117 int record = records[i];
121 if ((SqlSingle.GreaterThan(values[record], max)).IsTrue)
122 max = values[record];
129 case AggregateType.First:
130 if (records.Length > 0) {
131 return values[records[0]];
135 case AggregateType.Count:
137 for (int i = 0; i < records.Length; i++) {
138 if (!IsNull(records[i]))
144 catch (OverflowException) {
145 throw ExprException.Overflow(typeof(SqlSingle));
147 throw ExceptionBuilder.AggregateException(kind, DataType);
150 override public int Compare(int recordNo1, int recordNo2) {
151 return values[recordNo1].CompareTo(values[recordNo2]);
154 override public int CompareValueTo(int recordNo, Object value) {
155 return values[recordNo].CompareTo((SqlSingle)value);
158 override public object ConvertValue(object value) {
160 return SqlConvert.ConvertToSqlSingle(value);
165 override public void Copy(int recordNo1, int recordNo2) {
166 values[recordNo2] = values[recordNo1];
169 override public Object Get(int record) {
170 return values[record];
173 override public bool IsNull(int record) {
174 return (values[record].IsNull);
177 override public void Set(int record, Object value) {
178 values[record] = SqlConvert.ConvertToSqlSingle(value);
181 override public void SetCapacity(int capacity) {
182 SqlSingle[] newValues = new SqlSingle[capacity];
183 if (null != values) {
184 Array.Copy(values, 0, newValues, 0, Math.Min(capacity, values.Length));
189 override public object ConvertXmlToObject(string s) {
190 SqlSingle newValue = new SqlSingle();
191 string tempStr =string.Concat("<col>", s, "</col>"); // this is done since you can give fragmet to reader, bug 98767
192 StringReader strReader = new StringReader(tempStr);
194 IXmlSerializable tmp = newValue;
196 using (XmlTextReader xmlTextReader = new XmlTextReader(strReader)) {
197 tmp.ReadXml(xmlTextReader);
199 return ((SqlSingle)tmp);
202 override public string ConvertObjectToXml(object value) {
203 Debug.Assert(!DataStorage.IsObjectNull(value), "we should have null here");
204 Debug.Assert((value.GetType() == typeof(SqlSingle)), "wrong input type");
206 StringWriter strwriter = new StringWriter(FormatProvider);
208 using (XmlTextWriter xmlTextWriter = new XmlTextWriter (strwriter)) {
209 ((IXmlSerializable)value).WriteXml(xmlTextWriter);
211 return (strwriter.ToString ());
214 override protected object GetEmptyStorage(int recordCount) {
215 return new SqlSingle[recordCount];
218 override protected void CopyValue(int record, object store, BitArray nullbits, int storeIndex) {
219 SqlSingle[] typedStore = (SqlSingle[]) store;
220 typedStore[storeIndex] = values[record];
221 nullbits.Set(storeIndex, IsNull(record));
224 override protected void SetStorage(object store, BitArray nullbits) {
225 values = (SqlSingle[]) store;
226 //SetNullStorage(nullbits);