123456789_123456789_123456789_123456789_123456789_

Class: ActiveRecord::ConnectionAdapters::SchemaCreation

Do not use. This class is for internal use only.

Class Method Summary

Instance Attribute Summary

Instance Method Summary

Constructor Details

.new(conn) ⇒ SchemaCreation

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/abstract/schema_creation.rb', line 6

def initialize(conn)
  @conn = conn
  @cache = {}
end

Instance Attribute Details

#quote_column_name (readonly)

[ GitHub ]

#quote_default_expression (readonly)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/abstract/schema_creation.rb', line 16

delegate :quote_column_name, :quote_table_name, :quote_default_expression, :type_to_sql,
  :options_include_default?, :supports_indexes_in_create?, :use_foreign_keys?,
  :quoted_columns_for_index, :supports_partial_index?, :supports_check_constraints?,
  :supports_index_include?, :supports_exclusion_constraints?, :supports_unique_constraints?,
  :supports_nulls_not_distinct?,
  to: :@conn, private: true

#quote_table_name (readonly)

[ GitHub ]

#quoted_columns_for_index (readonly)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/abstract/schema_creation.rb', line 16

delegate :quote_column_name, :quote_table_name, :quote_default_expression, :type_to_sql,
  :options_include_default?, :supports_indexes_in_create?, :use_foreign_keys?,
  :quoted_columns_for_index, :supports_partial_index?, :supports_check_constraints?,
  :supports_index_include?, :supports_exclusion_constraints?, :supports_unique_constraints?,
  :supports_nulls_not_distinct?,
  to: :@conn, private: true

#supports_index_using?Boolean (readonly, private)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/abstract/schema_creation.rb', line 138

def supports_index_using?
  true
end

#type_to_sql (readonly)

[ GitHub ]

Instance Method Details

#accept(o)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/abstract/schema_creation.rb', line 11

def accept(o)
  m = @cache[o.class] ||= "visit_#{o.class.name.split('::').last}"
  send m, o
end

#action_sql(action, dependency) (private)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/abstract/schema_creation.rb', line 176

def action_sql(action, dependency)
  case dependency
  when :nullify then "ON #{action} SET NULL"
  when :cascade  then "ON #{action} CASCADE"
  when :restrict then "ON #{action} RESTRICT"
  else
    raise ArgumentError, <<~MSG
      '#{dependency}' is not supported for :on_update or :on_delete.
      Supported values are: :nullify, :cascade, :restrict
    MSG
  end
end

#add_column_options!(sql, options) (private)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/abstract/schema_creation.rb', line 151

def add_column_options!(sql, options)
  sql << " DEFAULT #{quote_default_expression(options[:default], options[:column])}" if options_include_default?(options)
  # must explicitly check for :null to allow change_column to work on migrations
  if options[:null] == false
    sql << " NOT NULL"
  end
  if options[:auto_increment] == true
    sql << " AUTO_INCREMENT"
  end
  if options[:primary_key] == true
    sql << " PRIMARY KEY"
  end
  sql
end

#add_table_options!(create_sql, o) (private)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/abstract/schema_creation.rb', line 142

def add_table_options!(create_sql, o)
  create_sql << " #{o.options}" if o.options
  create_sql
end

#column_options(o) (private)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/abstract/schema_creation.rb', line 147

def column_options(o)
  o.options.merge(column: o)
end

#options_include_default?Boolean

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/abstract/schema_creation.rb', line 16

delegate :quote_column_name, :quote_table_name, :quote_default_expression, :type_to_sql,
  :options_include_default?, :supports_indexes_in_create?, :use_foreign_keys?,
  :quoted_columns_for_index, :supports_partial_index?, :supports_check_constraints?,
  :supports_index_include?, :supports_exclusion_constraints?, :supports_unique_constraints?,
  :supports_nulls_not_distinct?,
  to: :@conn, private: true

#quoted_columns(o) (private)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/abstract/schema_creation.rb', line 134

def quoted_columns(o)
  String === o.columns ? o.columns : quoted_columns_for_index(o.columns, o.column_options)
end

#supports_check_constraints?Boolean

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/abstract/schema_creation.rb', line 16

delegate :quote_column_name, :quote_table_name, :quote_default_expression, :type_to_sql,
  :options_include_default?, :supports_indexes_in_create?, :use_foreign_keys?,
  :quoted_columns_for_index, :supports_partial_index?, :supports_check_constraints?,
  :supports_index_include?, :supports_exclusion_constraints?, :supports_unique_constraints?,
  :supports_nulls_not_distinct?,
  to: :@conn, private: true

#supports_exclusion_constraints?Boolean

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/abstract/schema_creation.rb', line 16

delegate :quote_column_name, :quote_table_name, :quote_default_expression, :type_to_sql,
  :options_include_default?, :supports_indexes_in_create?, :use_foreign_keys?,
  :quoted_columns_for_index, :supports_partial_index?, :supports_check_constraints?,
  :supports_index_include?, :supports_exclusion_constraints?, :supports_unique_constraints?,
  :supports_nulls_not_distinct?,
  to: :@conn, private: true

#supports_index_include?Boolean

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/abstract/schema_creation.rb', line 16

delegate :quote_column_name, :quote_table_name, :quote_default_expression, :type_to_sql,
  :options_include_default?, :supports_indexes_in_create?, :use_foreign_keys?,
  :quoted_columns_for_index, :supports_partial_index?, :supports_check_constraints?,
  :supports_index_include?, :supports_exclusion_constraints?, :supports_unique_constraints?,
  :supports_nulls_not_distinct?,
  to: :@conn, private: true

#supports_indexes_in_create?Boolean

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/abstract/schema_creation.rb', line 16

delegate :quote_column_name, :quote_table_name, :quote_default_expression, :type_to_sql,
  :options_include_default?, :supports_indexes_in_create?, :use_foreign_keys?,
  :quoted_columns_for_index, :supports_partial_index?, :supports_check_constraints?,
  :supports_index_include?, :supports_exclusion_constraints?, :supports_unique_constraints?,
  :supports_nulls_not_distinct?,
  to: :@conn, private: true

#supports_nulls_not_distinct?Boolean

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/abstract/schema_creation.rb', line 16

delegate :quote_column_name, :quote_table_name, :quote_default_expression, :type_to_sql,
  :options_include_default?, :supports_indexes_in_create?, :use_foreign_keys?,
  :quoted_columns_for_index, :supports_partial_index?, :supports_check_constraints?,
  :supports_index_include?, :supports_exclusion_constraints?, :supports_unique_constraints?,
  :supports_nulls_not_distinct?,
  to: :@conn, private: true

#supports_partial_index?Boolean

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/abstract/schema_creation.rb', line 16

delegate :quote_column_name, :quote_table_name, :quote_default_expression, :type_to_sql,
  :options_include_default?, :supports_indexes_in_create?, :use_foreign_keys?,
  :quoted_columns_for_index, :supports_partial_index?, :supports_check_constraints?,
  :supports_index_include?, :supports_exclusion_constraints?, :supports_unique_constraints?,
  :supports_nulls_not_distinct?,
  to: :@conn, private: true

#supports_unique_constraints?Boolean

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/abstract/schema_creation.rb', line 16

delegate :quote_column_name, :quote_table_name, :quote_default_expression, :type_to_sql,
  :options_include_default?, :supports_indexes_in_create?, :use_foreign_keys?,
  :quoted_columns_for_index, :supports_partial_index?, :supports_check_constraints?,
  :supports_index_include?, :supports_exclusion_constraints?, :supports_unique_constraints?,
  :supports_nulls_not_distinct?,
  to: :@conn, private: true

#table_modifier_in_create(o) (private)

Returns any SQL string to go between CREATE and TABLE. May be nil.

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/abstract/schema_creation.rb', line 172

def table_modifier_in_create(o)
  " TEMPORARY" if o.temporary
end

#to_sql(sql) (private)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/abstract/schema_creation.rb', line 166

def to_sql(sql)
  sql = sql.to_sql if sql.respond_to?(:to_sql)
  sql
end

#use_foreign_keys?Boolean

[ GitHub ]

#visit_AddCheckConstraint(o) (private)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/abstract/schema_creation.rb', line 126

def visit_AddCheckConstraint(o)
  "ADD #{accept(o)}"
end

#visit_AddColumnDefinition(o) (private)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/abstract/schema_creation.rb', line 40

def visit_AddColumnDefinition(o)
  +"ADD #{accept(o.column)}"
end

#visit_AddForeignKey(o) (private)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/abstract/schema_creation.rb', line 95

def visit_AddForeignKey(o)
  "ADD #{accept(o)}"
end

#visit_AlterTable(o) (private)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/abstract/schema_creation.rb', line 24

def visit_AlterTable(o)
  sql = +"ALTER TABLE #{quote_table_name(o.name)} "
  sql << o.adds.map { |col| accept col }.join(" ")
  sql << o.foreign_key_adds.map { |fk| visit_AddForeignKey fk }.join(" ")
  sql << o.foreign_key_drops.map { |fk| visit_DropForeignKey fk }.join(" ")
  sql << o.check_constraint_adds.map { |con| visit_AddCheckConstraint con }.join(" ")
  sql << o.check_constraint_drops.map { |con| visit_DropCheckConstraint con }.join(" ")
end

#visit_CheckConstraintDefinition(o) (private)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/abstract/schema_creation.rb', line 122

def visit_CheckConstraintDefinition(o)
  "CONSTRAINT #{o.name} CHECK (#{o.expression})"
end

#visit_ColumnDefinition(o) (private)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/abstract/schema_creation.rb', line 33

def visit_ColumnDefinition(o)
  o.sql_type = type_to_sql(o.type, **o.options)
  column_sql = +"#{quote_column_name(o.name)} #{o.sql_type}"
  add_column_options!(column_sql, column_options(o)) unless o.type == :primary_key
  column_sql
end

#visit_CreateIndexDefinition(o) (private)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/abstract/schema_creation.rb', line 103

def visit_CreateIndexDefinition(o)
  index = o.index

  sql = ["CREATE"]
  sql << "UNIQUE" if index.unique
  sql << "INDEX"
  sql << o.algorithm if o.algorithm
  sql << "IF NOT EXISTS" if o.if_not_exists
  sql << index.type if index.type
  sql << "#{quote_column_name(index.name)} ON #{quote_table_name(index.table)}"
  sql << "USING #{index.using}" if supports_index_using? && index.using
  sql << "(#{quoted_columns(index)})"
  sql << "INCLUDE (#{quoted_include_columns(index.include)})" if supports_index_include? && index.include
  sql << "NULLS NOT DISTINCT" if supports_nulls_not_distinct? && index.nulls_not_distinct
  sql << "WHERE #{index.where}" if supports_partial_index? && index.where

  sql.join(" ")
end

#visit_DropCheckConstraint(name) (private)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/abstract/schema_creation.rb', line 130

def visit_DropCheckConstraint(name)
  "DROP CONSTRAINT #{quote_column_name(name)}"
end

#visit_DropForeignKey(name) (private)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/abstract/schema_creation.rb', line 99

def visit_DropForeignKey(name)
  "DROP CONSTRAINT #{quote_column_name(name)}"
end

#visit_ForeignKeyDefinition(o) (private)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/abstract/schema_creation.rb', line 82

def visit_ForeignKeyDefinition(o)
  quoted_columns = Array(o.column).map { |c| quote_column_name(c) }
  quoted_primary_keys = Array(o.primary_key).map { |c| quote_column_name(c) }
  sql = +<<~SQL
    CONSTRAINT #{quote_column_name(o.name)}
    FOREIGN KEY (#{quoted_columns.join(", ")})
      REFERENCES #{quote_table_name(o.to_table)} (#{quoted_primary_keys.join(", ")})
  SQL
  sql << " #{action_sql('DELETE', o.on_delete)}" if o.on_delete
  sql << " #{action_sql('UPDATE', o.on_update)}" if o.on_update
  sql
end

#visit_PrimaryKeyDefinition(o) (private)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/abstract/schema_creation.rb', line 78

def visit_PrimaryKeyDefinition(o)
  "PRIMARY KEY (#{o.name.map { |name| quote_column_name(name) }.join(', ')})"
end

#visit_TableDefinition(o) (private)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/abstract/schema_creation.rb', line 44

def visit_TableDefinition(o)
  create_sql = +"CREATE#{table_modifier_in_create(o)} TABLE "
  create_sql << "IF NOT EXISTS " if o.if_not_exists
  create_sql << "#{quote_table_name(o.name)} "

  statements = o.columns.map { |c| accept c }
  statements << accept(o.primary_keys) if o.primary_keys

  if supports_indexes_in_create?
    statements.concat(o.indexes.map { |column_name, options| index_in_create(o.name, column_name, options) })
  end

  if use_foreign_keys?
    statements.concat(o.foreign_keys.map { |fk| accept fk })
  end

  if supports_check_constraints?
    statements.concat(o.check_constraints.map { |chk| accept chk })
  end

  if supports_exclusion_constraints?
    statements.concat(o.exclusion_constraints.map { |exc| accept exc })
  end

  if supports_unique_constraints?
    statements.concat(o.unique_constraints.map { |exc| accept exc })
  end

  create_sql << "(#{statements.join(', ')})" if statements.present?
  add_table_options!(create_sql, o)
  create_sql << " AS #{to_sql(o.as)}" if o.as
  create_sql
end