List:Commits« Previous MessageNext Message »
From:rburnett Date:January 8 2007 6:01pm
Subject:Connector/NET commit: r542 - in branches/5.0: . Driver/Source TestSuite
View as plain text  
Modified:
   branches/5.0/CHANGES
   branches/5.0/Driver/Source/ISSchemaProvider.cs
   branches/5.0/Driver/Source/parameter_collection.cs
   branches/5.0/TestSuite/StoredProcedure.cs
Log:
Return parameters created with DeriveParameters now have the name RETURN_VALUE.  We also changed how parameters are handled inside the parameter collection so that a return value parameter can have the same name as a non-return parameter.

Modified: branches/5.0/CHANGES
===================================================================
--- branches/5.0/CHANGES	2007-01-08 18:00:45 UTC (rev 541)
+++ branches/5.0/CHANGES	2007-01-08 18:01:21 UTC (rev 542)
@@ -3,6 +3,10 @@
   Bugs fixed
   ----------
   Bug #25443 ExecuteScalar() hangs when more than one bad result 
+  
+  Other changes
+  -------------
+  Return parameters created with DeriveParameters now have the name RETURN_VALUE
 
 Version 5.0.3 12-31-2006
 

Modified: branches/5.0/Driver/Source/ISSchemaProvider.cs
===================================================================
--- branches/5.0/Driver/Source/ISSchemaProvider.cs	2007-01-08 18:00:45 UTC (rev 541)
+++ branches/5.0/Driver/Source/ISSchemaProvider.cs	2007-01-08 18:01:21 UTC (rev 542)
@@ -488,10 +488,13 @@
             string[] split = cs.Split(parmDef, " \t\r\n");
             if (parmRow["IS_RESULT"].Equals("NO"))
             {
-					parmRow["PARAMETER_NAME"] = String.Format("{0}{1}",
-						connection.ParameterMarker, CleanParameterName(split[0]));
+                parmRow["PARAMETER_NAME"] = String.Format("{0}{1}",
+                    connection.ParameterMarker, CleanParameterName(split[0]));
                 parmDef = parmDef.Substring(split[0].Length);
             }
+            else
+                parmRow["PARAMETER_NAME"] = String.Format("{0}RETURN_VALUE",
+                    connection.ParameterMarker);
 
             ParseType(parmDef, sqlMode, parmRow);
         }

Modified: branches/5.0/Driver/Source/parameter_collection.cs
===================================================================
--- branches/5.0/Driver/Source/parameter_collection.cs	2007-01-08 18:00:45 UTC (rev 541)
+++ branches/5.0/Driver/Source/parameter_collection.cs	2007-01-08 18:01:21 UTC (rev 542)
@@ -40,6 +40,7 @@
 		private char paramMarker = '?';
 		private Hashtable ciHash;
 		private Hashtable hash;
+        private int returnParameterIndex;
 
 		internal MySqlParameterCollection()
 		{
@@ -50,6 +51,7 @@
 			ciHash = new Hashtable(new CaseInsensitiveHashCodeProvider(),
 			new CaseInsensitiveComparer());
 #endif
+            Clear();
 		}
 
 		internal char ParameterMarker
@@ -119,16 +121,13 @@
 
 		private MySqlParameter AddReturnParameter(MySqlParameter value)
 		{
-			for (int i = 0; i < items.Count; i++)
+            if (returnParameterIndex != -1)
 			{
-				MySqlParameter p = (MySqlParameter)items[i];
-				if (p.Direction != ParameterDirection.ReturnValue) continue;
-				items[i] = value;
+				items[returnParameterIndex] = value;
 				return value;
 			}
+
 			int index = items.Add(value);
-            hash.Add(value.ParameterName, index);
-            ciHash.Add(value.ParameterName, index);
             return value;
 		}
 
@@ -236,16 +235,31 @@
 			int index = this.IndexOf(parameterName);
 			if (index < 0)
 				throw new ArgumentException("Parameter '" + parameterName + "' not found in the collection.");
-			//changed = true;
-			items[index] = (MySqlParameter)value;
+            SetParameter(index, value);
 		}
 
 		protected override void SetParameter(int index, DbParameter value)
 		{
 			CheckIndex(index);
-			//changed = true;
+            MySqlParameter p = (MySqlParameter)items[index];
+            if (p.Direction == ParameterDirection.ReturnValue)
+                returnParameterIndex = -1;
+            else
+            {
+                hash.Remove(p.ParameterName);
+                ciHash.Remove(p.ParameterName);
+            }
+
 			items[index] = (MySqlParameter)value;
-		}
+            p = (MySqlParameter)value;
+            if (p.Direction == ParameterDirection.ReturnValue)
+                returnParameterIndex = index;
+            else
+            {
+                hash.Add(p.ParameterName, index);
+                ciHash.Add(p.ParameterName, index);
+            }
+        }
 
 		/// <summary>
 		/// Adds the specified <see cref="MySqlParameter"/> object to the <see cref="MySqlParameterCollection"/>.
@@ -274,6 +288,7 @@
 			items.Clear();
 			hash.Clear();
 			ciHash.Clear();
+            returnParameterIndex = -1;
 		}
 
 		/// <summary>
@@ -332,11 +347,20 @@
 		public override int IndexOf(string parameterName)
 		{
 			object o = hash[parameterName];
-			if (o == null)
-				o = ciHash[parameterName];
-			if (o == null)
-				return -1;
-			return (int)o;
+            if (o != null)
+                return (int)o;
+
+			o = ciHash[parameterName];
+            if (o != null)
+                return (int)o;
+
+            if (returnParameterIndex != -1)
+            {
+                MySqlParameter p = (MySqlParameter)items[returnParameterIndex];
+                if (String.Compare(parameterName, p.ParameterName, true) == 0)
+                    return returnParameterIndex;
+            }
+			return -1;
 		}
 
 		/// <summary>
@@ -394,6 +418,12 @@
 		public override void Remove(object value)
 		{
 			items.Remove(value);
+
+            MySqlParameter p = (value as MySqlParameter);
+            hash.Remove(p.ParameterName);
+            ciHash.Remove(p.ParameterName);
+            if (p.Direction == ParameterDirection.ReturnValue)
+                returnParameterIndex = -1;
 		}
 
 		/// <summary>
@@ -403,7 +433,7 @@
 		public override void RemoveAt(string name)
 		{
 			DbParameter p = GetParameter(name);
-			items.Remove(p);
+			Remove(p);
 		}
 
 		/// <summary>
@@ -413,7 +443,8 @@
 		/// <overloads>Removes the specified <see cref="MySqlParameter"/> from the collection.</overloads>
 		public override void RemoveAt(int index)
 		{
-			items.RemoveAt(index);
+            object o = items[index];
+            Remove(o);
 		}
 
         /// <summary>

Modified: branches/5.0/TestSuite/StoredProcedure.cs
===================================================================
--- branches/5.0/TestSuite/StoredProcedure.cs	2007-01-08 18:00:45 UTC (rev 541)
+++ branches/5.0/TestSuite/StoredProcedure.cs	2007-01-08 18:01:21 UTC (rev 542)
@@ -988,5 +988,17 @@
 			}
 		}
 
+        [Test]
+        public void CheckNameOfReturnParameter()
+        {
+            execSQL("CREATE FUNCTION fnTest() RETURNS CHAR(50)" +
+                " LANGUAGE SQL DETERMINISTIC BEGIN  RETURN \"Test\"; END");
+
+            MySqlCommand cmd = new MySqlCommand("fnTest", conn);
+            cmd.CommandType = CommandType.StoredProcedure;
+            MySqlCommandBuilder.DeriveParameters(cmd);
+            Assert.AreEqual(1, cmd.Parameters.Count);
+            Assert.AreEqual("?RETURN_VALUE", cmd.Parameters[0].ParameterName);
+        }
 	}
 }

Thread
Connector/NET commit: r542 - in branches/5.0: . Driver/Source TestSuiterburnett8 Jan