Module: DynamoidLockable::ClassMethods

Defined in:
lib/dynamoid_lockable.rb

Instance Method Summary collapse

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_fieldsObject

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_nameObject



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