From c0990f040f13d408786abf4a2d4ce97e7917f86c Mon Sep 17 00:00:00 2001 From: Justin George Date: Wed, 6 Feb 2013 15:48:08 -0800 Subject: Add some tests to enumerate how extensions should be stored in the schema output --- activerecord/test/cases/adapters/postgresql/hstore_test.rb | 4 ++++ activerecord/test/cases/schema_dumper_test.rb | 11 +++++++++++ 2 files changed, 15 insertions(+) diff --git a/activerecord/test/cases/adapters/postgresql/hstore_test.rb b/activerecord/test/cases/adapters/postgresql/hstore_test.rb index 331e3f7e4d..2b660457c4 100644 --- a/activerecord/test/cases/adapters/postgresql/hstore_test.rb +++ b/activerecord/test/cases/adapters/postgresql/hstore_test.rb @@ -35,6 +35,10 @@ class PostgresqlHstoreTest < ActiveRecord::TestCase @connection.execute 'drop table if exists hstores' end + def test_hstore_included_in_extensions + assert @connection.extensions.include?('hstore'), "extension list should include hstore" + end + def test_hstore_enabled assert @connection.extension_enabled?('hstore') end diff --git a/activerecord/test/cases/schema_dumper_test.rb b/activerecord/test/cases/schema_dumper_test.rb index cae12e0e3a..d702c0f8d1 100644 --- a/activerecord/test/cases/schema_dumper_test.rb +++ b/activerecord/test/cases/schema_dumper_test.rb @@ -231,6 +231,17 @@ class SchemaDumperTest < ActiveRecord::TestCase end if current_adapter?(:PostgreSQLAdapter) + if ActiveRecord::Base.connection.supports_extensions? + def test_schema_dump_includes_extensions + connection = ActiveRecord::Base.connection + unless connection.extension_enabled?('hstore') + connection.enable_extension 'hstore' + end + output = standard_dump + assert_match %r{enable_extension "hstore"}, output + end + end + def test_schema_dump_includes_xml_shorthand_definition output = standard_dump if %r{create_table "postgresql_xml_data_type"} =~ output -- cgit v1.2.3 From e2fdfa9c07e1ec643dc4658a1a12075d9cc26c79 Mon Sep 17 00:00:00 2001 From: Justin George Date: Wed, 6 Feb 2013 15:55:58 -0800 Subject: improve tests to check for existence of extensions method, and skip testing dumped extensions if they are unsupported by the database --- .../test/cases/adapters/postgresql/hstore_test.rb | 1 + activerecord/test/cases/schema_dumper_test.rb | 15 +++++++-------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/activerecord/test/cases/adapters/postgresql/hstore_test.rb b/activerecord/test/cases/adapters/postgresql/hstore_test.rb index 2b660457c4..6640f9b497 100644 --- a/activerecord/test/cases/adapters/postgresql/hstore_test.rb +++ b/activerecord/test/cases/adapters/postgresql/hstore_test.rb @@ -36,6 +36,7 @@ class PostgresqlHstoreTest < ActiveRecord::TestCase end def test_hstore_included_in_extensions + assert @connection.respond_to?(:extensions), "connection should have a list of extensions" assert @connection.extensions.include?('hstore'), "extension list should include hstore" end diff --git a/activerecord/test/cases/schema_dumper_test.rb b/activerecord/test/cases/schema_dumper_test.rb index d702c0f8d1..c5092e15ea 100644 --- a/activerecord/test/cases/schema_dumper_test.rb +++ b/activerecord/test/cases/schema_dumper_test.rb @@ -231,15 +231,14 @@ class SchemaDumperTest < ActiveRecord::TestCase end if current_adapter?(:PostgreSQLAdapter) - if ActiveRecord::Base.connection.supports_extensions? - def test_schema_dump_includes_extensions - connection = ActiveRecord::Base.connection - unless connection.extension_enabled?('hstore') - connection.enable_extension 'hstore' - end - output = standard_dump - assert_match %r{enable_extension "hstore"}, output + def test_schema_dump_includes_extensions + connection = ActiveRecord::Base.connection + return skip unless connection.supports_extensions? + unless connection.extension_enabled?('hstore') + connection.enable_extension 'hstore' end + output = standard_dump + assert_match %r{enable_extension "hstore"}, output end def test_schema_dump_includes_xml_shorthand_definition -- cgit v1.2.3 From fba496f2c0ae583075795ff0200eeaec182e02de Mon Sep 17 00:00:00 2001 From: Justin George Date: Wed, 6 Feb 2013 15:58:51 -0800 Subject: add ActiveRecord::AbstractAdapter#extensions and ActiveRecord::ConnectionAdapters::PostgreSQLAdapter#extensions to allow dumping of enabled extensions to schema.rb, add ActiveRecord::SchemaDumper#extensions to dump extensions to schema.rb --- .../active_record/connection_adapters/abstract_adapter.rb | 6 ++++++ .../active_record/connection_adapters/postgresql_adapter.rb | 9 +++++++++ activerecord/lib/active_record/schema_dumper.rb | 12 ++++++++++++ 3 files changed, 27 insertions(+) diff --git a/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb b/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb index b2ad4e600d..310d25767b 100644 --- a/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb +++ b/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb @@ -177,6 +177,12 @@ module ActiveRecord false end + # A list of extensions, to be filled in by databases that + # support them (at the moment, postgresql) + def extensions + [] + end + # QUOTING ================================================== # Returns a bind substitution value given a +column+ and list of current diff --git a/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb b/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb index 5ce2f1b04c..84e48970ca 100644 --- a/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb +++ b/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb @@ -605,6 +605,15 @@ module ActiveRecord end end + def extensions + if supports_extensions? + res = exec_query "SELECT extname from pg_extension", "SCHEMA" + res.rows.map { |r| res.column_types['extname'].type_cast r.first } + else + [] + end + end + # Returns the configured supported identifier length supported by PostgreSQL def table_alias_length @table_alias_length ||= query('SHOW max_identifier_length', 'SCHEMA')[0][0].to_i diff --git a/activerecord/lib/active_record/schema_dumper.rb b/activerecord/lib/active_record/schema_dumper.rb index 36bde44e7c..f90aaa916d 100644 --- a/activerecord/lib/active_record/schema_dumper.rb +++ b/activerecord/lib/active_record/schema_dumper.rb @@ -24,6 +24,7 @@ module ActiveRecord def dump(stream) header(stream) + extensions(stream) tables(stream) trailer(stream) stream @@ -66,6 +67,17 @@ HEADER stream.puts "end" end + def extensions(stream) + return unless @connection.supports_extensions? + extensions = @connection.extensions + stream.puts <