Class: Dbsketch::Rendering::SQL::TableRenderer

Inherits:
Object
  • Object
show all
Defined in:
lib/dbsketch/rendering/sql/table_renderer.rb

Instance Method Summary collapse

Constructor Details

#initialize(column_renderer: nil, fk_renderer: nil, options: {}) ⇒ TableRenderer

Returns a new instance of TableRenderer.

Raises:

  • (ArgumentError)


16
17
18
19
20
21
22
23
24
25
# File 'lib/dbsketch/rendering/sql/table_renderer.rb', line 16

def initialize column_renderer: nil, fk_renderer: nil, options: {}
	### Preconditions
	raise ArgumentError, "options is not a Hash" unless options.is_a? Hash
	###
	@options = {
		:pretty	=> false
	}.merge options
	@column_renderer = (nil == column_renderer ? ColumnRenderer.new(:options => options) : column_renderer)
	@fk_renderer = (nil == fk_renderer ? ForeignKeyRenderer.new : fk_renderer)
end

Instance Method Details

#alter(table_diff) ⇒ Object

Raises:

  • (ArgumentError)


45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
# File 'lib/dbsketch/rendering/sql/table_renderer.rb', line 45

def alter table_diff
	### Preconditions
	raise ArgumentError, "table_diff is not a Dbsketch::Comparison::TableDiff" unless table_diff.is_a? Dbsketch::Comparison::TableDiff
	###
	queries = []

	# Columns
	deleted_columns = table_diff.columns.select { |d| d.deletion? }
	if not deleted_columns.empty?
		queries << "alter table #{table_diff.new_table.name} drop column #{deleted_columns.map { |d| d.old_column.name }.join(", ")}"
	end
	added_columns = table_diff.columns.select { |d| d.addition? }
	if not added_columns.empty?
		queries << "alter table #{table_diff.new_table.name} add #{added_columns.map { |d| @column_renderer.create d.new_column }.join(", ")}"
	end
	queries << table_diff.columns.select { |d| d.change? }.map { |d| "alter table #{table_diff.new_table.name} alter column #{@column_renderer.create d.new_column}" }

	# Primary key
	if nil != table_diff.primary_key
		queries << "alter table #{table_diff.new_table.name} drop constraint #{table_diff.primary_key.old_key.name}" if table_diff.primary_key.deletion? or table_diff.primary_key.change?
		queries << "alter table #{table_diff.new_table.name} add #{create_primary_key table_diff.primary_key.new_key}" if table_diff.primary_key.addition? or table_diff.primary_key.change?
	end

	# Check constraints
	deleted_and_changed = table_diff.check_constraints.select { |chk_diff| chk_diff.deletion? or chk_diff.change? }
	if not deleted_and_changed.empty?
		queries << "alter table #{table_diff.new_table.name} drop constraint #{deleted_and_changed.map { |d| d.old_constraint.name }.join(", ")}"
	end
	added_and_changed = table_diff.check_constraints.select { |chk_diff| chk_diff.addition? or chk_diff.change? }
	if not added_and_changed.empty?
		queries << "alter table #{table_diff.new_table.name} add #{added_and_changed.map { |d| create_check_constraint d.new_constraint }.join(", ")}"
	end
	queries.flatten.join("\n")

	# Foreign keys
	deleted_and_changed = table_diff.foreign_keys.select { |d| d.deletion? or d.change? }
	if not deleted_and_changed.empty?
		queries << "alter table #{table_diff.new_table.name} drop constraint #{deleted_and_changed.map { |d| d.old_key.name }.join(", ")}"
	end
	added_and_changed = table_diff.foreign_keys.select { |d| d.addition? or d.change? }
	if not added_and_changed.empty?
		queries << "alter table #{table_diff.new_table.name} add #{added_and_changed.map { |d| @fk_renderer.create d.new_key }.join(", ")}"
	end
	queries.flatten.join("\n")

	# Unique constraints
	deleted_and_changed = table_diff.unique_constraints.select { |d| d.deletion? or d.change? }
	if not deleted_and_changed.empty?
		queries << "alter table #{table_diff.new_table.name} drop constraint #{deleted_and_changed.map { |d| d.old_constraint.name }.join(", ")}"
	end
	added_and_changed = table_diff.unique_constraints.select { |d| d.addition? or d.change? }
	if not added_and_changed.empty?
		queries << "alter table #{table_diff.new_table.name} add #{added_and_changed.map { |d| create_unique_constraint d.new_constraint }.join(", ")}"
	end
	queries.flatten.join("\n")
end

#create(table) ⇒ Object

Raises:

  • (ArgumentError)


27
28
29
30
31
32
33
34
35
36
# File 'lib/dbsketch/rendering/sql/table_renderer.rb', line 27

def create table
	### Preconditions
	raise ArgumentError, "table is not a Dbsketch::Model::Table" unless table.is_a? Dbsketch::Model::Table
	###
	if @options[:pretty]
		create_pretty table
	else
		create_brief table
	end
end

#drop(table) ⇒ Object

Raises:

  • (ArgumentError)


38
39
40
41
42
43
# File 'lib/dbsketch/rendering/sql/table_renderer.rb', line 38

def drop table
	### Preconditions
	raise ArgumentError, "table is not a Dbsketch::Model::Table" unless table.is_a? Dbsketch::Model::Table
	###
	"if object_id('#{table.name}', 'U') is not null drop table #{table.name}"
end