[Mono-devel-list] [PATCH]System.Data.OracleClient

Eduard Nesiba eda at monetplus.cz
Mon May 24 10:08:54 EDT 2004


Hello,

please apply my patch into CVS.

Eduard.

Eduard Nesiba wrote:

> Hi,
>
> this patch implements some changes to System.Data.OracleClient
> - autocommit behavior for non query statement  which is out of
> transaction. In previous implementation changed rows stayed locked until
> client disconnect.
> - hasRows proper settings
>
> Can someone check it into CVS?
>
> "in  mcs directory: patch -p1 < System.Data.OracleClient.diff"
>
> Eduard
>
>------------------------------------------------------------------------
>
>diff -u -r mcs/class/System.Data.OracleClient/System.Data.OracleClient/OracleCommand.cs /home/mono/mcs/class/System.Data.OracleClient/System.Data.OracleClient/OracleCommand.cs
>--- mcs/class/System.Data.OracleClient/System.Data.OracleClient/OracleCommand.cs	Fri Jan  9 15:52:39 2004
>+++ /home/mono/mcs/class/System.Data.OracleClient/System.Data.OracleClient/OracleCommand.cs	Thu May  6 13:55:44 2004
>@@ -202,13 +202,13 @@
> 			return new OracleParameter ();
> 		}
> 
>-		private int ExecuteNonQueryInternal (OciStatementHandle statement)
>+		private int ExecuteNonQueryInternal (OciStatementHandle statement, bool useAutoCommit)
> 		{
> 			if (preparedStatement == null)
> 				statement.Prepare (CommandText);
> 
> 			BindParameters (statement);
>-			statement.ExecuteNonQuery ();
>+			statement.ExecuteNonQuery (useAutoCommit);
> 
> 			int rowsAffected = statement.GetAttributeInt32 (OciAttributeType.RowCount, ErrorHandle);
> 		
>@@ -220,13 +220,16 @@
> 			AssertConnectionIsOpen ();
> 			AssertTransactionMatch ();
> 			AssertCommandTextIsSet ();
>+			bool useAutoCommit = false; 
> 
> 			if (Transaction != null)
> 				Transaction.AttachToServiceContext ();
>+			else
>+				useAutoCommit = true;
> 
> 			OciStatementHandle statement = GetStatementHandle ();
> 			try {
>-				return ExecuteNonQueryInternal (statement);
>+				return ExecuteNonQueryInternal (statement, useAutoCommit);
> 			}
> 			finally	{
> 				SafeDisposeHandle (statement);
>@@ -238,14 +241,17 @@
> 			AssertConnectionIsOpen ();
> 			AssertTransactionMatch ();
> 			AssertCommandTextIsSet ();
>+			bool useAutoCommit = false; 
> 
> 			if (Transaction != null)
> 				Transaction.AttachToServiceContext ();
>+			else
>+				useAutoCommit = true;
> 
> 			OciStatementHandle statement = GetStatementHandle ();
> 
> 			try {
>-				int retval = ExecuteNonQueryInternal (statement);
>+				int retval = ExecuteNonQueryInternal (statement, useAutoCommit);
> 
> 				OciRowIdDescriptor descriptor = (OciRowIdDescriptor) Environment.Allocate (OciHandleType.RowId);
> 				descriptor.SetHandle (statement.GetAttributeIntPtr (OciAttributeType.RowId, ErrorHandle));
>@@ -276,6 +282,7 @@
> 			AssertTransactionMatch ();
> 			AssertCommandTextIsSet ();
> 			AssertNoDataReader ();
>+			bool hasRows = false;
> 
> 			if (Transaction != null) 
> 				Transaction.AttachToServiceContext ();
>@@ -289,9 +296,9 @@
> 					preparedStatement = null;	// OracleDataReader releases the statement handle
> 
> 				BindParameters (statement);
>-				statement.ExecuteQuery ();
>+				hasRows = statement.ExecuteQuery ();
> 
>-				rd = new OracleDataReader (this, statement);
>+				rd = new OracleDataReader (this, statement, hasRows);
> 			}
> 			finally	{
> 				if (statement != null && rd == null)
>diff -u -r mcs/class/System.Data.OracleClient/System.Data.OracleClient/OracleDataReader.cs /home/mono/mcs/class/System.Data.OracleClient/System.Data.OracleClient/OracleDataReader.cs
>--- mcs/class/System.Data.OracleClient/System.Data.OracleClient/OracleDataReader.cs	Fri Jan  9 15:52:39 2004
>+++ /home/mono/mcs/class/System.Data.OracleClient/System.Data.OracleClient/OracleDataReader.cs	Thu May  6 13:59:44 2004
>@@ -54,6 +54,17 @@
> 			this.statementType = statement.GetStatementType ();
> 		}
> 
>+	        internal OracleDataReader (OracleCommand command, OciStatementHandle statement, bool extHasRows )
>+	        {
>+        	    this.command = command;
>+	            this.hasRows = extHasRows;
>+	            this.isClosed = false;
>+	            this.schemaTable = ConstructSchemaTable ();
>+	            this.statement = statement;
>+        	    this.statementType = statement.GetStatementType ();
>+	        }
>+
>+
> 		~OracleDataReader ()
> 		{
> 			Dispose (false);
>@@ -414,6 +425,7 @@
> 		public bool Read ()
> 		{
> 			bool retval = statement.Fetch ();
>+			hasRows = retval;
> 			return retval;
> 			//return command.StatementHandle.Fetch ();
> 		}
>diff -u -r mcs/class/System.Data.OracleClient/System.Data.OracleClient.Oci/OciStatementHandle.cs /home/mono/mcs/class/System.Data.OracleClient/System.Data.OracleClient.Oci/OciStatementHandle.cs
>--- mcs/class/System.Data.OracleClient/System.Data.OracleClient.Oci/OciStatementHandle.cs	Sat Apr  3 19:19:03 2004
>+++ /home/mono/mcs/class/System.Data.OracleClient/System.Data.OracleClient.Oci/OciStatementHandle.cs	Thu May  6 14:05:36 2004
>@@ -123,19 +123,25 @@
> 
> 		public bool ExecuteQuery ()
> 		{
>-			return Execute (false);
>+			return Execute (false,false);
> 		}
> 
>-		public bool ExecuteNonQuery ()
>+		public bool ExecuteNonQuery (bool useAutoCommit)
> 		{
>-			return Execute (true);
>+			return Execute (true, useAutoCommit);
> 		}
> 
>-		public bool Execute (bool nonQuery)
>+		public bool Execute (bool nonQuery, bool useAutoCommit)
> 		{
> 			int status = 0;
> 			columnCount = 0;
> 			moreResults = false;
>+			int executeMode;
>+
>+			if( useAutoCommit)
>+				executeMode = (int)OciExecuteMode.CommitOnSuccess;
>+			else
>+				executeMode = (int)OciExecuteMode.Default;
> 
> 			if (this.disposed) 
> 			{
>@@ -149,7 +155,7 @@
> 				0,
> 				IntPtr.Zero,
> 				IntPtr.Zero,
>-				OciExecuteMode.Default);
>+				(OciExecuteMode)executeMode);
> 		
> 			switch (status) {
> 			case OciGlue.OCI_DEFAULT:
>  
>



More information about the Mono-devel-list mailing list