module DbCharmer::ConnectionFactory

Public Class Methods

abstract_connection_class_name(connection_name) click to toggle source

Generates unique names for our abstract AR classes

# File lib/db_charmer/connection_factory.rb, line 78
def self.abstract_connection_class_name(connection_name)
  conn_name_klass = connection_name.to_s.gsub(/\W+/, '_').camelize
  thread = Thread.current.object_id.abs # need to make sure it is non-negative
  "::AutoGeneratedAbstractConnectionClass#{conn_name_klass}ForThread#{thread}"
end
connect(connection_name, should_exist = true) click to toggle source

Establishes connection or return an existing one from cache

# File lib/db_charmer/connection_factory.rb, line 22
def self.connect(connection_name, should_exist = true)
  connection_name = connection_name.to_s
  connection_classes[connection_name] ||= establish_connection(connection_name, should_exist)
end
connect_to_db(connection_name, config) click to toggle source

Establishes connection or return an existing one from cache (not using AR database configs)

# File lib/db_charmer/connection_factory.rb, line 28
def self.connect_to_db(connection_name, config)
  connection_name = connection_name.to_s
  connection_classes[connection_name] ||= establish_connection_to_db(connection_name, config)
end
connection_classes() click to toggle source
# File lib/db_charmer/connection_factory.rb, line 9
def self.connection_classes
  Thread.current[:db_charmer_generated_connection_classes] ||= {}
end
connection_classes=(val) click to toggle source
# File lib/db_charmer/connection_factory.rb, line 13
def self.connection_classes=(val)
  Thread.current[:db_charmer_generated_connection_classes] = val
end
establish_connection(connection_name, should_exist = true) click to toggle source

Establish connection with a specified name

# File lib/db_charmer/connection_factory.rb, line 34
def self.establish_connection(connection_name, should_exist = true)
  abstract_class = generate_abstract_class(connection_name, should_exist)
  DbCharmer::ConnectionProxy.new(abstract_class, connection_name)
end
establish_connection_to_db(connection_name, config) click to toggle source

Establish connection with a specified name (not using AR database configs)

# File lib/db_charmer/connection_factory.rb, line 40
def self.establish_connection_to_db(connection_name, config)
  abstract_class = generate_abstract_class_for_db(connection_name, config)
  DbCharmer::ConnectionProxy.new(abstract_class, connection_name)
end
generate_abstract_class(connection_name, should_exist = true) click to toggle source

Generate an abstract AR class with specified connection established

# File lib/db_charmer/connection_factory.rb, line 46
def self.generate_abstract_class(connection_name, should_exist = true)
  # Generate class
  klass = generate_empty_abstract_ar_class(abstract_connection_class_name(connection_name))

  # Establish connection
  klass.establish_real_connection_if_exists(connection_name.to_sym, !!should_exist)

  # Return the class
  return klass
end
generate_abstract_class_for_db(connection_name, config) click to toggle source

Generate an abstract AR class with specified connection established (not using AR database configs)

# File lib/db_charmer/connection_factory.rb, line 58
def self.generate_abstract_class_for_db(connection_name, config)
  # Generate class
  klass = generate_empty_abstract_ar_class(abstract_connection_class_name(connection_name))

  # Establish connection
  klass.establish_connection(config)

  # Return the class
  return klass
end
generate_empty_abstract_ar_class(klass) click to toggle source
# File lib/db_charmer/connection_factory.rb, line 69
def self.generate_empty_abstract_ar_class(klass)
  # Define class
  module_eval "class #{klass} < ::ActiveRecord::Base; self.abstract_class = true; end"

  # Return class
  klass.constantize
end
reset!() click to toggle source
# File lib/db_charmer/connection_factory.rb, line 17
def self.reset!
  self.connection_classes = {}
end