Class: DoubleEntry::Locking::Lock

Inherits:
Object
  • Object
show all
Defined in:
lib/double_entry/locking.rb

Constant Summary collapse

@@locks =
Hash.new

Instance Method Summary collapse

Constructor Details

#initialize(accounts) ⇒ Lock

Returns a new instance of Lock.



56
57
58
59
# File 'lib/double_entry/locking.rb', line 56

def initialize(accounts)
  # Make sure we always lock in the same order, to avoid deadlocks.
  @accounts = accounts.flatten.sort
end

Instance Method Details

#balance_for(account) ⇒ Object



85
86
87
88
89
# File 'lib/double_entry/locking.rb', line 85

def balance_for()
  ensure_locked!

  locks[]
end

#ensure_locked!Object



79
80
81
82
83
# File 'lib/double_entry/locking.rb', line 79

def ensure_locked!
  @accounts.each do ||
    raise LockNotHeld.new() unless have_lock?()
  end
end

#in_a_locked_transaction?Boolean

Return true if we're inside a lock_accounts block.

Returns:

  • (Boolean)


75
76
77
# File 'lib/double_entry/locking.rb', line 75

def in_a_locked_transaction?
  !locks.nil?
end

#perform_lock(&block) ⇒ Object

Lock the given accounts, creating account balance records for them if needed.



63
64
65
66
67
68
69
70
71
72
# File 'lib/double_entry/locking.rb', line 63

def perform_lock(&block)
  ensure_outermost_transaction!

  unless lock_and_call(&block)
    
    unless lock_and_call(&block)
      raise LockDisaster
    end
  end
end