2014-07-25 17:32:53 +09:00
|
|
|
require 'active_record'
|
|
|
|
|
2014-08-13 21:55:14 +09:00
|
|
|
# Module#prepend support for Ruby 1.9
|
|
|
|
require 'prepend' unless Module.method_defined?(:prepend)
|
|
|
|
|
2014-07-25 17:32:53 +09:00
|
|
|
module ActiveRecord::ConnectionAdapters
|
|
|
|
class ColumnDefinition
|
|
|
|
module CharsetSupport
|
|
|
|
attr_accessor :charset, :collation
|
|
|
|
end
|
|
|
|
|
|
|
|
prepend CharsetSupport
|
|
|
|
end
|
|
|
|
|
|
|
|
class TableDefinition
|
|
|
|
module CharsetSupport
|
|
|
|
def new_column_definition(name, type, options)
|
|
|
|
column = super
|
|
|
|
column.charset = options[:charset]
|
|
|
|
column.collation = options[:collation]
|
|
|
|
column
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
prepend CharsetSupport
|
|
|
|
end
|
|
|
|
|
|
|
|
class AbstractMysqlAdapter
|
|
|
|
module CharsetSupport
|
|
|
|
def prepare_column_options(column, types)
|
|
|
|
spec = super
|
|
|
|
conn = ActiveRecord::Base.connection
|
|
|
|
spec[:charset] = column.charset.inspect if column.charset && column.charset != conn.charset
|
|
|
|
spec[:collation] = column.collation.inspect if column.collation && column.collation != conn.collation
|
|
|
|
spec
|
|
|
|
end
|
|
|
|
|
|
|
|
def migration_keys
|
|
|
|
super + [:charset, :collation]
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
prepend CharsetSupport
|
|
|
|
|
|
|
|
class SchemaCreation
|
|
|
|
module CharsetSupport
|
|
|
|
def column_options(o)
|
|
|
|
column_options = super
|
|
|
|
column_options[:charset] = o.charset unless o.charset.nil?
|
|
|
|
column_options[:collation] = o.collation unless o.collation.nil?
|
|
|
|
column_options
|
|
|
|
end
|
|
|
|
|
|
|
|
def add_column_options!(sql, options)
|
|
|
|
if options[:charset]
|
|
|
|
sql << " CHARACTER SET #{options[:charset]}"
|
|
|
|
end
|
|
|
|
|
|
|
|
if options[:collation]
|
|
|
|
sql << " COLLATE #{options[:collation]}"
|
|
|
|
end
|
|
|
|
|
|
|
|
super
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
prepend CharsetSupport
|
|
|
|
end
|
|
|
|
|
|
|
|
class Column
|
|
|
|
module CharsetSupport
|
|
|
|
attr_reader :charset
|
|
|
|
|
|
|
|
def initialize(*args)
|
|
|
|
super
|
|
|
|
@charset = @collation[/\A[^_]+/] unless @collation.nil?
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
prepend CharsetSupport
|
|
|
|
end
|
|
|
|
end
|
2014-08-13 21:55:14 +09:00
|
|
|
end
|