/// <summary>
 /// Creates/Rollbacks/Disposes Transaction
 /// </summary>
 /// <param name="body">Use Transaction.</param>
 /// <param name="this">Desired connection source.</param>
 /// <param name="token">Cancellation Token.</param>
 private static void Transaction(this IConnectionSource @this, Action <Transaction> body,
                                 CancellationToken token)
 {
     @this.Transaction(tran =>
     {
         body(tran);
         return(0);
     }, token);
 }
        /// <summary>
        /// Creates/Rollbacks/Disposes Transaction
        /// </summary>
        /// <param name="body">Use Transaction.</param>
        /// <param name="this">Desired connection source.</param>
        /// <param name="token">Cancellation Token.</param>
        /// <typeparam name="T">Generic Type T.</typeparam>
        /// <returns>Query Results of Type T.</returns>
        private static T Transaction <T>(this IConnectionSource @this, Func <Transaction, T> body, CancellationToken token)
        {
            if (body.Method.GetCustomAttribute(typeof(AsyncStateMachineAttribute)) != null)
            {
                throw new InvalidOperationException("Async Lambdas not supported, please use a Pool.");
            }
            var transaction = @this as ManagedTransaction;
            var ts          = @this as IPool;
            var tran        = transaction ?? @this?.Transaction() ?? new Transaction(ContextController.DefaultContext)
            {
                Token = token
            };
            // ReSharper disable once ConditionIsAlwaysTrueOrFalse
            var handleTransaction = transaction == null && ts == null && @this == null;
            var conn = tran.Connection;

            if (conn.State == ConnectionState.Closed)
            {
                conn.Open();
            }
            tran.OnTransactionCreated(tran);
            if (tran.DbTransaction == null)
            {
                tran.DbTransaction = conn.BeginTransaction();
            }
            try
            {
                var res = body(tran);
                if (handleTransaction)
                {
                    tran.Commit();
                }
                return(res);
            }
            catch (Exception)
            {
                if (handleTransaction)
                {
                    tran.Rollback();
                }
                throw;
            }
            finally
            {
                if (handleTransaction)
                {
                    tran.Dispose();
                    conn.Close();
                    conn.Dispose();
                }
            }
        }
 /// <summary>
 /// Creates/Rollbacks/Disposes Transaction
 /// </summary>
 /// <param name="body">Use Transaction.</param>
 /// <param name="this">Desired connection source.</param>
 /// <param name="token">Cancellation Token.</param>
 /// <returns>Awaitable Task</returns>
 public static Task TransactionAsync(this IConnectionSource @this, Action <Transaction> body,
                                     CancellationToken token)
 {
     return(Task.Run(() => @this.Transaction(body, token), token));
 }
 /// <summary>
 /// Creates/Rollbacks/Disposes Transaction
 /// </summary>
 /// <param name="body">Use Transaction.</param>
 /// <param name="this">Desired connection source.</param>
 // ReSharper disable once MemberCanBePrivate.Global
 public static void Transaction(this IConnectionSource @this, Action <Transaction> body)
 {
     @this.Transaction(body, CancellationToken.None);
 }
 /// <summary>
 /// Creates/Rollbacks/Disposes Transaction
 /// </summary>
 /// <param name="body">Use Transaction.</param>
 /// <param name="this">Desired connection source.</param>
 /// <typeparam name="T">Generic Type T.</typeparam>
 /// <returns>Query Results of Type T.</returns>
 // ReSharper disable once MemberCanBePrivate.Global
 public static T Transaction <T>(this IConnectionSource @this, Func <Transaction, T> body)
 {
     return(@this.Transaction(body, CancellationToken.None));
 }
Exemple #6
0
 // ReSharper disable once MemberCanBePrivate.Global
 /// <summary>
 /// Executes SqlCommand and returns Result.
 /// </summary>
 /// <param name="this">Desired IConnectionSource.</param>
 /// <returns>Database Query Result of Type T.</returns>
 public static ICommand Query(this IConnectionSource @this)
 {
     return(@this.Transaction(tran => new Command("", tran)));
 }
Exemple #7
0
 // ReSharper disable once MemberCanBePrivate.Global
 /// <summary>
 /// Executes SqlCommand and returns Result.
 /// </summary>
 /// <param name="this">Desired IConnectionSource.</param>
 /// <param name="database">Name of the database.</param>
 /// <returns>Database Query Result of Type T.</returns>
 public static ICommand Query(this IConnectionSource @this, string database)
 {
     return(@this.Transaction(database).Query());
 }