Class ActiveRecord::ConnectionAdapters::MysqlAdapter
In: vendor/rails/activerecord/lib/active_record/connection_adapters/mysql_adapter.rb
Parent: AbstractAdapter

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.
  • :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.

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 environment.rb file:

  ActiveRecord::ConnectionAdapters::MysqlAdapter.emulate_booleans = false

Methods

Constants

LOST_CONNECTION_ERROR_MESSAGES = [ "Server shutdown in progress", "Broken pipe", "Lost connection to MySQL server during query", "MySQL server has gone away" ]
QUOTED_FALSE = '1', '0'

Public Class methods

[Source]

     # File vendor/rails/activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 184
184:       def initialize(connection, logger, connection_options, config)
185:         super(connection, logger)
186:         @connection_options, @config = connection_options, config
187:         @quoted_column_names, @quoted_table_names = {}, {}
188:         connect
189:       end

Public Instance methods

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

[Source]

     # File vendor/rails/activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 265
265:       def active?
266:         if @connection.respond_to?(:stat)
267:           @connection.stat
268:         else
269:           @connection.query 'select 1'
270:         end
271: 
272:         # mysql-ruby doesn't raise an exception when stat fails.
273:         if @connection.respond_to?(:errno)
274:           @connection.errno.zero?
275:         else
276:           true
277:         end
278:       rescue Mysql::Error
279:         false
280:       end

[Source]

     # File vendor/rails/activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 452
452:       def change_column_null(table_name, column_name, null, default = nil)
453:         column = column_for(table_name, column_name)
454: 
455:         unless null || default.nil?
456:           execute("UPDATE #{quote_table_name(table_name)} SET #{quote_column_name(column_name)}=#{quote(default)} WHERE #{quote_column_name(column_name)} IS NULL")
457:         end
458: 
459:         change_column table_name, column_name, column.sql_type, :null => null
460:       end

Returns the database character set.

[Source]

     # File vendor/rails/activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 398
398:       def charset
399:         show_variable 'character_set_database'
400:       end

Returns the database collation strategy.

[Source]

     # File vendor/rails/activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 403
403:       def collation
404:         show_variable 'collation_database'
405:       end

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

[Source]

     # File vendor/rails/activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 381
381:       def create_database(name, options = {})
382:         if options[:collation]
383:           execute "CREATE DATABASE `#{name}` DEFAULT CHARACTER SET `#{options[:charset] || 'utf8'}` COLLATE `#{options[:collation]}`"
384:         else
385:           execute "CREATE DATABASE `#{name}` DEFAULT CHARACTER SET `#{options[:charset] || 'utf8'}`"
386:         end
387:       end

[Source]

     # File vendor/rails/activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 393
393:       def current_database
394:         select_value 'SELECT DATABASE() as db'
395:       end

[Source]

     # File vendor/rails/activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 287
287:       def disconnect!
288:         @connection.close rescue nil
289:       end

[Source]

     # File vendor/rails/activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 413
413:       def drop_table(table_name, options = {})
414:         super(table_name, options)
415:       end

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

[Source]

     # File vendor/rails/activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 219
219:       def quote(value, column = nil)
220:         if value.kind_of?(String) && column && column.type == :binary && column.class.respond_to?(:string_to_binary)
221:           s = column.class.string_to_binary(value).unpack("H*")[0]
222:           "x'#{s}'"
223:         elsif value.kind_of?(BigDecimal)
224:           "'#{value.to_s("F")}'"
225:         else
226:           super
227:         end
228:       end

[Source]

     # File vendor/rails/activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 246
246:       def quoted_false
247:         QUOTED_FALSE
248:       end

[Source]

     # File vendor/rails/activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 242
242:       def quoted_true
243:         QUOTED_TRUE
244:       end

[Source]

     # File vendor/rails/activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 282
282:       def reconnect!
283:         disconnect!
284:         connect
285:       end

[Source]

     # File vendor/rails/activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 443
443:       def rename_table(table_name, new_name)
444:         execute "RENAME TABLE #{quote_table_name(table_name)} TO #{quote_table_name(new_name)}"
445:       end

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

[Source]

     # File vendor/rails/activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 294
294:       def select_rows(sql, name = nil)
295:         @connection.query_with_result = true
296:         result = execute(sql, name)
297:         rows = []
298:         result.each { |row| rows << row }
299:         result.free
300:         rows
301:       end

SHOW VARIABLES LIKE ‘name‘

[Source]

     # File vendor/rails/activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 508
508:       def show_variable(name)
509:         variables = select_all("SHOW VARIABLES LIKE '#{name}'")
510:         variables.first['Value'] unless variables.empty?
511:       end

Maps logical Rails types to MySQL-specific data types.

[Source]

     # File vendor/rails/activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 493
493:       def type_to_sql(type, limit = nil, precision = nil, scale = nil)
494:         return super unless type.to_s == 'integer'
495: 
496:         case limit
497:         when 1; 'tinyint'
498:         when 2; 'smallint'
499:         when 3; 'mediumint'
500:         when nil, 4, 11; 'int(11)'  # compatibility with MySQL default
501:         when 5..8; 'bigint'
502:         else raise(ActiveRecordError, "No integer type has byte size #{limit}")
503:         end
504:       end

[Validate]