module ActiveRecord::DatabaseValidations::MySQL

Constants

TYPE_LIMITS

Public Class Methods

column_range(column) click to toggle source
# File lib/active_record/database_validations/mysql.rb, line 31
def self.column_range(column)
  args = {}
  unsigned = column.sql_type =~ / unsigned\z/
  case column.type
  when :decimal
    args[:less_than] = maximum = 10 ** (column.precision - column.scale)
    if unsigned
      args[:greater_than_or_equal_to] = 0
    else
      args[:greater_than] = 0 - maximum
    end

  when :integer
    args[:only_integer] = true
    args[:less_than] = unsigned ? 1 << (column.limit * 8) : 1 << (column.limit * 8 - 1)
    args[:greater_than_or_equal_to] = unsigned ? 0 : 0 - args[:less_than]
  end

  args
end
column_size_limit(column) click to toggle source
# File lib/active_record/database_validations/mysql.rb, line 20
def self.column_size_limit(column)
  column_type = column.sql_type.sub(/\(.*\z/, '').gsub(/\s/, '_').to_sym
  type_limit  = TYPE_LIMITS.fetch(column_type, {})

  [
    column.limit || type_limit[:maximum],
    type_limit[:type],
    determine_encoding(column),
  ]
end
determine_encoding(column) click to toggle source
# File lib/active_record/database_validations/mysql.rb, line 52
def self.determine_encoding(column)
  column = ActiveRecord::Validations::TypedColumn.new(column)
  return nil unless column.text?
  case column.collation
    when /\Autf8/; Encoding::UTF_8
    else raise NotImplementedError, "Don't know how to determine the Ruby encoding for MySQL's #{column.collation} collation."
  end
end
requires_transcoding?(value, column_encoding = nil) click to toggle source
# File lib/active_record/database_validations/mysql.rb, line 61
def self.requires_transcoding?(value, column_encoding = nil)
  column_encoding.present? && column_encoding != value.encoding
end
value_for_column(value, column_encoding = nil) click to toggle source
# File lib/active_record/database_validations/mysql.rb, line 65
def self.value_for_column(value, column_encoding = nil)
  value = value.to_s unless value.is_a?(String)

  if requires_transcoding?(value, column_encoding)
    return value.encode(Encoding::UTF_8)
  end

  value
end