Class: ActiveRecord::ConnectionAdapters::MysqlAdapter
- Inherits:
-
AbstractMysqlAdapter
- Object
- AbstractAdapter
- AbstractMysqlAdapter
- ActiveRecord::ConnectionAdapters::MysqlAdapter
- Defined in:
- activerecord/lib/active_record/connection_adapters/mysql_adapter.rb
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/server-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.
Defined Under Namespace
Modules: Fields Classes: Column, StatementPool
Constant Summary collapse
- ADAPTER_NAME =
'MySQL'
- ENCODINGS =
Taken from here:
https://github.com/tmtm/ruby-mysql/blob/master/lib/mysql/charset.rb
Author: TOMITA Masahiro <[email protected]>
{ "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, }
Constants inherited from AbstractMysqlAdapter
AbstractMysqlAdapter::INDEX_TYPES, AbstractMysqlAdapter::INDEX_USINGS, AbstractMysqlAdapter::LOST_CONNECTION_ERROR_MESSAGES, AbstractMysqlAdapter::NATIVE_DATABASE_TYPES
Constants inherited from AbstractAdapter
Constants included from ActiveSupport::Callbacks
ActiveSupport::Callbacks::CALLBACK_FILTER_TYPES
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
-
#active? ⇒ Boolean
CONNECTION MANAGEMENT ====================================.
-
#begin_db_transaction ⇒ Object
:nodoc:.
-
#clear_cache! ⇒ Object
Clears the prepared statements cache.
-
#client_encoding ⇒ Object
Get the client encoding for this database.
-
#disconnect! ⇒ Object
Disconnects from the database if already connected.
-
#each_hash(result) ⇒ Object
HELPER METHODS ===========================================.
-
#error_number(exception) ⇒ Object
:nodoc:.
- #exec_delete(sql, name, binds) ⇒ Object (also: #exec_update)
- #exec_query(sql, name = 'SQL', binds = []) {|affected_rows| ... } ⇒ Object
-
#exec_without_stmt(sql, name = 'SQL') ⇒ Object
:nodoc:.
- #execute_and_free(sql, name = nil) ⇒ Object
-
#initialize(connection, logger, connection_options, config) ⇒ MysqlAdapter
constructor
A new instance of MysqlAdapter.
-
#insert_sql(sql, name = nil, pk = nil, id_value = nil, sequence_name = nil) ⇒ Object
(also: #create)
:nodoc:.
- #last_inserted_id(result) ⇒ Object
-
#new_column(field, default, type, null, collation, extra = "") ⇒ Object
:nodoc:.
-
#quote_string(string) ⇒ Object
:nodoc:.
- #reconnect! ⇒ Object
- #reset! ⇒ Object
-
#select_rows(sql, name = nil) ⇒ Object
DATABASE STATEMENTS ======================================.
-
#supports_statement_cache? ⇒ Boolean
Returns true, since this connection adapter supports prepared statement caching.
-
#type_cast(value, column) ⇒ Object
QUOTING ==================================================.
Methods inherited from AbstractMysqlAdapter
#adapter_name, #add_column_position!, #add_index, #begin_isolated_db_transaction, #bulk_change_table, #case_insensitive_comparison, #case_sensitive_modifier, #change_column, #change_column_default, #change_column_null, #charset, #collation, #columns, #commit_db_transaction, #create_database, #create_savepoint, #create_table, #current_database, #disable_referential_integrity, #drop_database, #empty_insert_statement_value, #emulate_booleans, #execute, #index_algorithms, #indexes, #join_to_update, #limited_update_conditions, #native_database_types, #pk_and_sequence_for, #primary_key, #quote, #quote_column_name, #quote_table_name, #quoted_false, #quoted_true, #recreate_database, #release_savepoint, #rename_column, #rename_table, #rollback_db_transaction, #rollback_to_savepoint, #schema_creation, #show_variable, #strict_mode?, #supports_bulk_alter?, #supports_index_sort_order?, #supports_migrations?, #supports_primary_key?, #supports_savepoints?, #supports_transaction_isolation?, #table_exists?, #tables, #type_to_sql, #update_sql, #valid_type?
Methods inherited from AbstractAdapter
#adapter_name, #case_insensitive_comparison, #case_sensitive_modifier, #close, #create_savepoint, #current_savepoint_name, #disable_referential_integrity, #expire, #extensions, #index_algorithms, #lease, #open_transactions, #prefetch_primary_key?, #raw_connection, #release_savepoint, #requires_reloading?, #rollback_to_savepoint, #schema_creation, #substitute_at, #supports_bulk_alter?, #supports_count_distinct?, #supports_ddl_transactions?, #supports_explain?, #supports_extensions?, #supports_index_sort_order?, #supports_migrations?, #supports_partial_index?, #supports_primary_key?, #supports_savepoints?, #supports_transaction_isolation?, type_cast_config_to_boolean, type_cast_config_to_integer, #unprepared_statement, #unprepared_visitor, #valid_type?, #verify!
Methods included from ColumnDumper
#column_spec, #migration_keys, #prepare_column_options
Methods included from ActiveSupport::Callbacks
Methods included from ActiveSupport::Concern
#append_features, extended, #included
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, #quote_column_name, #quote_table_name, #quote_table_name_for_assignment, #quoted_date, #quoted_false, #quoted_true
Methods included from DatabaseStatements
#add_transaction_record, #begin_isolated_db_transaction, #begin_transaction, #case_sensitive_equality_operator, #commit_db_transaction, #commit_transaction, #current_transaction, #default_sequence_name, #delete, #empty_insert_statement_value, #exec_insert, #execute, #insert, #insert_fixture, #join_to_delete, #join_to_update, #limited_update_conditions, #reset_sequence!, #reset_transaction, #rollback_db_transaction, #rollback_transaction, #sanitize_limit, #select_all, #select_one, #select_value, #select_values, #to_sql, #transaction, #transaction_isolation_levels, #transaction_open?, #update, #within_new_transaction
Methods included from SchemaStatements
#add_column, #add_index, #add_reference, #add_timestamps, #assume_migrated_upto_version, #change_column, #change_column_default, #change_column_null, #change_table, #column_exists?, #columns, #columns_for_distinct, #create_join_table, #create_table, #drop_join_table, #drop_table, #dump_schema_information, #index_exists?, #index_name, #index_name_exists?, #initialize_schema_migrations_table, #native_database_types, #remove_column, #remove_columns, #remove_index, #remove_index!, #remove_reference, #remove_timestamps, #rename_column, #rename_index, #rename_table, #table_alias_for, #table_exists?, #type_to_sql
Constructor Details
#initialize(connection, logger, connection_options, config) ⇒ MysqlAdapter
Returns a new instance of MysqlAdapter.
126 127 128 129 130 131 132 |
# File 'activerecord/lib/active_record/connection_adapters/mysql_adapter.rb', line 126 def initialize(connection, logger, , config) super @statements = StatementPool.new(@connection, self.class.type_cast_config_to_integer(config.fetch(:statement_limit) { 1000 })) @client_encoding = nil connect end |
Instance Method Details
#active? ⇒ Boolean
CONNECTION MANAGEMENT ====================================
175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 |
# File 'activerecord/lib/active_record/connection_adapters/mysql_adapter.rb', line 175 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 |
#begin_db_transaction ⇒ Object
:nodoc:
473 474 475 476 477 |
# File 'activerecord/lib/active_record/connection_adapters/mysql_adapter.rb', line 473 def begin_db_transaction #:nodoc: exec_query "BEGIN" rescue Mysql::Error # Transactions aren't supported end |
#clear_cache! ⇒ Object
Clears the prepared statements cache.
224 225 226 |
# File 'activerecord/lib/active_record/connection_adapters/mysql_adapter.rb', line 224 def clear_cache! @statements.clear end |
#client_encoding ⇒ Object
Get the client encoding for this database
272 273 274 275 276 277 278 279 |
# File 'activerecord/lib/active_record/connection_adapters/mysql_adapter.rb', line 272 def client_encoding return @client_encoding if @client_encoding result = exec_query( "SHOW VARIABLES WHERE Variable_name = 'character_set_client'", 'SCHEMA') @client_encoding = ENCODINGS[result.rows.last.last] end |
#disconnect! ⇒ Object
Disconnects from the database if already connected. Otherwise, this method does nothing.
200 201 202 203 |
# File 'activerecord/lib/active_record/connection_adapters/mysql_adapter.rb', line 200 def disconnect! super @connection.close rescue nil end |
#each_hash(result) ⇒ Object
HELPER METHODS ===========================================
142 143 144 145 146 147 148 149 150 151 |
# File 'activerecord/lib/active_record/connection_adapters/mysql_adapter.rb', line 142 def each_hash(result) # :nodoc: if block_given? result.each_hash do |row| row.symbolize_keys! yield row end else to_enum(:each_hash, result) end end |
#error_number(exception) ⇒ Object
:nodoc:
157 158 159 |
# File 'activerecord/lib/active_record/connection_adapters/mysql_adapter.rb', line 157 def error_number(exception) # :nodoc: exception.errno if exception.respond_to?(:errno) end |
#exec_delete(sql, name, binds) ⇒ Object Also known as: exec_update
462 463 464 465 466 467 468 469 470 |
# File 'activerecord/lib/active_record/connection_adapters/mysql_adapter.rb', line 462 def exec_delete(sql, name, binds) affected_rows = 0 exec_query(sql, name, binds) do |n| affected_rows = n end affected_rows end |
#exec_query(sql, name = 'SQL', binds = []) {|affected_rows| ... } ⇒ Object
281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 |
# File 'activerecord/lib/active_record/connection_adapters/mysql_adapter.rb', line 281 def exec_query(sql, name = 'SQL', binds = []) # If the configuration sets prepared_statements:false, binds will # always be empty, since the bind variables will have been already # substituted and removed from binds by BindVisitor, so this will # effectively disable prepared statement usage completely. if binds.empty? 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_without_stmt(sql, name = 'SQL') ⇒ Object
:nodoc:
423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 |
# File 'activerecord/lib/active_record/connection_adapters/mysql_adapter.rb', line 423 def exec_without_stmt(sql, name = 'SQL') # :nodoc: # Some queries, like SHOW CREATE TABLE don't work through the prepared # statement API. For those queries, we need to use this method. :'( log(sql, name) do result = @connection.query(sql) affected_rows = @connection.affected_rows if result types = {} result.fetch_fields.each { |field| if field.decimals > 0 types[field.name] = Fields::Decimal.new else types[field.name] = Fields.find_type field end } result_set = ActiveRecord::Result.new(types.keys, result.to_a, types) result.free else result_set = ActiveRecord::Result.new([], []) end [result_set, affected_rows] end end |
#execute_and_free(sql, name = nil) ⇒ Object
449 450 451 452 453 454 |
# File 'activerecord/lib/active_record/connection_adapters/mysql_adapter.rb', line 449 def execute_and_free(sql, name = nil) result = execute(sql, name) ret = yield result result.free ret end |
#insert_sql(sql, name = nil, pk = nil, id_value = nil, sequence_name = nil) ⇒ Object Also known as: create
:nodoc:
456 457 458 459 |
# File 'activerecord/lib/active_record/connection_adapters/mysql_adapter.rb', line 456 def insert_sql(sql, name = nil, pk = nil, id_value = nil, sequence_name = nil) #:nodoc: super sql, name id_value || @connection.insert_id end |
#last_inserted_id(result) ⇒ Object
297 298 299 |
# File 'activerecord/lib/active_record/connection_adapters/mysql_adapter.rb', line 297 def last_inserted_id(result) @connection.insert_id end |
#new_column(field, default, type, null, collation, extra = "") ⇒ Object
:nodoc:
153 154 155 |
# File 'activerecord/lib/active_record/connection_adapters/mysql_adapter.rb', line 153 def new_column(field, default, type, null, collation, extra = "") # :nodoc: Column.new(field, default, type, null, collation, strict_mode?, extra) end |
#quote_string(string) ⇒ Object
:nodoc:
169 170 171 |
# File 'activerecord/lib/active_record/connection_adapters/mysql_adapter.rb', line 169 def quote_string(string) #:nodoc: @connection.quote(string) end |
#reconnect! ⇒ Object
192 193 194 195 196 |
# File 'activerecord/lib/active_record/connection_adapters/mysql_adapter.rb', line 192 def reconnect! super disconnect! connect end |
#reset! ⇒ Object
205 206 207 208 209 210 211 212 |
# File 'activerecord/lib/active_record/connection_adapters/mysql_adapter.rb', line 205 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) ⇒ Object
DATABASE STATEMENTS ======================================
216 217 218 219 220 221 |
# File 'activerecord/lib/active_record/connection_adapters/mysql_adapter.rb', line 216 def select_rows(sql, name = nil) @connection.query_with_result = true rows = exec_query(sql, name).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 |
#supports_statement_cache? ⇒ Boolean
Returns true, since this connection adapter supports prepared statement caching.
136 137 138 |
# File 'activerecord/lib/active_record/connection_adapters/mysql_adapter.rb', line 136 def supports_statement_cache? true end |
#type_cast(value, column) ⇒ Object
QUOTING ==================================================
163 164 165 166 167 |
# File 'activerecord/lib/active_record/connection_adapters/mysql_adapter.rb', line 163 def type_cast(value, column) return super unless value == true || value == false value ? 1 : 0 end |