add support for setting session variables for postgres connections (as you can in ActiveRecord 4.x)

This commit is contained in:
Konstantin Haase 2015-05-12 11:55:46 +02:00
parent 9ec2ef7f56
commit 887a797ae6
3 changed files with 46 additions and 0 deletions

View File

@ -0,0 +1,30 @@
# This backports support for the :variables option on postgres database details from ActiveRecord 4 to ActiveRecord 3.
require 'active_record'
if ActiveRecord::VERSION::MAJOR < 4
require 'active_record/connection_adapters/postgresql_adapter'
module ActiveRecordPostgresVariables
def configure_connection
result = super
set_variables
result
end
def set_variables
return unless variables = @config[:variables]
# copied from AR 4.2.1
variables.map do |k, v|
if v == ':default' || v == :default
# Sets the value to the global or compile default
execute("SET SESSION #{k} TO DEFAULT", 'SCHEMA')
elsif !v.nil?
execute("SET SESSION #{k} TO #{quote(v)}", 'SCHEMA')
end
end
end
end
ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.prepend(ActiveRecordPostgresVariables)
end

View File

@ -1,4 +1,8 @@
# these things need to go first
require 'conditional_skylight'
require 'active_record_postgres_variables'
# now actually load travis
require 'travis'
require 'travis/model'
require 'travis/support/amqp'

View File

@ -0,0 +1,12 @@
require 'spec_helper'
describe "ActiveRecordPostgresVariables" do
let(:variables) {{ foo: 'bar' }}
let(:database_options) { Travis.config.database.merge(variables: variables) }
let(:base) { Class.new(ActiveRecord::Base) }
it "passes on variables to postgres connections" do
base.establish_connection(database_options)
expect { base.table_exists? }.to raise_error(ActiveRecord::StatementInvalid, /unrecognized configuration parameter "foo"/)
end
end