Browse Source

OciInterval implementation

svn path=/trunk/mcs/; revision=130487
Veerapuram Varadhan 17 years ago
parent
commit
256eaefdb3

+ 7 - 0
mcs/class/System.Data.OracleClient/System.Data.OracleClient.Oci/OciCalls.cs

@@ -658,6 +658,13 @@ namespace System.Data.OracleClient.Oci
 			out byte min,
 			out byte sec,
 			out uint fsec);
+		
+		[DllImport ("oci")]
+		internal static extern int OCIIntervalFromText (IntPtr hndl,
+			IntPtr err,
+			string inpstring,
+			long inplen,
+			out IntPtr ret);
 
 		internal static int OCIDefineByPos (IntPtr stmtp,
 			out IntPtr defnpp,

+ 3 - 1
mcs/class/System.Data.OracleClient/System.Data.OracleClient.Oci/OciDataType.cs

@@ -47,6 +47,8 @@ namespace System.Data.OracleClient.Oci {
 		RSet = 0x74, // REF CURSOR
 		OciString = 0x9b,
 		OciDate = 0x9c,
-		TimeStamp = 0xbb
+		TimeStamp = 0xbb,
+		IntervalYearToMonth = 0xbd,
+		IntervalDayToSecond = 0xbe
 	}
 }

+ 72 - 0
mcs/class/System.Data.OracleClient/System.Data.OracleClient.Oci/OciDefineHandle.cs

@@ -54,6 +54,7 @@ namespace System.Data.OracleClient.Oci
 
 		OciLobLocator lobLocator;
 		OciDateTimeDescriptor dateTimeDesc;
+		OciIntervalDescriptor intervalDesc;
 
 		#endregion // Fields
 
@@ -149,6 +150,10 @@ namespace System.Data.OracleClient.Oci
 			case OciDataType.LongVarChar:
 				DefineLongVarChar (position, connection);
 				return;
+			case OciDataType.IntervalDayToSecond:
+			case OciDataType.IntervalYearToMonth:
+				DefineInterval (position, definedType, connection);
+				return;
 			default:
 				DefineChar (position, connection); // HANDLE ALL OTHERS AS CHAR FOR NOW
 				return;
@@ -380,6 +385,50 @@ namespace System.Data.OracleClient.Oci
 			}
 		}
 
+		void DefineInterval (int position, OciDataType type, OracleConnection connection)
+		{
+			ociType = type;
+			fieldType = typeof(System.TimeSpan);
+
+			switch (type) {
+				case OciDataType.IntervalDayToSecond:
+					definedSize = 11;
+					intervalDesc = (OciIntervalDescriptor) connection.Environment.Allocate (OciHandleType.IntervalDayToSecond);
+					break;
+				case OciDataType.IntervalYearToMonth:
+					intervalDesc = (OciIntervalDescriptor) connection.Environment.Allocate (OciHandleType.IntervalYearToMonth);
+					definedSize = 5;
+					break;
+			}
+			
+			if (intervalDesc == null) {
+				OciErrorInfo info = connection.ErrorHandle.HandleError ();
+				throw new OracleException (info.ErrorCode, info.ErrorMessage);
+			}
+
+			value = intervalDesc.Handle;
+			intervalDesc.ErrorHandle = ErrorHandle;
+
+			int status = 0;
+
+			status = OciCalls.OCIDefineByPosPtr (Parent,
+				out handle,
+				ErrorHandle,
+				position + 1,
+				ref value,
+				definedSize,
+				ociType,
+				ref indicator,
+				ref rlenp,
+				IntPtr.Zero,
+				0);
+
+			if (status != 0) {
+				OciErrorInfo info = connection.ErrorHandle.HandleError ();
+				throw new OracleException (info.ErrorCode, info.ErrorMessage);
+			}
+		}
+		
 		protected override void Dispose (bool disposing)
 		{
 			if (!disposed) {
@@ -468,6 +517,25 @@ namespace System.Data.OracleClient.Oci
 			case OciDataType.Blob:
 			case OciDataType.Clob:
 				return GetOracleLob ();
+			case OciDataType.IntervalDayToSecond:
+				long ticks;
+				tmp = Marshal.PtrToStringAnsi (Value, Size);
+				if (tmp != null) {
+					//TimeSpan ts = new TimeSpan (
+					Console.WriteLine ("IntervalDayToSecond value: {0}", (string)tmp);
+					ticks = long.Parse (String.Copy ((string)tmp));
+					return new OracleTimeSpan (ticks);
+				}
+				break;
+			case OciDataType.IntervalYearToMonth:
+				int months;
+				tmp = Marshal.PtrToStringAnsi (Value, Size);
+				if (tmp != null) {
+					Console.WriteLine ("IntervalDayToSecond value: {0}", (string)tmp);
+					months = int.Parse (String.Copy ((string)tmp));
+					return new OracleMonthSpan (months);
+				}
+				break;
 			default:
 				throw new Exception("OciDataType not implemented: " + DataType.ToString ());
 			}
@@ -502,6 +570,10 @@ namespace System.Data.OracleClient.Oci
 			case OciDataType.Long:
 			case OciDataType.RowIdDescriptor:
 				return new OracleString ((string) ovalue);
+			case OciDataType.IntervalDayToSecond:
+				return new OracleTimeSpan ((OracleTimeSpan) ovalue);
+			case OciDataType.IntervalYearToMonth:
+				return new OracleMonthSpan ((OracleMonthSpan) ovalue);
 			default:
 				// TODO: do other types
 				throw new NotImplementedException ();

+ 5 - 0
mcs/class/System.Data.OracleClient/System.Data.OracleClient.Oci/OciParameterDescriptor.cs

@@ -69,6 +69,7 @@ namespace System.Data.OracleClient.Oci {
 
 		public static OracleType OciDataTypeToOracleType (OciDataType ociType)
 		{
+			Console.WriteLine ("OciDataType = {0}", ociType);
 			switch (ociType) {
 			case OciDataType.VarChar2:
 				return OracleType.VarChar;
@@ -124,6 +125,10 @@ namespace System.Data.OracleClient.Oci {
 				return OracleType.DateTime;
 			case OciDataType.TimeStamp:
 				return OracleType.Timestamp;
+			case OciDataType.IntervalDayToSecond:
+				return OracleType.IntervalDayToSecond;
+			case OciDataType.IntervalYearToMonth:
+				return OracleType.IntervalYearToMonth;
 			default:
 				throw new NotImplementedException ();
 			}

+ 1 - 0
mcs/class/System.Data.OracleClient/System.Data.OracleClient.dll.sources

@@ -17,6 +17,7 @@ System.Data.OracleClient.Oci/OciErrorInfo.cs
 System.Data.OracleClient.Oci/OciExecuteMode.cs
 System.Data.OracleClient.Oci/OciHandle.cs
 System.Data.OracleClient.Oci/OciHandleType.cs
+System.Data.OracleClient.Oci/OciIntervalDescriptor.cs
 System.Data.OracleClient.Oci/OciLobLocator.cs
 System.Data.OracleClient.Oci/OciLobType.cs
 System.Data.OracleClient.Oci/OciNlsServiceType.cs

+ 10 - 3
mcs/class/System.Data.OracleClient/System.Data.OracleClient/OracleDataReader.cs

@@ -422,10 +422,14 @@ namespace System.Data.OracleClient
 			return new OracleDateTime (GetDateTime (i));
 		}
 
-		[MonoTODO]
 		public OracleMonthSpan GetOracleMonthSpan (int i)
 		{
-			throw new NotImplementedException ();
+			if (IsDBNull (i))
+				throw new InvalidOperationException("The value is null");
+
+			OracleMonthSpan output = (OracleMonthSpan) ((OciDefineHandle) statement.Values [i]).GetValue (
+				command.Connection.SessionFormatProvider, command.Connection);
+			return output;
 		}
 
 		public OracleString GetOracleString (int i)
@@ -462,6 +466,10 @@ namespace System.Data.OracleClient
 			case OciDataType.Long:
 			case OciDataType.RowIdDescriptor:
 				return GetOracleString (i);
+			case OciDataType.IntervalDayToSecond:
+				return GetOracleTimeSpan (i);
+			case OciDataType.IntervalYearToMonth:
+				return GetOracleMonthSpan (i);
 			default:
 				throw new NotImplementedException ();
 			}
@@ -484,7 +492,6 @@ namespace System.Data.OracleClient
 			return retval;
 		}
 
-		[MonoTODO]
 		public OracleTimeSpan GetOracleTimeSpan (int i)
 		{
 			return new OracleTimeSpan (GetTimeSpan (i));