1 //------------------------------------------------------------------------------
2 // <copyright file="SQLBooleanStorage.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
{
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 SqlBooleanStorage
: DataStorage
{
22 private SqlBoolean
[] values
;
24 public SqlBooleanStorage(DataColumn column
)
25 : base(column
, typeof(SqlBoolean
), SqlBoolean
.Null
, SqlBoolean
.Null
, StorageType
.SqlBoolean
) {
28 override public Object
Aggregate(int[] records
, AggregateType kind
) {
32 case AggregateType
.Min
:
33 SqlBoolean min
= true;
34 for (int i
= 0; i
< records
.Length
; i
++) {
35 int record
= records
[i
];
38 min
= SqlBoolean
.And(values
[record
], min
);
46 case AggregateType
.Max
:
47 SqlBoolean max
= false;
48 for (int i
= 0; i
< records
.Length
; i
++) {
49 int record
= records
[i
];
52 max
= SqlBoolean
.Or(values
[record
], max
);
60 case AggregateType
.First
:
61 if (records
.Length
> 0) {
62 return values
[records
[0]];
66 case AggregateType
.Count
:
68 for (int i
= 0; i
< records
.Length
; i
++) {
69 if (!IsNull(records
[i
]))
75 catch (OverflowException
) {
76 throw ExprException
.Overflow(typeof(SqlBoolean
));
78 throw ExceptionBuilder
.AggregateException(kind
, DataType
);
81 override public int Compare(int recordNo1
, int recordNo2
) {
82 return values
[recordNo1
].CompareTo(values
[recordNo2
]);
85 override public int CompareValueTo(int recordNo
, Object
value) {
86 return values
[recordNo
].CompareTo((SqlBoolean
)value);
89 override public object ConvertValue(object value) {
91 return SqlConvert
.ConvertToSqlBoolean(value);
96 override public void Copy(int recordNo1
, int recordNo2
) {
97 values
[recordNo2
] = values
[recordNo1
];
100 override public Object
Get(int record
) {
101 return values
[record
];
104 override public bool IsNull(int record
) {
105 return (values
[record
].IsNull
);
108 override public void Set(int record
, Object
value) {
109 values
[record
] = SqlConvert
.ConvertToSqlBoolean(value);
112 override public void SetCapacity(int capacity
) {
113 SqlBoolean
[] newValues
= new SqlBoolean
[capacity
];
114 if (null != values
) {
115 Array
.Copy(values
, 0, newValues
, 0, Math
.Min(capacity
, values
.Length
));
120 override public object ConvertXmlToObject(string s
) {
121 SqlBoolean newValue
= new SqlBoolean();
122 string tempStr
=string.Concat("<col>", s
, "</col>"); // this is done since you can give fragmet to reader, bug 98767
123 StringReader strReader
= new StringReader(tempStr
);
125 IXmlSerializable tmp
= newValue
;
127 using (XmlTextReader xmlTextReader
= new XmlTextReader(strReader
)) {
128 tmp
.ReadXml(xmlTextReader
);
130 return ((SqlBoolean
)tmp
);
133 override public string ConvertObjectToXml(object value) {
134 Debug
.Assert(!DataStorage
.IsObjectNull(value), "we should have null here");
135 Debug
.Assert((value.GetType() == typeof(SqlBoolean
)), "wrong input type");
137 StringWriter strwriter
= new StringWriter(FormatProvider
);
139 using (XmlTextWriter xmlTextWriter
= new XmlTextWriter (strwriter
)) {
140 ((IXmlSerializable
)value).WriteXml(xmlTextWriter
);
142 return (strwriter
.ToString ());
145 override protected object GetEmptyStorage(int recordCount
) {
146 return new SqlBoolean
[recordCount
];
149 override protected void CopyValue(int record
, object store
, BitArray nullbits
, int storeIndex
) {
150 SqlBoolean
[] typedStore
= (SqlBoolean
[]) store
;
151 typedStore
[storeIndex
] = values
[record
];
152 nullbits
.Set(storeIndex
, IsNull(record
));
155 override protected void SetStorage(object store
, BitArray nullbits
) {
156 values
= (SqlBoolean
[]) store
;
157 //SetNullStorage(nullbits);