Skip to content

Commit

Permalink
Implement AutoEnlist connection string option.
Browse files Browse the repository at this point in the history
  • Loading branch information
bgrainger committed Apr 15, 2017
1 parent 0d3753f commit 09d48fa
Show file tree
Hide file tree
Showing 5 changed files with 94 additions and 26 deletions.
2 changes: 1 addition & 1 deletion src/MySqlConnector/MySqlClient/MySqlConnection.cs
Original file line number Diff line number Diff line change
Expand Up @@ -161,7 +161,7 @@ private async Task OpenAsync(IOBehavior ioBehavior, CancellationToken cancellati
}

#if !NETSTANDARD1_3
if (System.Transactions.Transaction.Current != null)
if (m_connectionSettings.AutoEnlist && System.Transactions.Transaction.Current != null)
EnlistTransaction(System.Transactions.Transaction.Current);
#endif
}
Expand Down
11 changes: 11 additions & 0 deletions src/MySqlConnector/MySqlClient/MySqlConnectionStringBuilder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,12 @@ public bool AllowUserVariables
set => MySqlConnectionStringOption.AllowUserVariables.SetValue(this, value);
}

public bool AutoEnlist
{
get => MySqlConnectionStringOption.AutoEnlist.GetValue(this);
set => MySqlConnectionStringOption.AutoEnlist.SetValue(this, value);
}

public bool BufferResultSets
{
get => MySqlConnectionStringOption.BufferResultSets.GetValue(this);
Expand Down Expand Up @@ -243,6 +249,7 @@ internal abstract class MySqlConnectionStringOption

// Other Options
public static readonly MySqlConnectionStringOption<bool> AllowUserVariables;
public static readonly MySqlConnectionStringOption<bool> AutoEnlist;
public static readonly MySqlConnectionStringOption<bool> BufferResultSets;
public static readonly MySqlConnectionStringOption<string> CharacterSet;
public static readonly MySqlConnectionStringOption<uint> ConnectionTimeout;
Expand Down Expand Up @@ -345,6 +352,10 @@ static MySqlConnectionStringOption()
keys: new[] { "AllowUserVariables", "Allow User Variables" },
defaultValue: false));

AddOption(AutoEnlist = new MySqlConnectionStringOption<bool>(
keys: new[] { "AutoEnlist", "Auto Enlist" },
defaultValue: true));

AddOption(BufferResultSets = new MySqlConnectionStringOption<bool>(
keys: new[] { "BufferResultSets", "Buffer Result Sets" },
defaultValue: false));
Expand Down
3 changes: 3 additions & 0 deletions src/MySqlConnector/Serialization/ConnectionSettings.cs
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ public ConnectionSettings(MySqlConnectionStringBuilder csb)

// Other Options
AllowUserVariables = csb.AllowUserVariables;
AutoEnlist = csb.AutoEnlist;
BufferResultSets = csb.BufferResultSets;
ConnectionTimeout = (int)csb.ConnectionTimeout;
ConvertZeroDateTime = csb.ConvertZeroDateTime;
Expand Down Expand Up @@ -87,6 +88,7 @@ private ConnectionSettings(ConnectionSettings other, bool? useCompression)

// Other Options
AllowUserVariables = other.AllowUserVariables;
AutoEnlist = other.AutoEnlist;
BufferResultSets = other.BufferResultSets;
ConnectionTimeout = other.ConnectionTimeout;
ConvertZeroDateTime = other.ConvertZeroDateTime;
Expand Down Expand Up @@ -124,6 +126,7 @@ private ConnectionSettings(ConnectionSettings other, bool? useCompression)

// Other Options
internal readonly bool AllowUserVariables;
internal readonly bool AutoEnlist;
internal readonly bool BufferResultSets;
internal readonly int ConnectionTimeout;
internal readonly bool ConvertZeroDateTime;
Expand Down
53 changes: 28 additions & 25 deletions tests/MySqlConnector.Tests/MySqlConnectionStringBuilderTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ public void Defaults()
{
var csb = new MySqlConnectionStringBuilder();
Assert.Equal(false, csb.AllowUserVariables);
Assert.Equal(true, csb.AutoEnlist);
Assert.Equal(null, csb.CertificateFile);
Assert.Equal(null, csb.CertificatePassword);
Assert.Equal("", csb.CharacterSet);
Expand Down Expand Up @@ -54,35 +55,37 @@ public void ParseConnectionString()
var csb = new MySqlConnectionStringBuilder
{
ConnectionString = "Data Source=db-server;" +
"Initial Catalog=schema_name;" +
"Allow User Variables=true;" +
"certificate file=file.pfx;" +
"certificate password=Pass1234;" +
"Character Set=latin1;" +
"Compress=true;" +
"connect timeout=30;" +
"connection lifetime=15;" +
"ConnectionReset=false;" +
"Convert Zero Datetime=true;" +
"Initial Catalog=schema_name;" +
"Allow User Variables=true;" +
"auto enlist=False;" +
"certificate file=file.pfx;" +
"certificate password=Pass1234;" +
"Character Set=latin1;" +
"Compress=true;" +
"connect timeout=30;" +
"connection lifetime=15;" +
"ConnectionReset=false;" +
"Convert Zero Datetime=true;" +
#if !BASELINE
"connectionidletimeout=30;" +
"bufferresultsets=true;" +
"forcesynchronous=true;" +
"connectionidletimeout=30;" +
"bufferresultsets=true;" +
"forcesynchronous=true;" +
#endif
"Keep Alive=90;" +
"minpoolsize=5;" +
"maxpoolsize=15;" +
"OldGuids=true;" +
"persistsecurityinfo=yes;" +
"Pooling=no;" +
"Port=1234;" +
"pwd=Pass1234;" +
"Treat Tiny As Boolean=false;" +
"ssl mode=verifyca;" +
"Uid=username;" +
"useaffectedrows=false"
"Keep Alive=90;" +
"minpoolsize=5;" +
"maxpoolsize=15;" +
"OldGuids=true;" +
"persistsecurityinfo=yes;" +
"Pooling=no;" +
"Port=1234;" +
"pwd=Pass1234;" +
"Treat Tiny As Boolean=false;" +
"ssl mode=verifyca;" +
"Uid=username;" +
"useaffectedrows=false"
};
Assert.Equal(true, csb.AllowUserVariables);
Assert.Equal(false, csb.AutoEnlist);
Assert.Equal("file.pfx", csb.CertificateFile);
Assert.Equal("Pass1234", csb.CertificatePassword);
Assert.Equal("latin1", csb.CharacterSet);
Expand Down
51 changes: 51 additions & 0 deletions tests/SideBySide/TransactionScopeTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -195,6 +195,57 @@ public void ThrowExceptionAfterCompleteInTransaction()
Assert.Equal(new[] { 1, 2 }, values);
}

[Fact]
public void AutoEnlistFalseWithCommit()
{
m_database.Connection.Execute(@"drop table if exists transaction_scope_test;
create table transaction_scope_test(value integer not null);");

using (var transactionScope = new TransactionScope())
using (var conn = new MySqlConnection(AppConfig.ConnectionString + ";auto enlist=false"))
{
conn.Open();
using (var dbTransaction = conn.BeginTransaction())
{
conn.Execute("insert into transaction_scope_test(value) values(1), (2);");

dbTransaction.Commit();
transactionScope.Complete();
}
}

var values = m_database.Connection.Query<int>(@"select value from transaction_scope_test order by value;").ToList();
Assert.Equal(new[] { 1, 2 }, values);
}

[Fact]
public void AutoEnlistFalseWithoutCommit()
{
m_database.Connection.Execute(@"drop table if exists transaction_scope_test;
create table transaction_scope_test(value integer not null);");

using (var transactionScope = new TransactionScope())
using (var conn = new MySqlConnection(AppConfig.ConnectionString + ";auto enlist=false"))
{
conn.Open();
using (var dbTransaction = conn.BeginTransaction())
{
conn.Execute("insert into transaction_scope_test(value) values(1), (2);");

#if BASELINE
// With Connector/NET a MySqlTransaction can't roll back after TransactionScope has been completed;
// workaround is to explicitly dispose it first. In MySqlConnector (with AutoEnlist=false) they have
// independent lifetimes.
dbTransaction.Dispose();
#endif
transactionScope.Complete();
}
}

var values = m_database.Connection.Query<int>(@"select value from transaction_scope_test order by value;").ToList();
Assert.Equal(new int[0], values);
}

[Fact
#if BASELINE
(Skip = "Multiple simultaneous connections or connections with different connection strings inside the same transaction are not currently supported.")
Expand Down

0 comments on commit 09d48fa

Please sign in to comment.