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.
Files changed (65) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +674 -0
  3. data/README.md +1 -0
  4. data/lib/dbsketch.rb +64 -0
  5. data/lib/dbsketch/automation/automation_error.rb +15 -0
  6. data/lib/dbsketch/automation/database_connection_details.rb +32 -0
  7. data/lib/dbsketch/automation/database_importer.rb +184 -0
  8. data/lib/dbsketch/automation/database_proxy.rb +78 -0
  9. data/lib/dbsketch/automation/table_importer.rb +114 -0
  10. data/lib/dbsketch/comparison/check_constraint_comparator.rb +54 -0
  11. data/lib/dbsketch/comparison/column_comparator.rb +65 -0
  12. data/lib/dbsketch/comparison/comparison_error.rb +15 -0
  13. data/lib/dbsketch/comparison/computed_column_comparator.rb +63 -0
  14. data/lib/dbsketch/comparison/database_comparator.rb +115 -0
  15. data/lib/dbsketch/comparison/diff.rb +37 -0
  16. data/lib/dbsketch/comparison/foreign_key_comparator.rb +56 -0
  17. data/lib/dbsketch/comparison/function_comparator.rb +56 -0
  18. data/lib/dbsketch/comparison/index_comparator.rb +65 -0
  19. data/lib/dbsketch/comparison/primary_key_comparator.rb +61 -0
  20. data/lib/dbsketch/comparison/procedure_comparator.rb +54 -0
  21. data/lib/dbsketch/comparison/table_comparator.rb +158 -0
  22. data/lib/dbsketch/comparison/trigger_comparator.rb +53 -0
  23. data/lib/dbsketch/comparison/type_comparator.rb +51 -0
  24. data/lib/dbsketch/comparison/unique_constraint_comparator.rb +58 -0
  25. data/lib/dbsketch/comparison/view_comparator.rb +54 -0
  26. data/lib/dbsketch/model/abstract_column.rb +25 -0
  27. data/lib/dbsketch/model/check_constraint.rb +23 -0
  28. data/lib/dbsketch/model/column.rb +35 -0
  29. data/lib/dbsketch/model/computed_column.rb +27 -0
  30. data/lib/dbsketch/model/custom_code.rb +21 -0
  31. data/lib/dbsketch/model/database.rb +87 -0
  32. data/lib/dbsketch/model/database_object.rb +71 -0
  33. data/lib/dbsketch/model/foreign_key.rb +29 -0
  34. data/lib/dbsketch/model/function.rb +23 -0
  35. data/lib/dbsketch/model/index.rb +40 -0
  36. data/lib/dbsketch/model/model_error.rb +15 -0
  37. data/lib/dbsketch/model/operation.rb +28 -0
  38. data/lib/dbsketch/model/primary_key.rb +33 -0
  39. data/lib/dbsketch/model/procedure.rb +18 -0
  40. data/lib/dbsketch/model/table.rb +171 -0
  41. data/lib/dbsketch/model/trigger.rb +32 -0
  42. data/lib/dbsketch/model/type.rb +92 -0
  43. data/lib/dbsketch/model/unique_constraint.rb +33 -0
  44. data/lib/dbsketch/model/view.rb +23 -0
  45. data/lib/dbsketch/rendering/meta/column_renderer.rb +76 -0
  46. data/lib/dbsketch/rendering/meta/database_renderer.rb +112 -0
  47. data/lib/dbsketch/rendering/meta/foreign_key_renderer.rb +31 -0
  48. data/lib/dbsketch/rendering/meta/index_renderer.rb +30 -0
  49. data/lib/dbsketch/rendering/meta/operation_renderer.rb +66 -0
  50. data/lib/dbsketch/rendering/meta/table_renderer.rb +177 -0
  51. data/lib/dbsketch/rendering/meta/trigger_renderer.rb +31 -0
  52. data/lib/dbsketch/rendering/meta/type_renderer.rb +37 -0
  53. data/lib/dbsketch/rendering/meta/view_renderer.rb +32 -0
  54. data/lib/dbsketch/rendering/sql/column_renderer.rb +75 -0
  55. data/lib/dbsketch/rendering/sql/database_diff_renderer.rb +94 -0
  56. data/lib/dbsketch/rendering/sql/database_renderer.rb +139 -0
  57. data/lib/dbsketch/rendering/sql/foreign_key_renderer.rb +24 -0
  58. data/lib/dbsketch/rendering/sql/index_renderer.rb +31 -0
  59. data/lib/dbsketch/rendering/sql/operation_renderer.rb +64 -0
  60. data/lib/dbsketch/rendering/sql/table_renderer.rb +148 -0
  61. data/lib/dbsketch/rendering/sql/trigger_renderer.rb +31 -0
  62. data/lib/dbsketch/rendering/sql/type_renderer.rb +28 -0
  63. data/lib/dbsketch/rendering/sql/view_renderer.rb +31 -0
  64. data/lib/dbsketch/version.rb +3 -0
  65. 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