123456789_123456789_123456789_123456789_123456789_

Class: ActiveRecord::ConnectionAdapters::MysqlAdapter

Overview

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:

  • :host - Defaults to “localhost”.

  • :port - Defaults to 3306.

  • :socket - Defaults to “/tmp/mysql.sock”.

  • :username - Defaults to “root”

  • :password - Defaults to nothing.

  • :database - The name of the database. No default, must be provided.

  • :encoding - (Optional) Sets the client encoding by executing “SET NAMES <encoding>” after connection.

  • :reconnect - Defaults to false (See MySQL documentation: dev.mysql.com/doc/refman/5.0/en/auto-reconnect.html).

  • :strict - Defaults to true. Enable STRICT_ALL_TABLES. (See MySQL documentation: dev.mysql.com/doc/refman/5.0/en/sql-mode.html)

  • :variables - (Optional) A hash session variables to send as SET @@SESSION.key = value on each database connection. Use the value :default to set a variable to its DEFAULT value. (See MySQL documentation: dev.mysql.com/doc/refman/5.0/en/set-statement.html).

  • :sslca - Necessary to use MySQL with an SSL connection.

  • :sslkey - Necessary to use MySQL with an SSL connection.

  • :sslcert - Necessary to use MySQL with an SSL connection.

  • :sslcapath - Necessary to use MySQL with an SSL connection.

  • :sslcipher - Necessary to use MySQL with an SSL connection.

Constant Summary

  • ADAPTER_NAME =
    # File 'activerecord/lib/active_record/connection_adapters/mysql_adapter.rb', line 69
    'MySQL'.freeze
  • ENCODINGS =

    Taken from here: github.com/tmtm/ruby-mysql/blob/master/lib/mysql/charset.rb Author: TOMITA Masahiro <tommy@tmtm.org>

    # File 'activerecord/lib/active_record/connection_adapters/mysql_adapter.rb', line 203
    {
      "armscii8" => nil,
      "ascii"    => Encoding::US_ASCII,
      "big5"     => Encoding::Big5,
      "binary"   => Encoding::ASCII_8BIT,
      "cp1250"   => Encoding::Windows_1250,
      "cp1251"   => Encoding::Windows_1251,
      "cp1256"   => Encoding::Windows_1256,
      "cp1257"   => Encoding::Windows_1257,
      "cp850"    => Encoding::CP850,
      "cp852"    => Encoding::CP852,
      "cp866"    => Encoding::IBM866,
      "cp932"    => Encoding::Windows_31J,
      "dec8"     => nil,
      "eucjpms"  => Encoding::EucJP_ms,
      "euckr"    => Encoding::EUC_KR,
      "gb2312"   => Encoding::EUC_CN,
      "gbk"      => Encoding::GBK,
      "geostd8"  => nil,
      "greek"    => Encoding::ISO_8859_7,
      "hebrew"   => Encoding::ISO_8859_8,
      "hp8"      => nil,
      "keybcs2"  => nil,
      "koi8r"    => Encoding::KOI8_R,
      "koi8u"    => Encoding::KOI8_U,
      "latin1"   => Encoding::ISO_8859_1,
      "latin2"   => Encoding::ISO_8859_2,
      "latin5"   => Encoding::ISO_8859_9,
      "latin7"   => Encoding::ISO_8859_13,
      "macce"    => Encoding::MacCentEuro,
      "macroman" => Encoding::MacRoman,
      "sjis"     => Encoding::SHIFT_JIS,
      "swe7"     => nil,
      "tis620"   => Encoding::TIS_620,
      "ucs2"     => Encoding::UTF_16BE,
      "ujis"     => Encoding::EucJP_ms,
      "utf8"     => Encoding::UTF_8,
      "utf8mb4"  => Encoding::UTF_8,
    }

::ActiveSupport::Callbacks - Included

CALLBACK_FILTER_TYPES

AbstractAdapter - Inherited

ADAPTER_NAME, SIMPLE_INT

AbstractMysqlAdapter - Inherited

INDEX_TYPES, INDEX_USINGS, LOST_CONNECTION_ERROR_MESSAGES, NATIVE_DATABASE_TYPES

Class Attribute Summary

Class Method Summary

AbstractMysqlAdapter - Inherited

.new

FIXME: Make the first parameter more similar for the two adapters.

AbstractAdapter - Inherited

::ActiveSupport::DescendantsTracker - Inherited

clear, descendants, direct_descendants,
store_inherited

This is the only method that is not thread safe, but is only ever called during the eager loading phase.

Instance Attribute Summary

AbstractMysqlAdapter - Inherited

#emulate_booleans, #emulate_booleans?, #strict_mode?, #supports_datetime_with_precision?, #supports_foreign_keys?,
#supports_index_sort_order?

Technically MySQL allows to create indexes with the sort order syntax but at the moment (5.5) it doesn't yet implement them.

#supports_indexes_in_create?,
#supports_migrations?

Returns true, since this connection adapter supports migrations.

#supports_primary_key?,
#supports_transaction_isolation?

MySQL 4 technically support transaction isolation, but it is affected by a bug where the transaction level gets persisted for the whole session:

#supports_views?

AbstractAdapter - Inherited

#active?

Checks whether the connection to the database is still active.

#in_use?
#logger, #owner, #pool, #prepared_statements,
#requires_reloading?

Returns true if its required to reload the connection between requests for development mode.

#schema_cache, #schema_cache=, #supports_bulk_alter?,
#supports_ddl_transactions?

Does this adapter support DDL rollbacks in transactions? That is, would CREATE TABLE or ALTER TABLE get rolled back by a transaction?

#supports_explain?

Does this adapter support explain?

#supports_extensions?

Does this adapter support database extensions?

#supports_foreign_keys?

Does this adapter support creating foreign key constraints?

#supports_index_sort_order?

Does this adapter support index sort order?

#supports_indexes_in_create?

Does this adapter support creating indexes in the same statement as creating the table?

#supports_migrations?

Does this adapter support migrations?

#supports_partial_index?

Does this adapter support partial indices?

#supports_primary_key?

Can this adapter determine the primary key for tables not attached to an Active Record class, such as join tables?

#supports_savepoints?

Does this adapter support savepoints?

#supports_transaction_isolation?

Does this adapter support setting the isolation level for a transaction?

#supports_views?

Does this adapter support views?

#visitor

DatabaseStatements - Included

#begin_transaction, #commit_transaction, #current_transaction, #open_transactions, #rollback_transaction,
#supports_statement_cache?

Returns true when the connection adapter supports prepared statement caching, otherwise returns false

#transaction_open?, #within_new_transaction

Instance Method Summary

AbstractMysqlAdapter - Inherited

#begin_db_transaction, #begin_isolated_db_transaction, #case_insensitive_comparison, #case_sensitive_comparison, #case_sensitive_modifier, #change_column_null,
#charset

Returns the database character set.

#clear_cache!,
#collation

Returns the database collation strategy.

#create_database

Create a new MySQL database with optional :charset and :collation.

#current_database,
#data_source_exists?
#data_sources
#drop_table, #empty_insert_statement_value,
#execute

Executes the SQL statement in the context of this connection.

#foreign_keys, #index_algorithms, #native_database_types,
#pk_and_sequence_for

Returns a table's primary key and belonging sequence.

#primary_key

Returns just a table's primary key.

#quoted_date, #quoted_false, #quoted_true,
#recreate_database

Drops the database specified on the name attribute and creates it again using the provided options.

#rename_index,
#rename_table

Renames a table.

#schema_creation,
#show_variable

SHOW VARIABLES LIKE 'name'.

#table_exists?, #truncate,
#type_to_sql

Maps logical ::Rails types to MySQL-specific data types.

#unquoted_false, #unquoted_true, #valid_type?

AbstractAdapter - Inherited

#adapter_name

Returns the human-readable name of the adapter.

#case_insensitive_comparison, #case_sensitive_comparison, #case_sensitive_modifier,
#clear_cache!

Clear any caching the database adapter may be doing, for example clearing the prepared statement cache.

#close

Check the connection back in to the connection pool.

#collector, #create_savepoint, #current_savepoint_name,
#disable_extension

This is meant to be implemented by the adapters that support extensions.

#disable_referential_integrity

Override to turn off referential integrity while executing &block.

#disconnect!

Disconnects from the database if already connected.

#enable_extension

This is meant to be implemented by the adapters that support extensions.

#expire,
#extensions

A list of extensions, to be filled in by adapters that support them.

#index_algorithms

A list of index algorithms, to be filled by adapters that support them.

#lease, #new_column,
#prefetch_primary_key?

Should primary key values be selected from their corresponding sequence before the insert statement? If true, next_sequence_value is called before each insert to set the record's primary key.

#raw_connection

Provides access to the underlying database driver for this adapter.

#reconnect!

Disconnects from the database if already connected, and establishes a new connection with the database.

#release_savepoint,
#reset!

Reset the state of this connection, directing the DBMS to clear transactions and other connection-related server-side state.

#schema_creation,
#substitute_at

Returns a bind substitution value given a bind column NOTE: The column param is currently being used by the sqlserver-adapter.

#unprepared_statement, #valid_type?,
#verify!

Checks whether the connection to the database is still active (i.e. not stale).

ColumnDumper - Included

#column_spec,
#migration_keys

Lists the valid migration options.

#prepare_column_options

This can be overridden on a Adapter level basis to support other extended datatypes (Example: Adding an array option in the PostgreSQLAdapter).

::ActiveSupport::Callbacks - Included

#run_callbacks

Runs the callbacks for the given event.

::ActiveRecord::QueryCache - Included

DatabaseLimits - Included

#allowed_index_name_length

Returns the maximum allowed length for an index name.

#column_name_length

Returns the maximum length of a column name.

#columns_per_multicolumn_index

Returns the maximum number of columns in a multicolumn index.

#columns_per_table

Returns the maximum number of columns per table.

#in_clause_length

Returns the maximum number of elements in an IN (x,y,z) clause.

#index_name_length

Returns the maximum length of an index name.

#indexes_per_table

Returns the maximum number of indexes per table.

#joins_per_query

Returns maximum number of joins in a single query.

#sql_query_length

Returns the maximum length of an SQL query.

#table_alias_length

Returns the maximum length of a table alias.

#table_name_length

Returns the maximum length of a table name.

Quoting - Included

#quote

Quotes the column value to help prevent SQL injection attacks.

#quote_column_name

Quotes the column name.

#quote_string

Quotes a string, escaping any ' (single quote) and \ (backslash) characters.

#quote_table_name

Quotes the table name.

#quote_table_name_for_assignment

Override to return the quoted table name for assignment.

#quoted_date, #quoted_false, #quoted_true,
#type_cast

Cast a value to a type that the database understands.

#unquoted_false, #unquoted_true

DatabaseStatements - Included

#add_transaction_record

Register a record with the current transaction so that its after_commit and after_rollback callbacks can be called.

#begin_db_transaction

Begins the transaction (and turns off auto-committing).

#begin_isolated_db_transaction

Begins the transaction with the isolation level set.

#commit_db_transaction

Commits the transaction (and turns on auto-committing).

#default_sequence_name,
#delete

Executes the delete statement and returns the number of rows affected.

#empty_insert_statement_value,
#exec_delete

Executes delete sql statement in the context of this connection using binds as the bind substitutes.

#exec_insert

Executes insert sql statement in the context of this connection using binds as the bind substitutes.

#exec_query

Executes sql statement in the context of this connection using binds as the bind substitutes.

#exec_update

Executes update sql statement in the context of this connection using binds as the bind substitutes.

#execute

Executes the SQL statement in the context of this connection.

#initialize,
#insert

Returns the last auto-generated ID from the affected table.

#insert_fixture

Inserts the given fixture into the table.

#reset_sequence!

Set the sequence to the max value of the table's column.

#rollback_db_transaction

Rolls back the transaction (and turns on auto-committing).

#rollback_to_savepoint,
#sanitize_limit

Sanitizes the given LIMIT parameter in order to prevent SQL injection.

#select_all

Returns an ::ActiveRecord::Result instance.

#select_one

Returns a record hash with the column names as keys and column values as values.

#select_rows

Returns an array of arrays containing the field values.

#select_value

Returns a single value from a record.

#select_values

Returns an array of the values of the first column in a select:

#to_sql

Converts an arel AST to SQL.

#transaction

Runs the given block in a database transaction, and returns the result of the block.

#transaction_isolation_levels, #transaction_state,
#truncate

Executes the truncate statement.

#update

Executes the update statement and returns the number of rows affected.

SchemaStatements - Included

#add_belongs_to
#add_column

Adds a new column to the named table.

#add_foreign_key

Adds a new foreign key.

#add_index

Adds a new index to the table.

#add_reference

Adds a reference.

#add_timestamps

Adds timestamps (created_at and updated_at) columns to table_name.

#assume_migrated_upto_version,
#change_column

Changes the column's definition according to the new options.

#change_column_default

Sets a new default value for a column:

#change_column_null

Sets or removes a NOT NULL constraint on a column.

#change_table

A block for changing columns in table.

#column_exists?

Checks to see if a column exists in a given table.

#columns

Returns an array of Column objects for the table specified by table_name.

#create_join_table

Creates a new join table with the name created using the lexical order of the first two arguments.

#create_table

Creates a new table with the name table_name.

#data_source_exists?

Checks to see if the data source name exists on the database.

#data_sources

Returns the relation names useable to back Active Record models.

#drop_join_table

Drops the join table specified by the given arguments.

#drop_table

Drops a table from the database.

#foreign_keys

Returns an array of foreign keys for the given table.

#index_exists?

Checks to see if an index exists on a table for a given index definition.

#index_name_exists?

Verifies the existence of an index with a given name.

#initialize_schema_migrations_table

Should not be called normally, but this operation is non-destructive.

#native_database_types

Returns a hash of mappings from the abstract data types to the native database types.

#remove_belongs_to
#remove_column

Removes the column from the table definition.

#remove_columns

Removes the given columns from the table definition.

#remove_foreign_key

Removes the given foreign key from the table.

#remove_index

Removes the given index from the table.

#remove_reference

Removes the reference(s).

#remove_timestamps

Removes the timestamp columns (created_at and updated_at) from the table definition.

#rename_column

Renames a column.

#rename_index

Renames an index.

#rename_table

Renames a table.

#table_alias_for

Truncates a table alias according to the limits of the current adapter.

#table_exists?

Checks to see if the table table_name exists on the database.

Constructor Details

.new(connection, logger, connection_options, config) ⇒ MysqlAdapter

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/mysql_adapter.rb', line 103

def initialize(connection, logger, connection_options, config)
  super
  @statements = StatementPool.new(@connection,
                                  self.class.type_cast_config_to_integer(config.fetch(:statement_limit) { 1000 }))
  @client_encoding = nil
  connect
end

Instance Attribute Details

#active?Boolean (readonly)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/mysql_adapter.rb', line 144

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

#supports_statement_cache?Boolean (readonly)

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

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/mysql_adapter.rb', line 113

def supports_statement_cache?
  true
end

Instance Method Details

#clear_cache!

Clears the prepared statements cache.

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/mysql_adapter.rb', line 195

def clear_cache!
  super
  @statements.clear
end

#client_encoding

Get the client encoding for this database

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/mysql_adapter.rb', line 244

def client_encoding
  return @client_encoding if @client_encoding

  result = exec_query(
    "select @@character_set_client",
    'SCHEMA')
  @client_encoding = ENCODINGS[result.rows.last.last]
end

#create(sql, name = nil, pk = nil, id_value = nil, sequence_name = nil)

Alias for #insert_sql.

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/mysql_adapter.rb', line 384

alias :create :insert_sql

#disconnect!

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

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/mysql_adapter.rb', line 169

def disconnect!
  super
  @connection.close rescue nil
end

#exec_query(sql, name = 'SQL', binds = []) {|affected_rows| ... }

Yields:

  • (affected_rows)
[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/mysql_adapter.rb', line 253

def exec_query(sql, name = 'SQL', binds = [])
  if without_prepared_statement?(binds)
    result_set, affected_rows = exec_without_stmt(sql, name)
  else
    result_set, affected_rows = exec_stmt(sql, name, binds)
  end

  yield affected_rows if block_given?

  result_set
end

#exec_update(sql, name, binds)

Alias for #exec_delete.

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/mysql_adapter.rb', line 395

alias :exec_update :exec_delete

#last_inserted_id(result)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/mysql_adapter.rb', line 265

def last_inserted_id(result)
  @connection.insert_id
end

#reconnect!

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/mysql_adapter.rb', line 161

def reconnect!
  super
  disconnect!
  connect
end

#reset!

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/mysql_adapter.rb', line 174

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

#select_rows(sql, name = nil, binds = [])

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/mysql_adapter.rb', line 187

def select_rows(sql, name = nil, binds = [])
  @connection.query_with_result = true
  rows = exec_query(sql, name, binds).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