public async Task <TResult> ExecuteAsync <TResult>(Func <IStorageDbConnection, object[], IDbTransaction, CancellationToken, Task <TResult> > command, object[] args, IsolationLevel il, CancellationToken cancellationToken) { if (command == null) { throw new ArgumentNullException(nameof(command)); } if (args == null) { throw new ArgumentNullException(nameof(args)); } var writer = new StringTextWriter(); writer.WriteAa(); var conn = new StorageDbConnection(await CreateDbConnectionWithOpenAsync(cancellationToken), writer); writer.WriteBb(Identity); var tr = conn.BeginTransaction(il); writer.WriteFf(); try { var result = await command(conn, args, tr, cancellationToken); tr.Commit(); writer.WriteGg(); writer.WriteCc(); return(result); } catch (Exception e) { writer.WriteError(e.Message); tr.Rollback(); writer.WriteHh(); throw new InvalidOperationException("Command failed to execute!", e); } finally { conn.Close(); conn.Dispose(); tr.Dispose(); writer.WriteDd(Identity); writer.WriteEe(); var message = writer.ToStringWithClear(); Logger.Write(message); } }
public async Task ExecuteAsync(Func <IStorageDbConnection, object[], CancellationToken, Task> command, object[] args, CancellationToken cancellationToken) { if (command == null) { throw new ArgumentNullException(nameof(command)); } if (args == null) { throw new ArgumentNullException(nameof(args)); } var writer = new StringTextWriter(); writer.WriteAa(); var conn = new StorageDbConnection(await CreateDbConnectionWithOpenAsync(cancellationToken), writer); writer.WriteBb(Identity); try { await command(conn, args, cancellationToken); writer.WriteCc(); } catch (Exception e) { writer.WriteError(e.Message); throw new InvalidOperationException("Command failed to execute!", e); } finally { conn.Close(); conn.Dispose(); writer.WriteDd(Identity); writer.WriteEe(); var message = writer.ToStringWithClear(); Logger.Write(message); } }