Returns just a table's primary key
# File lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 538 def primary_key(table) pk_and_sequence = pk_and_sequence_for(table) pk_and_sequence && pk_and_sequence.first end
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
# File lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 100 class_attribute :emulate_booleans
FIXME: Make the first parameter more similar for the two adapters
# File lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 131 def initialize(connection, logger, connection_options, config) super(connection, logger) @connection_options, @config = connection_options, config @quoted_column_names, @quoted_table_names = {}, {} if config.fetch(:prepared_statements) { true } @visitor = Arel::Visitors::MySQL.new self else @visitor = BindSubstitution.new self end end
# File lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 458 def add_column(table_name, column_name, type, options = {}) execute("ALTER TABLE #{quote_table_name(table_name)} #{add_column_sql(table_name, column_name, type, options)}") end
# File lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 510 def add_column_position!(sql, options) if options[:first] sql << " FIRST" elsif options[:after] sql << " AFTER #{quote_column_name(options[:after])}" end end
# File lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 265 def begin_db_transaction execute "BEGIN" rescue Exception # Transactions aren't supported end
# File lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 547 def case_insensitive_comparison(table, attribute, column, value) if column.case_sensitive? super else table[attribute].eq(value) end end
# File lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 543 def case_sensitive_modifier(node) Arel::Nodes::Bin.new(node) end
# File lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 462 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
# File lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 467 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.
# File lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 367 def charset show_variable 'character_set_database' end
Returns the database collation strategy.
# File lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 372 def collation show_variable 'collation_database' 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 lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 346 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
# File lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 283 def create_savepoint execute("SAVEPOINT #{current_savepoint_name}") end
# File lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 362 def current_database select_value 'SELECT DATABASE() as db' end
Executes the SQL statement in the context of this connection.
# File lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 239 def execute(sql, name = nil) 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
# File lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 555 def limited_update_conditions(where_sql, quoted_table_name, quoted_primary_key) where_sql end
# File lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 171 def native_database_types NATIVE_DATABASE_TYPES end
Returns a table's primary key and belonging sequence.
# File lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 525 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+\((.+)\)/ keys = $1.split(",").map { |key| key.gsub(/[`"]/, "") } keys.length == 1 ? [keys.first, nil] : nil else nil end end end
Returns just a table's primary key
# File lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 538 def primary_key(table) pk_and_sequence = pk_and_sequence_for(table) pk_and_sequence && pk_and_sequence.first end
QUOTING ==================================================
# File lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 196 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
# File lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 219 def quoted_false QUOTED_FALSE end
# File lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 215 def quoted_true QUOTED_TRUE end
Drops the database specified on the name attribute and creates it again using the provided options.
# File lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 334 def recreate_database(name, options = {}) drop_database(name) create_database(name, options) end
# File lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 291 def release_savepoint execute("RELEASE SAVEPOINT #{current_savepoint_name}") end
Renames a table.
Example:
rename_table('octopuses', 'octopi')
# File lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 454 def rename_table(table_name, new_name) execute "RENAME TABLE #{quote_table_name(table_name)} TO #{quote_table_name(new_name)}" end
# File lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 287 def rollback_to_savepoint execute("ROLLBACK TO SAVEPOINT #{current_savepoint_name}") end
SHOW VARIABLES LIKE 'name'
# File lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 519 def show_variable(name) variables = select_all("SHOW VARIABLES LIKE '#{name}'") variables.first['Value'] unless variables.empty? end
Technically MySQL allows to create indexes with the sort order syntax but at the moment (5.5) it doesn't yet implement them
# File lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 167 def supports_index_sort_order? true end
Returns true, since this connection adapter supports migrations.
# File lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 148 def supports_migrations? true end
# File lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 152 def supports_primary_key? true end
Returns true, since this connection adapter supports savepoints.
# File lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 157 def supports_savepoints? true end
# File lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 386 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
Maps logical Rails types to MySQL-specific data types.
# File lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 486 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
# File lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 597 def add_column_sql(table_name, column_name, type, options = {}) add_column_sql = "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) add_column_sql end
# File lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 561 def add_index_length(option_strings, column_names, options = {}) if options.is_a?(Hash) && length = options[:length] case length when Hash column_names.each {|name| option_strings[name] += "(#{length[name]})" if length.has_key?(name) && length[name].present?} when Fixnum column_names.each {|name| option_strings[name] += "(#{length})"} end end return option_strings end
# File lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 642 def add_index_sql(table_name, column_name, options = {}) index_name, index_type, index_columns = add_index_options(table_name, column_name, options) "ADD #{index_type} INDEX #{index_name} (#{index_columns})" end
# File lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 652 def add_timestamps_sql(table_name) [add_column_sql(table_name, :created_at, :datetime), add_column_sql(table_name, :updated_at, :datetime)] end
# File lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 604 def change_column_sql(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 = "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) change_column_sql end
# File lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 574 def quoted_columns_for_index(column_names, options = {}) option_strings = Hash[column_names.map {|name| [name, '']}] # add index length option_strings = add_index_length(option_strings, column_names, options) # add index sort order option_strings = add_index_sort_order(option_strings, column_names, options) column_names.map {|name| quote_column_name(name) + option_strings[name]} end
# File lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 637 def remove_column_sql(table_name, *column_names) columns_for_remove(table_name, *column_names).map {|column_name| "DROP #{column_name}" } end
# File lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 647 def remove_index_sql(table_name, options = {}) index_name = index_name_for_remove(table_name, options) "DROP INDEX #{index_name}" end
# File lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 656 def remove_timestamps_sql(table_name) [remove_column_sql(table_name, :updated_at), remove_column_sql(table_name, :created_at)] end
# File lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 621 def rename_column_sql(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 = "CHANGE #{quote_column_name(column_name)} #{quote_column_name(new_column_name)} #{current_type}" add_column_options!(rename_column_sql, options) rename_column_sql end
# File lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 586 def translate_exception(exception, message) case error_number(exception) when 1062 RecordNotUnique.new(message, exception) when 1452 InvalidForeignKey.new(message, exception) else super end end
Generated with the Darkfish Rdoc Generator 2.