From 29d2040b2992c112ca475a7a56bcd7f2016252ce Mon Sep 17 00:00:00 2001 From: Aaron Patterson Date: Tue, 29 Nov 2011 14:40:37 -0800 Subject: AbstractAdapter#close can be called to add the connection back to the pool. --- .../abstract/connection_pool.rb | 1 + .../connection_adapters/abstract_adapter.rb | 29 ++++++++++++++-------- .../connection_adapters/abstract_adapter_test.rb | 16 ++++++++++++ 3 files changed, 35 insertions(+), 11 deletions(-) diff --git a/activerecord/lib/active_record/connection_adapters/abstract/connection_pool.rb b/activerecord/lib/active_record/connection_adapters/abstract/connection_pool.rb index 04465db61d..656073b47a 100644 --- a/activerecord/lib/active_record/connection_adapters/abstract/connection_pool.rb +++ b/activerecord/lib/active_record/connection_adapters/abstract/connection_pool.rb @@ -275,6 +275,7 @@ module ActiveRecord raise ConnectionNotEstablished unless @automatic_reconnect c = new_connection + c.pool = self @connections << c c end diff --git a/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb b/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb index ce3417ad94..1a4cc93d2d 100644 --- a/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb +++ b/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb @@ -53,23 +53,25 @@ module ActiveRecord define_callbacks :checkout, :checkin - attr_accessor :visitor + attr_accessor :visitor, :pool attr_reader :schema_cache, :last_use, :in_use alias :in_use? :in_use - def initialize(connection, logger = nil) #:nodoc: + def initialize(connection, logger = nil, pool = nil) #:nodoc: super() - @active = nil - @connection, @logger = connection, logger + @active = nil + @connection = connection + @in_use = false + @instrumenter = ActiveSupport::Notifications.instrumenter + @last_use = false + @logger = logger + @open_transactions = 0 + @pool = pool + @query_cache = Hash.new { |h,sql| h[sql] = {} } @query_cache_enabled = false - @query_cache = Hash.new { |h,sql| h[sql] = {} } - @open_transactions = 0 - @instrumenter = ActiveSupport::Notifications.instrumenter - @visitor = nil - @schema_cache = SchemaCache.new self - @in_use = false - @last_use = false + @schema_cache = SchemaCache.new self + @visitor = nil end def lease @@ -256,6 +258,11 @@ module ActiveRecord "active_record_#{open_transactions}" end + # Check the connection back in to the connection pool + def close + pool.checkin self + end + protected def log(sql, name = "SQL", binds = []) diff --git a/activerecord/test/cases/connection_adapters/abstract_adapter_test.rb b/activerecord/test/cases/connection_adapters/abstract_adapter_test.rb index 962a5b46fd..7af9079b48 100644 --- a/activerecord/test/cases/connection_adapters/abstract_adapter_test.rb +++ b/activerecord/test/cases/connection_adapters/abstract_adapter_test.rb @@ -33,6 +33,22 @@ module ActiveRecord adapter.expire assert !adapter.in_use?, 'adapter is in use' end + + def test_close + pool = ConnectionPool.new(Base::ConnectionSpecification.new({}, nil)) + pool.connections << adapter + adapter.pool = pool + + # Make sure the pool marks the connection in use + assert_equal adapter, pool.connection + assert adapter.in_use? + + # Close should put the adapter back in the pool + adapter.close + assert !adapter.in_use? + + assert_equal adapter, pool.connection + end end end end -- cgit v1.2.3