Module: DynamoidLockable::ClassMethods
- Defined in:
- lib/dynamoid_lockable.rb
Instance Method Summary collapse
- #ensure_lockable_field(name) ⇒ Object
- #lock_config(name) ⇒ Object
- #lockable(lock_name, locker_name: locking_name) ⇒ Object
-
#lockable_fields ⇒ Object
TODO: Make this inheritance safe.
- #lockable_fields=(val) ⇒ Object
- #locking_name ⇒ Object
- #locks_with(base_field, lock_for: DEFAULT_LOCK_TIME, relock_every: lock_for / 3) ⇒ Object
- #unlockable(lock_name, locker_name: locking_name) ⇒ Object
Instance Method Details
#ensure_lockable_field(name) ⇒ Object
124 125 126 |
# File 'lib/dynamoid_lockable.rb', line 124 def ensure_lockable_field(name) raise "Lock #{name} unrecognized" unless lockable_fields.key?(name) end |
#lock_config(name) ⇒ Object
99 100 101 |
# File 'lib/dynamoid_lockable.rb', line 99 def lock_config(name) lockable_fields[name.to_sym] end |
#lockable(lock_name, locker_name: locking_name) ⇒ Object
112 113 114 115 116 117 118 119 120 121 122 |
# File 'lib/dynamoid_lockable.rb', line 112 def lockable(lock_name, locker_name: locking_name) ensure_lockable_field(lock_name) advanced_where do |r| r.send(hash_key).exists? & ( (r.send("#{lock_name}_locked_by") == locker_name) | !r.send("#{lock_name}_locked_until").exists? | (r.send("#{lock_name}_locked_until") < Time.now) ) end end |
#lockable_fields ⇒ Object
TODO: Make this inheritance safe
91 92 93 |
# File 'lib/dynamoid_lockable.rb', line 91 def lockable_fields @lockable_fields ||= {} end |
#lockable_fields=(val) ⇒ Object
95 96 97 |
# File 'lib/dynamoid_lockable.rb', line 95 def lockable_fields=(val) @lockable_fields = val end |
#locking_name ⇒ Object
86 87 88 |
# File 'lib/dynamoid_lockable.rb', line 86 def locking_name Thread.current[:dynamo_lock_name] ||= SecureRandom.uuid end |
#locks_with(base_field, lock_for: DEFAULT_LOCK_TIME, relock_every: lock_for / 3) ⇒ Object
103 104 105 106 107 108 109 110 |
# File 'lib/dynamoid_lockable.rb', line 103 def locks_with(base_field, lock_for: DEFAULT_LOCK_TIME, relock_every: lock_for / 3) self.lockable_fields = lockable_fields.merge( base_field.to_sym => { duration: lock_for, relock_every: relock_every } ) field "#{base_field}_locked_until".to_sym, :datetime field "#{base_field}_locked_by".to_sym, :string end |
#unlockable(lock_name, locker_name: locking_name) ⇒ Object
128 129 130 131 132 133 134 135 |
# File 'lib/dynamoid_lockable.rb', line 128 def unlockable(lock_name, locker_name: locking_name) ensure_lockable_field(lock_name) advanced_where do |r| r.send(self.hash_key).exists? & (r.send("#{lock_name}_locked_by") == locker_name) end end |