module WithAdvisoryLock::Concern::ClassMethods

Public Instance Methods

advisory_lock_exists?(lock_name) click to toggle source
# File lib/with_advisory_lock/concern.rb, line 20
def advisory_lock_exists?(lock_name)
  impl = impl_class.new(connection, lock_name, 0)
  impl.already_locked? || !impl.yield_with_lock.lock_was_acquired?
end
current_advisory_lock() click to toggle source
# File lib/with_advisory_lock/concern.rb, line 25
def current_advisory_lock
  lock_stack_key = WithAdvisoryLock::Base.lock_stack.first
  lock_stack_key && lock_stack_key[0]
end
with_advisory_lock(lock_name, options = {}, &block) click to toggle source
# File lib/with_advisory_lock/concern.rb, line 9
def with_advisory_lock(lock_name, options = {}, &block)
  result = with_advisory_lock_result(lock_name, options, &block)
  result.lock_was_acquired? ? result.result : false
end
with_advisory_lock_result(lock_name, options = {}, &block) click to toggle source
# File lib/with_advisory_lock/concern.rb, line 14
def with_advisory_lock_result(lock_name, options = {}, &block)
  class_options = options.extract!(:force_nested_lock_support) if options.respond_to?(:fetch)
  impl = impl_class(class_options).new(connection, lock_name, options)
  impl.with_advisory_lock_if_needed(&block)
end

Private Instance Methods

impl_class(options = nil) click to toggle source
# File lib/with_advisory_lock/concern.rb, line 32
def impl_class(options = nil)
  adapter = WithAdvisoryLock::DatabaseAdapterSupport.new(connection)
  if adapter.postgresql?
    WithAdvisoryLock::PostgreSQL
  elsif adapter.mysql?
    nested_lock = if options.respond_to?(:fetch) && [true, false].include?(options.fetch(:force_nested_lock_support, nil))
                    options.fetch(:force_nested_lock_support)
                  else
                    adapter.mysql_nested_lock_support?
                  end

    if nested_lock
      WithAdvisoryLock::MySQL
    else
      WithAdvisoryLock::MySQLNoNesting
    end
  else
    WithAdvisoryLock::Flock
  end
end