Module: RR::ConnectionExtenders
- Defined in:
- lib/rubyrep/connection_extenders/connection_extenders.rb,
lib/rubyrep/connection_extenders/jdbc_extender.rb,
lib/rubyrep/connection_extenders/mysql_extender.rb,
lib/rubyrep/connection_extenders/postgresql_extender.rb
Overview
Connection extenders provide additional database specific functionality not coming in the ActiveRecord library. This module itself only provides functionality to register and retrieve such connection extenders.
Defined Under Namespace
Modules: JdbcSQLExtender, MysqlExtender, PostgreSQLExtender Classes: DummyActiveRecord
Constant Summary collapse
- @@use_cache =
true
Class Method Summary collapse
-
.clear_db_connection_cache ⇒ Object
Free up all cached connections.
-
.connection_cache ⇒ Object
Returns the connection cache hash.
-
.connection_cache=(cache) ⇒ Object
Sets a new connection cache.
-
.db_connect(config) ⇒ Object
Creates database connections by calling #db_connect_without_cache with the provided
config
configuration hash. -
.db_connect_without_cache(config) ⇒ Object
Creates an ActiveRecord database connection according to the provided
config
connection hash. -
.extenders ⇒ Object
Returns a Hash of currently registered connection extenders.
-
.install_logger(db_connection, config) ⇒ Object
Installs the configured logger (if any) into the database connection.
-
.register(extender) ⇒ Object
Registers one or multiple connection extender.
-
.use_cache? ⇒ Boolean
Returns the current cache status (
true
if caching is used;false
otherwise). -
.use_db_connection_cache(status) ⇒ Object
If status == true: enable the cache.
Class Method Details
.clear_db_connection_cache ⇒ Object
Free up all cached connections
148 149 150 |
# File 'lib/rubyrep/connection_extenders/connection_extenders.rb', line 148 def self.clear_db_connection_cache @@connection_cache = {} end |
.connection_cache ⇒ Object
Returns the connection cache hash.
95 |
# File 'lib/rubyrep/connection_extenders/connection_extenders.rb', line 95 def self.connection_cache; @@connection_cache; end |
.connection_cache=(cache) ⇒ Object
Sets a new connection cache
98 99 100 |
# File 'lib/rubyrep/connection_extenders/connection_extenders.rb', line 98 def self.connection_cache=(cache) @@connection_cache = cache end |
.db_connect(config) ⇒ Object
Creates database connections by calling #db_connect_without_cache with the provided config
configuration hash. A new database connection is created only if no according cached connection is available.
120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 |
# File 'lib/rubyrep/connection_extenders/connection_extenders.rb', line 120 def self.db_connect(config) if not use_cache? db_connection = db_connect_without_cache config else config_dump = Marshal.dump config.reject {|key, | [:proxy_host, :proxy_port, :logger].include? key} config_checksum = Digest::SHA1.hexdigest(config_dump) @@connection_cache ||= {} db_connection = connection_cache[config_checksum] unless db_connection and db_connection.active? db_connection = db_connect_without_cache config connection_cache[config_checksum] = db_connection end end install_logger db_connection, config db_connection end |
.db_connect_without_cache(config) ⇒ Object
Creates an ActiveRecord database connection according to the provided config
connection hash. Possible values of this parameter are described in ActiveRecord::Base#establish_connection. The database connection is extended with the correct ConnectionExtenders module.
ActiveRecord only allows one database connection per class. (It disconnects the existing database connection if a new connection is established.) To go around this, we delete ActiveRecord’s memory of the existing database connection as soon as it is created.
49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 |
# File 'lib/rubyrep/connection_extenders/connection_extenders.rb', line 49 def self.db_connect_without_cache(config) if RUBY_PLATFORM =~ /java/ adapter = config[:adapter] # As recommended in the activerecord-jdbc-adapter use the jdbc versions # of the Adapters. E. g. instead of "postgresql", "jdbcpostgresql". adapter = 'jdbc' + adapter unless adapter =~ /^jdbc/ DummyActiveRecord.establish_connection(config.merge(:adapter => adapter)) else DummyActiveRecord.establish_connection(config) end connection = DummyActiveRecord.connection # Delete the database connection from ActiveRecords's 'memory' ActiveRecord::Base.connection_handler.connection_pools.delete DummyActiveRecord.name extender = "" if RUBY_PLATFORM =~ /java/ extender = :jdbc elsif ConnectionExtenders.extenders.include? config[:adapter].to_sym extender = config[:adapter].to_sym else raise "No ConnectionExtender available for :#{config[:adapter]}" end connection.extend ConnectionExtenders.extenders[extender] # Hack to get Postgres schema support under JRuby to par with the standard # ruby version if RUBY_PLATFORM =~ /java/ and config[:adapter].to_sym == :postgresql connection.extend RR::ConnectionExtenders::PostgreSQLExtender connection.initialize_search_path end replication_module = ReplicationExtenders.extenders[config[:adapter].to_sym] connection.extend replication_module if replication_module connection end |
.extenders ⇒ Object
Returns a Hash of currently registered connection extenders. (Empty Hash if no connection extenders were defined.)
23 24 25 26 |
# File 'lib/rubyrep/connection_extenders/connection_extenders.rb', line 23 def self.extenders @extenders ||= {} @extenders end |
.install_logger(db_connection, config) ⇒ Object
Installs the configured logger (if any) into the database connection.
-
db_connection
: database connection (as produced by #db_connect) -
config
: database configuration (as provided to #db_connect)
105 106 107 108 109 110 111 112 113 114 |
# File 'lib/rubyrep/connection_extenders/connection_extenders.rb', line 105 def self.install_logger(db_connection, config) if config[:logger] if config[:logger].respond_to?(:debug) logger = config[:logger] else logger = Logger.new(config[:logger]) end db_connection.instance_variable_set :@logger, logger end end |
.register(extender) ⇒ Object
Registers one or multiple connection extender. extender is a Hash with
key:: The adapter symbol as used by ActiveRecord::Connection Adapters, e. g. :postgresql
value:: Name of the module implementing the connection extender
32 33 34 35 |
# File 'lib/rubyrep/connection_extenders/connection_extenders.rb', line 32 def self.register(extender) @extenders ||= {} @extenders.merge! extender end |
.use_cache? ⇒ Boolean
Returns the current cache status (true
if caching is used; false
otherwise).
92 |
# File 'lib/rubyrep/connection_extenders/connection_extenders.rb', line 92 def self.use_cache?; @@use_cache; end |
.use_db_connection_cache(status) ⇒ Object
If status == true: enable the cache. If status == false: don’ use cache Returns the old connection caching status
142 143 144 145 |
# File 'lib/rubyrep/connection_extenders/connection_extenders.rb', line 142 def self.use_db_connection_cache(status) old_status, @@use_cache = @@use_cache, status old_status end |