class <%= migration_class_name %> < ActiveRecord::Migration[<%= ActiveRecord::Migration.current_version %>]

def up
  execute "ALTER DATABASE `#{db.current_database}` CHARACTER SET #{charset} COLLATE #{collation};"
  db.tables.each do |table|
    execute "ALTER TABLE `#{table}` ROW_FORMAT=DYNAMIC CHARACTER SET #{charset} COLLATE #{collation};"

    db.columns(table).each do |column|
      case column.sql_type
        when /([a-z]*)text/i
          default = (column.default.blank?) ? '' : "DEFAULT '#{column.default}'"
          null = (column.null) ? '' : 'NOT NULL'
          execute "ALTER TABLE `#{table}` MODIFY `#{column.name}` #{column.sql_type.upcase} CHARACTER SET #{charset} COLLATE #{collation} #{default} #{null};"
        when /varchar\(([0-9]+)\)/i
          sql_type = column.sql_type.upcase
          default = (column.default.blank?) ? '' : "DEFAULT '#{column.default}'"
          null = (column.null) ? '' : 'NOT NULL'
          execute "ALTER TABLE `#{table}` MODIFY `#{column.name}` #{sql_type} CHARACTER SET #{charset} COLLATE #{collation} #{default} #{null};"
      end
    end
  end
end

def down
end

private

def charset
  "utf8mb4"
end

def collation
  "utf8mb4_unicode_ci"
end

def db
  ActiveRecord::Base.connection
end

end