dbsketch 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/LICENSE +674 -0
- data/README.md +1 -0
- data/lib/dbsketch.rb +64 -0
- data/lib/dbsketch/automation/automation_error.rb +15 -0
- data/lib/dbsketch/automation/database_connection_details.rb +32 -0
- data/lib/dbsketch/automation/database_importer.rb +184 -0
- data/lib/dbsketch/automation/database_proxy.rb +78 -0
- data/lib/dbsketch/automation/table_importer.rb +114 -0
- data/lib/dbsketch/comparison/check_constraint_comparator.rb +54 -0
- data/lib/dbsketch/comparison/column_comparator.rb +65 -0
- data/lib/dbsketch/comparison/comparison_error.rb +15 -0
- data/lib/dbsketch/comparison/computed_column_comparator.rb +63 -0
- data/lib/dbsketch/comparison/database_comparator.rb +115 -0
- data/lib/dbsketch/comparison/diff.rb +37 -0
- data/lib/dbsketch/comparison/foreign_key_comparator.rb +56 -0
- data/lib/dbsketch/comparison/function_comparator.rb +56 -0
- data/lib/dbsketch/comparison/index_comparator.rb +65 -0
- data/lib/dbsketch/comparison/primary_key_comparator.rb +61 -0
- data/lib/dbsketch/comparison/procedure_comparator.rb +54 -0
- data/lib/dbsketch/comparison/table_comparator.rb +158 -0
- data/lib/dbsketch/comparison/trigger_comparator.rb +53 -0
- data/lib/dbsketch/comparison/type_comparator.rb +51 -0
- data/lib/dbsketch/comparison/unique_constraint_comparator.rb +58 -0
- data/lib/dbsketch/comparison/view_comparator.rb +54 -0
- data/lib/dbsketch/model/abstract_column.rb +25 -0
- data/lib/dbsketch/model/check_constraint.rb +23 -0
- data/lib/dbsketch/model/column.rb +35 -0
- data/lib/dbsketch/model/computed_column.rb +27 -0
- data/lib/dbsketch/model/custom_code.rb +21 -0
- data/lib/dbsketch/model/database.rb +87 -0
- data/lib/dbsketch/model/database_object.rb +71 -0
- data/lib/dbsketch/model/foreign_key.rb +29 -0
- data/lib/dbsketch/model/function.rb +23 -0
- data/lib/dbsketch/model/index.rb +40 -0
- data/lib/dbsketch/model/model_error.rb +15 -0
- data/lib/dbsketch/model/operation.rb +28 -0
- data/lib/dbsketch/model/primary_key.rb +33 -0
- data/lib/dbsketch/model/procedure.rb +18 -0
- data/lib/dbsketch/model/table.rb +171 -0
- data/lib/dbsketch/model/trigger.rb +32 -0
- data/lib/dbsketch/model/type.rb +92 -0
- data/lib/dbsketch/model/unique_constraint.rb +33 -0
- data/lib/dbsketch/model/view.rb +23 -0
- data/lib/dbsketch/rendering/meta/column_renderer.rb +76 -0
- data/lib/dbsketch/rendering/meta/database_renderer.rb +112 -0
- data/lib/dbsketch/rendering/meta/foreign_key_renderer.rb +31 -0
- data/lib/dbsketch/rendering/meta/index_renderer.rb +30 -0
- data/lib/dbsketch/rendering/meta/operation_renderer.rb +66 -0
- data/lib/dbsketch/rendering/meta/table_renderer.rb +177 -0
- data/lib/dbsketch/rendering/meta/trigger_renderer.rb +31 -0
- data/lib/dbsketch/rendering/meta/type_renderer.rb +37 -0
- data/lib/dbsketch/rendering/meta/view_renderer.rb +32 -0
- data/lib/dbsketch/rendering/sql/column_renderer.rb +75 -0
- data/lib/dbsketch/rendering/sql/database_diff_renderer.rb +94 -0
- data/lib/dbsketch/rendering/sql/database_renderer.rb +139 -0
- data/lib/dbsketch/rendering/sql/foreign_key_renderer.rb +24 -0
- data/lib/dbsketch/rendering/sql/index_renderer.rb +31 -0
- data/lib/dbsketch/rendering/sql/operation_renderer.rb +64 -0
- data/lib/dbsketch/rendering/sql/table_renderer.rb +148 -0
- data/lib/dbsketch/rendering/sql/trigger_renderer.rb +31 -0
- data/lib/dbsketch/rendering/sql/type_renderer.rb +28 -0
- data/lib/dbsketch/rendering/sql/view_renderer.rb +31 -0
- data/lib/dbsketch/version.rb +3 -0
- metadata +134 -0
@@ -0,0 +1,31 @@
|
|
1
|
+
########################################################################################################################
|
2
|
+
# Render a trigger into ruby
|
3
|
+
########################################################################################################################
|
4
|
+
|
5
|
+
require_relative '../../model/trigger'
|
6
|
+
|
7
|
+
module Dbsketch
|
8
|
+
module Rendering
|
9
|
+
module Meta
|
10
|
+
|
11
|
+
class TriggerRenderer
|
12
|
+
|
13
|
+
def create trigger
|
14
|
+
### Preconditions
|
15
|
+
raise ArgumentError, "trigger is not a Dbsketch::Model::Trigger" unless trigger.is_a? Dbsketch::Model::Trigger
|
16
|
+
###
|
17
|
+
"Dbsketch::Model::Trigger.new(\"#{trigger.name}\", #{trigger.target.name}, \"#{trigger.activation_time}\", :algo => \"#{trigger.algo}\")"
|
18
|
+
end
|
19
|
+
|
20
|
+
def drop trigger
|
21
|
+
### Preconditions
|
22
|
+
raise ArgumentError, "trigger is not a Dbsketch::Model::Trigger" unless trigger.is_a? Dbsketch::Model::Trigger
|
23
|
+
###
|
24
|
+
"Trigger.drop #{trigger.name}"
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
########################################################################################################################
|
2
|
+
# Render a type into ruby
|
3
|
+
########################################################################################################################
|
4
|
+
|
5
|
+
require_relative '../../model/type'
|
6
|
+
|
7
|
+
module Dbsketch
|
8
|
+
module Rendering
|
9
|
+
module Meta
|
10
|
+
|
11
|
+
class TypeRenderer
|
12
|
+
def initialize type_keyword: 'Dbsketch::Model::Type.new'
|
13
|
+
### Preconditions
|
14
|
+
raise ArgumentError, "type_keyword is not a String" unless type_keyword.is_a? String
|
15
|
+
###
|
16
|
+
@type_keyword = type_keyword
|
17
|
+
end
|
18
|
+
|
19
|
+
def create type
|
20
|
+
### Preconditions
|
21
|
+
raise ArgumentError, "type is not a Dbsketch::Model::Type" unless type.is_a? Dbsketch::Model::Type
|
22
|
+
###
|
23
|
+
str = "#{@type_keyword}('#{type.sql_type}'"
|
24
|
+
if type.sizes.count > 1
|
25
|
+
str << ", [#{type.sizes.join(", ")}]"
|
26
|
+
elsif type.sizes.count > 0
|
27
|
+
str << ", #{type.sizes.first.is_a?(String) ? "'#{type.sizes.first}'" : type.sizes.first}"
|
28
|
+
end
|
29
|
+
str << ")"
|
30
|
+
str
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
########################################################################################################################
|
2
|
+
# Render a view into rub<
|
3
|
+
########################################################################################################################
|
4
|
+
|
5
|
+
require_relative '../../model/view'
|
6
|
+
|
7
|
+
module Dbsketch
|
8
|
+
module Rendering
|
9
|
+
module Meta
|
10
|
+
|
11
|
+
class ViewRenderer
|
12
|
+
|
13
|
+
def create view
|
14
|
+
### Preconditions
|
15
|
+
raise ArgumentError, "view is not a Dbsketch::Model::View" unless view.is_a? Dbsketch::Model::View
|
16
|
+
###
|
17
|
+
"create view #{view.name} as #{view.query}"
|
18
|
+
"Dbsketch::Model::View.new(\"#{view.name}\", \"#{view.query}\")"
|
19
|
+
end
|
20
|
+
|
21
|
+
def drop view
|
22
|
+
### Preconditions
|
23
|
+
raise ArgumentError, "view is not a Dbsketch::Model::View" unless view.is_a? Dbsketch::Model::View
|
24
|
+
###
|
25
|
+
"View.drop #{view.name}"
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,75 @@
|
|
1
|
+
########################################################################################################################
|
2
|
+
# Render a column into SQL
|
3
|
+
########################################################################################################################
|
4
|
+
|
5
|
+
require_relative '../../model/abstract_column'
|
6
|
+
require_relative '../../model/column'
|
7
|
+
require_relative '../../model/computed_column'
|
8
|
+
|
9
|
+
require_relative 'type_renderer'
|
10
|
+
|
11
|
+
module Dbsketch
|
12
|
+
module Rendering
|
13
|
+
module SQL
|
14
|
+
|
15
|
+
class ColumnRenderer
|
16
|
+
def initialize type_renderer: nil, options: {}
|
17
|
+
### Preconditions
|
18
|
+
raise ArgumentError, "options is not a Hash" unless options.is_a? Hash
|
19
|
+
###
|
20
|
+
@options = {
|
21
|
+
:pretty => false
|
22
|
+
}.merge options
|
23
|
+
@type_renderer = (nil == type_renderer ? TypeRenderer.new : type_renderer)
|
24
|
+
end
|
25
|
+
|
26
|
+
def create column
|
27
|
+
### Preconditions
|
28
|
+
raise ArgumentError, "column is not a Dbsketch::Model::AbstractColumn" unless column.is_a? Dbsketch::Model::AbstractColumn
|
29
|
+
###
|
30
|
+
if column.is_a? Dbsketch::Model::ComputedColumn
|
31
|
+
create_computed_column column
|
32
|
+
elsif column.is_a? Dbsketch::Model::Column
|
33
|
+
create_column column
|
34
|
+
else
|
35
|
+
raise ArgumentError, "#{column.class} is an unknown subclass of Dbsketch::Model::AbstractColumn"
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
private
|
40
|
+
|
41
|
+
def get_semantic column
|
42
|
+
sql = ""
|
43
|
+
if @options[:pretty] and (nil != column.meaning or nil != column.comment)
|
44
|
+
sql << " -- "
|
45
|
+
sql << column.meaning if nil != column.meaning
|
46
|
+
sql << ". " if nil != column.meaning and nil != column.comment
|
47
|
+
sql << column.comment if nil != column.comment
|
48
|
+
end
|
49
|
+
sql
|
50
|
+
end
|
51
|
+
|
52
|
+
def create_column column
|
53
|
+
sql = "#{column.name} #{@type_renderer.create column.type}"
|
54
|
+
sql << " identity(1,1)" if column.identity
|
55
|
+
sql << (column.nullable ? " null" : " not null")
|
56
|
+
if nil != column.default
|
57
|
+
sql << " default #{column.default}"
|
58
|
+
end
|
59
|
+
sql << get_semantic(column)
|
60
|
+
sql
|
61
|
+
end
|
62
|
+
|
63
|
+
def create_computed_column column
|
64
|
+
sql = "#{column.name} as #{column.query}"
|
65
|
+
sql << " persisted" if column.persisted
|
66
|
+
sql << " not null" if not column.nullable
|
67
|
+
sql << get_semantic(column)
|
68
|
+
sql
|
69
|
+
end
|
70
|
+
|
71
|
+
end
|
72
|
+
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
@@ -0,0 +1,94 @@
|
|
1
|
+
########################################################################################################################
|
2
|
+
# Render a database diff into SQL
|
3
|
+
########################################################################################################################
|
4
|
+
|
5
|
+
require_relative '../../comparison/database_comparator'
|
6
|
+
|
7
|
+
require_relative 'index_renderer'
|
8
|
+
require_relative 'operation_renderer'
|
9
|
+
require_relative 'table_renderer'
|
10
|
+
require_relative 'trigger_renderer'
|
11
|
+
require_relative 'view_renderer'
|
12
|
+
|
13
|
+
module Dbsketch
|
14
|
+
module Rendering
|
15
|
+
module SQL
|
16
|
+
|
17
|
+
class DatabaseDiffRenderer
|
18
|
+
def initialize index_renderer: nil, operation_renderer: nil, table_renderer: nil, trigger_renderer: nil, view_renderer: nil, options: {}
|
19
|
+
### Preconditions
|
20
|
+
raise ArgumentError, "index_renderer is not a Dbsketch::Rendering::SQL::IndexRenderer" unless nil == index_renderer or index_renderer.is_a? IndexRenderer
|
21
|
+
raise ArgumentError, "operation_renderer is not a Dbsketch::Rendering::SQL::OperationRenderer" unless nil == operation_renderer or operation_renderer.is_a? OperationRenderer
|
22
|
+
raise ArgumentError, "table_renderer is not a Dbsketch::Rendering::SQL::TableRenderer" unless nil == table_renderer or table_renderer.is_a? TableRenderer
|
23
|
+
raise ArgumentError, "trigger_renderer is not a Dbsketch::Rendering::SQL::TriggerRenderer" unless nil == trigger_renderer or trigger_renderer.is_a? TriggerRenderer
|
24
|
+
raise ArgumentError, "view_renderer is not a Dbsketch::Rendering::SQL::ViewRenderer" unless nil == view_renderer or view_renderer.is_a? ViewRenderer
|
25
|
+
raise ArgumentError, "options is not a Hash" unless options.is_a? Hash
|
26
|
+
raise ArgumentError, "options[:drop_if_exists] has not a value in [:before, :inline]" unless [nil, :before, :inline].include? options[:drop_if_exists]
|
27
|
+
raise ArgumentError, "options[:order_by_dependencies] == true is not compatible with options[:drop_if_exists] == :inline" if options[:order_by_dependencies] and :inline == options[:drop_if_exists]
|
28
|
+
###
|
29
|
+
@options = {
|
30
|
+
:drop_if_exists => nil,
|
31
|
+
:go_statements => true,
|
32
|
+
:order_by_dependencies => true,
|
33
|
+
:pretty => false,
|
34
|
+
}.merge options
|
35
|
+
@index_renderer = (nil == index_renderer ? IndexRenderer.new : index_renderer)
|
36
|
+
@operation_renderer = (nil == operation_renderer ? OperationRenderer.new : operation_renderer)
|
37
|
+
@table_renderer = (nil == table_renderer ? TableRenderer.new(:options => @options) : table_renderer)
|
38
|
+
@trigger_renderer = (nil == trigger_renderer ? TriggerRenderer.new : trigger_renderer)
|
39
|
+
@view_renderer = (nil == view_renderer ? ViewRenderer.new : view_renderer)
|
40
|
+
end
|
41
|
+
|
42
|
+
def render database_diff
|
43
|
+
### Preconditions
|
44
|
+
raise ArgumentError, "database_diff is not a Dbsketch::Comparison::DatabaseDiff" unless database_diff.is_a? Dbsketch::Comparison::DatabaseDiff
|
45
|
+
###
|
46
|
+
separator = ";\n" + (@options[:go_statements] ? "go\n" : '')
|
47
|
+
|
48
|
+
simple_diffs = database_diff.indexes + database_diff.operations + database_diff.triggers + database_diff.views
|
49
|
+
deletions = diffs.select { |d| d.deletion? }.map { |i| drop_item i.old_value }
|
50
|
+
creations = diffs.select { |d| d.addition? }.map { |i| create_item i.new_value }
|
51
|
+
changes = diffs.select { |d| d.change? }.map { |i| [drop_item i.old_value, create_item i.new_value] }
|
52
|
+
|
53
|
+
deletions << database_diff.tables.select { |d| d.deletion? }.map { |i| drop_item i.old_value }
|
54
|
+
creations < database_diff.tables.select { |d| d.addition? }.map { |i| create_item i.new_value }
|
55
|
+
changes << database_diff.tables.select { |d| d.change? }.map { |i| [drop_item i.old_value, create_item i.new_value] }
|
56
|
+
|
57
|
+
(deletions + creations + changes).flatten.compact.join(separator) + separator
|
58
|
+
end
|
59
|
+
|
60
|
+
private
|
61
|
+
|
62
|
+
def create_item item
|
63
|
+
if item.is_a? Dbsketch::Model::Index
|
64
|
+
@index_renderer.create item
|
65
|
+
elsif item.is_a? Dbsketch::Model::Operation
|
66
|
+
@operation_renderer.create item
|
67
|
+
elsif item.is_a? Dbsketch::Model::Table
|
68
|
+
@table_renderer.create item
|
69
|
+
elsif item.is_a? Dbsketch::Model::Trigger
|
70
|
+
@trigger_renderer.create item
|
71
|
+
elsif item.is_a? Dbsketch::Model::View
|
72
|
+
@view_renderer.create item
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
def drop_item item
|
77
|
+
if item.is_a? Dbsketch::Model::Index
|
78
|
+
@index_renderer.drop item
|
79
|
+
elsif item.is_a? Dbsketch::Model::Operation
|
80
|
+
@operation_renderer.drop item
|
81
|
+
elsif item.is_a? Dbsketch::Model::Table
|
82
|
+
@table_renderer.drop item
|
83
|
+
elsif item.is_a? Dbsketch::Model::Trigger
|
84
|
+
@trigger_renderer.drop item
|
85
|
+
elsif item.is_a? Dbsketch::Model::View
|
86
|
+
@view_renderer.drop item
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
end
|
91
|
+
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
@@ -0,0 +1,139 @@
|
|
1
|
+
########################################################################################################################
|
2
|
+
# Render a database into SQL
|
3
|
+
########################################################################################################################
|
4
|
+
|
5
|
+
require_relative '../../comparison/database_comparator'
|
6
|
+
require_relative '../../model/database'
|
7
|
+
|
8
|
+
require_relative 'index_renderer'
|
9
|
+
require_relative 'operation_renderer'
|
10
|
+
require_relative 'table_renderer'
|
11
|
+
require_relative 'trigger_renderer'
|
12
|
+
require_relative 'view_renderer'
|
13
|
+
|
14
|
+
module Dbsketch
|
15
|
+
module Rendering
|
16
|
+
module SQL
|
17
|
+
|
18
|
+
class DatabaseRenderer
|
19
|
+
def initialize index_renderer: nil, operation_renderer: nil, table_renderer: nil, trigger_renderer: nil, view_renderer: nil, options: {}
|
20
|
+
### Preconditions
|
21
|
+
raise ArgumentError, "index_renderer is not a Dbsketch::Rendering::SQL::IndexRenderer" unless nil == index_renderer or index_renderer.is_a? IndexRenderer
|
22
|
+
raise ArgumentError, "operation_renderer is not a Dbsketch::Rendering::SQL::OperationRenderer" unless nil == operation_renderer or operation_renderer.is_a? OperationRenderer
|
23
|
+
raise ArgumentError, "table_renderer is not a Dbsketch::Rendering::SQL::TableRenderer" unless nil == table_renderer or table_renderer.is_a? TableRenderer
|
24
|
+
raise ArgumentError, "trigger_renderer is not a Dbsketch::Rendering::SQL::TriggerRenderer" unless nil == trigger_renderer or trigger_renderer.is_a? TriggerRenderer
|
25
|
+
raise ArgumentError, "view_renderer is not a Dbsketch::Rendering::SQL::ViewRenderer" unless nil == view_renderer or view_renderer.is_a? ViewRenderer
|
26
|
+
raise ArgumentError, "options is not a Hash" unless options.is_a? Hash
|
27
|
+
raise ArgumentError, "options[:drop_if_exists] has not a value in [:before, :inline]" unless [nil, :before, :inline].include? options[:drop_if_exists]
|
28
|
+
raise ArgumentError, "options[:order_by_dependencies] == true is not compatible with options[:drop_if_exists] == :inline" if options[:order_by_dependencies] and :inline == options[:drop_if_exists]
|
29
|
+
###
|
30
|
+
@options = {
|
31
|
+
:drop_if_exists => nil,
|
32
|
+
:go_statements => true,
|
33
|
+
:order_by_dependencies => true,
|
34
|
+
:pretty => false,
|
35
|
+
}.merge options
|
36
|
+
@index_renderer = (nil == index_renderer ? IndexRenderer.new : index_renderer)
|
37
|
+
@operation_renderer = (nil == operation_renderer ? OperationRenderer.new : operation_renderer)
|
38
|
+
@table_renderer = (nil == table_renderer ? TableRenderer.new(:options => @options) : table_renderer)
|
39
|
+
@trigger_renderer = (nil == trigger_renderer ? TriggerRenderer.new : trigger_renderer)
|
40
|
+
@view_renderer = (nil == view_renderer ? ViewRenderer.new : view_renderer)
|
41
|
+
end
|
42
|
+
|
43
|
+
def create database
|
44
|
+
### Preconditions
|
45
|
+
raise ArgumentError, "database is not a Dbsketch::Model::Database" unless database.is_a? Dbsketch::Model::Database
|
46
|
+
###
|
47
|
+
database.order_items! if @options[:order_by_dependencies]
|
48
|
+
if :before == @options[:drop_if_exists]
|
49
|
+
drop_before_and_create database
|
50
|
+
elsif :inline == @options[:drop_if_exists]
|
51
|
+
drop_inline_and_create database
|
52
|
+
else
|
53
|
+
only_create database
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def alter database_diff
|
58
|
+
### Preconditions
|
59
|
+
raise ArgumentError, "database_diff is not a Dbsketch::Comparison::DatabaseDiff" unless database_diff.is_a? Dbsketch::Comparison::DatabaseDiff
|
60
|
+
###
|
61
|
+
separator = ";\n" + (@options[:go_statements] ? "go\n" : '')
|
62
|
+
|
63
|
+
diffs = database_diff.indexes + database_diff.operations + database_diff.tables + database_diff.triggers + database_diff.views
|
64
|
+
deletions = diffs.select { |d| d.deletion? }.map { |i| drop_item i.old_value }
|
65
|
+
changes = diffs.select { |d| d.change? }.map { |i| alter_item(i) }
|
66
|
+
creations = diffs.select { |d| d.addition? }.map { |i| create_item i.new_value }
|
67
|
+
|
68
|
+
(deletions + changes + creations).flatten.compact.join(separator) + separator
|
69
|
+
end
|
70
|
+
|
71
|
+
private
|
72
|
+
|
73
|
+
def create_item item
|
74
|
+
if item.is_a? Dbsketch::Model::CustomCode
|
75
|
+
item.do_code
|
76
|
+
elsif item.is_a? Dbsketch::Model::Index
|
77
|
+
@index_renderer.create item
|
78
|
+
elsif item.is_a? Dbsketch::Model::Operation
|
79
|
+
@operation_renderer.create item
|
80
|
+
elsif item.is_a? Dbsketch::Model::Table
|
81
|
+
@table_renderer.create item
|
82
|
+
elsif item.is_a? Dbsketch::Model::Trigger
|
83
|
+
@trigger_renderer.create item
|
84
|
+
elsif item.is_a? Dbsketch::Model::View
|
85
|
+
@view_renderer.create item
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
def drop_item item
|
90
|
+
if item.is_a? Dbsketch::Model::CustomCode
|
91
|
+
item.undo_code
|
92
|
+
elsif item.is_a? Dbsketch::Model::Index
|
93
|
+
@index_renderer.drop item
|
94
|
+
elsif item.is_a? Dbsketch::Model::Operation
|
95
|
+
@operation_renderer.drop item
|
96
|
+
elsif item.is_a? Dbsketch::Model::Table
|
97
|
+
@table_renderer.drop item
|
98
|
+
elsif item.is_a? Dbsketch::Model::Trigger
|
99
|
+
@trigger_renderer.drop item
|
100
|
+
elsif item.is_a? Dbsketch::Model::View
|
101
|
+
@view_renderer.drop item
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
def alter_item item_diff
|
106
|
+
if item_diff.old_value.is_a? Dbsketch::Model::Index
|
107
|
+
[drop_item(item_diff.old_value), create_item(item_diff.new_value)]
|
108
|
+
elsif item_diff.old_value.is_a? Dbsketch::Model::Operation
|
109
|
+
[drop_item(item_diff.old_value), create_item(item_diff.new_value)]
|
110
|
+
elsif item_diff.old_value.is_a? Dbsketch::Model::Table
|
111
|
+
@table_renderer.alter item_diff
|
112
|
+
elsif item_diff.old_value.is_a? Dbsketch::Model::Trigger
|
113
|
+
[drop_item(item_diff.old_value), create_item(item_diff.new_value)]
|
114
|
+
elsif item_diff.old_value.is_a? Dbsketch::Model::View
|
115
|
+
[drop_item(item_diff.old_value), create_item(item_diff.new_value)]
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
def only_create database
|
120
|
+
separator = ";\n" + (@options[:go_statements] ? "go\n" : '')
|
121
|
+
database.items.map { |i| create_item i }.flatten.compact.join(separator) + separator
|
122
|
+
end
|
123
|
+
|
124
|
+
def drop_inline_and_create database
|
125
|
+
separator = ";\n" + (@options[:go_statements] ? "go\n" : '')
|
126
|
+
database.items.map { |i| [drop_item(i), create_item(i)] }.flatten.compact.join(separator) + separator
|
127
|
+
end
|
128
|
+
|
129
|
+
def drop_before_and_create database
|
130
|
+
separator = ";\n" + (@options[:go_statements] ? "go\n" : '')
|
131
|
+
items_to_drop = @options[:order_by_dependencies] ? database.items.reverse : database.items
|
132
|
+
(items_to_drop.map { |i| drop_item(i) } + database.items.map { |i| create_item(i) }).flatten.compact.join(separator) + separator
|
133
|
+
end
|
134
|
+
|
135
|
+
end
|
136
|
+
|
137
|
+
end
|
138
|
+
end
|
139
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
########################################################################################################################
|
2
|
+
# Render a column into SQL
|
3
|
+
########################################################################################################################
|
4
|
+
|
5
|
+
require_relative '../../model/foreign_key'
|
6
|
+
|
7
|
+
module Dbsketch
|
8
|
+
module Rendering
|
9
|
+
module SQL
|
10
|
+
|
11
|
+
class ForeignKeyRenderer
|
12
|
+
|
13
|
+
def create foreign_key
|
14
|
+
### Preconditions
|
15
|
+
raise ArgumentError, "foreign_key is not a Dbsketch::Model::ForeignKey" unless foreign_key.is_a? Dbsketch::Model::ForeignKey
|
16
|
+
###
|
17
|
+
"constraint #{foreign_key.name} foreign key (#{foreign_key.constricted_column.name}) references #{foreign_key.referenced_table.name} (#{foreign_key.referenced_column.name})"
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
########################################################################################################################
|
2
|
+
# Render an index into SQL
|
3
|
+
########################################################################################################################
|
4
|
+
|
5
|
+
require_relative '../../model/index'
|
6
|
+
|
7
|
+
module Dbsketch
|
8
|
+
module Rendering
|
9
|
+
module SQL
|
10
|
+
|
11
|
+
class IndexRenderer
|
12
|
+
|
13
|
+
def create index
|
14
|
+
### Preconditions
|
15
|
+
raise ArgumentError, "index is not a Dbsketch::Model::Index" unless index.is_a? Dbsketch::Model::Index
|
16
|
+
###
|
17
|
+
"create index #{index.name} on #{index.target.name} (#{index.columns.map {|c| c.name }.join(", ")})"
|
18
|
+
end
|
19
|
+
|
20
|
+
def drop index
|
21
|
+
### Preconditions
|
22
|
+
raise ArgumentError, "index is not a Dbsketch::Model::Index" unless index.is_a? Dbsketch::Model::Index
|
23
|
+
###
|
24
|
+
"if exists(select * from sysindexes where name = '#{index.name}') drop index #{index.name} on #{index.target.name}"
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|