From 887a797ae6925e9971c8c9d8e23920bfafbcf1e7 Mon Sep 17 00:00:00 2001 From: Konstantin Haase Date: Tue, 12 May 2015 11:55:46 +0200 Subject: [PATCH] add support for setting session variables for postgres connections (as you can in ActiveRecord 4.x) --- lib/active_record_postgres_variables.rb | 30 +++++++++++++++++++ lib/travis/api/app.rb | 4 +++ spec/active_record_postgres_variables_spec.rb | 12 ++++++++ 3 files changed, 46 insertions(+) create mode 100644 lib/active_record_postgres_variables.rb create mode 100644 spec/active_record_postgres_variables_spec.rb diff --git a/lib/active_record_postgres_variables.rb b/lib/active_record_postgres_variables.rb new file mode 100644 index 00000000..e04e5ab4 --- /dev/null +++ b/lib/active_record_postgres_variables.rb @@ -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 \ No newline at end of file diff --git a/lib/travis/api/app.rb b/lib/travis/api/app.rb index 4b9a7015..ff0aaa51 100644 --- a/lib/travis/api/app.rb +++ b/lib/travis/api/app.rb @@ -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' diff --git a/spec/active_record_postgres_variables_spec.rb b/spec/active_record_postgres_variables_spec.rb new file mode 100644 index 00000000..2acab155 --- /dev/null +++ b/spec/active_record_postgres_variables_spec.rb @@ -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