From f20b2f4e54d27f7f98ca537ac69b1be8f88fc2a5 Mon Sep 17 00:00:00 2001 From: Aaron Patterson Date: Sat, 16 Mar 2013 16:01:03 -0700 Subject: push alter table add column sql in to the schema modification visitor --- .../abstract/schema_definitions.rb | 29 +++++++++++++++++----- .../abstract/schema_statements.rb | 10 +++++--- .../connection_adapters/abstract_adapter.rb | 26 +++++++++++++++---- 3 files changed, 51 insertions(+), 14 deletions(-) (limited to 'activerecord/lib/active_record/connection_adapters') diff --git a/activerecord/lib/active_record/connection_adapters/abstract/schema_definitions.rb b/activerecord/lib/active_record/connection_adapters/abstract/schema_definitions.rb index 922a544e81..7f0be28080 100644 --- a/activerecord/lib/active_record/connection_adapters/abstract/schema_definitions.rb +++ b/activerecord/lib/active_record/connection_adapters/abstract/schema_definitions.rb @@ -262,12 +262,7 @@ module ActiveRecord end alias :belongs_to :references - private - def create_column_definition(name, type) - ColumnDefinition.new name, type - end - - def new_column_definition(name, type, options) + def new_column_definition(name, type, options) # :nodoc: column = create_column_definition name, type limit = options.fetch(:limit) do native[type][:limit] if native[type].is_a?(Hash) @@ -281,6 +276,11 @@ module ActiveRecord column end + private + def create_column_definition(name, type) + ColumnDefinition.new name, type + end + def primary_key_column_name primary_key_column = columns.detect { |c| c.primary_key? } primary_key_column && primary_key_column.name @@ -291,6 +291,23 @@ module ActiveRecord end end + class AlterTable # :nodoc: + attr_reader :add + + def initialize(td) + @td = td + @add = nil + end + + def name; @td.name; end + + def add_column(name, type, options) + name = name.to_s + type = type.to_sym + @add = @td.new_column_definition(name, type, options) + end + end + # Represents an SQL table in an abstract way for updating a table. # Also see TableDefinition and SchemaStatements#create_table # 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 08e8d3ca20..6631a278ab 100644 --- a/activerecord/lib/active_record/connection_adapters/abstract/schema_statements.rb +++ b/activerecord/lib/active_record/connection_adapters/abstract/schema_statements.rb @@ -355,9 +355,9 @@ module ActiveRecord # Adds a new column to the named table. # See TableDefinition#column for details of the options you can use. def add_column(table_name, column_name, type, options = {}) - add_column_sql = "ALTER TABLE #{quote_table_name(table_name)} ADD #{quote_column_name(column_name)} #{type_to_sql(type, options[:limit], options[:precision], options[:scale])}" - add_column_options!(add_column_sql, options) - execute(add_column_sql) + at = create_alter_table table_name + at.add_column(column_name, type, options) + execute schema_creation.accept at end # Removes the given columns from the table definition. @@ -829,6 +829,10 @@ module ActiveRecord TableDefinition.new native_database_types, name, temporary, options end + def create_alter_table(name) + AlterTable.new create_table_definition(name, false, {}) + end + def update_table_definition(table_name, base) Table.new(table_name, base) end diff --git a/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb b/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb index b3c55dfbbb..5d38b45a5b 100644 --- a/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb +++ b/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb @@ -113,14 +113,22 @@ module ActiveRecord private + def visit_AlterTable(o) + sql = "ALTER TABLE #{quote_table_name(o.name)} " + + if col = o.add + sql_type = type_to_sql(col.type.to_sym, col.limit, col.precision, col.scale) + sql << "ADD #{quote_column_name(col.name)} #{sql_type}" + add_column_options!(sql, column_options(col)) + end + + sql + end + def visit_ColumnDefinition(o) sql_type = type_to_sql(o.type.to_sym, o.limit, o.precision, o.scale) column_sql = "#{quote_column_name(o.name)} #{sql_type}" - column_options = {} - column_options[:null] = o.null unless o.null.nil? - column_options[:default] = o.default unless o.default.nil? - column_options[:column] = o - add_column_options!(column_sql, column_options) unless o.primary_key? + add_column_options!(column_sql, column_options(o)) unless o.primary_key? column_sql end @@ -132,6 +140,14 @@ module ActiveRecord create_sql end + def column_options(o) + column_options = {} + column_options[:null] = o.null unless o.null.nil? + column_options[:default] = o.default unless o.default.nil? + column_options[:column] = o + column_options + end + def quote_column_name(name) @conn.quote_column_name name end -- cgit v1.2.3