mirror of
https://github.com/github/rails.git
synced 2026-04-26 03:00:59 -04:00
connection pool can cache column, table, and primary key information
This commit is contained in:
@@ -58,6 +58,7 @@ module ActiveRecord
|
||||
# before giving up and raising a timeout error (default 5 seconds).
|
||||
class ConnectionPool
|
||||
attr_reader :spec, :connections
|
||||
attr_reader :columns, :columns_hash, :primary_keys
|
||||
|
||||
# Creates a new ConnectionPool object. +spec+ is a ConnectionSpecification
|
||||
# object which describes database connection information (e.g. adapter,
|
||||
@@ -81,6 +82,39 @@ module ActiveRecord
|
||||
|
||||
@connections = []
|
||||
@checked_out = []
|
||||
|
||||
@columns = Hash.new do |h, table_name|
|
||||
h[table_name] = with_connection do |conn|
|
||||
conn.columns(table_name, "#{table_name} Columns")
|
||||
end
|
||||
end
|
||||
|
||||
@columns_hash = Hash.new do |h, table_name|
|
||||
h[table_name] = Hash[columns[table_name].map { |col|
|
||||
[col.name, col]
|
||||
}]
|
||||
end
|
||||
|
||||
@primary_keys = Hash.new do |h, table_name|
|
||||
h[table_name] = with_connection do |conn|
|
||||
if conn.table_exists?(table_name)
|
||||
conn.primary_key(table_name)
|
||||
else
|
||||
'id'
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
# Clears out internal caches:
|
||||
#
|
||||
# * columns
|
||||
# * columns_hash
|
||||
# * primary_keys
|
||||
def clear_cache!
|
||||
@columns.clear
|
||||
@columns_hash.clear
|
||||
@primary_keys.clear
|
||||
end
|
||||
|
||||
# Retrieve the connection associated with the current thread, or call
|
||||
|
||||
@@ -3,6 +3,41 @@ require "cases/helper"
|
||||
module ActiveRecord
|
||||
module ConnectionAdapters
|
||||
class ConnectionPoolTest < ActiveRecord::TestCase
|
||||
def setup
|
||||
# Keep a duplicate pool so we do not bother others
|
||||
@pool = ConnectionPool.new ActiveRecord::Base.connection_pool.spec
|
||||
end
|
||||
|
||||
def test_pool_caches_columns
|
||||
columns = @pool.columns['posts']
|
||||
assert_equal columns, @pool.columns['posts']
|
||||
end
|
||||
|
||||
def test_pool_caches_columns_hash
|
||||
columns_hash = @pool.columns_hash['posts']
|
||||
assert_equal columns_hash, @pool.columns_hash['posts']
|
||||
end
|
||||
|
||||
def test_clearing_cache
|
||||
@pool.columns['posts']
|
||||
@pool.columns_hash['posts']
|
||||
@pool.primary_keys['posts']
|
||||
|
||||
@pool.clear_cache!
|
||||
|
||||
assert_equal 0, @pool.columns.size
|
||||
assert_equal 0, @pool.columns_hash.size
|
||||
assert_equal 0, @pool.primary_keys.size
|
||||
end
|
||||
|
||||
def test_primary_key
|
||||
assert_equal 'id', @pool.primary_keys['posts']
|
||||
end
|
||||
|
||||
def test_primary_key_for_non_existent_table
|
||||
assert_equal 'id', @pool.primary_keys['omgponies']
|
||||
end
|
||||
|
||||
def test_clear_stale_cached_connections!
|
||||
pool = ConnectionPool.new ActiveRecord::Base.connection_pool.spec
|
||||
|
||||
|
||||
Reference in New Issue
Block a user