class PtOnlineMigration::PTCommandBuilder

Public Class Methods

new(table_name, options, execute) click to toggle source
# File lib/pt_online_migration/pt_command_builder.rb, line 6
def initialize(table_name, options, execute)
        @table_name = table_name
        execute_clause = execute ? '--execute' : '--dry-run'
        @cmd_prefix = ["pt-online-schema-change h=#{options.delete(:host)},u=#{options.delete(:username)},p=#{options.delete(:password)},D=#{options.delete(:database)},t=#{table_name} #{execute_clause} --print"]
        @pt_options = options
        @alter_statements = []
end

Public Instance Methods

add_column(name, type, options) click to toggle source
# File lib/pt_online_migration/pt_command_builder.rb, line 30
def add_column(name, type, options)
        alter_statement
        definition = column_definition(type, options)
        @alter_statements.push "add column #{name.to_s} #{definition}"
end
change(name, type, options = {}) click to toggle source
# File lib/pt_online_migration/pt_command_builder.rb, line 63
def change(name, type, options = {})
        alter_statement
        @alter_statements.push "modify column #{name.to_s} #{column_definition(type, options)}"
end
command() click to toggle source
# File lib/pt_online_migration/pt_command_builder.rb, line 53
def command
        options = ''
        @pt_options.map do |k, v|
                options += " --#{k.to_s.gsub('_', '-')} '#{v}'"
        end

        return "#{@cmd_prefix.join(' ') + options} #{@modification_type} '#{@alter_statements.join(', ')}'"
end
index(columns, options = {}) click to toggle source
# File lib/pt_online_migration/pt_command_builder.rb, line 37
def index(columns, options = {})
        alter_statement
        columns = Array(columns)
        options[:name] ||= "#{@table_name}_#{columns.join('_')}_index"
        @alter_statements.push "add#{' unique' if options[:unique]} index #{options[:name].to_s} (#{columns.join(', ')})"
end
remove(*column_names) click to toggle source
# File lib/pt_online_migration/pt_command_builder.rb, line 69
def remove(*column_names)
        alter_statement
        @alter_statements.concat(column_names.map {|name| "drop column #{name.to_s}"})
end
remove_index(options) click to toggle source
# File lib/pt_online_migration/pt_command_builder.rb, line 75
def remove_index(options)
        alter_statement
        options = {:column => options} if options.class == Symbol
        index = index_name(options)
        @alter_statements.push "drop index #{index}"
end
rename(old_name, new_name, type, options = {}) click to toggle source
# File lib/pt_online_migration/pt_command_builder.rb, line 45
def rename(old_name, new_name, type, options = {})
        alter_statement
        @cmd_prefix.push '--no-check-alter'
        definition = column_definition(type, options)
        @alter_statements.push "change column #{old_name} #{new_name} #{definition}"
end
table_name() click to toggle source
# File lib/pt_online_migration/pt_command_builder.rb, line 15
def table_name
        @table_name
end

Private Instance Methods

alter_statement() click to toggle source
# File lib/pt_online_migration/pt_command_builder.rb, line 84
def alter_statement
        @modification_type ||= '--alter'
end
column_definition(type, options) click to toggle source
# File lib/pt_online_migration/pt_command_builder.rb, line 89
def column_definition(type, options)
        default_options = {:default => :no_default, :precision => 1, :null => true, :scale => 0}
        options = default_options.merge(options)

        column_definition = [ActiveRecord::Base.connection.type_to_sql(type, options[:limit], options[:precision], options[:scale])]

        column_definition.push 'not null' if options[:null] == false
        options[:default] ||= 'null'
        column_definition.push "default #{options[:default]}" unless options[:default] == :no_default
        column_definition.push 'auto_increment' if options[:auto_increment]
        column_definition.push 'first' if options[:first]
        column_definition.push "after #{options[:after]}" if options[:after]

        return column_definition.join(' ')
end
index_name(options) click to toggle source
# File lib/pt_online_migration/pt_command_builder.rb, line 106
def index_name(options)
        return "#{@table_name}_#{options[:column]}_index" if options[:column]
        return "#{@table_name}_#{options[:columns].join('_')}_index" if options[:columns]
        return options[:name] if options[:name]
        raise ArgumentError, "unable to determine index name from #{options.inspect}"
end