Module: Mimi::DB::Lock

Includes:
Core::Module
Defined in:
lib/mimi/db/lock.rb,
lib/mimi/db/lock/mysql_lock.rb,
lib/mimi/db/lock/sqlite_lock.rb,
lib/mimi/db/lock/postgresql_lock.rb

Defined Under Namespace

Classes: MysqlLock, NotAvailable, PostgresqlLock, SqliteLock

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.configureObject



22
23
24
25
# File 'lib/mimi/db/lock.rb', line 22

def self.configure(*)
  super
  Mimi::DB.extend(self)
end

.module_pathObject



18
19
20
# File 'lib/mimi/db/lock.rb', line 18

def self.module_path
  Pathname.new(__dir__).join('lock')
end

.startObject



27
28
29
30
31
32
# File 'lib/mimi/db/lock.rb', line 27

def self.start
  require_relative 'lock/postgresql_lock'
  require_relative 'lock/mysql_lock'
  require_relative 'lock/sqlite_lock'
  super
end

Instance Method Details

#lock(name, opts = {}, &block) ⇒ true, Falsey

Obtains a named lock

Parameters:

  • name (String, Symbol)
  • opts (Hash) (defaults to: {})

Options Hash (opts):

  • :timeout (Numeric, nil)

    Timeout in seconds

  • :temporary (Boolean)

    Remove the lock

Returns:

  • (true)

    if the lock was obtained and the block executed

  • (Falsey)

    if the lock was NOT obtained



44
45
46
47
48
49
# File 'lib/mimi/db/lock.rb', line 44

def lock(name, opts = {}, &block)
  lock!(name, opts, &block)
  true
rescue NotAvailable
  nil
end

#lock!(name, opts = {}, &block) ⇒ Object



51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
# File 'lib/mimi/db/lock.rb', line 51

def lock!(name, opts = {}, &block)
  raise 'Not implemented'

  # FIXME: migrate Mimi::DB::Lock to Sequel

  opts = Mimi::DB::Lock.module_options[:default_lock_options].merge(opts.dup)
  adapter_name = ActiveRecord::Base.connection.adapter_name.downcase.to_sym
  case adapter_name
  when :postgresql, :empostgresql, :postgis
    Mimi::DB::Lock::PostgresqlLock.new(name, opts).execute(&block)
  when :mysql, :mysql2
    Mimi::DB::Lock::MysqlLock.new(name, opts).execute(&block)
  when :sqlite
    Mimi::DB::Lock::SqliteLock.new(name, opts).execute(&block)
  else
    raise "Named locks not supported by the adapter: #{adapter_name}"
  end
end