Class: ActiveRecord::ConnectionAdapters::Mysql2Adapter
- Inherits:
-
AbstractAdapter
- Object
- AbstractAdapter
- ActiveRecord::ConnectionAdapters::Mysql2Adapter
- Defined in:
- lib/active_record/connection_adapters/mysql2_adapter.rb
Defined Under Namespace
Classes: BindSubstitution
Constant Summary collapse
- ADAPTER_NAME =
'Mysql2'
- PRIMARY =
"PRIMARY"
- 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) DEFAULT NULL 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 } }
Instance Attribute Summary
Attributes inherited from AbstractAdapter
Attributes included from QueryCache
#query_cache, #query_cache_enabled
Class Method Summary collapse
-
.visitor_for(pool) ⇒ Object
:nodoc:.
Instance Method Summary collapse
-
#active? ⇒ Boolean
CONNECTION MANAGEMENT ====================================.
- #adapter_name ⇒ Object
- #add_column(table_name, column_name, type, options = {}) ⇒ Object
- #add_column_position!(sql, options) ⇒ Object
- #add_limit_offset!(sql, options) ⇒ Object
- #begin_db_transaction ⇒ Object
- #case_sensitive_equality_operator ⇒ Object
- #case_sensitive_modifier(node) ⇒ Object
- #change_column(table_name, column_name, type, options = {}) ⇒ Object
- #change_column_default(table_name, column_name, default) ⇒ Object
- #change_column_null(table_name, column_name, null, default = nil) ⇒ Object
-
#charset ⇒ Object
Returns the database character set.
-
#collation ⇒ Object
Returns the database collation strategy.
-
#columns(table_name, name = nil) ⇒ Object
Returns an array of
Mysql2Column
objects for the table specified bytable_name
. - #commit_db_transaction ⇒ Object
-
#create_database(name, options = {}) ⇒ Object
Create a new MySQL database with optional
:charset
and:collation
. - #create_savepoint ⇒ Object
- #create_table(table_name, options = {}) ⇒ Object
- #current_database ⇒ Object
-
#disable_referential_integrity(&block) ⇒ Object
REFERENTIAL INTEGRITY ====================================.
-
#disconnect! ⇒ Object
Disconnects from the database if already connected.
-
#drop_database(name) ⇒ Object
Drops a MySQL database.
- #drop_table(table_name, options = {}) ⇒ Object
- #exec_delete(sql, name, binds) ⇒ Object (also: #exec_update)
- #exec_insert(sql, name, binds) ⇒ Object
-
#execute(sql, name = nil) ⇒ Object
Executes the SQL statement in the context of this connection.
-
#indexes(table_name, name = nil) ⇒ Object
Returns an array of indexes for the given table.
-
#initialize(connection, logger, connection_options, config) ⇒ Mysql2Adapter
constructor
A new instance of Mysql2Adapter.
- #insert_sql(sql, name = nil, pk = nil, id_value = nil, sequence_name = nil) ⇒ Object (also: #create)
-
#join_to_update(update, select) ⇒ Object
In the simple case, MySQL allows us to place JOINs directly into the UPDATE query.
- #last_inserted_id(result) ⇒ Object
- #limited_update_conditions(where_sql, quoted_table_name, quoted_primary_key) ⇒ Object
- #native_database_types ⇒ Object
-
#pk_and_sequence_for(table) ⇒ Object
Returns a table’s primary key and belonging sequence.
-
#primary_key(table) ⇒ Object
Returns just a table’s primary key.
-
#quote(value, column = nil) ⇒ Object
QUOTING ==================================================.
-
#quote_column_name(name) ⇒ Object
:nodoc:.
- #quote_string(string) ⇒ Object
-
#quote_table_name(name) ⇒ Object
:nodoc:.
- #quoted_false ⇒ Object
- #quoted_true ⇒ Object
- #reconnect! ⇒ Object
-
#recreate_database(name, options = {}) ⇒ Object
Drops the database specified on the
name
attribute and creates it again using the providedoptions
. - #release_savepoint ⇒ Object
- #rename_column(table_name, column_name, new_column_name) ⇒ Object
-
#rename_table(table_name, new_name) ⇒ Object
Renames a table.
-
#requires_reloading? ⇒ Boolean
this is set to true in 2.3, but we don’t want it to be.
- #reset! ⇒ Object
- #rollback_db_transaction ⇒ Object
- #rollback_to_savepoint ⇒ Object
-
#select_rows(sql, name = nil) ⇒ Object
Returns an array of arrays containing the field values.
-
#show_variable(name) ⇒ Object
SHOW VARIABLES LIKE ‘name’.
-
#structure_dump ⇒ Object
SCHEMA STATEMENTS ========================================.
- #substitute_at(column, index) ⇒ Object
-
#supports_migrations? ⇒ Boolean
Returns true, since this connection adapter supports migrations.
- #supports_primary_key? ⇒ Boolean
-
#supports_savepoints? ⇒ Boolean
Returns true, since this connection adapter supports savepoints.
- #table_exists?(name) ⇒ Boolean
-
#tables(name = nil, database = nil) ⇒ Object
:nodoc:.
-
#type_to_sql(type, limit = nil, precision = nil, scale = nil) ⇒ Object
Maps logical Rails types to MySQL-specific data types.
- #update_sql(sql, name = nil) ⇒ Object
Methods inherited from AbstractAdapter
#clear_cache!, #current_savepoint_name, #decrement_open_transactions, #increment_open_transactions, #open_transactions, #prefetch_primary_key?, #raw_connection, #supports_bulk_alter?, #supports_count_distinct?, #supports_ddl_transactions?, #transaction_joinable=, #verify!
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
#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
Methods included from DatabaseStatements
#add_transaction_record, #default_sequence_name, #delete, #empty_insert_statement_value, #insert, #insert_fixture, #outside_transaction?, #reset_sequence!, #sanitize_limit, #select_all, #select_one, #select_value, #select_values, #supports_statement_cache?, #to_sql, #transaction, #update
Methods included from SchemaStatements
#add_column_options!, #add_index, #add_timestamps, #assume_migrated_upto_version, #change_table, #column_exists?, #distinct, #dump_schema_information, #index_exists?, #index_name, #index_name_exists?, #initialize_schema_migrations_table, #remove_column, #remove_index, #remove_index!, #remove_timestamps, #rename_index, #table_alias_for
Constructor Details
#initialize(connection, logger, connection_options, config) ⇒ Mysql2Adapter
Returns a new instance of Mysql2Adapter.
126 127 128 129 130 131 |
# File 'lib/active_record/connection_adapters/mysql2_adapter.rb', line 126 def initialize(connection, logger, , config) super(connection, logger) @connection_options, @config = , config @quoted_column_names, @quoted_table_names = {}, {} configure_connection end |
Class Method Details
.visitor_for(pool) ⇒ Object
:nodoc:
137 138 139 |
# File 'lib/active_record/connection_adapters/mysql2_adapter.rb', line 137 def self.visitor_for(pool) # :nodoc: BindSubstitution.new pool end |
Instance Method Details
#active? ⇒ Boolean
CONNECTION MANAGEMENT ====================================
213 214 215 216 |
# File 'lib/active_record/connection_adapters/mysql2_adapter.rb', line 213 def active? return false unless @connection @connection.ping end |
#adapter_name ⇒ Object
141 142 143 |
# File 'lib/active_record/connection_adapters/mysql2_adapter.rb', line 141 def adapter_name ADAPTER_NAME end |
#add_column(table_name, column_name, type, options = {}) ⇒ Object
491 492 493 494 495 496 |
# File 'lib/active_record/connection_adapters/mysql2_adapter.rb', line 491 def add_column(table_name, column_name, type, = {}) add_column_sql = "ALTER TABLE #{quote_table_name(table_name)} ADD #{quote_column_name(column_name)} #{type_to_sql(type, [:limit], [:precision], [:scale])}" (add_column_sql, ) add_column_position!(add_column_sql, ) execute(add_column_sql) end |
#add_column_position!(sql, options) ⇒ Object
569 570 571 572 573 574 575 |
# File 'lib/active_record/connection_adapters/mysql2_adapter.rb', line 569 def add_column_position!(sql, ) if [:first] sql << " FIRST" elsif [:after] sql << " AFTER #{quote_column_name([:after])}" end end |
#add_limit_offset!(sql, options) ⇒ Object
351 352 353 354 355 356 357 358 359 360 361 |
# File 'lib/active_record/connection_adapters/mysql2_adapter.rb', line 351 def add_limit_offset!(sql, ) limit, offset = [:limit], [:offset] if limit && offset sql << " LIMIT #{offset.to_i}, #{sanitize_limit(limit)}" elsif limit sql << " LIMIT #{sanitize_limit(limit)}" elsif offset sql << " OFFSET #{offset.to_i}" end sql end |
#begin_db_transaction ⇒ Object
321 322 323 324 325 |
# File 'lib/active_record/connection_adapters/mysql2_adapter.rb', line 321 def begin_db_transaction execute "BEGIN" rescue Exception # Transactions aren't supported end |
#case_sensitive_equality_operator ⇒ Object
602 603 604 |
# File 'lib/active_record/connection_adapters/mysql2_adapter.rb', line 602 def case_sensitive_equality_operator "= BINARY" end |
#case_sensitive_modifier(node) ⇒ Object
607 608 609 |
# File 'lib/active_record/connection_adapters/mysql2_adapter.rb', line 607 def case_sensitive_modifier(node) Arel::Nodes::Bin.new(node) end |
#change_column(table_name, column_name, type, options = {}) ⇒ Object
513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 |
# File 'lib/active_record/connection_adapters/mysql2_adapter.rb', line 513 def change_column(table_name, column_name, type, = {}) column = column_for(table_name, column_name) unless () [:default] = column.default end unless .has_key?(:null) [:null] = column.null end change_column_sql = "ALTER TABLE #{quote_table_name(table_name)} CHANGE #{quote_column_name(column_name)} #{quote_column_name(column_name)} #{type_to_sql(type, [:limit], [:precision], [:scale])}" (change_column_sql, ) add_column_position!(change_column_sql, ) execute(change_column_sql) end |
#change_column_default(table_name, column_name, default) ⇒ Object
498 499 500 501 |
# File 'lib/active_record/connection_adapters/mysql2_adapter.rb', line 498 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
503 504 505 506 507 508 509 510 511 |
# File 'lib/active_record/connection_adapters/mysql2_adapter.rb', line 503 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 ⇒ Object
Returns the database character set.
414 415 416 |
# File 'lib/active_record/connection_adapters/mysql2_adapter.rb', line 414 def charset show_variable 'character_set_database' end |
#collation ⇒ Object
Returns the database collation strategy.
419 420 421 |
# File 'lib/active_record/connection_adapters/mysql2_adapter.rb', line 419 def collation show_variable 'collation_database' end |
#columns(table_name, name = nil) ⇒ Object
Returns an array of Mysql2Column
objects for the table specified by table_name
.
469 470 471 472 473 474 475 476 477 |
# File 'lib/active_record/connection_adapters/mysql2_adapter.rb', line 469 def columns(table_name, name = nil) sql = "SHOW FIELDS FROM #{quote_table_name(table_name)}" columns = [] result = execute(sql, 'SCHEMA') result.each(:symbolize_keys => true, :as => :hash) { |field| columns << Mysql2Column.new(field[:Field], field[:Default], field[:Type], field[:Null] == "YES") } columns end |
#commit_db_transaction ⇒ Object
327 328 329 330 331 |
# File 'lib/active_record/connection_adapters/mysql2_adapter.rb', line 327 def commit_db_transaction execute "COMMIT" rescue Exception # Transactions aren't supported 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
393 394 395 396 397 398 399 |
# File 'lib/active_record/connection_adapters/mysql2_adapter.rb', line 393 def create_database(name, = {}) if [:collation] execute "CREATE DATABASE `#{name}` DEFAULT CHARACTER SET `#{[:charset] || 'utf8'}` COLLATE `#{[:collation]}`" else execute "CREATE DATABASE `#{name}` DEFAULT CHARACTER SET `#{[:charset] || 'utf8'}`" end end |
#create_savepoint ⇒ Object
339 340 341 |
# File 'lib/active_record/connection_adapters/mysql2_adapter.rb', line 339 def create_savepoint execute("SAVEPOINT #{current_savepoint_name}") end |
#create_table(table_name, options = {}) ⇒ Object
479 480 481 |
# File 'lib/active_record/connection_adapters/mysql2_adapter.rb', line 479 def create_table(table_name, = {}) super(table_name, .reverse_merge(:options => "ENGINE=InnoDB")) end |
#current_database ⇒ Object
409 410 411 |
# File 'lib/active_record/connection_adapters/mysql2_adapter.rb', line 409 def current_database select_value 'SELECT DATABASE() as db' end |
#disable_referential_integrity(&block) ⇒ Object
REFERENTIAL INTEGRITY ====================================
200 201 202 203 204 205 206 207 208 209 |
# File 'lib/active_record/connection_adapters/mysql2_adapter.rb', line 200 def disable_referential_integrity(&block) #: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 |
#disconnect! ⇒ Object
Disconnects from the database if already connected. Otherwise, this method does nothing.
230 231 232 233 234 235 |
# File 'lib/active_record/connection_adapters/mysql2_adapter.rb', line 230 def disconnect! unless @connection.nil? @connection.close @connection = nil end end |
#drop_database(name) ⇒ Object
Drops a MySQL database.
Example:
drop_database('sebastian_development')
405 406 407 |
# File 'lib/active_record/connection_adapters/mysql2_adapter.rb', line 405 def drop_database(name) #:nodoc: execute "DROP DATABASE IF EXISTS `#{name}`" end |
#drop_table(table_name, options = {}) ⇒ Object
446 447 448 |
# File 'lib/active_record/connection_adapters/mysql2_adapter.rb', line 446 def drop_table(table_name, = {}) super(table_name, ) end |
#exec_delete(sql, name, binds) ⇒ Object Also known as: exec_update
306 307 308 309 |
# File 'lib/active_record/connection_adapters/mysql2_adapter.rb', line 306 def exec_delete(sql, name, binds) execute to_sql(sql, binds), name @connection.affected_rows end |
#exec_insert(sql, name, binds) ⇒ Object
302 303 304 |
# File 'lib/active_record/connection_adapters/mysql2_adapter.rb', line 302 def exec_insert(sql, name, binds) execute to_sql(sql, binds), name end |
#execute(sql, name = nil) ⇒ Object
Executes the SQL statement in the context of this connection.
279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 |
# File 'lib/active_record/connection_adapters/mysql2_adapter.rb', line 279 def execute(sql, name = nil) # make sure we carry over any changes to ActiveRecord::Base.default_timezone that have been # made since we established the connection @connection.[:database_timezone] = ActiveRecord::Base.default_timezone if name == :skip_logging @connection.query(sql) else log(sql, name) { @connection.query(sql) } end rescue ActiveRecord::StatementInvalid => exception if exception..split(":").first =~ /Packets out of order/ raise ActiveRecord::StatementInvalid, "'Packets out of order' error was received from the database. Please update your mysql bindings (gem install mysql) and read http://dev.mysql.com/doc/mysql/en/password-hashing.html for more information. If you're on Windows, use the Instant Rails installer to get the updated mysql bindings." else raise end end |
#indexes(table_name, name = nil) ⇒ Object
Returns an array of indexes for the given table.
451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 |
# File 'lib/active_record/connection_adapters/mysql2_adapter.rb', line 451 def indexes(table_name, name = nil) indexes = [] current_index = nil result = execute("SHOW KEYS FROM #{quote_table_name(table_name)}", 'SCHEMA') result.each(:symbolize_keys => true, :as => :hash) do |row| if current_index != row[:Key_name] next if row[:Key_name] == PRIMARY # skip the primary key current_index = row[:Key_name] indexes << Mysql2IndexDefinition.new(row[:Table], row[:Key_name], row[:Non_unique] == 0, [], []) end indexes.last.columns << row[:Column_name] indexes.last.lengths << row[:Sub_part] end indexes end |
#insert_sql(sql, name = nil, pk = nil, id_value = nil, sequence_name = nil) ⇒ Object Also known as: create
296 297 298 299 |
# File 'lib/active_record/connection_adapters/mysql2_adapter.rb', line 296 def insert_sql(sql, name = nil, pk = nil, id_value = nil, sequence_name = nil) super id_value || @connection.last_id 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. However, MySQL is too stupid to create a temporary table for this automatically, so we have to give it some prompting in the form of a subsubquery. Ugh!
620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 |
# File 'lib/active_record/connection_adapters/mysql2_adapter.rb', line 620 def join_to_update(update, select) #:nodoc: if select.limit || select.offset || select.orders.any? subsubselect = select.clone subsubselect.projections = [update.key] subselect = Arel::SelectManager.new(select.engine) subselect.project Arel.sql(update.key.name) subselect.from subsubselect.as('__active_record_temp') update.where update.key.in(subselect) else update.table select.source update.wheres = select.constraints end end |
#last_inserted_id(result) ⇒ Object
312 313 314 |
# File 'lib/active_record/connection_adapters/mysql2_adapter.rb', line 312 def last_inserted_id(result) @connection.last_id end |
#limited_update_conditions(where_sql, quoted_table_name, quoted_primary_key) ⇒ Object
611 612 613 |
# File 'lib/active_record/connection_adapters/mysql2_adapter.rb', line 611 def limited_update_conditions(where_sql, quoted_table_name, quoted_primary_key) where_sql end |
#native_database_types ⇒ Object
159 160 161 |
# File 'lib/active_record/connection_adapters/mysql2_adapter.rb', line 159 def native_database_types NATIVE_DATABASE_TYPES end |
#pk_and_sequence_for(table) ⇒ Object
Returns a table’s primary key and belonging sequence.
584 585 586 587 588 589 590 591 592 593 594 |
# File 'lib/active_record/connection_adapters/mysql2_adapter.rb', line 584 def pk_and_sequence_for(table) result = execute("SHOW CREATE TABLE #{quote_table_name(table)}", 'SCHEMA') create_table = result.first[1] if create_table.to_s =~ /PRIMARY KEY\s+\((.+)\)/ keys = $1.split(",").map { |key| key.gsub(/[`"]/, "") } keys.length == 1 ? [keys.first, nil] : nil else nil end end |
#primary_key(table) ⇒ Object
Returns just a table’s primary key
597 598 599 600 |
# File 'lib/active_record/connection_adapters/mysql2_adapter.rb', line 597 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 ==================================================
165 166 167 168 169 170 171 172 |
# File 'lib/active_record/connection_adapters/mysql2_adapter.rb', line 165 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}'" else super end end |
#quote_column_name(name) ⇒ Object
:nodoc:
174 175 176 |
# File 'lib/active_record/connection_adapters/mysql2_adapter.rb', line 174 def quote_column_name(name) #:nodoc: @quoted_column_names[name] ||= "`#{name.to_s.gsub('`', '``')}`" end |
#quote_string(string) ⇒ Object
182 183 184 |
# File 'lib/active_record/connection_adapters/mysql2_adapter.rb', line 182 def quote_string(string) @connection.escape(string) end |
#quote_table_name(name) ⇒ Object
:nodoc:
178 179 180 |
# File 'lib/active_record/connection_adapters/mysql2_adapter.rb', line 178 def quote_table_name(name) #:nodoc: @quoted_table_names[name] ||= quote_column_name(name).gsub('.', '`.`') end |
#quoted_false ⇒ Object
190 191 192 |
# File 'lib/active_record/connection_adapters/mysql2_adapter.rb', line 190 def quoted_false QUOTED_FALSE end |
#quoted_true ⇒ Object
186 187 188 |
# File 'lib/active_record/connection_adapters/mysql2_adapter.rb', line 186 def quoted_true QUOTED_TRUE end |
#reconnect! ⇒ Object
218 219 220 221 |
# File 'lib/active_record/connection_adapters/mysql2_adapter.rb', line 218 def reconnect! disconnect! connect end |
#recreate_database(name, options = {}) ⇒ Object
Drops the database specified on the name
attribute and creates it again using the provided options
.
381 382 383 384 |
# File 'lib/active_record/connection_adapters/mysql2_adapter.rb', line 381 def recreate_database(name, = {}) drop_database(name) create_database(name, ) end |
#release_savepoint ⇒ Object
347 348 349 |
# File 'lib/active_record/connection_adapters/mysql2_adapter.rb', line 347 def release_savepoint execute("RELEASE SAVEPOINT #{current_savepoint_name}") end |
#rename_column(table_name, column_name, new_column_name) ⇒ Object
530 531 532 533 534 535 536 537 538 539 540 541 542 |
# File 'lib/active_record/connection_adapters/mysql2_adapter.rb', line 530 def rename_column(table_name, column_name, new_column_name) = {} if column = columns(table_name).find { |c| c.name == column_name.to_s } [:default] = column.default [: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 = "ALTER TABLE #{quote_table_name(table_name)} CHANGE #{quote_column_name(column_name)} #{quote_column_name(new_column_name)} #{current_type}" (rename_column_sql, ) execute(rename_column_sql) end |
#rename_table(table_name, new_name) ⇒ Object
Renames a table.
Example:
rename_table('octopuses', 'octopi')
487 488 489 |
# File 'lib/active_record/connection_adapters/mysql2_adapter.rb', line 487 def rename_table(table_name, new_name) execute "RENAME TABLE #{quote_table_name(table_name)} TO #{quote_table_name(new_name)}" end |
#requires_reloading? ⇒ Boolean
this is set to true in 2.3, but we don’t want it to be
224 225 226 |
# File 'lib/active_record/connection_adapters/mysql2_adapter.rb', line 224 def requires_reloading? false end |
#reset! ⇒ Object
237 238 239 240 |
# File 'lib/active_record/connection_adapters/mysql2_adapter.rb', line 237 def reset! disconnect! connect end |
#rollback_db_transaction ⇒ Object
333 334 335 336 337 |
# File 'lib/active_record/connection_adapters/mysql2_adapter.rb', line 333 def rollback_db_transaction execute "ROLLBACK" rescue Exception # Transactions aren't supported end |
#rollback_to_savepoint ⇒ Object
343 344 345 |
# File 'lib/active_record/connection_adapters/mysql2_adapter.rb', line 343 def rollback_to_savepoint execute("ROLLBACK TO SAVEPOINT #{current_savepoint_name}") end |
#select_rows(sql, name = nil) ⇒ Object
Returns an array of arrays containing the field values. Order is the same as that returned by columns
.
274 275 276 |
# File 'lib/active_record/connection_adapters/mysql2_adapter.rb', line 274 def select_rows(sql, name = nil) execute(sql, name).to_a end |
#show_variable(name) ⇒ Object
SHOW VARIABLES LIKE ‘name’.
578 579 580 581 |
# File 'lib/active_record/connection_adapters/mysql2_adapter.rb', line 578 def show_variable(name) variables = select_all("SHOW VARIABLES LIKE '#{name}'") variables.first['Value'] unless variables.empty? end |
#structure_dump ⇒ Object
SCHEMA STATEMENTS ========================================
366 367 368 369 370 371 372 373 374 375 376 377 |
# File 'lib/active_record/connection_adapters/mysql2_adapter.rb', line 366 def structure_dump if supports_views? sql = "SHOW FULL TABLES WHERE Table_type = 'BASE TABLE'" else sql = "SHOW TABLES" end select_all(sql).inject("") do |structure, table| table.delete('Table_type') structure += select_one("SHOW CREATE TABLE #{quote_table_name(table.to_a.first.last)}")["Create Table"] + ";\n\n" end end |
#substitute_at(column, index) ⇒ Object
194 195 196 |
# File 'lib/active_record/connection_adapters/mysql2_adapter.rb', line 194 def substitute_at(column, index) Arel::Nodes::BindParam.new "\0" end |
#supports_migrations? ⇒ Boolean
Returns true, since this connection adapter supports migrations.
146 147 148 |
# File 'lib/active_record/connection_adapters/mysql2_adapter.rb', line 146 def supports_migrations? true end |
#supports_primary_key? ⇒ Boolean
150 151 152 |
# File 'lib/active_record/connection_adapters/mysql2_adapter.rb', line 150 def supports_primary_key? true end |
#supports_savepoints? ⇒ Boolean
Returns true, since this connection adapter supports savepoints.
155 156 157 |
# File 'lib/active_record/connection_adapters/mysql2_adapter.rb', line 155 def supports_savepoints? true end |
#table_exists?(name) ⇒ Boolean
432 433 434 435 436 437 438 439 440 441 442 443 444 |
# File 'lib/active_record/connection_adapters/mysql2_adapter.rb', line 432 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 |
#tables(name = nil, database = nil) ⇒ Object
:nodoc:
423 424 425 426 427 428 429 430 |
# File 'lib/active_record/connection_adapters/mysql2_adapter.rb', line 423 def tables(name = nil, database = nil) #:nodoc: sql = "SHOW TABLES " sql << "IN #{quote_table_name(database)} " if database execute(sql, 'SCHEMA').collect do |field| field.first end end |
#type_to_sql(type, limit = nil, precision = nil, scale = nil) ⇒ Object
Maps logical Rails types to MySQL-specific data types.
545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 |
# File 'lib/active_record/connection_adapters/mysql2_adapter.rb', line 545 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 |
#update_sql(sql, name = nil) ⇒ Object
316 317 318 319 |
# File 'lib/active_record/connection_adapters/mysql2_adapter.rb', line 316 def update_sql(sql, name = nil) super @connection.affected_rows end |