Skip to content

Commit

Permalink
Exposing the transaction used in class Database. This enables to do q…
Browse files Browse the repository at this point in the history
…ueries not supported by rainbow within the same transaction

Closes #1944
  • Loading branch information
kbilsted committed Feb 5, 2024
1 parent 8f36991 commit 128037e
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 17 deletions.
8 changes: 4 additions & 4 deletions Dapper.Rainbow/Database.Async.cs
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,7 @@ public Task<IEnumerable<T>> AllAsync() =>
/// <param name="param">The parameters to use.</param>
/// <returns>The number of rows affected.</returns>
public Task<int> ExecuteAsync(string sql, dynamic param = null) =>
_connection.ExecuteAsync(sql, param as object, _transaction, _commandTimeout);
_connection.ExecuteAsync(sql, param as object, Transaction, _commandTimeout);

/// <summary>
/// Asynchronously queries the current database.
Expand All @@ -98,7 +98,7 @@ public Task<int> ExecuteAsync(string sql, dynamic param = null) =>
/// <param name="param">The parameters to use.</param>
/// <returns>An enumerable of <typeparamref name="T"/> for the rows fetched.</returns>
public Task<IEnumerable<T>> QueryAsync<T>(string sql, dynamic param = null) =>
_connection.QueryAsync<T>(sql, param as object, _transaction, _commandTimeout);
_connection.QueryAsync<T>(sql, param as object, Transaction, _commandTimeout);

/// <summary>
/// Asynchronously queries the current database for a single record.
Expand All @@ -108,7 +108,7 @@ public Task<IEnumerable<T>> QueryAsync<T>(string sql, dynamic param = null) =>
/// <param name="param">The parameters to use.</param>
/// <returns>An enumerable of <typeparamref name="T"/> for the rows fetched.</returns>
public Task<T> QueryFirstOrDefaultAsync<T>(string sql, dynamic param = null) =>
_connection.QueryFirstOrDefaultAsync<T>(sql, param as object, _transaction, _commandTimeout);
_connection.QueryFirstOrDefaultAsync<T>(sql, param as object, Transaction, _commandTimeout);

/// <summary>
/// Perform an asynchronous multi-mapping query with 2 input types.
Expand Down Expand Up @@ -195,7 +195,7 @@ public Task<IEnumerable<TReturn>> QueryAsync<TFirst, TSecond, TThird, TFourth, T
/// <param name="param">The parameters to use.</param>
/// <remarks>Note: each row can be accessed via "dynamic", or by casting to an IDictionary&lt;string,object&gt;</remarks>
public Task<IEnumerable<dynamic>> QueryAsync(string sql, dynamic param = null) =>
_connection.QueryAsync(sql, param as object, _transaction);
_connection.QueryAsync(sql, param as object, Transaction);

/// <summary>
/// Execute a command that returns multiple result sets, and access each in turn.
Expand Down
32 changes: 19 additions & 13 deletions Dapper.Rainbow/Database.cs
Original file line number Diff line number Diff line change
Expand Up @@ -175,7 +175,11 @@ public Table(Database<TDatabase> database, string likelyTableName)

private DbConnection _connection;
private int _commandTimeout;
private DbTransaction _transaction;

/// <summary>
/// Get access to the underlying transaction
/// </summary>
public DbTransaction Transaction;

/// <summary>
/// Get underlying database connection.
Expand Down Expand Up @@ -215,27 +219,29 @@ internal virtual Action<TDatabase> CreateTableConstructorForTable()
/// Begins a transaction in this database.
/// </summary>
/// <param name="isolation">The isolation level to use.</param>
public void BeginTransaction(IsolationLevel isolation = IsolationLevel.ReadCommitted)
/// <returns>The transaction created</returns>
public DbTransaction BeginTransaction(IsolationLevel isolation = IsolationLevel.ReadCommitted)
{
_transaction = _connection.BeginTransaction(isolation);
Transaction = _connection.BeginTransaction(isolation);
return Transaction;
}

/// <summary>
/// Commits the current transaction in this database.
/// </summary>
public void CommitTransaction()
{
_transaction.Commit();
_transaction = null;
Transaction.Commit();
Transaction = null;
}

/// <summary>
/// Rolls back the current transaction in this database.
/// </summary>
public void RollbackTransaction()
{
_transaction.Rollback();
_transaction = null;
Transaction.Rollback();
Transaction = null;
}

/// <summary>
Expand Down Expand Up @@ -336,7 +342,7 @@ private bool TableExists(string name)
if (!string.IsNullOrEmpty(schemaName)) builder.Append("TABLE_SCHEMA = @schemaName AND ");
builder.Append("TABLE_NAME = @name");

return _connection.Query(builder.ToString(), new { schemaName, name }, _transaction).Count() == 1;
return _connection.Query(builder.ToString(), new { schemaName, name }, Transaction).Count() == 1;
}

/// <summary>
Expand All @@ -346,7 +352,7 @@ private bool TableExists(string name)
/// <param name="param">The parameters to use.</param>
/// <returns>The number of rows affected.</returns>
public int Execute(string sql, dynamic param = null) =>
_connection.Execute(sql, param as object, _transaction, _commandTimeout);
_connection.Execute(sql, param as object, Transaction, _commandTimeout);

/// <summary>
/// Queries the current database.
Expand All @@ -357,7 +363,7 @@ public int Execute(string sql, dynamic param = null) =>
/// <param name="buffered">Whether to buffer the results.</param>
/// <returns>An enumerable of <typeparamref name="T"/> for the rows fetched.</returns>
public IEnumerable<T> Query<T>(string sql, dynamic param = null, bool buffered = true) =>
_connection.Query<T>(sql, param as object, _transaction, buffered, _commandTimeout);
_connection.Query<T>(sql, param as object, Transaction, buffered, _commandTimeout);

/// <summary>
/// Queries the current database for a single record.
Expand All @@ -367,7 +373,7 @@ public IEnumerable<T> Query<T>(string sql, dynamic param = null, bool buffered =
/// <param name="param">The parameters to use.</param>
/// <returns>An enumerable of <typeparamref name="T"/> for the rows fetched.</returns>
public T QueryFirstOrDefault<T>(string sql, dynamic param = null) =>
_connection.QueryFirstOrDefault<T>(sql, param as object, _transaction, _commandTimeout);
_connection.QueryFirstOrDefault<T>(sql, param as object, Transaction, _commandTimeout);

/// <summary>
/// Perform a multi-mapping query with 2 input types.
Expand Down Expand Up @@ -455,7 +461,7 @@ public IEnumerable<TReturn> Query<TFirst, TSecond, TThird, TFourth, TFifth, TRet
/// <param name="buffered">Whether the results should be buffered in memory.</param>
/// <remarks>Note: each row can be accessed via "dynamic", or by casting to an IDictionary&lt;string,object&gt;</remarks>
public IEnumerable<dynamic> Query(string sql, dynamic param = null, bool buffered = true) =>
_connection.Query(sql, param as object, _transaction, buffered);
_connection.Query(sql, param as object, Transaction, buffered);

/// <summary>
/// Execute a command that returns multiple result sets, and access each in turn.
Expand All @@ -477,7 +483,7 @@ public virtual void Dispose()
if (connection.State != ConnectionState.Closed)
{
_connection = null;
_transaction = null;
Transaction = null;
connection?.Close();
}
GC.SuppressFinalize(this);
Expand Down

0 comments on commit 128037e

Please sign in to comment.