Skip to content

Commit

Permalink
Moving add_column_options! up to SchemaCreation
Browse files Browse the repository at this point in the history
removed two instances of add_column_options! from abstract_mysql_adapter

reworked rename_column_sql to remove add_column_options from schema_statements

changed to use new hash syntax.
  • Loading branch information
jeran authored and Ranjay Krishna committed Jun 13, 2013
1 parent 56edecb commit ea72430
Show file tree
Hide file tree
Showing 4 changed files with 47 additions and 38 deletions.
Expand Up @@ -25,6 +25,9 @@ def primary_key?
end
end

class ChangeColumnDefinition < Struct.new(:column, :type, :options) #:nodoc:
end

# Represents the schema of an SQL table in an abstract way. This class
# provides methods for manipulating the schema representation.
#
Expand Down
Expand Up @@ -694,17 +694,6 @@ def type_to_sql(type, limit = nil, precision = nil, scale = nil) #:nodoc:
end
end

def add_column_options!(sql, options) #:nodoc:
sql << " DEFAULT #{quote(options[:default], options[:column])}" if options_include_default?(options)
# must explicitly check for :null to allow change_column to work on migrations
if options[:null] == false
sql << " NOT NULL"
end
if options[:auto_increment] == true
sql << " AUTO_INCREMENT"
end
end

# SELECT DISTINCT clause for a given set of columns and a given ORDER BY clause.
# Both PostgreSQL and Oracle overrides this for custom DISTINCT syntax.
#
Expand Down
Expand Up @@ -112,19 +112,19 @@ def accept(o)
send m, o
end

def visit_AddColumn(o)
sql_type = type_to_sql(o.type.to_sym, o.limit, o.precision, o.scale)
sql = "ADD #{quote_column_name(o.name)} #{sql_type}"
add_column_options!(sql, column_options(o))
end

private

def visit_AlterTable(o)
sql = "ALTER TABLE #{quote_table_name(o.name)} "
sql << o.adds.map { |col| visit_AddColumn col }.join(' ')
end

def visit_AddColumn(o)
sql_type = type_to_sql(o.type.to_sym, o.limit, o.precision, o.scale)
sql = "ADD #{quote_column_name(o.name)} #{sql_type}"
add_column_options!(sql, column_options(o))
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}"
Expand All @@ -145,6 +145,8 @@ def column_options(o)
column_options[:null] = o.null unless o.null.nil?
column_options[:default] = o.default unless o.default.nil?
column_options[:column] = o
column_options[:first] = o.first
column_options[:after] = o.after
column_options
end

Expand All @@ -160,9 +162,20 @@ def type_to_sql(type, limit, precision, scale)
@conn.type_to_sql type.to_sym, limit, precision, scale
end

def add_column_options!(column_sql, column_options)
@conn.add_column_options! column_sql, column_options
column_sql
def add_column_options!(sql, options)
sql << " DEFAULT #{@conn.quote(options[:default], options[:column])}" if options_include_default?(options)
# must explicitly check for :null to allow change_column to work on migrations
if options[:null] == false
sql << " NOT NULL"
end
if options[:auto_increment] == true
sql << " AUTO_INCREMENT"
end
sql
end

def options_include_default?(options)
options.include?(:default) && !(options[:null] == false && options[:default].nil?)
end
end

Expand Down
Expand Up @@ -4,17 +4,26 @@ module ActiveRecord
module ConnectionAdapters
class AbstractMysqlAdapter < AbstractAdapter
class SchemaCreation < AbstractAdapter::SchemaCreation
private

def visit_AddColumn(o)
add_column_position!(super, o)
add_column_position!(super, column_options(o))
end

private
def visit_ChangeColumnDefinition(o)
column = o.column
options = o.options
sql_type = type_to_sql(o.type, options[:limit], options[:precision], options[:scale])
change_column_sql = "CHANGE #{quote_column_name(column.name)} #{quote_column_name(options[:name])} #{sql_type}"
add_column_options!(change_column_sql, options)
add_column_position!(change_column_sql, options)
end

def add_column_position!(sql, column)
if column.first
def add_column_position!(sql, options)
if options[:first]
sql << " FIRST"
elsif column.after
sql << " AFTER #{quote_column_name(column.after)}"
elsif options[:after]
sql << " AFTER #{quote_column_name(options[:after])}"
end
sql
end
Expand Down Expand Up @@ -659,10 +668,9 @@ def translate_exception(exception, message)
end

def add_column_sql(table_name, column_name, type, options = {})
add_column_sql = "ADD #{quote_column_name(column_name)} #{type_to_sql(type, options[:limit], options[:precision], options[:scale])}"
add_column_options!(add_column_sql, options)
add_column_position!(add_column_sql, options)
add_column_sql
td = create_table_definition table_name, options[:temporary], options[:options]
cd = td.new_column_definition(column_name, type, options)
schema_creation.visit_AddColumn cd
end

def change_column_sql(table_name, column_name, type, options = {})
Expand All @@ -676,14 +684,12 @@ def change_column_sql(table_name, column_name, type, options = {})
options[:null] = column.null
end

change_column_sql = "CHANGE #{quote_column_name(column_name)} #{quote_column_name(column_name)} #{type_to_sql(type, options[:limit], options[:precision], options[:scale])}"
add_column_options!(change_column_sql, options)
add_column_position!(change_column_sql, options)
change_column_sql
options[:name] = column.name
schema_creation.accept ChangeColumnDefinition.new column, type, options
end

def rename_column_sql(table_name, column_name, new_column_name)
options = {}
options = { name: new_column_name }

if column = columns(table_name).find { |c| c.name == column_name.to_s }
options[:default] = column.default
Expand All @@ -694,9 +700,7 @@ def rename_column_sql(table_name, column_name, new_column_name)
end

current_type = select_one("SHOW COLUMNS FROM #{quote_table_name(table_name)} LIKE '#{column_name}'", 'SCHEMA')["Type"]
rename_column_sql = "CHANGE #{quote_column_name(column_name)} #{quote_column_name(new_column_name)} #{current_type}"
add_column_options!(rename_column_sql, options)
rename_column_sql
schema_creation.accept ChangeColumnDefinition.new column, current_type, options
end

def remove_column_sql(table_name, column_name, type = nil, options = {})
Expand Down

0 comments on commit ea72430

Please sign in to comment.