diff options
author | wangjohn <wangjohn@mit.edu> | 2013-04-09 16:29:36 -0400 |
---|---|---|
committer | wangjohn <wangjohn@mit.edu> | 2013-04-09 22:27:32 -0400 |
commit | 95ac3913ee24efa1c5a9789963697aaa6e5b32b7 (patch) | |
tree | c164100facb9752b8513e62d30a05657c4a390a6 /activerecord/lib | |
parent | e94f024e142526181ab98714f919cc2d5c4c394a (diff) | |
download | rails-95ac3913ee24efa1c5a9789963697aaa6e5b32b7.tar.gz rails-95ac3913ee24efa1c5a9789963697aaa6e5b32b7.tar.bz2 rails-95ac3913ee24efa1c5a9789963697aaa6e5b32b7.zip |
Created a runtime registry for thread local variables in active record.
Diffstat (limited to 'activerecord/lib')
-rw-r--r-- | activerecord/lib/active_record.rb | 1 | ||||
-rw-r--r-- | activerecord/lib/active_record/connection_handling.rb | 4 | ||||
-rw-r--r-- | activerecord/lib/active_record/core.rb | 4 | ||||
-rw-r--r-- | activerecord/lib/active_record/log_subscriber.rb | 4 | ||||
-rw-r--r-- | activerecord/lib/active_record/runtime_registry.rb | 32 |
5 files changed, 39 insertions, 6 deletions
diff --git a/activerecord/lib/active_record.rb b/activerecord/lib/active_record.rb index 3bfc6772b2..249eabfd7d 100644 --- a/activerecord/lib/active_record.rb +++ b/activerecord/lib/active_record.rb @@ -50,6 +50,7 @@ module ActiveRecord autoload :Querying autoload :ReadonlyAttributes autoload :Reflection + autoload :RuntimeRegistry autoload :Sanitization autoload :Schema autoload :SchemaDumper diff --git a/activerecord/lib/active_record/connection_handling.rb b/activerecord/lib/active_record/connection_handling.rb index 1e03414c29..3f175988db 100644 --- a/activerecord/lib/active_record/connection_handling.rb +++ b/activerecord/lib/active_record/connection_handling.rb @@ -54,11 +54,11 @@ module ActiveRecord end def connection_id - Thread.current['ActiveRecord::Base.connection_id'] + ActiveRecord::RuntimeRegistry.instance.connection_id end def connection_id=(connection_id) - Thread.current['ActiveRecord::Base.connection_id'] = connection_id + ActiveRecord::RuntimeRegistry.instance.connection_id = connection_id end # Returns the configuration of the associated connection as a hash: diff --git a/activerecord/lib/active_record/core.rb b/activerecord/lib/active_record/core.rb index afa1766615..7a8408155a 100644 --- a/activerecord/lib/active_record/core.rb +++ b/activerecord/lib/active_record/core.rb @@ -80,11 +80,11 @@ module ActiveRecord class_attribute :default_connection_handler, instance_writer: false def self.connection_handler - Thread.current[:active_record_connection_handler] || self.default_connection_handler + ActiveRecord::RuntimeRegistry.instance.connection_handler || self.default_connection_handler end def self.connection_handler=(handler) - Thread.current[:active_record_connection_handler] = handler + ActiveRecord::RuntimeRegistry.instance.connection_handler = handler end self.default_connection_handler = ConnectionAdapters::ConnectionHandler.new diff --git a/activerecord/lib/active_record/log_subscriber.rb b/activerecord/lib/active_record/log_subscriber.rb index c1ba524c84..69371a1dab 100644 --- a/activerecord/lib/active_record/log_subscriber.rb +++ b/activerecord/lib/active_record/log_subscriber.rb @@ -3,11 +3,11 @@ module ActiveRecord IGNORE_PAYLOAD_NAMES = ["SCHEMA", "EXPLAIN"] def self.runtime=(value) - Thread.current[:active_record_sql_runtime] = value + ActiveRecord::RuntimeRegistry.instance.sql_runtime = value end def self.runtime - Thread.current[:active_record_sql_runtime] ||= 0 + ActiveRecord::RuntimeRegistry.instance.sql_runtime ||= 0 end def self.reset_runtime diff --git a/activerecord/lib/active_record/runtime_registry.rb b/activerecord/lib/active_record/runtime_registry.rb new file mode 100644 index 0000000000..3f0ac68143 --- /dev/null +++ b/activerecord/lib/active_record/runtime_registry.rb @@ -0,0 +1,32 @@ +require 'active_support/per_thread_registry' + +module ActiveRecord + # This is a registry class for storing local variables in active record. The + # class allows you to access variables that are local to the current thread. + # These thread local variables are stored as attributes in the + # +RuntimeRegistry+ class. + # + # You can access the thread local variables by calling a variable's name on + # the +RuntimeRegistry+ class. For example, if you wanted to obtain the + # connection handler for the current thread, you would invoke: + # + # ActiveRecord::RuntimeRegistry.instance.connection_handler + # + # The +PerThreadRegistry+ module will make a new +RuntimeRegistry+ instance + # and store it in +Thread.current+. Whenever you make a call for an attribute + # on the +RuntimeRegistry+ class, the call will be sent to the instance that + # is stored in +Thread.current+. + # + # Note that you can also make the following call which would provide an + # equivalent result as the previous code: + # + # ActiveRecord::RuntimeRegistry.connection_handler + # + # However, this is less performant because it makes a call to +method_missing+ + # before it sends the method call to the +instance+. + class RuntimeRegistry + extend ActiveSupport::PerThreadRegistry + + attr_accessor :connection_handler, :sql_runtime, :connection_id + end +end |