123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119 |
- require 'active_record'
- # Module#prepend support for Ruby 1.9
- require 'prepend' unless Module.method_defined?(:prepend)
- 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
- def utf8mb4_supported?
- if @utf8mb4_supported.nil?
- @utf8mb4_supported = !select("show character set like 'utf8mb4'").empty?
- else
- @utf8mb4_supported
- end
- end
- def charset_collation(charset, collation)
- [charset, collation].map { |name|
- case name
- when nil
- nil
- when /\A(utf8mb4(_\w*)?)\z/
- if utf8mb4_supported?
- $1
- else
- "utf8#{$2}"
- end
- else
- name.to_s
- end
- }
- end
- def create_database(name, options = {})
- # utf8mb4 is used in column definitions; use utf8 for
- # databases.
- if options[:charset] == 'utf8mb4'
- options = options.merge(charset: 'utf8')
- end
- super(name, options)
- 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)
- charset, collation = @conn.charset_collation(options[:charset], options[:collation])
- if charset
- sql << " CHARACTER SET #{charset}"
- end
- if collation
- sql << " COLLATE #{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
- end
|