From cd6ddc865a68d126a845d03337e1c7f775588db2 Mon Sep 17 00:00:00 2001 From: Doug Cole Date: Sat, 7 Apr 2012 18:23:26 -0700 Subject: refactor configuration of insert_returning --- .../connection_adapters/postgresql_adapter.rb | 18 +++--------- .../adapters/postgresql/postgresql_adapter_test.rb | 34 ++++++++++------------ 2 files changed, 19 insertions(+), 33 deletions(-) (limited to 'activerecord') diff --git a/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb b/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb index c39e8c8577..78c00d9341 100644 --- a/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb +++ b/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb @@ -17,7 +17,7 @@ module ActiveRecord # Forward any unused config params to PGconn.connect. [:statement_limit, :encoding, :min_messages, :schema_search_path, :schema_order, :adapter, :pool, :wait_timeout, :template, - :reaping_frequency].each do |key| + :reaping_frequency, :insert_returning].each do |key| conn_params.delete key end conn_params.delete_if { |k,v| v.nil? } @@ -259,6 +259,8 @@ module ActiveRecord # call on the connection. # * :min_messages - An optional client min messages that is used in a # SET client_min_messages TO call on the connection. + # * :insert_returning - An optional boolean to control the use or RETURNING for INSERT statements + # defaults to true. # # Any further options are used as connection parameters to libpq. See # http://www.postgresql.org/docs/9.1/static/libpq-connect.html for the @@ -406,7 +408,7 @@ module ActiveRecord initialize_type_map @local_tz = execute('SHOW TIME ZONE', 'SCHEMA').first["TimeZone"] - self.enable_insert_returning! + @use_insert_returning = @config.key?(:insert_returning) ? @config[:insert_returning] : true end # Clears the prepared statements cache. @@ -1258,18 +1260,6 @@ module ActiveRecord end end - # Enable insert statements to use INSERT ... RETURNING ... statements. On by default. - def enable_insert_returning! - @use_insert_returning = true - end - - # Disable INSERT ... RETURNING ... statements, using currval() instead. - # Useful for trigger based insertions where INSERT RETURNING does the wrong thing. - def disable_insert_returning! - @use_insert_returning = false - end - - def use_insert_returning? @use_insert_returning end diff --git a/activerecord/test/cases/adapters/postgresql/postgresql_adapter_test.rb b/activerecord/test/cases/adapters/postgresql/postgresql_adapter_test.rb index 3073b9f011..92e31a3e44 100644 --- a/activerecord/test/cases/adapters/postgresql/postgresql_adapter_test.rb +++ b/activerecord/test/cases/adapters/postgresql/postgresql_adapter_test.rb @@ -50,38 +50,30 @@ module ActiveRecord end def test_insert_sql_with_returning_disabled - @connection.disable_insert_returning! - id = @connection.insert_sql("insert into postgresql_partitioned_table_parent (number) VALUES (1)") - expect = @connection.query('select max(id) from postgresql_partitioned_table_parent').first.first + connection = connection_without_insert_returning + id = connection.insert_sql("insert into postgresql_partitioned_table_parent (number) VALUES (1)") + expect = connection.query('select max(id) from postgresql_partitioned_table_parent').first.first assert_equal expect, id - ensure - @connection.enable_insert_returning! end def test_exec_insert_with_returning_disabled - @connection.disable_insert_returning! - result = @connection.exec_insert("insert into postgresql_partitioned_table_parent (number) VALUES (1)", nil, [], 'id', 'postgresql_partitioned_table_parent_id_seq') - expect = @connection.query('select max(id) from postgresql_partitioned_table_parent').first.first + connection = connection_without_insert_returning + result = connection.exec_insert("insert into postgresql_partitioned_table_parent (number) VALUES (1)", nil, [], 'id', 'postgresql_partitioned_table_parent_id_seq') + expect = connection.query('select max(id) from postgresql_partitioned_table_parent').first.first assert_equal expect, result.rows.first.first - ensure - @connection.enable_insert_returning! end def test_exec_insert_with_returning_disabled_and_no_sequence_name_given - @connection.disable_insert_returning! - result = @connection.exec_insert("insert into postgresql_partitioned_table_parent (number) VALUES (1)", nil, [], 'id') - expect = @connection.query('select max(id) from postgresql_partitioned_table_parent').first.first + connection = connection_without_insert_returning + result = connection.exec_insert("insert into postgresql_partitioned_table_parent (number) VALUES (1)", nil, [], 'id') + expect = connection.query('select max(id) from postgresql_partitioned_table_parent').first.first assert_equal expect, result.rows.first.first - ensure - @connection.enable_insert_returning! end def test_sql_for_insert_with_returning_disabled - @connection.disable_insert_returning! - result = @connection.sql_for_insert('sql', nil, nil, nil, 'binds') + connection = connection_without_insert_returning + result = connection.sql_for_insert('sql', nil, nil, nil, 'binds') assert_equal ['sql', 'binds'], result - ensure - @connection.enable_insert_returning! end def test_serial_sequence @@ -239,6 +231,10 @@ module ActiveRecord ctx.exec_insert(sql, 'SQL', binds) end + + def connection_without_insert_returning + ActiveRecord::Base.postgresql_connection(ActiveRecord::Base.configurations['arunit'].merge(:insert_returning => false)) + end end end end -- cgit v1.2.3