Keine Beschreibung http://j1x-huginn.herokuapp.com

ar_mysql_column_charset.rb 2.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. require 'active_record'
  2. # Module#prepend support for Ruby 1.9
  3. require 'prepend' unless Module.method_defined?(:prepend)
  4. module ActiveRecord::ConnectionAdapters
  5. class ColumnDefinition
  6. module CharsetSupport
  7. attr_accessor :charset, :collation
  8. end
  9. prepend CharsetSupport
  10. end
  11. class TableDefinition
  12. module CharsetSupport
  13. def new_column_definition(name, type, options)
  14. column = super
  15. column.charset = options[:charset]
  16. column.collation = options[:collation]
  17. column
  18. end
  19. end
  20. prepend CharsetSupport
  21. end
  22. class AbstractMysqlAdapter
  23. module CharsetSupport
  24. def prepare_column_options(column, types)
  25. spec = super
  26. spec[:charset] = column.charset.inspect if column.charset && column.charset != charset
  27. spec[:collation] = column.collation.inspect if column.collation && column.collation != collation
  28. spec
  29. end
  30. def migration_keys
  31. super + [:charset, :collation]
  32. end
  33. def utf8mb4_supported?
  34. if @utf8mb4_supported.nil?
  35. @utf8mb4_supported = !select("show character set like 'utf8mb4'").empty?
  36. else
  37. @utf8mb4_supported
  38. end
  39. end
  40. def charset_collation(charset, collation)
  41. [charset, collation].map { |name|
  42. case name
  43. when nil
  44. nil
  45. when /\A(utf8mb4(_\w*)?)\z/
  46. if utf8mb4_supported?
  47. $1
  48. else
  49. "utf8#{$2}"
  50. end
  51. else
  52. name.to_s
  53. end
  54. }
  55. end
  56. def create_database(name, options = {})
  57. # utf8mb4 is used in column definitions; use utf8 for
  58. # databases.
  59. [:charset, :collation].each { |key|
  60. case options[key]
  61. when /\A(utf8mb4(_\w*)?)\z/
  62. options = options.merge(key => "utf8#{$2}")
  63. end
  64. }
  65. super(name, options)
  66. end
  67. end
  68. prepend CharsetSupport
  69. class SchemaCreation
  70. module CharsetSupport
  71. def column_options(o)
  72. column_options = super
  73. column_options[:charset] = o.charset unless o.charset.nil?
  74. column_options[:collation] = o.collation unless o.collation.nil?
  75. column_options
  76. end
  77. def add_column_options!(sql, options)
  78. charset, collation = @conn.charset_collation(options[:charset], options[:collation])
  79. if charset
  80. sql << " CHARACTER SET #{charset}"
  81. end
  82. if collation
  83. sql << " COLLATE #{collation}"
  84. end
  85. super
  86. end
  87. end
  88. prepend CharsetSupport
  89. end
  90. class Column
  91. module CharsetSupport
  92. attr_reader :charset
  93. def initialize(*args)
  94. super
  95. @charset = @collation[/\A[^_]+/] unless @collation.nil?
  96. end
  97. end
  98. prepend CharsetSupport
  99. end
  100. end
  101. end