1 // 2 // OracleDateTime.cs 3 // 4 // Part of the Mono class libraries at 5 // mcs/class/System.Data.OracleClient/System.Data.OracleClient 6 // 7 // Assembly: System.Data.OracleClient.dll 8 // Namespace: System.Data.OracleClient 9 // 10 // Authors: Tim Coleman <tim@timcoleman.com> 11 // Daniel Morgan <danielmorgan@verizon.net> 12 // 13 // Copyright (C) Tim Coleman, 2003 14 // Copyright (C) Daniel Morgan, 2005 15 // 16 // Licensed under the MIT/X11 License. 17 // 18 19 using System; 20 using System.Data.SqlTypes; 21 using System.Globalization; 22 using System.Text; 23 24 namespace System.Data.OracleClient { 25 public struct OracleDateTime : IComparable, INullable 26 { 27 #region Fields 28 29 public static readonly OracleDateTime MaxValue = new OracleDateTime (4712, 12, 31); 30 public static readonly OracleDateTime MinValue = new OracleDateTime (1, 1, 1); 31 public static readonly OracleDateTime Null = new OracleDateTime (); 32 33 DateTime value; 34 bool notNull; 35 36 #endregion // Fields 37 38 #region Constructors 39 OracleDateTimeSystem.Data.OracleClient.OracleDateTime40 public OracleDateTime (DateTime dt) 41 { 42 value = dt; 43 notNull = true; 44 } 45 OracleDateTimeSystem.Data.OracleClient.OracleDateTime46 public OracleDateTime (long ticks) 47 : this (new DateTime (ticks)) 48 { 49 } 50 OracleDateTimeSystem.Data.OracleClient.OracleDateTime51 public OracleDateTime (OracleDateTime from) 52 : this (from.Value) 53 { 54 } 55 OracleDateTimeSystem.Data.OracleClient.OracleDateTime56 public OracleDateTime (int year, int month, int day) 57 : this (new DateTime (year, month, day)) 58 { 59 } 60 OracleDateTimeSystem.Data.OracleClient.OracleDateTime61 public OracleDateTime (int year, int month, int day, Calendar calendar) 62 : this (new DateTime (year, month, day, calendar)) 63 { 64 } 65 OracleDateTimeSystem.Data.OracleClient.OracleDateTime66 public OracleDateTime (int year, int month, int day, int hour, int minute, int second) 67 : this (new DateTime (year, month, day, hour, minute, second)) 68 { 69 } 70 OracleDateTimeSystem.Data.OracleClient.OracleDateTime71 public OracleDateTime (int year, int month, int day, int hour, int minute, int second, Calendar calendar) 72 : this (new DateTime (year, month, day, hour, minute, second, calendar)) 73 { 74 } 75 OracleDateTimeSystem.Data.OracleClient.OracleDateTime76 public OracleDateTime (int year, int month, int day, int hour, int minute, int second, int millisecond) 77 : this (new DateTime (year, month, day, hour, minute, second, millisecond)) 78 { 79 } 80 OracleDateTimeSystem.Data.OracleClient.OracleDateTime81 public OracleDateTime (int year, int month, int day, int hour, int minute, int second, int millisecond, Calendar calendar) 82 : this (new DateTime (year, month, day, hour, minute, second, millisecond, calendar)) 83 { 84 } 85 86 #endregion // Constructors 87 88 #region Properties 89 90 public int Day { 91 get { return value.Day; } 92 } 93 94 public int Hour { 95 get { return value.Hour; } 96 } 97 98 public bool IsNull { 99 get { return !notNull; } 100 } 101 102 public int Millisecond { 103 get { return value.Millisecond; } 104 } 105 106 public int Minute { 107 get { return value.Minute; } 108 } 109 110 public int Month { 111 get { return value.Month; } 112 } 113 114 public int Second { 115 get { return value.Second; } 116 } 117 118 public DateTime Value { 119 get { return value; } 120 } 121 122 public int Year { 123 get { return value.Year; } 124 } 125 126 #endregion // Properties 127 128 #region Methods 129 CompareToSystem.Data.OracleClient.OracleDateTime130 public int CompareTo (object obj) 131 { 132 OracleDateTime o = (OracleDateTime) obj; 133 if (obj == null) 134 throw new NullReferenceException ("Object reference not set to an instance of an object"); 135 else if (!(obj is OracleDateTime)) 136 throw new ArgumentException ("Value is not a System.Data.OracleClient.OracleDateTime", obj.ToString ()); 137 else if (o.IsNull && this.IsNull) 138 return 0; 139 else if (o.IsNull && !(this.IsNull)) 140 return 1; 141 else 142 return value.CompareTo (o.Value); 143 } 144 EqualsSystem.Data.OracleClient.OracleDateTime145 public override bool Equals (object value) 146 { 147 if (value is OracleDateTime) 148 { 149 OracleDateTime d = (OracleDateTime) value; 150 if (!(this.IsNull) && !(d.IsNull)) 151 return this.value == d.value; 152 else 153 throw new InvalidOperationException ("The value is null"); 154 } 155 return false; 156 } 157 EqualsSystem.Data.OracleClient.OracleDateTime158 public static OracleBoolean Equals (OracleDateTime x, OracleDateTime y) 159 { 160 if (x.IsNull || y.IsNull) 161 return OracleBoolean.Null; 162 return new OracleBoolean (x.Value == y.Value); 163 } 164 165 [MonoTODO] GetHashCodeSystem.Data.OracleClient.OracleDateTime166 public override int GetHashCode () 167 { 168 throw new NotImplementedException (); 169 } 170 GreaterThanSystem.Data.OracleClient.OracleDateTime171 public static OracleBoolean GreaterThan (OracleDateTime x, OracleDateTime y) 172 { 173 if (x.IsNull || y.IsNull) 174 return OracleBoolean.Null; 175 return new OracleBoolean (x.Value > y.Value); 176 } 177 GreaterThanOrEqualSystem.Data.OracleClient.OracleDateTime178 public static OracleBoolean GreaterThanOrEqual (OracleDateTime x, OracleDateTime y) 179 { 180 if (x.IsNull || y.IsNull) 181 return OracleBoolean.Null; 182 return new OracleBoolean (x.Value >= y.Value); 183 } 184 LessThanSystem.Data.OracleClient.OracleDateTime185 public static OracleBoolean LessThan (OracleDateTime x, OracleDateTime y) 186 { 187 if (x.IsNull || y.IsNull) 188 return OracleBoolean.Null; 189 return new OracleBoolean (x.Value < y.Value); 190 } 191 LessThanOrEqualSystem.Data.OracleClient.OracleDateTime192 public static OracleBoolean LessThanOrEqual (OracleDateTime x, OracleDateTime y) 193 { 194 if (x.IsNull || y.IsNull) 195 return OracleBoolean.Null; 196 return new OracleBoolean (x.Value <= y.Value); 197 } 198 NotEqualsSystem.Data.OracleClient.OracleDateTime199 public static OracleBoolean NotEquals (OracleDateTime x, OracleDateTime y) 200 { 201 if (x.IsNull || y.IsNull) 202 return OracleBoolean.Null; 203 return new OracleBoolean (x.Value != y.Value); 204 } 205 ParseSystem.Data.OracleClient.OracleDateTime206 public static OracleDateTime Parse (string s) 207 { 208 return new OracleDateTime (DateTime.Parse (s)); 209 } 210 ToStringSystem.Data.OracleClient.OracleDateTime211 public override string ToString () 212 { 213 if (IsNull) 214 return "Null"; 215 return Value.ToString (); 216 } 217 218 #endregion // Methods 219 220 #region Operators and Type Conversions 221 operator ==System.Data.OracleClient.OracleDateTime222 public static OracleBoolean operator == (OracleDateTime x, OracleDateTime y) 223 { 224 return Equals (x, y); 225 } 226 operator >System.Data.OracleClient.OracleDateTime227 public static OracleBoolean operator > (OracleDateTime x, OracleDateTime y) 228 { 229 return GreaterThan (x, y); 230 } 231 operator >=System.Data.OracleClient.OracleDateTime232 public static OracleBoolean operator >= (OracleDateTime x, OracleDateTime y) 233 { 234 return GreaterThanOrEqual (x, y); 235 } 236 operator !=System.Data.OracleClient.OracleDateTime237 public static OracleBoolean operator != (OracleDateTime x, OracleDateTime y) 238 { 239 return NotEquals (x, y); 240 } 241 operator <System.Data.OracleClient.OracleDateTime242 public static OracleBoolean operator < (OracleDateTime x, OracleDateTime y) 243 { 244 return LessThan (x, y); 245 } 246 operator <=System.Data.OracleClient.OracleDateTime247 public static OracleBoolean operator <= (OracleDateTime x, OracleDateTime y) 248 { 249 return LessThanOrEqual (x, y); 250 } 251 operator DateTimeSystem.Data.OracleClient.OracleDateTime252 public static explicit operator DateTime (OracleDateTime x) 253 { 254 return x.Value; 255 } 256 operator OracleDateTimeSystem.Data.OracleClient.OracleDateTime257 public static explicit operator OracleDateTime (string x) 258 { 259 return new OracleDateTime (DateTime.Parse (x)); 260 } 261 ConvertSystemDatePartToOracleDateSystem.Data.OracleClient.OracleDateTime262 private static string ConvertSystemDatePartToOracleDate (string sysPart) 263 { 264 if (sysPart.Length == 0) 265 return ""; 266 else { 267 switch (sysPart) { 268 case "tt": 269 return "AM"; 270 case "yy": 271 return "YY"; 272 case "yyyy": 273 return "YYYY"; 274 case "MM": 275 return "MM"; 276 case "MON": 277 return "MMM"; 278 case "MMMM": 279 return "MONTH"; 280 case "dd": 281 return "DD"; 282 case "ddd": 283 return "DY"; 284 case "dddd": 285 return "DAY"; 286 case "hh": 287 return "HH"; 288 case "HH": 289 return "HH24"; 290 case "mm": 291 return "MI"; 292 case "ss": 293 return "SS"; 294 default: 295 // ignore any others? 296 return ""; 297 } 298 } 299 } 300 ConvertOracleDatePartToSystemDatePartSystem.Data.OracleClient.OracleDateTime301 private static string ConvertOracleDatePartToSystemDatePart (string oraPart) 302 { 303 if (oraPart.Length == 0) 304 return ""; 305 else { 306 switch (oraPart) { 307 case "AM": 308 case "PM": 309 // TODO: need to handle "A.M." and "P.M." 310 return "tt"; 311 case "RR": // TODO: handle special year RR. for now, treat it like yy 312 return "yy"; 313 case "YY": 314 return "yy"; 315 case "YYYY": 316 return "yyyy"; 317 case "MM": 318 return "MM"; 319 case "MON": 320 return "MMM"; 321 case "MONTH": 322 return "MMMM"; 323 case "DD": 324 return "dd"; 325 case "DY": 326 return "ddd"; 327 case "DAY": 328 return "dddd"; 329 case "HH": 330 case "HH12": 331 return "hh"; 332 case "HH24": 333 return "HH"; 334 case "MI": 335 return "mm"; 336 case "SS": 337 return "ss"; 338 default: 339 // ignore any others? 340 return ""; 341 } 342 } 343 } 344 ConvertSystemDateTimeFormatToOracleDateSystem.Data.OracleClient.OracleDateTime345 internal static string ConvertSystemDateTimeFormatToOracleDate (string sysFormat) 346 { 347 if (sysFormat == String.Empty) 348 return String.Empty; 349 350 char[] chars = sysFormat.ToCharArray (); 351 352 StringBuilder sb = new StringBuilder (); 353 StringBuilder sfinal = new StringBuilder (); 354 355 int i = 0; 356 bool inQuote = false; 357 char quoteChar = '\"'; 358 string sPart; 359 360 for (i = 0; i < chars.Length; i++) { 361 char ch = chars[i]; 362 363 if (inQuote == true) { 364 sfinal.Append (ch); 365 if (ch == quoteChar) 366 inQuote = false; 367 } 368 else { 369 switch (ch) { 370 case ' ': 371 case '.': 372 case ',': 373 case '/': 374 case '-': 375 case ':': 376 if (sb.Length > 0) { 377 sPart = ConvertSystemDatePartToOracleDate (sb.ToString ()); 378 if (sPart.Length > 0) 379 sfinal.Append (sPart); 380 } 381 sb = null; 382 sb = new StringBuilder (); 383 sfinal.Append (ch); 384 break; 385 case '\"': 386 sfinal.Append (ch); 387 inQuote = true; 388 quoteChar = '\"'; 389 break; 390 default: 391 sb.Append (ch); 392 break; 393 } 394 } 395 } 396 397 if (sb.Length > 0) { 398 sPart = ConvertSystemDatePartToOracleDate (sb.ToString ()); 399 if (sPart.Length > 0) 400 sfinal.Append (sPart); 401 sb = null; 402 } 403 string returnStr = sfinal.ToString (); 404 sfinal = null; 405 return returnStr; 406 } 407 ConvertOracleDateFormatToSystemDateTimeSystem.Data.OracleClient.OracleDateTime408 internal static string ConvertOracleDateFormatToSystemDateTime (string oraFormat) 409 { 410 if (oraFormat == String.Empty) 411 return String.Empty; 412 413 char[] chars = oraFormat.ToCharArray (); 414 415 StringBuilder sb = new StringBuilder (); 416 StringBuilder sfinal = new StringBuilder (); 417 418 int i = 0; 419 bool inQuote = false; 420 char quoteChar = '\"'; 421 string sPart; 422 423 for (i = 0; i < chars.Length; i++) { 424 char ch = chars[i]; 425 426 if (inQuote == true) { 427 sfinal.Append (ch); 428 if (ch == quoteChar) 429 inQuote = false; 430 } 431 else { 432 switch (ch) { 433 case ' ': 434 case '.': 435 case ',': 436 case '/': 437 case '-': 438 case ':': 439 if (sb.Length > 0) { 440 sPart = ConvertOracleDatePartToSystemDatePart (sb.ToString ()); 441 if (sPart.Length > 0) 442 sfinal.Append (sPart); 443 } 444 sb = null; 445 sb = new StringBuilder (); 446 sfinal.Append (ch); 447 break; 448 case '\"': 449 sfinal.Append (ch); 450 inQuote = true; 451 quoteChar = '\"'; 452 break; 453 default: 454 sb.Append (ch); 455 break; 456 } 457 } 458 } 459 460 if (sb.Length > 0) { 461 sPart = ConvertOracleDatePartToSystemDatePart (sb.ToString ()); 462 if (sPart.Length > 0) 463 sfinal.Append (sPart); 464 sb = null; 465 } 466 string returnStr = sfinal.ToString (); 467 sfinal = null; 468 return returnStr; 469 } 470 471 #endregion // Operators and Type Conversions 472 } 473 } 474 475