Skip to content

Instantly share code, notes, and snippets.

@adstage-david
Forked from jrochkind/gist:1364551
Created January 30, 2015 21:57
Show Gist options
  • Save adstage-david/6c240abef19f426058d7 to your computer and use it in GitHub Desktop.
Save adstage-david/6c240abef19f426058d7 to your computer and use it in GitHub Desktop.
# Call ActiveRecord::base.forbid_implicit_checkout_for_thread! from a thread, and if
# that thread later tries to access an active record connection without explicit checkout
# (#with_connection, or #checkout), an ImplicitConnectionForbiddenError will be raised.
module ActiveRecord
class Base
class << self
def forbid_implicit_checkout_for_thread!
Thread.current[:active_record_forbid_implicit_connections] = true
end
def connection
if Thread.current[:active_record_forbid_implicit_connections] && ! thread_connected?
raise ImplicitConnectionForbiddenError.new("Implicit ActiveRecord checkout attempted when Thread :force_explicit_connections set!")
end
retrieve_connection
end
# In Rails 3.1, this is connection_pool.active_connection?
# But we define our own so we have it in Rails 3.0 too.
def thread_connected?
connection_id = connection_pool.send(:current_connection_id)
connection_pool.instance_variable_get("@reserved_connections").has_key? connection_id
end
end
end
class ImplicitConnectionForbiddenError < ActiveRecord::ConnectionTimeoutError ; end
end
ActiveRecord::Base.forbid_implicit_checkout_for_thread!
ActiveRecord::Base.connection_pool.checkin(ActiveRecord::Base.connection_pool.connections.first)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment