class Replicat::Proxy

Constants

REPLICABLE_METHOD_NAMES
REPLICABLE_METHOD_NAMES_REGEXP

Attributes

current_connection_name[RW]
index[W]

Public Class Methods

new(model_class) click to toggle source
# File lib/replicat/proxy.rb, line 12
def initialize(model_class)
  @model_class = model_class
end

Private Instance Methods

clear_query_cache() click to toggle source
# File lib/replicat/proxy.rb, line 68
def clear_query_cache
  master_connection.clear_query_cache
  slave_connection_pool_table.values.map {|pool| pool.connection.clear_query_cache }
end
connection_by_method_name(method_name) click to toggle source
# File lib/replicat/proxy.rb, line 26
def connection_by_method_name(method_name)
  REPLICABLE_METHOD_NAMES_REGEXP === method_name ? slave_connection : master_connection
end
current_connection() click to toggle source
# File lib/replicat/proxy.rb, line 30
def current_connection
  if current_connection_name.to_s == "master"
    master_connection
  else
    slave_connection_pool_table[current_connection_name.to_s].try(:connection) or raise_connection_not_found
  end
end
increment_slave_connection_index() click to toggle source
# File lib/replicat/proxy.rb, line 64
def increment_slave_connection_index
  self.index = (index + 1) % slave_connection_pool_table.size
end
index() click to toggle source
# File lib/replicat/proxy.rb, line 73
def index
  @index ||= rand(slave_connection_pool_table.size)
end
master_connection() click to toggle source
# File lib/replicat/proxy.rb, line 38
def master_connection
  @model_class.connection_without_proxy
end
method_missing(method_name, *args, &block) click to toggle source
# File lib/replicat/proxy.rb, line 18
def method_missing(method_name, *args, &block)
  if current_connection_name
    current_connection.send(method_name, *args, &block)
  else
    connection_by_method_name(method_name).send(method_name, *args, &block)
  end
end
raise_connection_not_found() click to toggle source
# File lib/replicat/proxy.rb, line 56
def raise_connection_not_found
  raise Error, "connection #{current_connection_name} is not found"
end
slave_connection() click to toggle source
# File lib/replicat/proxy.rb, line 42
def slave_connection
  slave_connection_pool.connection
end
slave_connection_index() click to toggle source
# File lib/replicat/proxy.rb, line 60
def slave_connection_index
  index.tap { increment_slave_connection_index }
end
slave_connection_pool() click to toggle source
# File lib/replicat/proxy.rb, line 46
def slave_connection_pool
  slave_connection_pool_table.values[slave_connection_index]
end
slave_connection_pool_table() click to toggle source
# File lib/replicat/proxy.rb, line 50
def slave_connection_pool_table
  @slave_connection_pools ||= @model_class.replications.inject({}) do |table, (name, configuration)|
    table.merge(name => ConnectionPoolCreater.create(configuration))
  end
end