Forráskód Böngészése

2003-02-17 Tim Coleman <[email protected]>
* System.Data.OracleClient/OracleDataAdapter.cs:
* System.Data.OracleClient/OracleRowUpdatedEventArgs.cs:
* System.Data.OracleClient/OracleRowUpdatedEventHandler.cs:
* System.Data.OracleClient/OracleRowUpdatingEventArgs.cs:
* System.Data.OracleClient/OracleRowUpdatingEventHandler.cs:
* list:
New classes added.
* System.Data.OracleClient/OracleDataReader.cs:
* System.Data.OracleClient.Oci/OciDefineHandle.cs:
Add handling for number and date types in OracleDataReader
GetValue

svn path=/trunk/mcs/; revision=11664

Tim Coleman 23 éve
szülő
commit
c5fd5f9344

+ 13 - 0
mcs/class/System.Data.OracleClient/ChangeLog

@@ -1,3 +1,16 @@
+2003-02-17  Tim Coleman <[email protected]>
+	* System.Data.OracleClient/OracleDataAdapter.cs:
+	* System.Data.OracleClient/OracleRowUpdatedEventArgs.cs:
+	* System.Data.OracleClient/OracleRowUpdatedEventHandler.cs:
+	* System.Data.OracleClient/OracleRowUpdatingEventArgs.cs:
+	* System.Data.OracleClient/OracleRowUpdatingEventHandler.cs:
+	* list:
+		New classes added.
+	* System.Data.OracleClient/OracleDataReader.cs:
+	* System.Data.OracleClient.Oci/OciDefineHandle.cs:
+		Add handling for number and date types in OracleDataReader
+		GetValue
+
 2003-02-16  Daniel Morgan <[email protected]>
 
 	* System.Data.OracleClient.Oci/OciStatementHandle.cs

+ 68 - 11
mcs/class/System.Data.OracleClient/System.Data.OracleClient.Oci/OciDefineHandle.cs

@@ -29,7 +29,10 @@ namespace System.Data.OracleClient.Oci {
 		short indicator;
 		OracleType type;
 		OciDataType ociType;
+		OciDataType definedType;
 		int definedSize;
+		int rlenp;
+		sbyte scale;
 	
 		#endregion // Fields
 
@@ -53,6 +56,17 @@ namespace System.Data.OracleClient.Oci {
 				throw new OracleException (info.ErrorCode, info.ErrorMessage);
 			}
 
+			status = OciGlue.OCIAttrGetSByte (parameterHandle,
+							(uint) OciDescriptorType.Parameter,
+							out scale,
+							IntPtr.Zero,
+							OciAttributeType.DataSize,
+							statement.ErrorHandle.Handle);
+			if (status != 0) {
+				OciErrorInfo info = statement.ErrorHandle.HandleError ();
+				throw new OracleException (info.ErrorCode, info.ErrorMessage);
+			}
+
 			status = OciGlue.OCIAttrGetInt32 (parameterHandle,
 							(uint) OciDescriptorType.Parameter,
 							out ociTypeInt,
@@ -63,7 +77,20 @@ namespace System.Data.OracleClient.Oci {
 				OciErrorInfo info = statement.ErrorHandle.HandleError ();
 				throw new OracleException (info.ErrorCode, info.ErrorMessage);
 			}
-			ociType = (OciDataType) ociTypeInt;
+			definedType = (OciDataType) ociTypeInt;
+
+			switch (definedType) {
+			case OciDataType.Number:
+				ociType = OciDataType.Char;
+				break;
+			case OciDataType.Date:
+				ociType = OciDataType.Char;
+				definedSize = 20;
+				break;
+			default:
+				ociType = definedType;
+				break;
+			}
 
 			value = Marshal.AllocHGlobal (definedSize);
 
@@ -75,17 +102,15 @@ namespace System.Data.OracleClient.Oci {
 							definedSize,
 							ociType,
 							ref indicator,
-							IntPtr.Zero,
+							ref rlenp,
 							IntPtr.Zero,
 							0);
+
 			if (status != 0) {
 				OciErrorInfo info = statement.ErrorHandle.HandleError ();
 				throw new OracleException (info.ErrorCode, info.ErrorMessage);
 			}
 
-			if (value == IntPtr.Zero)
-				Console.WriteLine ("BRRRRAAAAP");
-
 			statement.FreeParameterHandle (parameterHandle);
 		}
 
@@ -93,6 +118,10 @@ namespace System.Data.OracleClient.Oci {
 
 		#region Properties
 
+		public OciDataType DataType {
+			get { return definedType; }
+		}
+
 		public int DefinedSize {
 			get { return definedSize; }
 		}
@@ -106,18 +135,32 @@ namespace System.Data.OracleClient.Oci {
 			get { return OciHandleType.Define; }
 		}
 
+		public bool IsNull {
+			get { return (indicator == -1); }
+		}
+
+		public sbyte Scale {
+			get { return scale; }
+		}
+
+		public int Size {
+			get { return rlenp; }
+		}
+
 		public IntPtr Value {
-			get { 
-				if (value == IntPtr.Zero)
-					Console.WriteLine ("BRRRRAAAAP! EXCEEEUUUUSE ME!");
-				return value; 
-			}
+			get { return value; }
 		}
 
 		#endregion
 
 		#region Methods
 
+		[DllImport ("oci")]
+		public static extern int OCIDateGetDate (IntPtr date,
+							out short year,
+							out byte month,
+							out byte day);
+
 		[DllImport ("oci")]
 		public static extern int OCIDefineByPos (IntPtr stmtp,
 							out IntPtr defnpp,
@@ -127,7 +170,7 @@ namespace System.Data.OracleClient.Oci {
 							int value_sz,
 							[MarshalAs (UnmanagedType.U2)] OciDataType dty,
 							ref short indp,
-							IntPtr rlenp,
+							ref int rlenp,
 							IntPtr rcodep,
 							uint mode);
 
@@ -136,6 +179,20 @@ namespace System.Data.OracleClient.Oci {
 			Marshal.FreeHGlobal (value);
 		}
 
+		public DateTime GetDateValue ()
+		{
+			short year;
+			byte month;
+			byte day;
+
+			OCIDateGetDate (value,
+					out year,
+					out month,
+					out day);
+
+			return new DateTime (year, month, day);
+		}
+
 		#endregion // Methods
 	}
 }

+ 180 - 0
mcs/class/System.Data.OracleClient/System.Data.OracleClient/OracleDataAdapter.cs

@@ -0,0 +1,180 @@
+//
+// OracleDataAdapter.cs
+//
+// Part of the Mono class libraries at
+// mcs/class/System.Data.OracleClient/System.Data.OracleClient
+//
+// Assembly: System.Data.OracleClient.dll
+// Namespace: System.Data.OracleClient
+//
+// Author: Tim Coleman <[email protected]>
+//
+// Parts transferred from System.Data.SqlClient/SqlDataAdapter.cs
+// Authors:
+//      Rodrigo Moya ([email protected])
+//      Daniel Morgan ([email protected])
+//      Tim Coleman ([email protected])
+//
+// Copyright (C) Tim Coleman, 2003
+// (C) Ximian, Inc 2002
+//
+// Licensed under the MIT/X11 License.
+//
+
+using System;
+using System.ComponentModel;
+using System.Data;
+using System.Data.Common;
+
+namespace System.Data.OracleClient {
+	public sealed class OracleDataAdapter : DbDataAdapter, IDbDataAdapter 
+	{
+		#region Fields
+
+		bool disposed = false;	
+		OracleCommand deleteCommand;
+		OracleCommand insertCommand;
+		OracleCommand selectCommand;
+		OracleCommand updateCommand;
+
+		#endregion
+
+		#region Constructors
+		
+		public OracleDataAdapter () 	
+			: this (new OracleCommand ())
+		{
+		}
+
+		public OracleDataAdapter (OracleCommand selectCommand) 
+		{
+			DeleteCommand = null;
+			InsertCommand = null;
+			SelectCommand = selectCommand;
+			UpdateCommand = null;
+		}
+
+		public OracleDataAdapter (string selectCommandText, OracleConnection selectConnection) 
+			: this (new OracleCommand (selectCommandText, selectConnection))
+		{ 
+		}
+
+		public OracleDataAdapter (string selectCommandText, string selectConnectionString)
+			: this (selectCommandText, new OracleConnection (selectConnectionString))
+		{
+		}
+
+		#endregion
+
+		#region Properties
+
+		public OracleCommand DeleteCommand {
+			get { return deleteCommand; }
+			set { deleteCommand = value; }
+		}
+
+		public OracleCommand InsertCommand {
+			get { return insertCommand; }
+			set { insertCommand = value; }
+		}
+
+		public OracleCommand SelectCommand {
+			get { return selectCommand; }
+			set { selectCommand = value; }
+		}
+
+		public OracleCommand UpdateCommand {
+			get { return updateCommand; }
+			set { updateCommand = value; }
+		}
+
+		IDbCommand IDbDataAdapter.DeleteCommand {
+			get { return DeleteCommand; }
+			set { 
+				if (!(value is OracleCommand)) 
+					throw new ArgumentException ();
+				DeleteCommand = (OracleCommand) value;
+			}
+		}
+
+		IDbCommand IDbDataAdapter.InsertCommand {
+			get { return InsertCommand; }
+			set { 
+				if (!(value is OracleCommand)) 
+					throw new ArgumentException ();
+				InsertCommand = (OracleCommand) value;
+			}
+		}
+
+		IDbCommand IDbDataAdapter.SelectCommand {
+			get { return SelectCommand; }
+			set { 
+				if (!(value is OracleCommand)) 
+					throw new ArgumentException ();
+				SelectCommand = (OracleCommand) value;
+			}
+		}
+
+		IDbCommand IDbDataAdapter.UpdateCommand {
+			get { return UpdateCommand; }
+			set { 
+				if (!(value is OracleCommand)) 
+					throw new ArgumentException ();
+				UpdateCommand = (OracleCommand) value;
+			}
+		}
+
+
+		ITableMappingCollection IDataAdapter.TableMappings {
+			get { return TableMappings; }
+		}
+
+		#endregion // Properties
+
+		#region Methods
+
+		protected override RowUpdatedEventArgs CreateRowUpdatedEvent (DataRow dataRow, IDbCommand command, StatementType statementType, DataTableMapping tableMapping) 
+		{
+			return new OracleRowUpdatedEventArgs (dataRow, command, statementType, tableMapping);
+		}
+
+
+		protected override RowUpdatingEventArgs CreateRowUpdatingEvent (DataRow dataRow, IDbCommand command, StatementType statementType, DataTableMapping tableMapping) 
+		{
+			return new OracleRowUpdatingEventArgs (dataRow, command, statementType, tableMapping);
+		}
+
+		protected override void Dispose (bool disposing)
+		{
+			if (!disposed) {
+				if (disposing) {
+					// Release managed resources
+				}
+				// Release unmanaged resources
+				disposed = true;
+			}
+		}
+
+		protected override void OnRowUpdated (RowUpdatedEventArgs value) 
+		{
+			if (RowUpdated != null)
+				RowUpdated (this, (OracleRowUpdatedEventArgs) value);
+		}
+
+		protected override void OnRowUpdating (RowUpdatingEventArgs value) 
+		{
+			if (RowUpdating != null)
+				RowUpdating (this, (OracleRowUpdatingEventArgs) value);
+		}
+
+		#endregion // Methods
+
+		#region Events and Delegates
+
+		public event OracleRowUpdatedEventHandler RowUpdated;
+		public event OracleRowUpdatingEventHandler RowUpdating;
+
+		#endregion // Events and Delegates
+
+	}
+}

+ 46 - 9
mcs/class/System.Data.OracleClient/System.Data.OracleClient/OracleDataReader.cs

@@ -45,6 +45,7 @@ namespace System.Data.OracleClient {
 			this.isSelect = (command.CommandText.Trim ().ToUpper ().StartsWith ("SELECT"));
 			this.schemaTable = ConstructSchemaTable ();
 			this.fieldCount = command.StatementHandle.ColumnCount;
+			Read ();
 		}
 
 		public int Depth {
@@ -275,7 +276,7 @@ namespace System.Data.OracleClient {
 					return (int) schemaRow ["ColumnOrdinal"];
 			throw new IndexOutOfRangeException ();
 		}
-		
+
 		public DataTable GetSchemaTable ()
 		{
 			if (schemaTable.Rows != null && schemaTable.Rows.Count > 0)
@@ -323,15 +324,51 @@ namespace System.Data.OracleClient {
 		[MonoTODO]
 		public object GetValue (int i)
 		{
-			// OBVIOUSLY THIS IS NOT REALLY A STRING ALWAYS
-			// The OciDefineHandle should get it as a native type.
-			object foo = Marshal.PtrToStringAnsi (((OciDefineHandle) command.StatementHandle.Values [i]).Value, ((OciDefineHandle) command.StatementHandle.Values[i]).DefinedSize);
-
-			if (foo != null)
-				return String.Copy ((string) foo);
+			OciDefineHandle defineHandle = (OciDefineHandle) command.StatementHandle.Values [i];
+			object tmp;
+
+			if (defineHandle.IsNull)
+				return DBNull.Value;
+
+			switch (defineHandle.DataType) {
+			case OciDataType.VarChar2:
+			case OciDataType.String:
+			case OciDataType.VarChar:
+			case OciDataType.Char:
+			case OciDataType.CharZ:
+			case OciDataType.OciString:
+				tmp = Marshal.PtrToStringAnsi (defineHandle.Value, defineHandle.Size);
+				if (tmp != null)
+					return String.Copy ((string) tmp);
+				break;
+			case OciDataType.Integer:
+				tmp = Marshal.PtrToStringAnsi (defineHandle.Value, defineHandle.Size);
+				if (tmp != null) 
+					return Int32.Parse (String.Copy ((string) tmp));
+				break;
+			case OciDataType.Number:
+				tmp = Marshal.PtrToStringAnsi (defineHandle.Value, defineHandle.Size);
+				if (tmp != null) {
+					if (defineHandle.Scale == 0) 
+						return Int32.Parse (String.Copy ((string) tmp));
+					else
+						return Decimal.Parse (String.Copy ((string) tmp));
+				}
+				break;
+			case OciDataType.Float:
+				tmp = Marshal.PtrToStringAnsi (defineHandle.Value, defineHandle.Size);
+				if (tmp != null) 
+					return Double.Parse (String.Copy ((string) tmp));
+				break;
+			case OciDataType.Date:
+				tmp = Marshal.PtrToStringAnsi (defineHandle.Value, defineHandle.Size);
+				Console.WriteLine ((string) tmp);
+				if (tmp != null)
+					return DateTime.Parse ((string) tmp);
+				break;
+			}
 
-			return null;
-			//throw new NotImplementedException ();
+			return DBNull.Value;
 		}
 
 		[MonoTODO]

+ 49 - 0
mcs/class/System.Data.OracleClient/System.Data.OracleClient/OracleRowUpdatedEventArgs.cs

@@ -0,0 +1,49 @@
+//
+// OracleRowUpdatedEventArgs.cs
+//
+// Part of the Mono class libraries at
+// mcs/class/System.Data.OracleClient/System.Data.OracleClient
+//
+// Assembly: System.Data.OracleClient.dll
+// Namespace: System.Data.OracleClient
+//
+// Author: Tim Coleman <[email protected]>
+//
+// Parts derived from System.Data.SqlClient.SqlRowUpdatedEventArgs
+// Authors:
+//      Rodrigo Moya ([email protected])
+//      Daniel Morgan ([email protected])
+//      Tim Coleman ([email protected])
+//
+//
+// (C) Ximian, Inc 2002
+// Copyright (C) Tim Coleman, 2002-2003
+//
+// Licensed under the MIT/X11 License.
+//
+
+using System;
+using System.Data;
+using System.Data.Common;
+
+namespace System.Data.OracleClient {
+	public sealed class OracleRowUpdatedEventArgs : RowUpdatedEventArgs 
+	{
+		#region Constructors
+
+		public OracleRowUpdatedEventArgs (DataRow row, IDbCommand command, StatementType statementType, DataTableMapping tableMapping) 
+			: base (row, command, statementType, tableMapping)
+		{
+		}
+
+		#endregion // Constructors
+
+		#region Properties
+
+		public new OracleCommand Command {
+			get { return (OracleCommand) base.Command; }
+		}
+
+		#endregion // Properties
+	}
+}

+ 27 - 0
mcs/class/System.Data.OracleClient/System.Data.OracleClient/OracleRowUpdatedEventHandler.cs

@@ -0,0 +1,27 @@
+//
+// OracleRowUpdatedEventHandler.cs
+//
+// Part of the Mono class libraries at
+// mcs/class/System.Data.OracleClient/System.Data.OracleClient
+//
+// Assembly: System.Data.OracleClient.dll
+// Namespace: System.Data.OracleClient
+//
+// Author: Tim Coleman <[email protected]>
+//
+// Parts derived from System.Data.SqlClient.SqlRowUpdatedEventHandler
+// Authors:
+//      Rodrigo Moya ([email protected])
+//      Daniel Morgan ([email protected])
+//
+// (C) Ximian, Inc 2002
+// Copyright (C) Tim Coleman, 2003
+//
+// Licensed under the MIT/X11 License.
+
+
+using System;
+
+namespace System.Data.OracleClient {
+	public delegate void OracleRowUpdatedEventHandler (object sender, OracleRowUpdatedEventArgs e);
+}

+ 48 - 0
mcs/class/System.Data.OracleClient/System.Data.OracleClient/OracleRowUpdatingEventArgs.cs

@@ -0,0 +1,48 @@
+//
+// OracleRowUpdatingEventArgs.cs
+//
+// Part of the Mono class libraries at
+// mcs/class/System.Data.OracleClient/System.Data.OracleClient
+//
+// Assembly: System.Data.OracleClient.dll
+// Namespace: System.Data.OracleClient
+//
+// Author: Tim Coleman <[email protected]>
+//
+// Parts derived from System.Data.SqlClient.SqlRowUpdatingEventArgs
+// Authors:
+//      Rodrigo Moya ([email protected])
+//      Daniel Morgan ([email protected])
+//      Tim Coleman ([email protected])
+//
+// (C) Ximian, Inc 2002
+// Copyright (C) Tim Coleman, 2002-2003
+//
+// Licensed under the MIT/X11 License.
+
+using System;
+using System.Data;
+using System.Data.Common;
+
+namespace System.Data.OracleClient {
+	public sealed class OracleRowUpdatingEventArgs : RowUpdatingEventArgs
+	{
+		#region Constructors
+
+		public OracleRowUpdatingEventArgs (DataRow row, IDbCommand command, StatementType statementType, DataTableMapping tableMapping) 
+			: base (row, command, statementType, tableMapping)
+		{
+		}
+
+		#endregion // Constructors
+
+		#region Properties
+
+		public new OracleCommand Command {
+			get { return (OracleCommand) base.Command; }
+			set { base.Command = value; }
+		}
+
+		#endregion // Properties
+	}
+}

+ 27 - 0
mcs/class/System.Data.OracleClient/System.Data.OracleClient/OracleRowUpdatingEventHandler.cs

@@ -0,0 +1,27 @@
+//
+// OracleRowUpdatingEventHandler.cs
+//
+// Part of the Mono class libraries at
+// mcs/class/System.Data.OracleClient/System.Data.OracleClient
+//
+// Assembly: System.Data.OracleClient.dll
+// Namespace: System.Data.OracleClient
+//
+// Author: Tim Coleman <[email protected]>
+//
+// Parts derived from System.Data.SqlClient.SqlRowUpdatingEventHandler
+// Authors:
+//      Rodrigo Moya ([email protected])
+//      Daniel Morgan ([email protected])
+//
+// (C) Ximian, Inc 2002
+// Copyright (C) Tim Coleman, 2003
+//
+// Licensed under the MIT/X11 License.
+//
+
+using System;
+
+namespace System.Data.OracleClient {
+	public delegate void OracleRowUpdatingEventHandler(object sender, OracleRowUpdatingEventArgs e);
+}

+ 5 - 0
mcs/class/System.Data.OracleClient/list

@@ -27,10 +27,15 @@ System.Data.OracleClient.Oci/OciTransactionHandle.cs
 System.Data.OracleClient/OciGlue.cs
 System.Data.OracleClient/OracleCommand.cs
 System.Data.OracleClient/OracleConnection.cs
+System.Data.OracleClient/OracleDataAdapter.cs
 System.Data.OracleClient/OracleDataReader.cs
 System.Data.OracleClient/OracleException.cs
 System.Data.OracleClient/OracleParameterCollection.cs
 System.Data.OracleClient/OracleParameter.cs
+System.Data.OracleClient/OracleRowUpdatedEventArgs.cs
+System.Data.OracleClient/OracleRowUpdatedEventHandler.cs
+System.Data.OracleClient/OracleRowUpdatingEventArgs.cs
+System.Data.OracleClient/OracleRowUpdatingEventHandler.cs
 System.Data.OracleClient/OracleString.cs
 System.Data.OracleClient/OracleTransaction.cs
 System.Data.OracleClient/OracleType.cs