Class: ActiveRecord::ConnectionAdapters::AbstractMysqlAdapter

Inherits:
AbstractAdapter
  • Object
show all
Includes:
Savepoints
Defined in:
lib/active_record/connection_adapters/abstract_mysql_adapter.rb

Direct Known Subclasses

Mysql2Adapter, MysqlAdapter

Defined Under Namespace

Classes: BindSubstitution, Column, SchemaCreation

Constant Summary collapse

LOST_CONNECTION_ERROR_MESSAGES =
[
"Server shutdown in progress",
"Broken pipe",
"Lost connection to MySQL server during query",
"MySQL server has gone away" ]
NATIVE_DATABASE_TYPES =
{
  :primary_key => "int(11) auto_increment PRIMARY KEY",
  :string      => { :name => "varchar", :limit => 255 },
  :text        => { :name => "text" },
  :integer     => { :name => "int", :limit => 4 },
  :float       => { :name => "float" },
  :decimal     => { :name => "decimal" },
  :datetime    => { :name => "datetime" },
  :timestamp   => { :name => "datetime" },
  :time        => { :name => "time" },
  :date        => { :name => "date" },
  :binary      => { :name => "blob" },
  :boolean     => { :name => "tinyint", :limit => 1 }
}
INDEX_TYPES =
[:fulltext, :spatial]
INDEX_USINGS =
[:btree, :hash]

Constants inherited from AbstractAdapter

ActiveRecord::ConnectionAdapters::AbstractAdapter::SIMPLE_INT

Instance Attribute Summary

Attributes inherited from AbstractAdapter

#in_use, #last_use, #logger, #pool, #schema_cache, #visitor

Attributes included from QueryCache

#query_cache, #query_cache_enabled

Instance Method Summary collapse

Methods included from Savepoints

#create_savepoint, #release_savepoint, #rollback_to_savepoint, #supports_savepoints?

Methods inherited from AbstractAdapter

#active?, #active_threadsafe?, #clear_cache!, #close, #create_savepoint, #current_savepoint_name, #disable_extension, #disconnect!, #enable_extension, #expire, #extensions, #lease, #open_transactions, #prefetch_primary_key?, #raw_connection, #reconnect!, #release_savepoint, #requires_reloading?, #reset!, #rollback_to_savepoint, #substitute_at, #supports_count_distinct?, #supports_ddl_transactions?, #supports_explain?, #supports_extensions?, #supports_partial_index?, #supports_savepoints?, type_cast_config_to_boolean, type_cast_config_to_integer, #unprepared_statement, #unprepared_visitor, #verify!

Methods included from ColumnDumper

#column_spec, #migration_keys, #prepare_column_options

Methods included from QueryCache

#cache, #clear_query_cache, dirties_query_cache, #disable_query_cache!, #enable_query_cache!, included, #select_all, #uncached

Methods included from DatabaseLimits

#allowed_index_name_length, #column_name_length, #columns_per_multicolumn_index, #columns_per_table, #in_clause_length, #index_name_length, #indexes_per_table, #joins_per_query, #sql_query_length, #table_alias_length, #table_name_length

Methods included from Quoting

#quote_string, #quote_table_name_for_assignment, #quoted_date

Methods included from DatabaseStatements

#add_transaction_record, #begin_transaction, #commit_transaction, #current_transaction, #default_sequence_name, #delete, #exec_delete, #exec_insert, #exec_query, #exec_update, #insert, #insert_fixture, #join_to_delete, #reset_sequence!, #reset_transaction, #rollback_transaction, #sanitize_limit, #select_all, #select_one, #select_rows, #select_value, #select_values, #supports_statement_cache?, #to_sql, #transaction, #transaction_isolation_levels, #transaction_open?, #update, #within_new_transaction

Methods included from SchemaStatements

#add_column, #add_reference, #add_timestamps, #assume_migrated_upto_version, #change_table, #column_exists?, #columns_for_distinct, #create_join_table, #drop_join_table, #dump_schema_information, #index_exists?, #index_name, #index_name_exists?, #initialize_schema_migrations_table, #remove_column, #remove_columns, #remove_index, #remove_index!, #remove_reference, #remove_timestamps, #table_alias_for, #update_table_definition

Constructor Details

#initialize(connection, logger, connection_options, config) ⇒ AbstractMysqlAdapter

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



173
174
175
176
177
178
179
180
181
182
183
184
# File 'lib/active_record/connection_adapters/abstract_mysql_adapter.rb', line 173

def initialize(connection, logger, connection_options, config)
  super(connection, logger)
  @connection_options, @config = connection_options, config
  @quoted_column_names, @quoted_table_names = {}, {}

  if self.class.type_cast_config_to_boolean(config.fetch(:prepared_statements) { true })
    @prepared_statements = true
    @visitor = Arel::Visitors::MySQL.new self
  else
    @visitor = unprepared_visitor
  end
end

Instance Method Details

#adapter_nameObject

:nodoc:



186
187
188
# File 'lib/active_record/connection_adapters/abstract_mysql_adapter.rb', line 186

def adapter_name #:nodoc:
  self.class::ADAPTER_NAME
end

#add_column_position!(sql, options) ⇒ Object



558
559
560
561
562
563
564
# File 'lib/active_record/connection_adapters/abstract_mysql_adapter.rb', line 558

def add_column_position!(sql, options)
  if options[:first]
    sql << " FIRST"
  elsif options[:after]
    sql << " AFTER #{quote_column_name(options[:after])}"
  end
end

#add_index(table_name, column_name, options = {}) ⇒ Object

:nodoc:



521
522
523
524
# File 'lib/active_record/connection_adapters/abstract_mysql_adapter.rb', line 521

def add_index(table_name, column_name, options = {}) #:nodoc:
  index_name, index_type, index_columns, index_options, index_algorithm, index_using = add_index_options(table_name, column_name, options)
  execute "CREATE #{index_type} INDEX #{quote_column_name(index_name)} #{index_using} ON #{quote_table_name(table_name)} (#{index_columns})#{index_options} #{index_algorithm}"
end

#begin_db_transactionObject



316
317
318
# File 'lib/active_record/connection_adapters/abstract_mysql_adapter.rb', line 316

def begin_db_transaction
  execute "BEGIN"
end

#begin_isolated_db_transaction(isolation) ⇒ Object



320
321
322
323
# File 'lib/active_record/connection_adapters/abstract_mysql_adapter.rb', line 320

def begin_isolated_db_transaction(isolation)
  execute "SET TRANSACTION ISOLATION LEVEL #{transaction_isolation_levels.fetch(isolation)}"
  begin_db_transaction
end

#bulk_change_table(table_name, operations) ⇒ Object

:nodoc:



461
462
463
464
465
466
467
468
469
470
471
472
473
474
# File 'lib/active_record/connection_adapters/abstract_mysql_adapter.rb', line 461

def bulk_change_table(table_name, operations) #:nodoc:
  sqls = operations.map do |command, args|
    table, arguments = args.shift, args
    method = :"#{command}_sql"

    if respond_to?(method, true)
      send(method, table, *arguments)
    else
      raise "Unknown method called : #{method}(#{arguments.inspect})"
    end
  end.flatten.join(", ")

  execute("ALTER TABLE #{quote_table_name(table_name)} #{sqls}")
end

#case_insensitive_comparison(table, attribute, column, value) ⇒ Object



595
596
597
598
599
600
601
# File 'lib/active_record/connection_adapters/abstract_mysql_adapter.rb', line 595

def case_insensitive_comparison(table, attribute, column, value)
  if column.case_sensitive?
    super
  else
    table[attribute].eq(value)
  end
end

#case_sensitive_modifier(node) ⇒ Object



591
592
593
# File 'lib/active_record/connection_adapters/abstract_mysql_adapter.rb', line 591

def case_sensitive_modifier(node)
  Arel::Nodes::Bin.new(node)
end

#change_column(table_name, column_name, type, options = {}) ⇒ Object

:nodoc:



512
513
514
# File 'lib/active_record/connection_adapters/abstract_mysql_adapter.rb', line 512

def change_column(table_name, column_name, type, options = {}) #:nodoc:
  execute("ALTER TABLE #{quote_table_name(table_name)} #{change_column_sql(table_name, column_name, type, options)}")
end

#change_column_default(table_name, column_name, default) ⇒ Object



497
498
499
500
# File 'lib/active_record/connection_adapters/abstract_mysql_adapter.rb', line 497

def change_column_default(table_name, column_name, default)
  column = column_for(table_name, column_name)
  change_column table_name, column_name, column.sql_type, :default => default
end

#change_column_null(table_name, column_name, null, default = nil) ⇒ Object



502
503
504
505
506
507
508
509
510
# File 'lib/active_record/connection_adapters/abstract_mysql_adapter.rb', line 502

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

#charsetObject

Returns the database character set.



388
389
390
# File 'lib/active_record/connection_adapters/abstract_mysql_adapter.rb', line 388

def charset
  show_variable 'character_set_database'
end

#collationObject

Returns the database collation strategy.



393
394
395
# File 'lib/active_record/connection_adapters/abstract_mysql_adapter.rb', line 393

def collation
  show_variable 'collation_database'
end

#columns(table_name) ⇒ Object

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



447
448
449
450
451
452
453
454
455
# File 'lib/active_record/connection_adapters/abstract_mysql_adapter.rb', line 447

def columns(table_name)#:nodoc:
  sql = "SHOW FULL FIELDS FROM #{quote_table_name(table_name)}"
  execute_and_free(sql, 'SCHEMA') do |result|
    each_hash(result).map do |field|
      field_name = set_field_encoding(field[:Field])
      new_column(field_name, field[:Default], field[:Type], field[:Null] == "YES", field[:Collation], field[:Extra])
    end
  end
end

#commit_db_transactionObject

:nodoc:



325
326
327
# File 'lib/active_record/connection_adapters/abstract_mysql_adapter.rb', line 325

def commit_db_transaction #:nodoc:
  execute "COMMIT"
end

#create_database(name, options = {}) ⇒ Object

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


367
368
369
370
371
372
373
# File 'lib/active_record/connection_adapters/abstract_mysql_adapter.rb', line 367

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_table(table_name, options = {}) ⇒ Object

:nodoc:



457
458
459
# File 'lib/active_record/connection_adapters/abstract_mysql_adapter.rb', line 457

def create_table(table_name, options = {}) #:nodoc:
  super(table_name, options.reverse_merge(:options => "ENGINE=InnoDB"))
end

#current_databaseObject



383
384
385
# File 'lib/active_record/connection_adapters/abstract_mysql_adapter.rb', line 383

def current_database
  select_value 'SELECT DATABASE() as db'
end

#disable_referential_integrityObject

REFERENTIAL INTEGRITY ====================================



286
287
288
289
290
291
292
293
294
295
# File 'lib/active_record/connection_adapters/abstract_mysql_adapter.rb', line 286

def disable_referential_integrity #:nodoc:
  old = select_value("SELECT @@FOREIGN_KEY_CHECKS")

  begin
    update("SET FOREIGN_KEY_CHECKS = 0")
    yield
  ensure
    update("SET FOREIGN_KEY_CHECKS = #{old}")
  end
end

#drop_database(name) ⇒ Object

Drops a MySQL database.

Example:

drop_database('sebastian_development')


379
380
381
# File 'lib/active_record/connection_adapters/abstract_mysql_adapter.rb', line 379

def drop_database(name) #:nodoc:
  execute "DROP DATABASE IF EXISTS `#{name}`"
end

#drop_table(table_name, options = {}) ⇒ Object



485
486
487
# File 'lib/active_record/connection_adapters/abstract_mysql_adapter.rb', line 485

def drop_table(table_name, options = {})
  execute "DROP#{' TEMPORARY' if options[:temporary]} TABLE #{quote_table_name(table_name)}"
end

#each_hash(result) ⇒ Object

The two drivers have slightly different ways of yielding hashes of results, so this method must be implemented to provide a uniform interface.

Raises:

  • (NotImplementedError)


240
241
242
# File 'lib/active_record/connection_adapters/abstract_mysql_adapter.rb', line 240

def each_hash(result) # :nodoc:
  raise NotImplementedError
end

#empty_insert_statement_valueObject



345
346
347
# File 'lib/active_record/connection_adapters/abstract_mysql_adapter.rb', line 345

def empty_insert_statement_value
  "VALUES ()"
end

#emulate_booleansObject

:singleton-method: 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::Mysql[2]Adapter.emulate_booleans = false


139
# File 'lib/active_record/connection_adapters/abstract_mysql_adapter.rb', line 139

class_attribute :emulate_booleans

#error_number(exception) ⇒ Object

Must return the Mysql error number from the exception, if the exception has an error number.

Raises:

  • (NotImplementedError)


251
252
253
# File 'lib/active_record/connection_adapters/abstract_mysql_adapter.rb', line 251

def error_number(exception) # :nodoc:
  raise NotImplementedError
end

#execute(sql, name = nil) ⇒ Object

Executes the SQL statement in the context of this connection.



300
301
302
# File 'lib/active_record/connection_adapters/abstract_mysql_adapter.rb', line 300

def execute(sql, name = nil)
  log(sql, name) { @connection.query(sql) }
end

#execute_and_free(sql, name = nil) {|execute(sql, name)| ... } ⇒ Object

MysqlAdapter has to free a result after using it, so we use this method to write stuff in an abstract way without concerning ourselves about whether it needs to be explicitly freed or not.

Yields:



307
308
309
# File 'lib/active_record/connection_adapters/abstract_mysql_adapter.rb', line 307

def execute_and_free(sql, name = nil) #:nodoc:
  yield execute(sql, name)
end

#index_algorithmsObject



232
233
234
# File 'lib/active_record/connection_adapters/abstract_mysql_adapter.rb', line 232

def index_algorithms
  { default: 'ALGORITHM = DEFAULT', copy: 'ALGORITHM = COPY', inplace: 'ALGORITHM = INPLACE' }
end

#indexes(table_name, name = nil) ⇒ Object

Returns an array of indexes for the given table.



423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
# File 'lib/active_record/connection_adapters/abstract_mysql_adapter.rb', line 423

def indexes(table_name, name = nil) #:nodoc:
  indexes = []
  current_index = nil
  execute_and_free("SHOW KEYS FROM #{quote_table_name(table_name)}", 'SCHEMA') do |result|
    each_hash(result) do |row|
      if current_index != row[:Key_name]
        next if row[:Key_name] == 'PRIMARY' # skip the primary key
        current_index = row[:Key_name]

        mysql_index_type = row[:Index_type].downcase.to_sym
        index_type  = INDEX_TYPES.include?(mysql_index_type)  ? mysql_index_type : nil
        index_using = INDEX_USINGS.include?(mysql_index_type) ? mysql_index_type : nil
        indexes << IndexDefinition.new(row[:Table], row[:Key_name], row[:Non_unique].to_i == 0, [], [], nil, nil, index_type, index_using)
      end

      indexes.last.columns << row[:Column_name]
      indexes.last.lengths << row[:Sub_part]
    end
  end

  indexes
end

#join_to_update(update, select) ⇒ Object

In the simple case, MySQL allows us to place JOINs directly into the UPDATE query. However, this does not allow for LIMIT, OFFSET and ORDER. To support these, we must use a subquery.



336
337
338
339
340
341
342
343
# File 'lib/active_record/connection_adapters/abstract_mysql_adapter.rb', line 336

def join_to_update(update, select) #:nodoc:
  if select.limit || select.offset || select.orders.any?
    super
  else
    update.table select.source
    update.wheres = select.constraints
  end
end

#limited_update_conditions(where_sql, quoted_table_name, quoted_primary_key) ⇒ Object



603
604
605
# File 'lib/active_record/connection_adapters/abstract_mysql_adapter.rb', line 603

def limited_update_conditions(where_sql, quoted_table_name, quoted_primary_key)
  where_sql
end

#native_database_typesObject



228
229
230
# File 'lib/active_record/connection_adapters/abstract_mysql_adapter.rb', line 228

def native_database_types
  NATIVE_DATABASE_TYPES
end

#new_column(field, default, type, null, collation, extra = "") ⇒ Object

Overridden by the adapters to instantiate their specific Column type.



245
246
247
# File 'lib/active_record/connection_adapters/abstract_mysql_adapter.rb', line 245

def new_column(field, default, type, null, collation, extra = "") # :nodoc:
  Column.new(field, default, type, null, collation, extra)
end

#pk_and_sequence_for(table) ⇒ Object

Returns a table’s primary key and belonging sequence.



573
574
575
576
577
578
579
580
581
582
583
# File 'lib/active_record/connection_adapters/abstract_mysql_adapter.rb', line 573

def pk_and_sequence_for(table)
  execute_and_free("SHOW CREATE TABLE #{quote_table_name(table)}", 'SCHEMA') do |result|
    create_table = each_hash(result).first[:"Create Table"]
    if create_table.to_s =~ /PRIMARY KEY\s+(?:USING\s+\w+\s+)?\((.+)\)/
      keys = $1.split(",").map { |key| key.delete('`"') }
      keys.length == 1 ? [keys.first, nil] : nil
    else
      nil
    end
  end
end

#primary_key(table) ⇒ Object

Returns just a table’s primary key



586
587
588
589
# File 'lib/active_record/connection_adapters/abstract_mysql_adapter.rb', line 586

def primary_key(table)
  pk_and_sequence = pk_and_sequence_for(table)
  pk_and_sequence && pk_and_sequence.first
end

#quote(value, column = nil) ⇒ Object

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



257
258
259
260
261
262
263
264
265
266
# File 'lib/active_record/connection_adapters/abstract_mysql_adapter.rb', line 257

def quote(value, column = nil)
  if value.kind_of?(String) && column && column.type == :binary
    s = value.unpack("H*")[0]
    "x'#{s}'"
  elsif value.kind_of?(BigDecimal)
    value.to_s("F")
  else
    super
  end
end

#quote_column_name(name) ⇒ Object

:nodoc:



268
269
270
# File 'lib/active_record/connection_adapters/abstract_mysql_adapter.rb', line 268

def quote_column_name(name) #:nodoc:
  @quoted_column_names[name] ||= "`#{name.to_s.gsub('`', '``')}`"
end

#quote_table_name(name) ⇒ Object

:nodoc:



272
273
274
# File 'lib/active_record/connection_adapters/abstract_mysql_adapter.rb', line 272

def quote_table_name(name) #:nodoc:
  @quoted_table_names[name] ||= quote_column_name(name).gsub('.', '`.`')
end

#quoted_falseObject



280
281
282
# File 'lib/active_record/connection_adapters/abstract_mysql_adapter.rb', line 280

def quoted_false
  QUOTED_FALSE
end

#quoted_trueObject



276
277
278
# File 'lib/active_record/connection_adapters/abstract_mysql_adapter.rb', line 276

def quoted_true
  QUOTED_TRUE
end

#recreate_database(name, options = {}) ⇒ Object

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



353
354
355
356
357
358
# File 'lib/active_record/connection_adapters/abstract_mysql_adapter.rb', line 353

def recreate_database(name, options = {})
  drop_database(name)
  sql = create_database(name, options)
  reconnect!
  sql
end

#rename_column(table_name, column_name, new_column_name) ⇒ Object

:nodoc:



516
517
518
519
# File 'lib/active_record/connection_adapters/abstract_mysql_adapter.rb', line 516

def rename_column(table_name, column_name, new_column_name) #:nodoc:
  execute("ALTER TABLE #{quote_table_name(table_name)} #{rename_column_sql(table_name, column_name, new_column_name)}")
  rename_column_indexes(table_name, column_name, new_column_name)
end

#rename_index(table_name, old_name, new_name) ⇒ Object



489
490
491
492
493
494
495
# File 'lib/active_record/connection_adapters/abstract_mysql_adapter.rb', line 489

def rename_index(table_name, old_name, new_name)
  if (version[0] == 5 && version[1] >= 7) || version[0] >= 6
    execute "ALTER TABLE #{quote_table_name(table_name)} RENAME INDEX #{quote_table_name(old_name)} TO #{quote_table_name(new_name)}"
  else
    super
  end
end

#rename_table(table_name, new_name) ⇒ Object

Renames a table.

Example:

rename_table('octopuses', 'octopi')


480
481
482
483
# File 'lib/active_record/connection_adapters/abstract_mysql_adapter.rb', line 480

def rename_table(table_name, new_name)
  execute "RENAME TABLE #{quote_table_name(table_name)} TO #{quote_table_name(new_name)}"
  rename_table_indexes(table_name, new_name)
end

#rollback_db_transactionObject

:nodoc:



329
330
331
# File 'lib/active_record/connection_adapters/abstract_mysql_adapter.rb', line 329

def rollback_db_transaction #:nodoc:
  execute "ROLLBACK"
end

#schema_creationObject



34
35
36
# File 'lib/active_record/connection_adapters/abstract_mysql_adapter.rb', line 34

def schema_creation
  SchemaCreation.new self
end

#show_variable(name) ⇒ Object

SHOW VARIABLES LIKE ‘name’



567
568
569
570
# File 'lib/active_record/connection_adapters/abstract_mysql_adapter.rb', line 567

def show_variable(name)
  variables = select_all("SHOW VARIABLES LIKE '#{name}'", 'SCHEMA')
  variables.first['Value'] unless variables.empty?
end

#strict_mode?Boolean

Returns:

  • (Boolean)


607
608
609
# File 'lib/active_record/connection_adapters/abstract_mysql_adapter.rb', line 607

def strict_mode?
  self.class.type_cast_config_to_boolean(@config.fetch(:strict, true))
end

#supports_bulk_alter?Boolean

:nodoc:

Returns:

  • (Boolean)


199
200
201
# File 'lib/active_record/connection_adapters/abstract_mysql_adapter.rb', line 199

def supports_bulk_alter? #:nodoc:
  true
end

#supports_index_sort_order?Boolean

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

Returns:

  • (Boolean)


205
206
207
# File 'lib/active_record/connection_adapters/abstract_mysql_adapter.rb', line 205

def supports_index_sort_order?
  true
end

#supports_migrations?Boolean

Returns true, since this connection adapter supports migrations.

Returns:

  • (Boolean)


191
192
193
# File 'lib/active_record/connection_adapters/abstract_mysql_adapter.rb', line 191

def supports_migrations?
  true
end

#supports_primary_key?Boolean

Returns:

  • (Boolean)


195
196
197
# File 'lib/active_record/connection_adapters/abstract_mysql_adapter.rb', line 195

def supports_primary_key?
  true
end

#supports_transaction_isolation?Boolean

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

bugs.mysql.com/bug.php?id=39170

Returns:

  • (Boolean)


224
225
226
# File 'lib/active_record/connection_adapters/abstract_mysql_adapter.rb', line 224

def supports_transaction_isolation?
  version[0] >= 5
end

#table_exists?(name) ⇒ Boolean

Returns:

  • (Boolean)


407
408
409
410
411
412
413
414
415
416
417
418
419
420
# File 'lib/active_record/connection_adapters/abstract_mysql_adapter.rb', line 407

def table_exists?(name)
  return false unless name
  return true if tables(nil, nil, name).any?

  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, table).any?
end

#tables(name = nil, database = nil, like = nil) ⇒ Object

:nodoc:



397
398
399
400
401
402
403
404
405
# File 'lib/active_record/connection_adapters/abstract_mysql_adapter.rb', line 397

def tables(name = nil, database = nil, like = nil) #:nodoc:
  sql = "SHOW TABLES "
  sql << "IN #{quote_table_name(database)} " if database
  sql << "LIKE #{quote(like)}" if like

  execute_and_free(sql, 'SCHEMA') do |result|
    result.collect { |field| field.first }
  end
end

#type_cast(value, column) ⇒ Object



209
210
211
212
213
214
215
216
217
218
# File 'lib/active_record/connection_adapters/abstract_mysql_adapter.rb', line 209

def type_cast(value, column)
  case value
  when TrueClass
    1
  when FalseClass
    0
  else
    super
  end
end

#type_to_sql(type, limit = nil, precision = nil, scale = nil) ⇒ Object

Maps logical Rails types to MySQL-specific data types.



527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
# File 'lib/active_record/connection_adapters/abstract_mysql_adapter.rb', line 527

def type_to_sql(type, limit = nil, precision = nil, scale = nil)
  case type.to_s
  when 'binary'
    case limit
    when 0..0xfff;           "varbinary(#{limit})"
    when nil;                "blob"
    when 0x1000..0xffffffff; "blob(#{limit})"
    else raise(ActiveRecordError, "No binary type has character length #{limit}")
    end
  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

#update_sql(sql, name = nil) ⇒ Object

:nodoc:



311
312
313
314
# File 'lib/active_record/connection_adapters/abstract_mysql_adapter.rb', line 311

def update_sql(sql, name = nil) #:nodoc:
  super
  @connection.affected_rows
end

#valid_type?(type) ⇒ Boolean

Returns:

  • (Boolean)


611
612
613
# File 'lib/active_record/connection_adapters/abstract_mysql_adapter.rb', line 611

def valid_type?(type)
  !native_database_types[type].nil?
end