From: Date: September 22 2007 12:28am Subject: Connector/NET commit: r1023 - in branches/5.1: . Driver/Source TestSuite/Source List-Archive: http://lists.mysql.com/commits/34471 X-Bug: 30964 Message-Id: <200709212228.l8LMSME9003416@bk-internal.mysql.com> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Modified: branches/5.1/CHANGES branches/5.1/Driver/Source/Connection.cs branches/5.1/TestSuite/Source/ConnectionTests.cs Log: Fixed problem that prevented commands from being executed from the state change handler. Not sure why you would want to do this but... (bug #30964) Modified: branches/5.1/CHANGES =================================================================== --- branches/5.1/CHANGES 2007-09-21 22:23:49 UTC (rev 1022) +++ branches/5.1/CHANGES 2007-09-21 22:28:21 UTC (rev 1023) @@ -72,7 +72,9 @@ - Changed from using Array.Copy to Buffer.BlockCopy in MySqlDataReader.GetBytes. This helps with memory usage as we expect the source and destination arrays to not be overlapping. (Bug #31090) - + - Fixed problem that prevented commands from being executed from the state change + handler. Not sure why you would want to do this but... (bug #30964) + Version 5.0.8 8/16/2007 Bug #28706 Log messages are truncated - Fixed a problem with compression over a network. We were letting the inflate stream read Modified: branches/5.1/Driver/Source/Connection.cs =================================================================== --- branches/5.1/Driver/Source/Connection.cs 2007-09-21 22:23:49 UTC (rev 1022) +++ branches/5.1/Driver/Source/Connection.cs 2007-09-21 22:28:21 UTC (rev 1023) @@ -402,13 +402,14 @@ this.database = database; } - internal void SetState(ConnectionState newConnectionState) + internal void SetState(ConnectionState newConnectionState, bool broadcast) { if (newConnectionState == connectionState) return; ConnectionState oldConnectionState = connectionState; connectionState = newConnectionState; - OnStateChange(new StateChangeEventArgs(oldConnectionState, connectionState)); + if (broadcast) + OnStateChange(new StateChangeEventArgs(oldConnectionState, connectionState)); } /// @@ -419,7 +420,7 @@ { bool result = driver.Ping(); if (!result) - SetState(ConnectionState.Closed); + SetState(ConnectionState.Closed, true); return result; } @@ -429,7 +430,7 @@ if (State == ConnectionState.Open) throw new InvalidOperationException(Resources.ConnectionAlreadyOpen); - SetState(ConnectionState.Connecting); + SetState(ConnectionState.Connecting, true); #if !CF // if we are auto enlisting in a current transaction, then we will be @@ -460,7 +461,7 @@ } catch (Exception) { - SetState(ConnectionState.Closed); + SetState(ConnectionState.Closed, true); throw; } @@ -468,7 +469,7 @@ if (driver.Settings.UseOldSyntax) Logger.LogWarning("You are using old syntax that will be removed in future versions"); - SetState(ConnectionState.Open); + SetState(ConnectionState.Open, false); driver.Configure(this); if (settings.Database != null && settings.Database != String.Empty) ChangeDatabase(settings.Database); @@ -490,7 +491,8 @@ #endif hasBeenOpen = true; - } + SetState(ConnectionState.Open, true); + } /// public new MySqlCommand CreateCommand() @@ -551,7 +553,7 @@ catch (Exception) { } - SetState(ConnectionState.Closed); + SetState(ConnectionState.Closed, true); } internal void CloseFully() @@ -588,7 +590,7 @@ driver.IsInActiveUse = false; #endif - SetState(ConnectionState.Closed); + SetState(ConnectionState.Closed, true); } internal string CurrentDatabase() Modified: branches/5.1/TestSuite/Source/ConnectionTests.cs =================================================================== --- branches/5.1/TestSuite/Source/ConnectionTests.cs 2007-09-21 22:23:49 UTC (rev 1022) +++ branches/5.1/TestSuite/Source/ConnectionTests.cs 2007-09-21 22:28:21 UTC (rev 1023) @@ -397,5 +397,30 @@ } } } + + /// + /// Bug #30964 StateChange imperfection + /// + MySqlConnection rqConnection; + [Test] + public void RunningAQueryFromStateChangeHandler() + { + string connStr = GetConnectionString(true); + using (rqConnection = new MySqlConnection(connStr)) + { + rqConnection.StateChange += new StateChangeEventHandler(RunningQueryStateChangeHandler); + rqConnection.Open(); + } + } + + void RunningQueryStateChangeHandler(object sender, StateChangeEventArgs e) + { + if (e.CurrentState == ConnectionState.Open) + { + MySqlCommand cmd = new MySqlCommand("SELECT 1", rqConnection); + object o = cmd.ExecuteScalar(); + Assert.AreEqual(1, o); + } + } } }