Prechádzať zdrojové kódy

2005-01-09 Daniel Morgan <[email protected]>

	* System.Data.OracleClient/OracleCommand.cs: set Command
	property on OciStatementHandle
	
	* System.Data.OracleClient/OracleConnection.cs: implement
	properties ServerVersion and DataSource, partially
	implement method ICloneable Clone, implement
	connection StateChange and InfoMessage events
	
	* System.Data.OracleClient/OciGlue.cs: add internal properties
	for OciSessionHandle and OciServerHandle
	
	* System.Data.OracleClient/OracleInfoMessageEventArgs.cs:
	implement
	
	* Test/TestOracleClient.cs: add new tests
	
	* System.Data.OracleClient.Oci/OciStatementHandle.cs: 
	- add property for OracleCommand
	- patch from Joost Evertse <[email protected]>
	  for handling OCI_SUCCES_WITH_INFO during Fetch which
	  indicates a Warning info message
	
	* System.Data.OracleClient.Oci/OciCalls.cs: added OCI call
	OCIServerVersion
	
	* System.Data.OracleClient.Oci/OciDefineHandle.cs: flush

svn path=/trunk/mcs/; revision=38585
Daniel Morgan 21 rokov pred
rodič
commit
d3c298e5e0

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

@@ -1,3 +1,32 @@
+2005-01-09  Daniel Morgan <[email protected]>
+
+	* System.Data.OracleClient/OracleCommand.cs: set Command
+	property on OciStatementHandle
+	
+	* System.Data.OracleClient/OracleConnection.cs: implement
+	properties ServerVersion and DataSource, partially
+	implement method ICloneable Clone, implement
+	connection StateChange and InfoMessage events
+	
+	* System.Data.OracleClient/OciGlue.cs: add internal properties
+	for OciSessionHandle and OciServerHandle
+	
+	* System.Data.OracleClient/OracleInfoMessageEventArgs.cs:
+	implement
+	
+	* Test/TestOracleClient.cs: add new tests
+	
+	* System.Data.OracleClient.Oci/OciStatementHandle.cs: 
+	- add property for OracleCommand
+	- patch from Joost Evertse <[email protected]>
+	  for handling OCI_SUCCES_WITH_INFO during Fetch which
+	  indicates a Warning info message
+	
+	* System.Data.OracleClient.Oci/OciCalls.cs: added OCI call
+	OCIServerVersion
+	
+	* System.Data.OracleClient.Oci/OciDefineHandle.cs: flush
+
 2005-01-06  Daniel Morgan <[email protected]>
 
 	* Assembly/AssemblyInfo.cs: updated copyright

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

@@ -276,6 +276,13 @@ namespace System.Data.OracleClient.Oci
 				IntPtr errhp,
 				uint mode);
 
+			[DllImport ("oci")]
+			internal static extern int OCIServerVersion (IntPtr hndlp,
+				IntPtr errhp,
+				[In][Out] byte[] bufp,
+				uint bufsz,
+				[MarshalAs (UnmanagedType.U4)] OciHandleType type);
+
 			[DllImport ("oci")]
 			internal static extern int OCISessionBegin (IntPtr svchp,
 				IntPtr errhp,
@@ -682,6 +689,20 @@ namespace System.Data.OracleClient.Oci
 			return OciNativeCalls.OCIServerDetach (srvhp, errhp, mode);
 		}
 
+		internal static int OCIServerVersion (IntPtr hndlp,
+			IntPtr errhp,
+			ref byte[] bufp,
+			uint bufsz,
+			OciHandleType hndltype) 
+		{
+			Trace.WriteLineIf(traceOci, "OCIServerVersion", "OCI");
+			return OciNativeCalls.OCIServerVersion (hndlp,
+				errhp,
+				bufp,
+				bufsz,
+				hndltype);
+		}
+
 		internal static int OCISessionBegin (IntPtr svchp,
 			IntPtr errhp,
 			IntPtr usrhp,

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

@@ -347,7 +347,6 @@ namespace System.Data.OracleClient.Oci
 				OciCalls.OCICharSetToUnicode (env, ret, buffer, out rsize);
 	
 				return ret.ToString ();
-
 			case OciDataType.Integer:
 			case OciDataType.Number:
 			case OciDataType.Float:

+ 11 - 0
mcs/class/System.Data.OracleClient/System.Data.OracleClient.Oci/OciStatementHandle.cs

@@ -30,6 +30,7 @@ namespace System.Data.OracleClient.Oci {
 		bool moreResults;
 		OciServiceHandle serviceHandle;
 		ArrayList values;
+		OracleCommand command;
 	
 		#endregion // Fields
 
@@ -63,6 +64,11 @@ namespace System.Data.OracleClient.Oci {
 			get { return values; }
 		}
 
+		public OracleCommand Command {
+			get { return command; }
+			set { command = value; }
+		}
+
 		#endregion // Properties
 
 		#region Methods
@@ -208,6 +214,11 @@ namespace System.Data.OracleClient.Oci {
 			case OciGlue.OCI_DEFAULT:
 				moreResults = true;
 				break;
+			case OciGlue.OCI_SUCCESS_WITH_INFO:
+				//OciErrorInfo ei = ErrorHandle.HandleError ();
+				//command.Connection.CreateInfoMessage (ei);
+				moreResults = true;
+				break;
 			default:
 				OciErrorInfo info = ErrorHandle.HandleError ();
 				throw new OracleException (info.ErrorCode, info.ErrorMessage);

+ 8 - 1
mcs/class/System.Data.OracleClient/System.Data.OracleClient/OciGlue.cs

@@ -69,6 +69,14 @@ namespace System.Data.OracleClient.Oci {
 			get { return service; }
 		}
 
+		public OciServerHandle ServerHandle {
+			get { return server; }
+		}
+
+		public OciSessionHandle SessionHandle {
+			get { return session; }
+		}
+
 		#endregion // Properties
 
 		#region Methods
@@ -130,7 +138,6 @@ namespace System.Data.OracleClient.Oci {
 				throw new OracleException (info.ErrorCode, info.ErrorMessage);
 			}
 
-
 			if (!service.SetSession (session)) {
 				OciErrorInfo info = error.HandleError ();
 				Disconnect ();

+ 1 - 0
mcs/class/System.Data.OracleClient/System.Data.OracleClient/OracleCommand.cs

@@ -477,6 +477,7 @@ namespace System.Data.OracleClient {
 			OciStatementHandle h = (OciStatementHandle) Connection.Environment.Allocate (OciHandleType.Statement);
 			h.ErrorHandle = Connection.ErrorHandle;
 			h.Service = Connection.ServiceContext;
+			h.Command = this;
 			return h;
 		}
 

+ 61 - 4
mcs/class/System.Data.OracleClient/System.Data.OracleClient/OracleConnection.cs

@@ -104,7 +104,7 @@ namespace System.Data.OracleClient
 		[DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
 		public string DataSource {
 			get {
-				throw new NotImplementedException ();
+				return conInfo.Database;
 			}
 		}
 
@@ -128,10 +128,37 @@ namespace System.Data.OracleClient
 		[DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
 		public string ServerVersion {
 			get {
-				throw new NotImplementedException ();
+				if (this.State != ConnectionState.Open)
+					throw new System.InvalidOperationException ("Invalid operation. The connection is closed.");
+				return GetOracleVersion ();
 			}
 		}
 
+		internal string GetOracleVersion () 
+		{
+			byte[] buffer = new Byte[256];
+			uint bufflen = (uint) buffer.Length;
+
+			IntPtr sh = oci.ServiceContext;
+			IntPtr eh = oci.ErrorHandle;
+
+			OciCalls.OCIServerVersion (sh, 
+				eh, 
+				ref buffer,  bufflen,
+				OciHandleType.Service);
+			
+			// Get length of returned string
+			int 	rsize = 0;
+			IntPtr	env = oci.Environment;
+			OciCalls.OCICharSetToUnicode (env, null, buffer, out rsize);
+			
+			// Get string
+			StringBuilder ret = new StringBuilder(rsize);
+			OciCalls.OCICharSetToUnicode (env, ret, buffer, out rsize);
+
+			return ret.ToString ();
+		}
+
 		internal OciGlue Oci {
 			get { return oci; }
 		}
@@ -184,7 +211,12 @@ namespace System.Data.OracleClient
 		[MonoTODO]
 		object ICloneable.Clone ()
 		{
-			throw new NotImplementedException ();
+			OracleConnection con = new OracleConnection ();
+			con.ConnectionString = this.ConnectionString;
+			if (this.State == ConnectionState.Open)
+				con.Open ();
+			// TODO: what other properties need to be cloned?
+			return con;
 		}
 
 		IDbTransaction IDbConnection.BeginTransaction ()
@@ -224,6 +256,31 @@ namespace System.Data.OracleClient
 		{
 			oci.CreateConnection (conInfo);
 			state = ConnectionState.Open;
+			CreateStateChange (ConnectionState.Closed, ConnectionState.Open);
+		}
+
+		internal void CreateInfoMessage (OciErrorInfo info) 
+		{
+			OracleInfoMessageEventArgs a = new OracleInfoMessageEventArgs (info);
+			OnInfoMessage (a);
+		}
+
+		private void OnInfoMessage (OracleInfoMessageEventArgs e) 
+		{
+			if (InfoMessage != null)
+				InfoMessage (this, e);
+		}
+
+		internal void CreateStateChange (ConnectionState original, ConnectionState current) 
+		{
+			StateChangeEventArgs a = new StateChangeEventArgs (original, current);
+			OnStateChange (a);
+		}
+
+		private void OnStateChange (StateChangeEventArgs e) 
+		{
+			if (StateChange != null)
+				StateChange (this, e);
 		}
 
 		public void Close () 
@@ -233,9 +290,9 @@ namespace System.Data.OracleClient
 
 			oci.Disconnect ();
 			state = ConnectionState.Closed;
+			CreateStateChange (ConnectionState.Open, ConnectionState.Closed);
 		}
 
-
 		void SetConnectionString (string connectionString) 
 		{
 			this.connectionString = connectionString;

+ 7 - 5
mcs/class/System.Data.OracleClient/System.Data.OracleClient/OracleInfoMessageEventArgs.cs

@@ -17,8 +17,10 @@
 using System;
 using System.IO;
 using System.Data.SqlTypes;
+using System.Data.OracleClient.Oci;
 
-namespace System.Data.OracleClient {
+namespace System.Data.OracleClient 
+{
 	public sealed class OracleInfoMessageEventArgs : EventArgs
 	{
 		#region Fields
@@ -30,10 +32,10 @@ namespace System.Data.OracleClient {
 
 		#region Constructors
 
-		internal OracleInfoMessageEventArgs (OracleException exception)
+		internal OracleInfoMessageEventArgs (OciErrorInfo info)
 		{
-			code = exception.Code;
-			message = exception.Message;
+			code = info.ErrorCode;
+			message = info.ErrorMessage;
 		}
 
 		#endregion // Constructors
@@ -59,7 +61,7 @@ namespace System.Data.OracleClient {
 
 		public override string ToString ()
 		{
-			throw new NotImplementedException ();
+			return Message;
 		}
 
 		#endregion // Methods

+ 103 - 4
mcs/class/System.Data.OracleClient/Test/TestOracleClient.cs

@@ -11,6 +11,9 @@
 //     Assembly: System.Data.OracleClient.dll
 //     Namespace: System.Data.OracleClient
 // 
+// To Compile:
+// mcs TestOracleClient.cs /r:System.Data.dll /r:System.Data.OracleClient.dll /nowarn:0168
+//
 // Author: 
 //     Daniel Morgan <[email protected]>
 //         
@@ -760,6 +763,87 @@ namespace Test.OracleClient
 			cmd3.ExecuteNonQuery ();
 		}
 
+		static void ShowConnectionProperties (OracleConnection con) 
+		{
+			IDbConnection dbcon = (IDbConnection) con;
+
+			try {
+				Console.WriteLine ("ServerVersion: " + con.ServerVersion);
+			} catch (System.InvalidOperationException ioe) {
+				Console.WriteLine ("InvalidOperationException caught.");
+				Console.WriteLine ("Message: " + ioe.Message);
+			}
+
+			Console.WriteLine ("DataSource: " + con.DataSource);
+		}
+
+		static void NullAggregateTest (OracleConnection con)
+		{
+			Console.WriteLine("  Drop table MONO_TEST_TABLE3...");
+			OracleCommand cmd2 = con.CreateCommand ();
+
+			try {
+				cmd2.CommandText = "DROP TABLE MONO_TEST_TABLE3";
+				cmd2.ExecuteNonQuery ();
+			}
+			catch(OracleException oe1) {
+				// ignore if table already exists
+			}
+
+			Console.WriteLine("  Create table MONO_TEST_TABLE3...");
+						
+			cmd2.CommandText = "CREATE TABLE MONO_TEST_TABLE3 (" +
+				" COL1 VARCHAR2(8), "+
+				" COL2 VARCHAR2(32))";
+
+			cmd2.ExecuteNonQuery ();
+
+			Console.WriteLine("  Insert some rows into table MONO_TEST_TABLE3...");
+			cmd2.CommandText = "INSERT INTO MONO_TEST_TABLE3 (COL1, COL2) VALUES ('1','one')";
+			cmd2.ExecuteNonQuery ();
+
+			cmd2.CommandText = "INSERT INTO MONO_TEST_TABLE3 (COL1, COL2) VALUES ('1','uno')";
+			cmd2.ExecuteNonQuery ();
+			
+			cmd2.CommandText = "INSERT INTO MONO_TEST_TABLE3 (COL1, COL2) VALUES ('3','three')";
+			cmd2.ExecuteNonQuery ();
+			
+			cmd2.CommandText = "INSERT INTO MONO_TEST_TABLE3 (COL1, COL2) VALUES ('3', null)";
+			cmd2.ExecuteNonQuery ();
+
+			cmd2.CommandText = "INSERT INTO MONO_TEST_TABLE3 (COL1, COL2) VALUES ('3','few')";
+			cmd2.ExecuteNonQuery ();
+
+			Console.WriteLine("  ExecuteScalar...");
+			cmd2.CommandText = "SELECT COL1, COUNT(COL2) AS MAX_COL1 FROM MONO_TEST_TABLE3 GROUP BY COL1";
+			OracleDataReader reader = cmd2.ExecuteReader ();
+			Console.WriteLine (" Read...");
+			while (reader.Read ()) {
+
+				object obj0 = reader.GetValue (0);
+				Console.WriteLine("Value 0: " + obj0.ToString ());
+				object obj1 = reader.GetValue (1);
+				Console.WriteLine("Value 1: " + obj1.ToString ());
+			
+				Console.WriteLine (" Read...");
+			}
+
+			Console.WriteLine (" No more records.");
+		}
+
+		static void OnInfoMessage (object sender, OracleInfoMessageEventArgs e) 
+		{
+			Console.WriteLine("InfoMessage Message: " + e.Message.ToString());
+			Console.WriteLine("InfoMessage Code: " + e.Code.ToString());
+			Console.WriteLine("InfoMessage Source: " + e.Source.ToString());
+		}
+
+		static void OnStateChange (object sender, StateChangeEventArgs e) 
+		{
+			Console.WriteLine("StateChange CurrentSate:" + e.CurrentState.ToString ());
+			Console.WriteLine("StateChange OriginalState:" + e.OriginalState.ToString ());
+		}
+
 		[STAThread]
 		static void Main(string[] args) 
 		{ 	
@@ -777,14 +861,23 @@ namespace Test.OracleClient
 				args[0], args[1], args[2]);
 
 			OracleConnection con1 = new OracleConnection();
+
+			ShowConnectionProperties (con1);
+
 			con1.ConnectionString = connectionString;
-			con1.Open();
+
+			con1.InfoMessage += new OracleInfoMessageEventHandler (OnInfoMessage);
+			con1.StateChange += new StateChangeEventHandler (OnStateChange);
+			Console.WriteLine("Opening...");
+			con1.Open ();
+			Console.WriteLine("Opened.");
+
+			ShowConnectionProperties (con1);
 
 			Console.WriteLine ("Mono Oracle Test BEGIN ...");
 			MonoTest (con1);
 			Console.WriteLine ("Mono Oracle Test END ...");
 
-
 			Wait ("");
 			
 			Console.WriteLine ("LOB Test BEGIN...");
@@ -836,8 +929,14 @@ namespace Test.OracleClient
 			Console.WriteLine ("Stored Proc Test 2 END...");
 
 			Wait ("");
-			
-			con1.Close();		
+
+			Console.WriteLine ("Null Aggregate Warning BEGIN test...");
+			NullAggregateTest (con1);
+			Console.WriteLine ("Null Aggregate Warning END test...");
+
+			Console.WriteLine("Closing...");
+			con1.Close ();
+			Console.WriteLine("Closed.");
 			
 			Console.WriteLine("Done.");
 		}