Class: DoubleEntry::Locking::Lock
- Inherits:
-
Object
- Object
- DoubleEntry::Locking::Lock
- Defined in:
- lib/double_entry/locking.rb
Constant Summary collapse
- @@locks =
Hash.new
Instance Method Summary collapse
- #balance_for(account) ⇒ Object
- #ensure_locked! ⇒ Object
-
#in_a_locked_transaction? ⇒ Boolean
Return true if we're inside a lock_accounts block.
-
#initialize(accounts) ⇒ Lock
constructor
A new instance of Lock.
-
#perform_lock(&block) ⇒ Object
Lock the given accounts, creating account balance records for them if needed.
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(account) ensure_locked! locks[account] end |
#ensure_locked! ⇒ Object
79 80 81 82 83 |
# File 'lib/double_entry/locking.rb', line 79 def ensure_locked! @accounts.each do |account| raise LockNotHeld.new(account) unless have_lock?(account) end end |
#in_a_locked_transaction? ⇒ Boolean
Return true if we're inside a lock_accounts block.
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) create_missing_account_balances unless lock_and_call(&block) raise LockDisaster end end end |