executeBlock<R> static method

FutureOr<R> executeBlock<R>(
  1. FutureOr<R> block(
    1. Transaction transaction
    ), {
  2. Transaction? transaction,
  3. bool allowExecutingTransaction = true,
})

Executes block inside a Transaction and commits it.

  • If the parameter transaction is provided it will be used as the Transaction instance.
  • If allowExecutingTransaction is true (default) and transaction is not provided executingTransaction will be used.
  • If transaction is null and allowExecutingTransaction is false, or no executingTransaction can be found, a new Transaction instance will be created.
  • See execute.

Implementation

static FutureOr<R> executeBlock<R>(
    FutureOr<R> Function(Transaction transaction) block,
    {Transaction? transaction,
    bool allowExecutingTransaction = true}) {
  if (transaction == null && allowExecutingTransaction) {
    transaction = executingTransaction;
  }

  if (transaction != null) {
    return block(transaction);
  }

  transaction = Transaction();

  return transaction
      ._executeImpl(() => block(transaction!))
      .resolveMapped((r) {
    if (r == null) {
      try {
        return r as R;
      } catch (e, s) {
        var abortError =
            transaction!.abortError ?? transaction._resolveAbortError(e, s);
        var abortStackTrace = abortError.errorStackTrace;
        if (abortStackTrace != null) {
          Error.throwWithStackTrace(abortError, abortStackTrace);
        } else {
          throw abortError;
        }
      }
    }

    return r;
  });
}