Skip to content

Commit

Permalink
Use ambient transaction in bulk loader. Fixes #300
Browse files Browse the repository at this point in the history
  • Loading branch information
bgrainger committed Nov 17, 2017
1 parent 35a47b5 commit 29fe8b4
Show file tree
Hide file tree
Showing 2 changed files with 74 additions and 4 deletions.
6 changes: 2 additions & 4 deletions src/MySqlConnector/MySql.Data.MySqlClient/MySqlBulkLoader.cs
Expand Up @@ -22,7 +22,6 @@ public sealed class MySqlBulkLoader
public List<string> Columns { get; }
public MySqlBulkLoaderConflictOption ConflictOption { get; set; }
public MySqlConnection Connection { get; set; }
public MySqlTransaction Transaction { get; set; }
public char EscapeCharacter { get; set; }
public List<string> Expressions { get; }
public char FieldQuotationCharacter { get; set; }
Expand Down Expand Up @@ -60,7 +59,6 @@ public MySqlBulkLoader(MySqlConnection connection)
ConflictOption = MySqlBulkLoaderConflictOption.None;
Columns = new List<string>();
Expressions = new List<string>();
Transaction = connection.CurrentTransaction;
}

private string BuildSqlCommand()
Expand Down Expand Up @@ -186,11 +184,11 @@ private async Task<int> LoadAsync(IOBehavior ioBehavior, CancellationToken cance
closeConnection = true;
Connection.Open();
}

try
{
var commandString = BuildSqlCommand();
var cmd = new MySqlCommand(commandString, Connection, Transaction)
var cmd = new MySqlCommand(commandString, Connection, Connection.CurrentTransaction)
{
CommandTimeout = Timeout,
};
Expand Down
72 changes: 72 additions & 0 deletions tests/SideBySide/BulkLoaderSync.cs
Expand Up @@ -245,6 +245,42 @@ public void BulkLoadLocalCsvFileInTransactionWithCommit()
}
}

[Fact]
public void BulkLoadLocalCsvFileBeforeTransactionWithCommit()
{
try
{
m_database.Connection.Open();
var bulkLoader = new MySqlBulkLoader(m_database.Connection)
{
FileName = AppConfig.MySqlBulkLoaderLocalCsvFile,
TableName = m_testTable,
CharacterSet = "UTF8",
NumberOfLinesToSkip = 1,
FieldTerminator = ",",
FieldQuotationCharacter = '"',
FieldQuotationOptional = true,
Local = true,
};
bulkLoader.Expressions.Add("five = UNHEX(five)");
bulkLoader.Columns.AddRange(new[] { "one", "two", "three", "four", "five" });

using (var transaction = m_database.Connection.BeginTransaction())
{
var rowCount = bulkLoader.Load();
Assert.Equal(20, rowCount);

transaction.Commit();
}

Assert.Equal(20, m_database.Connection.ExecuteScalar<int>($@"select count(*) from {m_testTable};"));
}
finally
{
m_database.Connection.Close();
}
}

[Fact]
public void BulkLoadLocalCsvFileInTransactionWithRollback()
{
Expand Down Expand Up @@ -281,6 +317,42 @@ public void BulkLoadLocalCsvFileInTransactionWithRollback()
}
}

[Fact]
public void BulkLoadLocalCsvFileBeforeTransactionWithRollback()
{
try
{
m_database.Connection.Open();
var bulkLoader = new MySqlBulkLoader(m_database.Connection)
{
FileName = AppConfig.MySqlBulkLoaderLocalCsvFile,
TableName = m_testTable,
CharacterSet = "UTF8",
NumberOfLinesToSkip = 1,
FieldTerminator = ",",
FieldQuotationCharacter = '"',
FieldQuotationOptional = true,
Local = true,
};
bulkLoader.Expressions.Add("five = UNHEX(five)");
bulkLoader.Columns.AddRange(new[] { "one", "two", "three", "four", "five" });

using (var transaction = m_database.Connection.BeginTransaction())
{
var rowCount = bulkLoader.Load();
Assert.Equal(20, rowCount);

transaction.Rollback();
}

Assert.Equal(0, m_database.Connection.ExecuteScalar<int>($@"select count(*) from {m_testTable};"));
}
finally
{
m_database.Connection.Close();
}
}

[Fact]
public void BulkLoadMissingFileName()
{
Expand Down

0 comments on commit 29fe8b4

Please sign in to comment.