DateTimeOffsetStorage.cs 6.5 KB

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