class Granite::Action::TransactionManager::TransactionsStack

A class to manage transaction callbacks stack.

Attributes

depth[R]

Public Class Methods

new() click to toggle source
# File lib/granite/action/transaction_manager/transactions_stack.rb, line 8
def initialize
  @callbacks = []
  @depth = 0
end

Public Instance Methods

add_callback(callback) click to toggle source
# File lib/granite/action/transaction_manager/transactions_stack.rb, line 23
def add_callback(callback)
  fail 'Start a transaction before you add callbacks on it' if depth.zero?

  @callbacks.last << callback
end
callbacks() click to toggle source
# File lib/granite/action/transaction_manager/transactions_stack.rb, line 29
def callbacks
  @callbacks.flatten
end
transaction() { || ... } click to toggle source
# File lib/granite/action/transaction_manager/transactions_stack.rb, line 13
def transaction
  start_new!
  result = yield
  finish_current!
  result
rescue StandardError, ScriptError
  rollback_current!
  raise
end

Private Instance Methods

finish_current(result) click to toggle source
# File lib/granite/action/transaction_manager/transactions_stack.rb, line 48
def finish_current(result)
  fail ArgumentError, 'No current transaction' if @depth.zero?

  @depth -= 1

  if result
    current = @callbacks.pop
    previous = @callbacks.pop
    @callbacks << [previous, current].flatten.compact
  else
    @callbacks.pop
  end
end
finish_current!() click to toggle source
# File lib/granite/action/transaction_manager/transactions_stack.rb, line 40
def finish_current!
  finish_current(true)
end
rollback_current!() click to toggle source
# File lib/granite/action/transaction_manager/transactions_stack.rb, line 44
def rollback_current!
  finish_current(false)
end
start_new!() click to toggle source
# File lib/granite/action/transaction_manager/transactions_stack.rb, line 35
def start_new!
  @depth += 1
  @callbacks << []
end