2007-01-22 14:43:50 +01:00
module ActiveRecord
class Base
class ConnectionSpecification #:nodoc:
attr_reader :config , :adapter_method
def initialize ( config , adapter_method )
@config , @adapter_method = config , adapter_method
end
end
2009-02-04 21:26:08 +01:00
##
# :singleton-method:
2008-10-27 07:47:01 +01:00
# The connection handler
cattr_accessor :connection_handler , :instance_writer = > false
@@connection_handler = ConnectionAdapters :: ConnectionHandler . new
2007-01-22 14:43:50 +01:00
# Returns the connection currently associated with the class. This can
# also be used to "borrow" the connection to do database work that isn't
# easily done without going straight to SQL.
def connection
self . class . connection
end
# Establishes the connection to the database. Accepts a hash as input where
2008-05-18 06:22:34 +02:00
# the <tt>:adapter</tt> key must be specified with the name of a database adapter (in lower-case)
2007-01-22 14:43:50 +01:00
# example for regular databases (MySQL, Postgresql, etc):
#
# ActiveRecord::Base.establish_connection(
# :adapter => "mysql",
# :host => "localhost",
# :username => "myuser",
# :password => "mypass",
# :database => "somedatabase"
# )
#
# Example for SQLite database:
#
# ActiveRecord::Base.establish_connection(
# :adapter => "sqlite",
# :database => "path/to/dbfile"
# )
#
2008-06-02 08:35:38 +02:00
# Also accepts keys as strings (for parsing from YAML for example):
2008-05-18 06:22:34 +02:00
#
2007-01-22 14:43:50 +01:00
# ActiveRecord::Base.establish_connection(
# "adapter" => "sqlite",
# "database" => "path/to/dbfile"
# )
#
# The exceptions AdapterNotSpecified, AdapterNotFound and ArgumentError
# may be returned on an error.
def self . establish_connection ( spec = nil )
case spec
when nil
raise AdapterNotSpecified unless defined? RAILS_ENV
establish_connection ( RAILS_ENV )
when ConnectionSpecification
2008-10-27 07:47:01 +01:00
@@connection_handler . establish_connection ( name , spec )
2007-01-22 14:43:50 +01:00
when Symbol , String
if configuration = configurations [ spec . to_s ]
establish_connection ( configuration )
else
raise AdapterNotSpecified , " #{ spec } database is not configured "
end
else
spec = spec . symbolize_keys
unless spec . key? ( :adapter ) then raise AdapterNotSpecified , " database configuration does not specify adapter " end
2007-12-21 08:48:59 +01:00
begin
require 'rubygems'
gem " activerecord- #{ spec [ :adapter ] } -adapter "
require " active_record/connection_adapters/ #{ spec [ :adapter ] } _adapter "
rescue LoadError
begin
require " active_record/connection_adapters/ #{ spec [ :adapter ] } _adapter "
rescue LoadError
raise " Please install the #{ spec [ :adapter ] } adapter: `gem install activerecord- #{ spec [ :adapter ] } -adapter` ( #{ $! } ) "
end
end
2007-01-22 14:43:50 +01:00
adapter_method = " #{ spec [ :adapter ] } _connection "
2007-12-21 08:48:59 +01:00
if ! respond_to? ( adapter_method )
raise AdapterNotFound , " database configuration specifies nonexistent #{ spec [ :adapter ] } adapter "
end
2007-01-22 14:43:50 +01:00
remove_connection
establish_connection ( ConnectionSpecification . new ( spec , adapter_method ) )
end
end
2008-10-27 07:47:01 +01:00
class << self
# Deprecated and no longer has any effect.
def allow_concurrency
ActiveSupport :: Deprecation . warn ( " ActiveRecord::Base.allow_concurrency has been deprecated and no longer has any effect. Please remove all references to allow_concurrency. " )
2007-01-22 14:43:50 +01:00
end
2008-10-27 07:47:01 +01:00
# Deprecated and no longer has any effect.
def allow_concurrency = ( flag )
ActiveSupport :: Deprecation . warn ( " ActiveRecord::Base.allow_concurrency= has been deprecated and no longer has any effect. Please remove all references to allow_concurrency=. " )
end
2007-01-22 14:43:50 +01:00
2008-10-27 07:47:01 +01:00
# Deprecated and no longer has any effect.
def verification_timeout
ActiveSupport :: Deprecation . warn ( " ActiveRecord::Base.verification_timeout has been deprecated and no longer has any effect. Please remove all references to verification_timeout. " )
end
2007-01-22 14:43:50 +01:00
2008-10-27 07:47:01 +01:00
# Deprecated and no longer has any effect.
def verification_timeout = ( flag )
ActiveSupport :: Deprecation . warn ( " ActiveRecord::Base.verification_timeout= has been deprecated and no longer has any effect. Please remove all references to verification_timeout=. " )
end
2007-01-22 14:43:50 +01:00
2008-10-27 07:47:01 +01:00
# Returns the connection currently associated with the class. This can
# also be used to "borrow" the connection to do database work unrelated
# to any of the specific Active Records.
def connection
retrieve_connection
2007-01-22 14:43:50 +01:00
end
2008-10-27 07:47:01 +01:00
def connection_pool
connection_handler . retrieve_connection_pool ( self )
2007-01-22 14:43:50 +01:00
end
2008-10-27 07:47:01 +01:00
def retrieve_connection
connection_handler . retrieve_connection ( self )
end
2009-02-04 21:26:08 +01:00
# Returns true if +ActiveRecord+ is connected.
2008-10-27 07:47:01 +01:00
def connected?
connection_handler . connected? ( self )
end
def remove_connection ( klass = self )
connection_handler . remove_connection ( klass )
end
delegate :clear_active_connections! , :clear_reloadable_connections! ,
:clear_all_connections! , :verify_active_connections! , :to = > :connection_handler
2007-01-22 14:43:50 +01:00
end
end
end