module PgAdvisoryLocker::ClassMethods

Public Instance Methods

lock_record(key2, &block) click to toggle source

advisory lock for this model, with key2 as argument blocks until advisory lock is release acquires lock on return

if block is passed in, lock/unlock around the block

# File lib/pg_advisory_locker/pg_advisory_locker.rb, line 66
def lock_record(key2, &block)
  return pg_advisory_lock(table_oid, key2, &block)
end
pg_advisory_lock(key1, key2, &block) click to toggle source

pg_advisory_lock - direct access to postgres pg_advisory_lock function key1: int key2: int if block is passed in, lock/unlock around the block

# File lib/pg_advisory_locker/pg_advisory_locker.rb, line 92
def pg_advisory_lock(key1, key2, &block)
  locked = uncached do
    find_by_sql(["select pg_advisory_lock(?, ?)", key1, key2]).first.pg_advisory_lock == "t"
  end
  if block.present?
    begin
      return block.call
    ensure
      pg_advisory_unlock(key1, key2)
    end
  end
  return locked
end
pg_advisory_unlock(key1, key2) click to toggle source

pg_advisory_unlock - direct access to postgres pg_advisory_unlock function key1: int key2: int

on return releases lock

# File lib/pg_advisory_locker/pg_advisory_locker.rb, line 137
def pg_advisory_unlock(key1, key2)
  unlocked = uncached do
    find_by_sql(["select pg_advisory_unlock(?, ?)", key1, key2]).first.pg_advisory_unlock == "t"
  end
  return unlocked
end
pg_try_advisory_lock(key1, key2, &block) click to toggle source

pg_try_advisory_lock - direct access to postgres pg_try_advisory_lock function key1: int key2: int

if lock is acquired, acquires lock and returns true if lock is currently acquired, returns false never blocks

if block is passed in, lock/unlock around the block executing block only if lock is acquired

# File lib/pg_advisory_locker/pg_advisory_locker.rb, line 116
def pg_try_advisory_lock(key1, key2, &block)
  locked = uncached do
    find_by_sql(["select pg_try_advisory_lock(?, ?)", key1, key2]).first.pg_try_advisory_lock == "t"
  end
  if locked
    if block.present?
      begin
        block.call
      ensure
        pg_advisory_unlock(key1, key2)
      end
    end
  end
  return locked
end
table_oid() click to toggle source

table_oid is good unique identifier value for the table We could use a has of the name if the thought there would be no collisions The OID is always unique, so we use it

# File lib/pg_advisory_locker/pg_advisory_locker.rb, line 40
    def table_oid
      if @table_oid.nil?
        sql_table_components = table_name.split('.')
        if sql_table_components.length == 1
          sql_table_components.prepend('public')
        end
        sql = <<-SQL
         SELECT
           pg_class.oid
         FROM
           pg_class,pg_namespace
         WHERE
           pg_namespace.nspname = ? AND
           pg_class.relnamespace = pg_namespace.oid AND
           pg_class.relname = ?
        SQL
        @table_oid = find_by_sql([sql, *sql_table_components]).first.oid.to_i
      end
      return @table_oid
    end
try_lock_record(key2, &block) click to toggle source

advisory try lock for this model, with key2 as argument

if lock is acquired, acquires lock and returns true if lock is currently acquired, returns false never blocks

if block is passed in, lock/unlock around the block executing block only if lock is acquired

# File lib/pg_advisory_locker/pg_advisory_locker.rb, line 78
def try_lock_record(key2, &block)
  return pg_try_advisory_lock(table_oid, key2, &block)
end
unlock_record(key2) click to toggle source

advisory unlock for this model, with key2 as argument on return releases lock

# File lib/pg_advisory_locker/pg_advisory_locker.rb, line 84
def unlock_record(key2)
  return pg_advisory_unlock(table_oid, key2)
end