1 //------------------------------------------------------------------------------ 2 // <copyright file="BooleanStorage.cs" company="Microsoft"> 3 // Copyright (c) Microsoft Corporation. All rights reserved. 4 // </copyright> 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 //------------------------------------------------------------------------------ 9 10 namespace System.Data.Common { 11 using System; 12 using System.Xml; 13 using System.Data.SqlTypes; 14 using System.Collections; 15 16 internal sealed class BooleanStorage : DataStorage { 17 18 private const Boolean defaultValue = false; 19 20 private Boolean[] values; 21 BooleanStorage(DataColumn column)22 internal BooleanStorage(DataColumn column) 23 : base(column, typeof(Boolean), defaultValue, StorageType.Boolean) { 24 } 25 Aggregate(int[] records, AggregateType kind)26 override public Object Aggregate(int[] records, AggregateType kind) { 27 bool hasData = false; 28 try { 29 switch (kind) { 30 case AggregateType.Min: 31 Boolean min = true; 32 for (int i = 0; i < records.Length; i++) { 33 int record = records[i]; 34 if (IsNull(record)) 35 continue; 36 min=values[record] && min; 37 hasData = true; 38 } 39 if (hasData) { 40 return min; 41 } 42 return NullValue; 43 44 case AggregateType.Max: 45 Boolean max = false; 46 for (int i = 0; i < records.Length; i++) { 47 int record = records[i]; 48 if (IsNull(record)) 49 continue; 50 max=values[record] || max; 51 hasData = true; 52 } 53 if (hasData) { 54 return max; 55 } 56 return NullValue; 57 58 case AggregateType.First: 59 if (records.Length > 0) { 60 return values[records[0]]; 61 } 62 return null; 63 64 case AggregateType.Count: 65 return base.Aggregate(records, kind); 66 67 } 68 } 69 catch (OverflowException) { 70 throw ExprException.Overflow(typeof(Boolean)); 71 } 72 throw ExceptionBuilder.AggregateException(kind, DataType); 73 } 74 Compare(int recordNo1, int recordNo2)75 override public int Compare(int recordNo1, int recordNo2) { 76 Boolean valueNo1 = values[recordNo1]; 77 Boolean valueNo2 = values[recordNo2]; 78 79 if (valueNo1 == defaultValue || valueNo2 == defaultValue) { 80 int bitCheck = CompareBits(recordNo1, recordNo2); 81 if (0 != bitCheck) 82 return bitCheck; 83 } 84 return valueNo1.CompareTo(valueNo2); 85 //return ((valueNo1 == valueNo2) ? 0 : ((false == valueNo1) ? -1 : 1)); // similar to Boolean.CompareTo(Boolean) 86 } 87 CompareValueTo(int recordNo, object value)88 public override int CompareValueTo(int recordNo, object value) { 89 System.Diagnostics.Debug.Assert(0 <= recordNo, "Invalid record"); 90 System.Diagnostics.Debug.Assert(null != value, "null value"); 91 92 if (NullValue == value) { 93 if (IsNull(recordNo)) { 94 return 0; 95 } 96 return 1; 97 } 98 99 Boolean valueNo1 = values[recordNo]; 100 if ((defaultValue == valueNo1) && IsNull(recordNo)) { 101 return -1; 102 } 103 return valueNo1.CompareTo((Boolean)value); 104 //return ((valueNo1 == valueNo2) ? 0 : ((false == valueNo1) ? -1 : 1)); // similar to Boolean.CompareTo(Boolean) 105 } 106 ConvertValue(object value)107 public override object ConvertValue(object value) { 108 if (NullValue != value) { 109 if (null != value) { 110 value = ((IConvertible)value).ToBoolean(FormatProvider); 111 } 112 else { 113 value = NullValue; 114 } 115 } 116 return value; 117 } 118 Copy(int recordNo1, int recordNo2)119 override public void Copy(int recordNo1, int recordNo2) { 120 CopyBits(recordNo1, recordNo2); 121 values[recordNo2] = values[recordNo1]; 122 } 123 Get(int record)124 override public Object Get(int record) { 125 Boolean value = values[record]; 126 if (value != defaultValue) { 127 return value; 128 } 129 return GetBits(record); 130 } 131 Set(int record, Object value)132 override public void Set(int record, Object value) { 133 System.Diagnostics.Debug.Assert(null != value, "null value"); 134 if (NullValue == value) { 135 values[record] = defaultValue; 136 SetNullBit(record, true); 137 } 138 else { 139 values[record] = ((IConvertible)value).ToBoolean(FormatProvider); 140 SetNullBit(record, false); 141 } 142 } 143 SetCapacity(int capacity)144 override public void SetCapacity(int capacity) { 145 Boolean[] newValues = new Boolean[capacity]; 146 if (null != values) { 147 Array.Copy(values, 0, newValues, 0, Math.Min(capacity, values.Length)); 148 } 149 values = newValues; 150 base.SetCapacity(capacity); 151 } 152 ConvertXmlToObject(string s)153 override public object ConvertXmlToObject(string s) { 154 return XmlConvert.ToBoolean(s); 155 } 156 ConvertObjectToXml(object value)157 override public string ConvertObjectToXml(object value) { 158 return XmlConvert.ToString((Boolean) value); 159 } 160 GetEmptyStorage(int recordCount)161 override protected object GetEmptyStorage(int recordCount) { 162 return new Boolean[recordCount]; 163 } 164 CopyValue(int record, object store, BitArray nullbits, int storeIndex)165 override protected void CopyValue(int record, object store, BitArray nullbits, int storeIndex) { 166 Boolean[] typedStore = (Boolean[]) store; 167 typedStore[storeIndex] = values[record]; 168 nullbits.Set(storeIndex, IsNull(record)); 169 } 170 SetStorage(object store, BitArray nullbits)171 override protected void SetStorage(object store, BitArray nullbits) { 172 values = (Boolean[]) store; 173 SetNullStorage(nullbits); 174 } 175 } 176 } 177