- A
- B
- C
- D
- E
- I
- L
- N
- P
- Q
- R
- S
- T
- U
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" ] |
QUOTED_FALSE | = | '1', '0' |
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 } } |
# File activerecord/lib/active_record/connection_adapters/mysql2_adapter.rb, line 124 def initialize(connection, logger, connection_options, config) super(connection, logger) @connection_options, @config = connection_options, config @quoted_column_names, @quoted_table_names = {}, {} configure_connection end
CONNECTION MANAGEMENT ====================================
# File activerecord/lib/active_record/connection_adapters/mysql2_adapter.rb, line 491 def add_column(table_name, column_name, type, options = {}) add_column_sql = "ALTER TABLE #{quote_table_name(table_name)} ADD #{quote_column_name(column_name)} #{type_to_sql(type, options[:limit], options[:precision], options[:scale])}" add_column_options!(add_column_sql, options) add_column_position!(add_column_sql, options) execute(add_column_sql) end
# File activerecord/lib/active_record/connection_adapters/mysql2_adapter.rb, line 353 def add_limit_offset!(sql, options) limit, offset = options[:limit], options[: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
# File activerecord/lib/active_record/connection_adapters/mysql2_adapter.rb, line 513 def change_column(table_name, column_name, type, options = {}) column = column_for(table_name, column_name) unless options_include_default?(options) options[:default] = column.default end unless options.has_key?(:null) options[: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, options[:limit], options[:precision], options[:scale])}" add_column_options!(change_column_sql, options) add_column_position!(change_column_sql, options) execute(change_column_sql) end
# File activerecord/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
Returns the database character set.
Returns the database collation strategy.
Returns an array of Mysql2Column objects for the table specified by table_name.
# File activerecord/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
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 activerecord/lib/active_record/connection_adapters/mysql2_adapter.rb, line 395 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
Disconnects from the database if already connected. Otherwise, this method does nothing.
Executes the SQL statement in the context of this connection.
# File activerecord/lib/active_record/connection_adapters/mysql2_adapter.rb, line 275 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.query_options[: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.message.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
Returns an array of indexes for the given table.
# File activerecord/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
Returns a table’s primary key and belonging sequence.
# File activerecord/lib/active_record/connection_adapters/mysql2_adapter.rb, line 573 def pk_and_sequence_for(table) keys = [] result = execute("DESCRIBE #{quote_table_name(table)}", 'SCHEMA') result.each(:symbolize_keys => true, :as => :hash) do |row| keys << row[:Field] if row[:Key] == "PRI" end keys.length == 1 ? [keys.first, nil] : nil end
Returns just a table’s primary key
QUOTING ==================================================
# File activerecord/lib/active_record/connection_adapters/mysql2_adapter.rb, line 159 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}'" elsif value.kind_of?(BigDecimal) value.to_s("F") else super end end
Drops the database specified on the name attribute and creates it again using the provided options.
# File activerecord/lib/active_record/connection_adapters/mysql2_adapter.rb, line 530 def rename_column(table_name, column_name, new_column_name) options = {} if column = columns(table_name).find { |c| c.name == column_name.to_s } options[:default] = column.default options[: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}" add_column_options!(rename_column_sql, options) execute(rename_column_sql) end
Renames a table.
Example:
rename_table('octopuses', 'octopi')
this is set to true in 2.3, but we don’t want it to be
Returns an array of arrays containing the field values. Order is the same as that returned by columns.
SHOW VARIABLES LIKE ‘name’.
SCHEMA STATEMENTS ========================================
# File activerecord/lib/active_record/connection_adapters/mysql2_adapter.rb, line 368 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
Returns true, since this connection adapter supports migrations.
Returns true, since this connection adapter supports savepoints.
# File activerecord/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
Maps logical Rails types to MySQL-specific data types.
# File activerecord/lib/active_record/connection_adapters/mysql2_adapter.rb, line 545 def type_to_sql(type, limit = nil, precision = nil, scale = nil) return super unless type.to_s == '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 end
# File activerecord/lib/active_record/connection_adapters/mysql2_adapter.rb, line 623 def quoted_columns_for_index(column_names, options = {}) length = options[:length] if options.is_a?(Hash) quoted_column_names = case length when Hash column_names.map {|name| length[name] ? "#{quote_column_name(name)}(#{length[name]})" : quote_column_name(name) } when Fixnum column_names.map {|name| "#{quote_column_name(name)}(#{length})"} else column_names.map {|name| quote_column_name(name) } end end
# File activerecord/lib/active_record/connection_adapters/mysql2_adapter.rb, line 636 def translate_exception(exception, message) return super unless exception.respond_to?(:error_number) case exception.error_number when 1062 RecordNotUnique.new(message, exception) when 1452 InvalidForeignKey.new(message, exception) else super end end