Files

Class/Module Index [+]

Quicksearch

ActiveRecord::ConnectionAdapters::MysqlAdapter

The MySQL adapter will work with both Ruby/MySQL, which is a Ruby-based MySQL adapter that comes bundled with Active Record, and with the faster C-based MySQL/Ruby adapter (available both as a gem and from www.tmtm.org/en/mysql/ruby/).

Options:

Constants

ADAPTER_NAME
ENCODINGS

Taken from here:

https://github.com/tmtm/ruby-mysql/blob/master/lib/mysql/charset.rb

Author: TOMITA Masahiro <tommy@tmtm.org>

LOST_CONNECTION_ERROR_MESSAGES
NATIVE_DATABASE_TYPES
QUOTED_FALSE

Public Class Methods

emulate_booleans click to toggle source

By default, the MysqlAdapter will consider all columns of type tinyint(1) as boolean. If you wish to disable this emulation (which was the default behavior in versions 0.13.1 and earlier) you can add the following line to your application.rb file:

ActiveRecord::ConnectionAdapters::MysqlAdapter.emulate_booleans = false
# File lib/active_record/connection_adapters/mysql_adapter.rb, line 161
cattr_accessor :emulate_booleans
new(connection, logger, connection_options, config) click to toggle source
# File lib/active_record/connection_adapters/mysql_adapter.rb, line 221
def initialize(connection, logger, connection_options, config)
  super(connection, logger)
  @connection_options, @config = connection_options, config
  @quoted_column_names, @quoted_table_names = {}, {}
  @statements = {}
  @statements = StatementPool.new(@connection,
                                  config.fetch(:statement_limit) { 1000 })
  @client_encoding = nil
  connect
end

Public Instance Methods

active?() click to toggle source

CONNECTION MANAGEMENT ====================================

# File lib/active_record/connection_adapters/mysql_adapter.rb, line 334
def active?
  if @connection.respond_to?(:stat)
    @connection.stat
  else
    @connection.query 'select 1'
  end

  # mysql-ruby doesn't raise an exception when stat fails.
  if @connection.respond_to?(:errno)
    @connection.errno.zero?
  else
    true
  end
rescue Mysql::Error
  false
end
add_column(table_name, column_name, type, options = {}) click to toggle source
# File lib/active_record/connection_adapters/mysql_adapter.rb, line 715
def add_column(table_name, column_name, type, options = {})
  execute("ALTER TABLE #{quote_table_name(table_name)} #{add_column_sql(table_name, column_name, type, options)}")
end
add_column_position!(sql, options) click to toggle source
# File lib/active_record/connection_adapters/mysql_adapter.rb, line 767
def add_column_position!(sql, options)
  if options[:first]
    sql << " FIRST"
  elsif options[:after]
    sql << " AFTER #{quote_column_name(options[:after])}"
  end
end
case_sensitive_equality_operator() click to toggle source
# File lib/active_record/connection_adapters/mysql_adapter.rb, line 801
def case_sensitive_equality_operator
  "= BINARY"
end
case_sensitive_modifier(node) click to toggle source
# File lib/active_record/connection_adapters/mysql_adapter.rb, line 806
def case_sensitive_modifier(node)
  Arel::Nodes::Bin.new(node)
end
change_column_null(table_name, column_name, null, default = nil) click to toggle source
# File lib/active_record/connection_adapters/mysql_adapter.rb, line 724
def change_column_null(table_name, column_name, null, default = nil)
  column = column_for(table_name, column_name)

  unless null || default.nil?
    execute("UPDATE #{quote_table_name(table_name)} SET #{quote_column_name(column_name)}=#{quote(default)} WHERE #{quote_column_name(column_name)} IS NULL")
  end

  change_column table_name, column_name, column.sql_type, :null => null
end
charset() click to toggle source

Returns the database character set.

# File lib/active_record/connection_adapters/mysql_adapter.rb, line 623
def charset
  show_variable 'character_set_database'
end
clear_cache!() click to toggle source

Clears the prepared statements cache.

# File lib/active_record/connection_adapters/mysql_adapter.rb, line 382
def clear_cache!
  @statements.clear
end
client_encoding() click to toggle source

Get the client encoding for this database

# File lib/active_record/connection_adapters/mysql_adapter.rb, line 434
def client_encoding
  return @client_encoding if @client_encoding

  result = exec_query(
    "SHOW VARIABLES WHERE Variable_name = 'character_set_client'",
    'SCHEMA')
  @client_encoding = ENCODINGS[result.rows.last.last]
end
collation() click to toggle source

Returns the database collation strategy.

# File lib/active_record/connection_adapters/mysql_adapter.rb, line 628
def collation
  show_variable 'collation_database'
end
create_database(name, options = {}) click to toggle source

Create a new MySQL database with optional :charset and :collation. Charset defaults to utf8.

Example:

create_database 'charset_test', :charset => 'latin1', :collation => 'latin1_bin'
create_database 'matt_development'
create_database 'matt_development', :charset => :big5
# File lib/active_record/connection_adapters/mysql_adapter.rb, line 602
def create_database(name, options = {})
  if options[:collation]
    execute "CREATE DATABASE `#{name}` DEFAULT CHARACTER SET `#{options[:charset] || 'utf8'}` COLLATE `#{options[:collation]}`"
  else
    execute "CREATE DATABASE `#{name}` DEFAULT CHARACTER SET `#{options[:charset] || 'utf8'}`"
  end
end
create_savepoint() click to toggle source
# File lib/active_record/connection_adapters/mysql_adapter.rb, line 526
def create_savepoint
  execute("SAVEPOINT #{current_savepoint_name}")
end
current_database() click to toggle source
# File lib/active_record/connection_adapters/mysql_adapter.rb, line 618
def current_database
  select_value 'SELECT DATABASE() as db'
end
disconnect!() click to toggle source

Disconnects from the database if already connected. Otherwise, this method does nothing.

# File lib/active_record/connection_adapters/mysql_adapter.rb, line 359
def disconnect!
  @connection.close rescue nil
end
drop_table(table_name, options = {}) click to toggle source
# File lib/active_record/connection_adapters/mysql_adapter.rb, line 656
def drop_table(table_name, options = {})
  super(table_name, options)
end
exec_delete(sql, name, binds) click to toggle source
# File lib/active_record/connection_adapters/mysql_adapter.rb, line 499
def exec_delete(sql, name, binds)
  log(sql, name, binds) do
    exec_stmt(sql, name, binds) do |cols, stmt|
      stmt.affected_rows
    end
  end
end
Also aliased as: exec_update
exec_query(sql, name = 'SQL', binds = []) click to toggle source
# File lib/active_record/connection_adapters/mysql_adapter.rb, line 443
def exec_query(sql, name = 'SQL', binds = [])
  log(sql, name, binds) do
    exec_stmt(sql, name, binds) do |cols, stmt|
      ActiveRecord::Result.new(cols, stmt.to_a) if cols
    end
  end
end
exec_update(sql, name, binds) click to toggle source
Alias for: exec_delete
last_inserted_id(result) click to toggle source
# File lib/active_record/connection_adapters/mysql_adapter.rb, line 451
def last_inserted_id(result)
  @connection.insert_id
end
limited_update_conditions(where_sql, quoted_table_name, quoted_primary_key) click to toggle source
# File lib/active_record/connection_adapters/mysql_adapter.rb, line 810
def limited_update_conditions(where_sql, quoted_table_name, quoted_primary_key)
  where_sql
end
primary_key(table) click to toggle source

Returns just a table's primary key

# File lib/active_record/connection_adapters/mysql_adapter.rb, line 796
def primary_key(table)
  pk_and_sequence = pk_and_sequence_for(table)
  pk_and_sequence && pk_and_sequence.first
end
quote(value, column = nil) click to toggle source

QUOTING ==================================================

# File lib/active_record/connection_adapters/mysql_adapter.rb, line 282
def quote(value, column = nil)
  if value.kind_of?(String) && column && column.type == :binary && column.class.respond_to?(:string_to_binary)
    s = column.class.string_to_binary(value).unpack("H*")[0]
    "x'#{s}'"
  elsif value.kind_of?(BigDecimal)
    value.to_s("F")
  else
    super
  end
end
quoted_false() click to toggle source
# File lib/active_record/connection_adapters/mysql_adapter.rb, line 315
def quoted_false
  QUOTED_FALSE
end
quoted_true() click to toggle source
# File lib/active_record/connection_adapters/mysql_adapter.rb, line 311
def quoted_true
  QUOTED_TRUE
end
reconnect!() click to toggle source
# File lib/active_record/connection_adapters/mysql_adapter.rb, line 351
def reconnect!
  disconnect!
  clear_cache!
  connect
end
release_savepoint() click to toggle source
# File lib/active_record/connection_adapters/mysql_adapter.rb, line 534
def release_savepoint
  execute("RELEASE SAVEPOINT #{current_savepoint_name}")
end
rename_table(table_name, new_name) click to toggle source

Renames a table.

Example:

rename_table('octopuses', 'octopi')
# File lib/active_record/connection_adapters/mysql_adapter.rb, line 696
def rename_table(table_name, new_name)
  execute "RENAME TABLE #{quote_table_name(table_name)} TO #{quote_table_name(new_name)}"
end
reset!() click to toggle source
# File lib/active_record/connection_adapters/mysql_adapter.rb, line 363
def reset!
  if @connection.respond_to?(:change_user)
    # See http://bugs.mysql.com/bug.php?id=33540 -- the workaround way to
    # reset the connection is to change the user to the same user.
    @connection.change_user(@config[:username], @config[:password], @config[:database])
    configure_connection
  end
end
rollback_to_savepoint() click to toggle source
# File lib/active_record/connection_adapters/mysql_adapter.rb, line 530
def rollback_to_savepoint
  execute("ROLLBACK TO SAVEPOINT #{current_savepoint_name}")
end
select_rows(sql, name = nil) click to toggle source

DATABASE STATEMENTS ======================================

# File lib/active_record/connection_adapters/mysql_adapter.rb, line 374
def select_rows(sql, name = nil)
  @connection.query_with_result = true
  rows = exec_without_stmt(sql, name).rows
  @connection.more_results && @connection.next_result    # invoking stored procedures with CLIENT_MULTI_RESULTS requires this to tidy up else connection will be dropped
  rows
end
show_variable(name) click to toggle source

SHOW VARIABLES LIKE 'name'

# File lib/active_record/connection_adapters/mysql_adapter.rb, line 776
def show_variable(name)
  variables = select_all("SHOW VARIABLES LIKE '#{name}'")
  variables.first['Value'] unless variables.empty?
end
supports_statement_cache?() click to toggle source

Returns true, since this connection adapter supports prepared statement caching.

# File lib/active_record/connection_adapters/mysql_adapter.rb, line 256
def supports_statement_cache?
  true
end
table_exists?(name) click to toggle source
# File lib/active_record/connection_adapters/mysql_adapter.rb, line 642
def table_exists?(name)
  return true if super

  name          = name.to_s
  schema, table = name.split('.', 2)

  unless table # A table was provided without a schema
    table  = schema
    schema = nil
  end

  tables(nil, schema).include? table
end
type_cast(value, column) click to toggle source
# File lib/active_record/connection_adapters/mysql_adapter.rb, line 293
def type_cast(value, column)
  return super unless value == true || value == false

  value ? 1 : 0
end
type_to_sql(type, limit = nil, precision = nil, scale = nil) click to toggle source

Maps logical Rails types to MySQL-specific data types.

# File lib/active_record/connection_adapters/mysql_adapter.rb, line 743
def type_to_sql(type, limit = nil, precision = nil, scale = nil)
  case type.to_s
  when 'integer'
    case limit
    when 1; 'tinyint'
    when 2; 'smallint'
    when 3; 'mediumint'
    when nil, 4, 11; 'int(11)'  # compatibility with MySQL default
    when 5..8; 'bigint'
    else raise(ActiveRecordError, "No integer type has byte size #{limit}")
    end
  when 'text'
    case limit
    when 0..0xff;               'tinytext'
    when nil, 0x100..0xffff;    'text'
    when 0x10000..0xffffff;     'mediumtext'
    when 0x1000000..0xffffffff; 'longtext'
    else raise(ActiveRecordError, "No text type has character length #{limit}")
    end
  else
    super
  end
end

Protected Instance Methods

add_column_sql(table_name, column_name, type, options = {}) click to toggle source
# File lib/active_record/connection_adapters/mysql_adapter.rb, line 841
def add_column_sql(table_name, column_name, type, options = {})
  add_column_sql = "ADD #{quote_column_name(column_name)} #{type_to_sql(type, options[:limit], options[:precision], options[:scale])}"
  add_column_options!(add_column_sql, options)
  add_column_position!(add_column_sql, options)
  add_column_sql
end
add_index_sql(table_name, column_name, options = {}) click to toggle source
# File lib/active_record/connection_adapters/mysql_adapter.rb, line 886
def add_index_sql(table_name, column_name, options = {})
  index_name, index_type, index_columns = add_index_options(table_name, column_name, options)
  "ADD #{index_type} INDEX #{index_name} (#{index_columns})"
end
add_timestamps_sql(table_name) click to toggle source
# File lib/active_record/connection_adapters/mysql_adapter.rb, line 896
def add_timestamps_sql(table_name)
  [add_column_sql(table_name, :created_at, :datetime), add_column_sql(table_name, :updated_at, :datetime)]
end
change_column_sql(table_name, column_name, type, options = {}) click to toggle source
# File lib/active_record/connection_adapters/mysql_adapter.rb, line 853
def change_column_sql(table_name, column_name, type, options = {})
  column = column_for(table_name, column_name)

  unless options_include_default?(options)
    options[:default] = column.default
  end

  unless options.has_key?(:null)
    options[:null] = column.null
  end

  change_column_sql = "CHANGE #{quote_column_name(column_name)} #{quote_column_name(column_name)} #{type_to_sql(type, options[:limit], options[:precision], options[:scale])}"
  add_column_options!(change_column_sql, options)
  add_column_position!(change_column_sql, options)
  change_column_sql
end
quoted_columns_for_index(column_names, options = {}) click to toggle source
# File lib/active_record/connection_adapters/mysql_adapter.rb, line 815
def quoted_columns_for_index(column_names, options = {})
  length = options[:length] if options.is_a?(Hash)

  case length
  when Hash
    column_names.map {|name| length[name] ? "#{quote_column_name(name)}(#{length[name]})" : quote_column_name(name) }
  when Fixnum
    column_names.map {|name| "#{quote_column_name(name)}(#{length})"}
  else
    column_names.map {|name| quote_column_name(name) }
  end
end
remove_column_sql(table_name, *column_names) click to toggle source
# File lib/active_record/connection_adapters/mysql_adapter.rb, line 848
def remove_column_sql(table_name, *column_names)
  columns_for_remove(table_name, *column_names).map {|column_name| "DROP #{column_name}" }
end
remove_index_sql(table_name, options = {}) click to toggle source
# File lib/active_record/connection_adapters/mysql_adapter.rb, line 891
def remove_index_sql(table_name, options = {})
  index_name = index_name_for_remove(table_name, options)
  "DROP INDEX #{index_name}"
end
remove_timestamps_sql(table_name) click to toggle source
# File lib/active_record/connection_adapters/mysql_adapter.rb, line 900
def remove_timestamps_sql(table_name)
  [remove_column_sql(table_name, :updated_at), remove_column_sql(table_name, :created_at)]
end
rename_column_sql(table_name, column_name, new_column_name) click to toggle source
# File lib/active_record/connection_adapters/mysql_adapter.rb, line 870
def rename_column_sql(table_name, column_name, new_column_name)
  options = {}

  if column = columns(table_name).find { |c| c.name == column_name.to_s }
    options[:default] = column.default
    options[:null] = column.null
  else
    raise ActiveRecordError, "No such column: #{table_name}.#{column_name}"
  end

  current_type = select_one("SHOW COLUMNS FROM #{quote_table_name(table_name)} LIKE '#{column_name}'")["Type"]
  rename_column_sql = "CHANGE #{quote_column_name(column_name)} #{quote_column_name(new_column_name)} #{current_type}"
  add_column_options!(rename_column_sql, options)
  rename_column_sql
end
translate_exception(exception, message) click to toggle source
# File lib/active_record/connection_adapters/mysql_adapter.rb, line 828
def translate_exception(exception, message)
  return super unless exception.respond_to?(:errno)

  case exception.errno
  when 1062
    RecordNotUnique.new(message, exception)
  when 1452
    InvalidForeignKey.new(message, exception)
  else
    super
  end
end

[Validate]

Generated with the Darkfish Rdoc Generator 2.