| 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:
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
| 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' |
# 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
CONNECTION MANAGEMENT ====================================
# 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
# 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.
# 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
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 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
# 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
# File vendor/rails/activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 287
287: def disconnect!
288: @connection.close rescue nil
289: end
# 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 ==================================================
# 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
# File vendor/rails/activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 246
246: def quoted_false
247: QUOTED_FALSE
248: end
# File vendor/rails/activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 242
242: def quoted_true
243: QUOTED_TRUE
244: end
# File vendor/rails/activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 282
282: def reconnect!
283: disconnect!
284: connect
285: end
# 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 ======================================
# 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‘
# 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.
# 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