class Tango::DatabaseLocker

Database locker in form of .lock file

@author Mckomo

Attributes

lock_path[R]

Public Class Methods

new( candidates = [], lock_path = "./tmp/database.lock" ) click to toggle source

Constructor of DatabaseLocker

@param candidates [Array] List of databases to be blocked @param lock_path [String] @return [Tango::DatabaseLocker]

# File lib/tango/database_locker.rb, line 15
def initialize( candidates = [], lock_path = "./tmp/database.lock" )
  @candidates = candidates
  @lock_path = lock_path
end

Public Instance Methods

lock( database ) click to toggle source

Lock given database @example

unlocked = database_locker.unlocked # Find unlocked database
connect_to_db( unlocked )           # Connect to unlocked database
edit_db_data()                      # Change database data
database_locker.lock( unlocked )    # Lock database to be sure that any changes wont be made

@param database [String] @return [Tango::DatabaseLocker]

# File lib/tango/database_locker.rb, line 36
def lock( database )
  
  @unlocked = nil
  
  File.open( lock_path, "w" ) do |f|
    f.write( database )
  end
  
  self
  
end
unlocked() click to toggle source

Return name of unlocked database

return [String]

# File lib/tango/database_locker.rb, line 23
def unlocked
  @unlocked ||= find_unlocked
end

Private Instance Methods

find_unlocked() click to toggle source

Find unlocked database (with .lock file on mind)

@return [String]

# File lib/tango/database_locker.rb, line 53
def find_unlocked
  
  lock = File.open( lock_path, 'a+' ) { |f| f.read.strip.gsub(/\s+/, ' ') }
  
  # If some database was locked use next one
  unless lock.empty? or ! @candidates.include?( lock )
    @candidates.at( @candidates.index( lock ).next % @candidates.length )
  # Otherwise return first one
  else
    @candidates.first
  end
  
end