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

Class Method Details

.clear_db_connection_cacheObject

Free up all cached connections



161
162
163
# File 'lib/rubyrep/connection_extenders/connection_extenders.rb', line 161

def self.clear_db_connection_cache
  @@connection_cache = {}
end

.connection_cacheObject

Returns the connection cache hash.



100
# File 'lib/rubyrep/connection_extenders/connection_extenders.rb', line 100

def self.connection_cache; @@connection_cache; end

.connection_cache=(cache) ⇒ Object

Sets a new connection cache



103
104
105
# File 'lib/rubyrep/connection_extenders/connection_extenders.rb', line 103

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.



133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
# File 'lib/rubyrep/connection_extenders/connection_extenders.rb', line 133

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.



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
88
89
90
91
92
# File 'lib/rubyrep/connection_extenders/connection_extenders.rb', line 54

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

.extendersObject

Returns a Hash of currently registered connection extenders. (Empty Hash if no connection extenders were defined.)



28
29
30
31
# File 'lib/rubyrep/connection_extenders/connection_extenders.rb', line 28

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)



110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
# File 'lib/rubyrep/connection_extenders/connection_extenders.rb', line 110

def self.install_logger(db_connection, config)
  if config[:logger]
    if config[:logger].respond_to?(:debug)
      logger = config[:logger]
    else
      logger = ActiveSupport::BufferedLogger.new(config[:logger])
    end
    db_connection.instance_variable_set :@logger, logger
    if ActiveSupport.const_defined?(:Notifications)
      connection_object_id = db_connection.object_id
      db_connection.log_subscriber = ActiveSupport::Notifications.subscribe("sql.active_record") do |name, start, finish, id, payload|
        if payload[:connection_id] == connection_object_id and logger.debug?
          logger.debug payload[:sql].squeeze(" ")
        end
      end
    end
  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


37
38
39
40
# File 'lib/rubyrep/connection_extenders/connection_extenders.rb', line 37

def self.register(extender)
  @extenders ||= {}
  @extenders.merge! extender
end

.use_cache?Boolean

Returns the current cache status (true if caching is used; false otherwise).

Returns:

  • (Boolean)


97
# File 'lib/rubyrep/connection_extenders/connection_extenders.rb', line 97

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



155
156
157
158
# File 'lib/rubyrep/connection_extenders/connection_extenders.rb', line 155

def self.use_db_connection_cache(status)
  old_status, @@use_cache = @@use_cache, status
  old_status
end