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