class Hijacker::Database

Public Class Methods

connect_each(sites = all.map(&:database)) { |db| ... } click to toggle source
# File lib/hijacker/database.rb, line 102
def self.connect_each(sites = all.map(&:database))
  original_database = Hijacker.current_client
  begin
    sites.each do |db|
      begin
        Hijacker.connect_to_master(db)
      rescue MissingDatabaseError
        next
      end
      yield db
    end
  ensure
    begin
      Hijacker.connect_to_master(original_database)
    rescue MissingDatabaseError
    end
  end
end
connect_to_each_shared_site(&block) click to toggle source
# File lib/hijacker/database.rb, line 77
def self.connect_to_each_shared_site(&block)
  connect_each(find_shared_sites_for(Hijacker.current_client), &block)
end
connect_to_each_sister_site(&block) click to toggle source
# File lib/hijacker/database.rb, line 81
def self.connect_to_each_sister_site(&block)
  sites = find_shared_sites_for(Hijacker.current_client)
  sites.delete(Hijacker.current_client)
  connect_each(sites, &block)
end
count_each(options = {}, &blk) click to toggle source
# File lib/hijacker/database.rb, line 121
def self.count_each(options = {}, &blk)
  acc = {}

  if options.fetch(:progress, true)
    require 'progress'
    Progress.start("Counting...", count) do
      connect_each do |db|
        count = blk.call
        acc[db] = count if count > 0
        Progress.step
      end
    end
  else
    connect_each do |db|
      count = blk.call
      acc[db] = count if count > 0
    end
  end

  if options.fetch(:print, true)
    width = acc.keys.map(&:length).max
    acc.sort_by(&:last).each do |db, count|
      puts("%#{width}s: %s" % [db, count])
    end
  end

  acc
end
current() click to toggle source
# File lib/hijacker/database.rb, line 49
def self.current
  find(:first, :conditions => {:database => Hijacker.current_client})
end
disabled_databases() click to toggle source
# File lib/hijacker/database.rb, line 150
def self.disabled_databases
  Hijacker::Database.connection.select_values("SELECT `database_name` FROM `disabled_databases`")
end
find_by_name(name) click to toggle source
# File lib/hijacker/database.rb, line 45
def self.find_by_name(name)
  find_by_database(name)
end
find_master_and_sister_for(client) click to toggle source

always returns a master, sister can be nil

# File lib/hijacker/database.rb, line 65
def self.find_master_and_sister_for(client)
  master = self.find_master_for(client)
  sister = master.nil? ? nil : client
  master ||= client

  return master, sister
end
find_master_for(client) click to toggle source

returns a string or nil

# File lib/hijacker/database.rb, line 54
def self.find_master_for(client)
  @masters ||= {}
  @masters[client] ||= self.connection.select_values(
      "SELECT master.database "\
      "FROM `databases` AS master, `databases` AS sister "\
      "WHERE sister.database = #{ActiveRecord::Base.connection.quote(client)} "\
      "AND sister.master_id = master.id"
    ).first
end
find_shared_sites_for(client) click to toggle source
# File lib/hijacker/database.rb, line 87
def self.find_shared_sites_for(client)
  @shared_sites ||= {}
  return @shared_sites[client] if @shared_sites[client].present?

  current = self.find(:first, :conditions => {:database => client})
  master_id = current.master_id || current.id

  @shared_sites[client] = self.connection.select_values(
    "SELECT `database`
    FROM `databases`
    WHERE master_id = '#{master_id}' OR id = '#{master_id}'
    ORDER BY id"
  )
end
shared_sites() click to toggle source
# File lib/hijacker/database.rb, line 73
def self.shared_sites
  self.find_shared_sites_for(Hijacker.current_client)
end

Private Class Methods

catch_missing_database(&block) click to toggle source
# File lib/hijacker/database.rb, line 165
def self.catch_missing_database(&block)
  block.call
end

Public Instance Methods

disable!() click to toggle source
# File lib/hijacker/database.rb, line 154
def disable!
  Hijacker::Database.connection.
    execute("REPLACE INTO `disabled_databases` (`database_name`) VALUES ('#{database}')")
end
enable!() click to toggle source
# File lib/hijacker/database.rb, line 159
def enable!
  Hijacker::Database.connection.
    execute("DELETE FROM `disabled_databases` WHERE `database_name` = '#{database}'")
end
sister?() click to toggle source
# File lib/hijacker/database.rb, line 41
def sister?
  master_id.present?
end