class ActiveRecord::SaferMigrations::SettingHelper

Public Class Methods

new(connection, setting_name, value) click to toggle source
# File lib/active_record/safer_migrations/setting_helper.rb, line 6
def initialize(connection, setting_name, value)
  @connection = connection
  @setting_name = setting_name
  @value = value
end

Public Instance Methods

with_setting() { || ... } click to toggle source

We're changing a connection level setting, and we need to make sure we return it to the original value. It is automatically reverted if set within a transaction which rolls back, so that case needs handling differently.

| In Transaction      | Not in transaction

Raises | Reset setting | Reset setting Doesn't raise | Don't reset setting | Reset setting

# File lib/active_record/safer_migrations/setting_helper.rb, line 20
def with_setting
  record_current_setting
  set_new_setting
  yield
  reset_setting
rescue StandardError
  reset_setting unless in_transaction?
  raise
end

Private Instance Methods

in_transaction?() click to toggle source
# File lib/active_record/safer_migrations/setting_helper.rb, line 46
def in_transaction?
  ActiveRecord::Base.connection.open_transactions.positive?
end
record_current_setting() click to toggle source
# File lib/active_record/safer_migrations/setting_helper.rb, line 32
def record_current_setting
  @original_value = @connection.get_setting(@setting_name)
end
reset_setting() click to toggle source
# File lib/active_record/safer_migrations/setting_helper.rb, line 41
def reset_setting
  puts "-- set_setting(#{@setting_name.inspect}, #{@original_value})"
  @connection.set_setting(@setting_name, @original_value)
end
set_new_setting() click to toggle source
# File lib/active_record/safer_migrations/setting_helper.rb, line 36
def set_new_setting
  puts "-- set_setting(#{@setting_name.inspect}, #{@value})"
  @connection.set_setting(@setting_name, @value)
end