Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -186,113 +186,6 @@ def unique_constraints_in_create(table, stream)
end
end

class SchemaCreation
private

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

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

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

@conn.puts_log "visit_TableDefinition #{@conn.servertype}"
if !@conn.servertype.instance_of? IBM_IDS
statements.concat(o.unique_constraints.map { |exc| accept exc }) if supports_unique_constraints?
end

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

def visit_ColumnDefinition(o)
if @conn.instance_of? IBM_DBAdapter
@conn.puts_log "visit_ColumnDefinition #{o.name} #{o} #{@conn} #{@conn.servertype}"
end
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))
column_sql
end

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

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(" ")
sql << o.constraint_validations.map { |fk| visit_ValidateConstraint fk }.join(" ")
sql << o.exclusion_constraint_adds.map { |con| visit_AddExclusionConstraint con }.join(" ")
sql << o.exclusion_constraint_drops.map { |con| visit_DropExclusionConstraint con }.join(" ")
sql << o.unique_constraint_adds.map { |con| visit_AddUniqueConstraint con }.join(" ")
sql << o.unique_constraint_drops.map { |con| visit_DropUniqueConstraint con }.join(" ")
end

def visit_ValidateConstraint(name)
"VALIDATE CONSTRAINT #{quote_column_name(name)}"
end

def visit_UniqueConstraintDefinition(o)
column_name = Array(o.column).map { |column| quote_column_name(column) }.join(", ")

sql = ["CONSTRAINT"]
sql << quote_column_name(o.name)
sql << "UNIQUE"

if o.using_index
sql << "USING INDEX #{quote_column_name(o.using_index)}"
else
sql << "(#{column_name})"
end

# if o.deferrable
# sql << "DEFERRABLE INITIALLY #{o.deferrable.to_s.upcase}"
# end

sql.join(" ")
end

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

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

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

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

end
end

class Base
Expand Down Expand Up @@ -659,6 +552,118 @@ class IBM_DBAdapter < AbstractAdapter
:set_quoted_literal_replacement
attr_accessor :sql, :handle_lobs_triggered, :sql_parameter_values

# IBM DB2-specific SchemaCreation subclass.
# This is scoped to IBM_DBAdapter so it does not interfere with other
# adapters (e.g. PostgreSQL, MySQL) that may coexist in the same
# application via Rails' multi-database support.
class SchemaCreation < ConnectionAdapters::SchemaCreation
private

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

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

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

@conn.puts_log "visit_TableDefinition #{@conn.servertype}"
if !@conn.servertype.instance_of? IBM_IDS
statements.concat(o.unique_constraints.map { |exc| accept exc }) if supports_unique_constraints?
end

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

def visit_ColumnDefinition(o)
@conn.puts_log "visit_ColumnDefinition #{o.name} #{o} #{@conn} #{@conn.servertype}"
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))
column_sql
end

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

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(" ")
sql << o.constraint_validations.map { |fk| visit_ValidateConstraint fk }.join(" ")
sql << o.exclusion_constraint_adds.map { |con| visit_AddExclusionConstraint con }.join(" ")
sql << o.exclusion_constraint_drops.map { |con| visit_DropExclusionConstraint con }.join(" ")
sql << o.unique_constraint_adds.map { |con| visit_AddUniqueConstraint con }.join(" ")
sql << o.unique_constraint_drops.map { |con| visit_DropUniqueConstraint con }.join(" ")
end

def visit_ValidateConstraint(name)
"VALIDATE CONSTRAINT #{quote_column_name(name)}"
end

def visit_UniqueConstraintDefinition(o)
column_name = Array(o.column).map { |column| quote_column_name(column) }.join(", ")

sql = ["CONSTRAINT"]
sql << quote_column_name(o.name)
sql << "UNIQUE"

if o.using_index
sql << "USING INDEX #{quote_column_name(o.using_index)}"
else
sql << "(#{column_name})"
end

sql.join(" ")
end

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

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

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

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

# Returns the IBM DB2-specific SchemaCreation instance, ensuring that
# IBM-specific schema methods are only applied to IBM DB2 connections
# and do not affect other adapters.
def schema_creation # :nodoc:
SchemaCreation.new(self)
end

# Name of the adapter
def adapter_name
'IBM_DB'
Expand Down