1 //------------------------------------------------------------------------------
2 // <copyright file="StringStorage.cs" company="Microsoft">
3 // Copyright (c) Microsoft Corporation. All rights reserved.
5 // <owner current="true" primary="true">Microsoft</owner>
6 // <owner current="true" primary="false">Microsoft</owner>
7 // <owner current="false" primary="false">Microsoft</owner>
8 //------------------------------------------------------------------------------
10 namespace System.Data.Common {
12 using System.Diagnostics;
13 using System.Globalization;
14 using System.Data.SqlTypes;
15 using System.Collections;
17 // The string storage does not use BitArrays in DataStorage
18 internal sealed class StringStorage : DataStorage {
20 private String[] values;
22 public StringStorage(DataColumn column)
23 : base(column, typeof(String), String.Empty, StorageType.String) {
26 override public Object Aggregate(int[] recordNos, AggregateType kind) {
29 case AggregateType.Min:
31 for (i = 0; i < recordNos.Length; i++) {
32 if (IsNull(recordNos[i]))
38 for (i = i+1; i < recordNos.Length; i++) {
39 if (IsNull(recordNos[i]))
41 if (Compare(min, recordNos[i]) > 0) {
49 case AggregateType.Max:
51 for (i = 0; i < recordNos.Length; i++) {
52 if (IsNull(recordNos[i]))
58 for (i = i+1; i < recordNos.Length; i++) {
59 if (Compare(max, recordNos[i]) < 0) {
67 case AggregateType.Count:
69 for (i = 0; i < recordNos.Length; i++) {
70 Object value = values[recordNos[i]];
76 throw ExceptionBuilder.AggregateException(kind, DataType);
79 override public int Compare(int recordNo1, int recordNo2) {
80 string valueNo1 = values[recordNo1];
81 string valueNo2 = values[recordNo2];
83 if ((Object)valueNo1 == (Object)valueNo2)
91 return Table.Compare(valueNo1, valueNo2);
94 override public int CompareValueTo(int recordNo, Object value) {
95 Debug.Assert(recordNo != -1, "Invalid (-1) parameter: 'recordNo'");
96 Debug.Assert(null != value, "null value");
97 string valueNo1 = values[recordNo];
99 if (null == valueNo1) {
100 if (NullValue == value) {
107 else if (NullValue == value) {
110 return Table.Compare(valueNo1, (string)value);
113 public override object ConvertValue(object value) {
114 if (NullValue != value) {
116 value = value.ToString();
125 override public void Copy(int recordNo1, int recordNo2) {
126 values[recordNo2] = values[recordNo1];
129 override public Object Get(int recordNo) {
130 String value = values[recordNo];
138 override public int GetStringLength(int record) {
139 string value = values[record];
140 return ((null != value) ? value.Length : 0);
143 override public bool IsNull(int record) {
144 return (null == values[record]);
147 override public void Set(int record, Object value) {
148 System.Diagnostics.Debug.Assert(null != value, "null value");
149 if (NullValue == value) {
150 values[record] = null;
153 values[record] = value.ToString();
157 override public void SetCapacity(int capacity) {
158 string[] newValues = new string[capacity];
159 if (values != null) {
160 Array.Copy(values, 0, newValues, 0, Math.Min(capacity, values.Length));
165 override public object ConvertXmlToObject(string s) {
169 override public string ConvertObjectToXml(object value) {
170 return (string)value;
173 override protected object GetEmptyStorage(int recordCount) {
174 return new String[recordCount];
177 override protected void CopyValue(int record, object store, BitArray nullbits, int storeIndex) {
178 String[] typedStore = (String[]) store;
179 typedStore[storeIndex] = values[record];
180 nullbits.Set(storeIndex, IsNull(record));
183 override protected void SetStorage(object store, BitArray nullbits) {
184 values = (String[]) store;
185 // SetNullStorage(nullbits);