From 1465f9cee27a55b5c13bad35bac74be119097f17 Mon Sep 17 00:00:00 2001 From: Marcel Molina Date: Mon, 26 Sep 2005 21:30:12 +0000 Subject: Make migrations honor table name prefixes and suffixes. git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@2352 5ecf4fe2-1ee6-0310-87b1-e25e094e27de --- activerecord/CHANGELOG | 2 + .../abstract/schema_statements.rb | 6 +-- activerecord/lib/active_record/migration.rb | 15 +++++- activerecord/test/migration_test.rb | 55 +++++++++++++++++++++- 4 files changed, 71 insertions(+), 7 deletions(-) (limited to 'activerecord') diff --git a/activerecord/CHANGELOG b/activerecord/CHANGELOG index c766c86cae..c4336025c3 100644 --- a/activerecord/CHANGELOG +++ b/activerecord/CHANGELOG @@ -1,5 +1,7 @@ *SVN* +* Make migrations honor table name prefixes and suffixes. #2298 [Jakob S, Marcel Molina] + * Correct and optimize PostgreSQL bytea escaping. #1745, #1837 [dave@cherryville.org, ken@miriamtech.com, bellis@deepthought.org] * Fixtures should only reset a PostgreSQL sequence if it corresponds to an integer primary key named id. #1749 [chris@chrisbrinker.com] diff --git a/activerecord/lib/active_record/connection_adapters/abstract/schema_statements.rb b/activerecord/lib/active_record/connection_adapters/abstract/schema_statements.rb index 81ddb3e2bb..d7aefc9a82 100644 --- a/activerecord/lib/active_record/connection_adapters/abstract/schema_statements.rb +++ b/activerecord/lib/active_record/connection_adapters/abstract/schema_statements.rb @@ -102,8 +102,8 @@ module ActiveRecord def initialize_schema_information #:nodoc: begin - execute "CREATE TABLE schema_info (version #{type_to_sql(:integer)})" - execute "INSERT INTO schema_info (version) VALUES(0)" + execute "CREATE TABLE #{ActiveRecord::Migrator.schema_info_table_name} (version #{type_to_sql(:integer)})" + execute "INSERT INTO #{ActiveRecord::Migrator.schema_info_table_name} (version) VALUES(0)" rescue ActiveRecord::StatementInvalid # Schema has been intialized end @@ -112,7 +112,7 @@ module ActiveRecord def dump_schema_information #:nodoc: begin if (current_schema = ActiveRecord::Migrator.current_version) > 0 - return "INSERT INTO schema_info (version) VALUES (#{current_schema});" + return "INSERT INTO #{ActiveRecord::Migrator.schema_info_table_name} (version) VALUES (#{current_schema});" end rescue ActiveRecord::StatementInvalid # No Schema Info diff --git a/activerecord/lib/active_record/migration.rb b/activerecord/lib/active_record/migration.rb index 587fbf852d..fcb5ad82de 100644 --- a/activerecord/lib/active_record/migration.rb +++ b/activerecord/lib/active_record/migration.rb @@ -142,6 +142,7 @@ module ActiveRecord private def method_missing(method, *arguments, &block) + arguments[0] = Migrator.proper_table_name(arguments.first) unless arguments.empty? ActiveRecord::Base.connection.send(method, *arguments, &block) end end @@ -169,9 +170,19 @@ module ActiveRecord self.new(:down, migrations_path, target_version).migrate end + def schema_info_table_name + Base.table_name_prefix + "schema_info" + Base.table_name_suffix + end + def current_version - (Base.connection.select_one("SELECT version FROM schema_info") || {"version" => 0})["version"].to_i + (Base.connection.select_one("SELECT version FROM #{schema_info_table_name}") || {"version" => 0})["version"].to_i end + + def proper_table_name(name) + # Use the ActiveRecord objects own table_name, or pre/suffix from ActiveRecord::Base if name is a symbol/string + name.table_name rescue "#{ActiveRecord::Base.table_name_prefix}#{name}#{ActiveRecord::Base.table_name_suffix}" + end + end def initialize(direction, migrations_path, target_version = nil) @@ -222,7 +233,7 @@ module ActiveRecord end def set_schema_version(version) - Base.connection.update("UPDATE schema_info SET version = #{down? ? version.to_i - 1 : version.to_i}") + Base.connection.update("UPDATE #{self.class.schema_info_table_name} SET version = #{down? ? version.to_i - 1 : version.to_i}") end def up? diff --git a/activerecord/test/migration_test.rb b/activerecord/test/migration_test.rb index b24b7a7d44..5a86a678cd 100644 --- a/activerecord/test/migration_test.rb +++ b/activerecord/test/migration_test.rb @@ -15,7 +15,7 @@ if ActiveRecord::Base.connection.supports_migrations? def teardown ActiveRecord::Base.connection.initialize_schema_information - ActiveRecord::Base.connection.update "UPDATE schema_info SET version = 0" + ActiveRecord::Base.connection.update "UPDATE #{ActiveRecord::Migrator.schema_info_table_name} SET version = 0" Reminder.connection.drop_table("reminders") rescue nil Reminder.connection.drop_table("people_reminders") rescue nil @@ -262,5 +262,56 @@ if ActiveRecord::Base.connection.supports_migrations? assert Reminder.create("content" => "hello world", "remind_at" => Time.now) assert_equal "hello world", Reminder.find(:first).content end - end + + def test_schema_info_table_name + ActiveRecord::Base.table_name_prefix = "prefix_" + ActiveRecord::Base.table_name_suffix = "_suffix" + assert_equal "prefix_schema_info_suffix", ActiveRecord::Migrator.schema_info_table_name + ActiveRecord::Base.table_name_prefix = "" + ActiveRecord::Base.table_name_suffix = "" + assert_equal "schema_info", ActiveRecord::Migrator.schema_info_table_name + end + + def test_proper_table_name + assert_equal "table", ActiveRecord::Migrator.proper_table_name('table') + assert_equal "table", ActiveRecord::Migrator.proper_table_name(:table) + assert_equal "reminders", ActiveRecord::Migrator.proper_table_name(Reminder) + assert_equal Reminder.table_name, ActiveRecord::Migrator.proper_table_name(Reminder) + + # Use the model's own prefix/suffix if a model is given + ActiveRecord::Base.table_name_prefix = "ARprefix_" + ActiveRecord::Base.table_name_suffix = "_ARsuffix" + Reminder.table_name_prefix = 'prefix_' + Reminder.table_name_suffix = '_suffix' + assert_equal "prefix_reminders_suffix", ActiveRecord::Migrator.proper_table_name(Reminder) + Reminder.table_name_prefix = '' + Reminder.table_name_suffix = '' + + # Use AR::Base's prefix/suffix if string or symbol is given + ActiveRecord::Base.table_name_prefix = "prefix_" + ActiveRecord::Base.table_name_suffix = "_suffix" + assert_equal "prefix_table_suffix", ActiveRecord::Migrator.proper_table_name('table') + assert_equal "prefix_table_suffix", ActiveRecord::Migrator.proper_table_name(:table) + ActiveRecord::Base.table_name_prefix = "" + ActiveRecord::Base.table_name_suffix = "" + end + + def test_add_drop_table_with_prefix_and_suffix + assert_raises(ActiveRecord::StatementInvalid) { Reminder.column_methods_hash } + + ActiveRecord::Base.table_name_prefix = 'prefix_' + ActiveRecord::Base.table_name_suffix = '_suffix' + WeNeedReminders.up + + assert Reminder.create("content" => "hello world", "remind_at" => Time.now) + assert_equal "hello world", Reminder.find(:first).content + + WeNeedReminders.down + assert_raises(ActiveRecord::StatementInvalid) { Reminder.find(:first) } + ActiveRecord::Base.table_name_prefix = '' + ActiveRecord::Base.table_name_suffix = '' + end + + end + end -- cgit v1.2.3