dbsketch 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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,64 @@
1
+ ########################################################################################################################
2
+ # Render a column into SQL
3
+ ########################################################################################################################
4
+
5
+ require_relative '../../model/function'
6
+ require_relative '../../model/procedure'
7
+
8
+ module Dbsketch
9
+ module Rendering
10
+ module SQL
11
+
12
+ class OperationRenderer
13
+
14
+ def create operation
15
+ ### Preconditions
16
+ raise ArgumentError, "operation is not a Dbsketch::Model::Operation" unless operation.is_a? Dbsketch::Model::Operation
17
+ ###
18
+ if operation.is_a? Dbsketch::Model::Function
19
+ create_function operation
20
+ elsif operation.is_a? Dbsketch::Model::Procedure
21
+ create_procedure operation
22
+ else
23
+ raise ArgumentError, "#{operation.class} is an unknown subclass of Dbsketch::Model::Operation"
24
+ end
25
+ end
26
+
27
+ def drop operation
28
+ ### Preconditions
29
+ raise ArgumentError, "operation is not a Dbsketch::Model::Operation" unless operation.is_a? Dbsketch::Model::Operation
30
+ ###
31
+ if operation.is_a? Dbsketch::Model::Function
32
+ keyword = "function"
33
+ mssql_type = "FN"
34
+ elsif operation.is_a? Dbsketch::Model::Procedure
35
+ keyword = "procedure"
36
+ mssql_type = "P"
37
+ else
38
+ raise ArgumentError, "#{operation.class} is an unknown subclass of Dbsketch::Model::Operation"
39
+ end
40
+
41
+ "if object_id('#{operation.name}', '#{mssql_type}') is not null drop #{keyword} #{operation.name}"
42
+ end
43
+
44
+ private
45
+
46
+ def create_function function
47
+ sql = "create function #{function.name} ("
48
+ sql << "#{function.arguments.join(", ")}" if not function.arguments.empty?
49
+ sql << ") returns #{function.returns} as\nbegin\n\t#{function.algo}\nend"
50
+ sql
51
+ end
52
+
53
+ def create_procedure procedure
54
+ sql = "create procedure #{procedure.name} "
55
+ sql << "#{procedure.arguments.join(", ")} " if not procedure.arguments.empty?
56
+ sql << "as\nbegin\n\t#{procedure.algo}\nend"
57
+ sql
58
+ end
59
+
60
+ end
61
+
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,148 @@
1
+ ########################################################################################################################
2
+ # Render a table into SQL
3
+ ########################################################################################################################
4
+
5
+ require_relative '../../comparison/table_comparator'
6
+ require_relative '../../model/table'
7
+
8
+ require_relative 'column_renderer'
9
+ require_relative 'foreign_key_renderer'
10
+
11
+ module Dbsketch
12
+ module Rendering
13
+ module SQL
14
+
15
+ class TableRenderer
16
+ def initialize column_renderer: nil, fk_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
+ @column_renderer = (nil == column_renderer ? ColumnRenderer.new(:options => options) : column_renderer)
24
+ @fk_renderer = (nil == fk_renderer ? ForeignKeyRenderer.new : fk_renderer)
25
+ end
26
+
27
+ def create table
28
+ ### Preconditions
29
+ raise ArgumentError, "table is not a Dbsketch::Model::Table" unless table.is_a? Dbsketch::Model::Table
30
+ ###
31
+ if @options[:pretty]
32
+ create_pretty table
33
+ else
34
+ create_brief table
35
+ end
36
+ end
37
+
38
+ def drop table
39
+ ### Preconditions
40
+ raise ArgumentError, "table is not a Dbsketch::Model::Table" unless table.is_a? Dbsketch::Model::Table
41
+ ###
42
+ "if object_id('#{table.name}', 'U') is not null drop table #{table.name}"
43
+ end
44
+
45
+ def alter table_diff
46
+ ### Preconditions
47
+ raise ArgumentError, "table_diff is not a Dbsketch::Comparison::TableDiff" unless table_diff.is_a? Dbsketch::Comparison::TableDiff
48
+ ###
49
+ queries = []
50
+
51
+ # Columns
52
+ deleted_columns = table_diff.columns.select { |d| d.deletion? }
53
+ if not deleted_columns.empty?
54
+ queries << "alter table #{table_diff.new_table.name} drop column #{deleted_columns.map { |d| d.old_column.name }.join(", ")}"
55
+ end
56
+ added_columns = table_diff.columns.select { |d| d.addition? }
57
+ if not added_columns.empty?
58
+ queries << "alter table #{table_diff.new_table.name} add #{added_columns.map { |d| @column_renderer.create d.new_column }.join(", ")}"
59
+ end
60
+ 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}" }
61
+
62
+ # Primary key
63
+ if nil != table_diff.primary_key
64
+ 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?
65
+ 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?
66
+ end
67
+
68
+ # Check constraints
69
+ deleted_and_changed = table_diff.check_constraints.select { |chk_diff| chk_diff.deletion? or chk_diff.change? }
70
+ if not deleted_and_changed.empty?
71
+ queries << "alter table #{table_diff.new_table.name} drop constraint #{deleted_and_changed.map { |d| d.old_constraint.name }.join(", ")}"
72
+ end
73
+ added_and_changed = table_diff.check_constraints.select { |chk_diff| chk_diff.addition? or chk_diff.change? }
74
+ if not added_and_changed.empty?
75
+ queries << "alter table #{table_diff.new_table.name} add #{added_and_changed.map { |d| create_check_constraint d.new_constraint }.join(", ")}"
76
+ end
77
+ queries.flatten.join("\n")
78
+
79
+ # Foreign keys
80
+ deleted_and_changed = table_diff.foreign_keys.select { |d| d.deletion? or d.change? }
81
+ if not deleted_and_changed.empty?
82
+ queries << "alter table #{table_diff.new_table.name} drop constraint #{deleted_and_changed.map { |d| d.old_key.name }.join(", ")}"
83
+ end
84
+ added_and_changed = table_diff.foreign_keys.select { |d| d.addition? or d.change? }
85
+ if not added_and_changed.empty?
86
+ queries << "alter table #{table_diff.new_table.name} add #{added_and_changed.map { |d| @fk_renderer.create d.new_key }.join(", ")}"
87
+ end
88
+ queries.flatten.join("\n")
89
+
90
+ # Unique constraints
91
+ deleted_and_changed = table_diff.unique_constraints.select { |d| d.deletion? or d.change? }
92
+ if not deleted_and_changed.empty?
93
+ queries << "alter table #{table_diff.new_table.name} drop constraint #{deleted_and_changed.map { |d| d.old_constraint.name }.join(", ")}"
94
+ end
95
+ added_and_changed = table_diff.unique_constraints.select { |d| d.addition? or d.change? }
96
+ if not added_and_changed.empty?
97
+ queries << "alter table #{table_diff.new_table.name} add #{added_and_changed.map { |d| create_unique_constraint d.new_constraint }.join(", ")}"
98
+ end
99
+ queries.flatten.join("\n")
100
+ end
101
+
102
+ private
103
+
104
+ def create_primary_key primary_key
105
+ "constraint #{primary_key.name} primary key (#{primary_key.columns.map {|c| c.name }.join(", ")})"
106
+ end
107
+
108
+ def create_check_constraint constraint
109
+ "constraint #{constraint.name} check (#{constraint.condition})"
110
+ end
111
+
112
+ def create_unique_constraint constraint
113
+ "constraint #{constraint.name} unique (#{constraint.columns.map {|c| c.name }.join(", ")})"
114
+ end
115
+
116
+ def collect_items table
117
+ items = table.columns.sort { |a,b| a.order <=> b.order }.map { |c| @column_renderer.create c }
118
+ if nil != table.primary_key then items << create_primary_key(table.primary_key) end
119
+ items << table.check_constraints.map { |c| create_check_constraint c }
120
+ items << table.unique_constraints.map { |c| create_unique_constraint c }
121
+ items << table.foreign_keys.map { |k| @fk_renderer.create k }
122
+ items.flatten
123
+ end
124
+
125
+ def create_brief table
126
+ items = collect_items table
127
+ "create table #{table.name} (#{items.join(', ')})"
128
+ end
129
+
130
+ def create_pretty table
131
+ items = collect_items table
132
+ sql = ""
133
+ if nil != table.meaning or nil != table.comment
134
+ sql << "-- "
135
+ sql << table.meaning if nil != table.meaning
136
+ sql << "\n-- " if nil != table.meaning and nil != table.comment
137
+ sql << table.comment if nil != table.comment
138
+ sql << "\n"
139
+ end
140
+ sql << "create table #{table.name} (\n\t#{items.join(",\n\t")}\n)"
141
+ sql
142
+ end
143
+
144
+ end
145
+
146
+ end
147
+ end
148
+ end
@@ -0,0 +1,31 @@
1
+ ########################################################################################################################
2
+ # Render a trigger into SQL
3
+ ########################################################################################################################
4
+
5
+ require_relative '../../model/trigger'
6
+
7
+ module Dbsketch
8
+ module Rendering
9
+ module SQL
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
+ "create trigger #{trigger.name} on #{trigger.target.name} #{trigger.activation_time} as\nbegin\n\t#{trigger.algo}\nend"
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
+ "if object_id('#{trigger.name}', 'TR') is not null drop trigger #{trigger.name}"
25
+ end
26
+
27
+ end
28
+
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,28 @@
1
+ ########################################################################################################################
2
+ # Render a type into SQL
3
+ ########################################################################################################################
4
+
5
+ require_relative '../../model/type'
6
+
7
+ module Dbsketch
8
+ module Rendering
9
+ module SQL
10
+
11
+ class TypeRenderer
12
+
13
+ def create type
14
+ ### Preconditions
15
+ raise ArgumentError, "type is not a Dbsketch::Model::Type" unless type.is_a? Dbsketch::Model::Type
16
+ ###
17
+ if type.sizes.empty?
18
+ type.sql_type
19
+ else
20
+ "#{type.sql_type}(#{type.sizes.join(",")})"
21
+ end
22
+ end
23
+
24
+ end
25
+
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,31 @@
1
+ ########################################################################################################################
2
+ # Render a view into SQL
3
+ ########################################################################################################################
4
+
5
+ require_relative '../../model/view'
6
+
7
+ module Dbsketch
8
+ module Rendering
9
+ module SQL
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
+ end
19
+
20
+ def drop view
21
+ ### Preconditions
22
+ raise ArgumentError, "view is not a Dbsketch::Model::View" unless view.is_a? Dbsketch::Model::View
23
+ ###
24
+ "if object_id('#{view.name}', 'V') is not null drop view #{view.name}"
25
+ end
26
+
27
+ end
28
+
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,3 @@
1
+ module Dbsketch
2
+ VERSION = '0.0.1'
3
+ end
metadata ADDED
@@ -0,0 +1,134 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: dbsketch
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Francois Ruche
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-10-18 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: colorize
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '0.7'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '0.7'
27
+ - !ruby/object:Gem::Dependency
28
+ name: sequel
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '4.28'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '4.28'
41
+ description: Database scripting framework for Ruby.
42
+ email: francois.ruche@gmail.com
43
+ executables: []
44
+ extensions: []
45
+ extra_rdoc_files: []
46
+ files:
47
+ - LICENSE
48
+ - README.md
49
+ - lib/dbsketch.rb
50
+ - lib/dbsketch/automation/automation_error.rb
51
+ - lib/dbsketch/automation/database_connection_details.rb
52
+ - lib/dbsketch/automation/database_importer.rb
53
+ - lib/dbsketch/automation/database_proxy.rb
54
+ - lib/dbsketch/automation/table_importer.rb
55
+ - lib/dbsketch/comparison/check_constraint_comparator.rb
56
+ - lib/dbsketch/comparison/column_comparator.rb
57
+ - lib/dbsketch/comparison/comparison_error.rb
58
+ - lib/dbsketch/comparison/computed_column_comparator.rb
59
+ - lib/dbsketch/comparison/database_comparator.rb
60
+ - lib/dbsketch/comparison/diff.rb
61
+ - lib/dbsketch/comparison/foreign_key_comparator.rb
62
+ - lib/dbsketch/comparison/function_comparator.rb
63
+ - lib/dbsketch/comparison/index_comparator.rb
64
+ - lib/dbsketch/comparison/primary_key_comparator.rb
65
+ - lib/dbsketch/comparison/procedure_comparator.rb
66
+ - lib/dbsketch/comparison/table_comparator.rb
67
+ - lib/dbsketch/comparison/trigger_comparator.rb
68
+ - lib/dbsketch/comparison/type_comparator.rb
69
+ - lib/dbsketch/comparison/unique_constraint_comparator.rb
70
+ - lib/dbsketch/comparison/view_comparator.rb
71
+ - lib/dbsketch/model/abstract_column.rb
72
+ - lib/dbsketch/model/check_constraint.rb
73
+ - lib/dbsketch/model/column.rb
74
+ - lib/dbsketch/model/computed_column.rb
75
+ - lib/dbsketch/model/custom_code.rb
76
+ - lib/dbsketch/model/database.rb
77
+ - lib/dbsketch/model/database_object.rb
78
+ - lib/dbsketch/model/foreign_key.rb
79
+ - lib/dbsketch/model/function.rb
80
+ - lib/dbsketch/model/index.rb
81
+ - lib/dbsketch/model/model_error.rb
82
+ - lib/dbsketch/model/operation.rb
83
+ - lib/dbsketch/model/primary_key.rb
84
+ - lib/dbsketch/model/procedure.rb
85
+ - lib/dbsketch/model/table.rb
86
+ - lib/dbsketch/model/trigger.rb
87
+ - lib/dbsketch/model/type.rb
88
+ - lib/dbsketch/model/unique_constraint.rb
89
+ - lib/dbsketch/model/view.rb
90
+ - lib/dbsketch/rendering/meta/column_renderer.rb
91
+ - lib/dbsketch/rendering/meta/database_renderer.rb
92
+ - lib/dbsketch/rendering/meta/foreign_key_renderer.rb
93
+ - lib/dbsketch/rendering/meta/index_renderer.rb
94
+ - lib/dbsketch/rendering/meta/operation_renderer.rb
95
+ - lib/dbsketch/rendering/meta/table_renderer.rb
96
+ - lib/dbsketch/rendering/meta/trigger_renderer.rb
97
+ - lib/dbsketch/rendering/meta/type_renderer.rb
98
+ - lib/dbsketch/rendering/meta/view_renderer.rb
99
+ - lib/dbsketch/rendering/sql/column_renderer.rb
100
+ - lib/dbsketch/rendering/sql/database_diff_renderer.rb
101
+ - lib/dbsketch/rendering/sql/database_renderer.rb
102
+ - lib/dbsketch/rendering/sql/foreign_key_renderer.rb
103
+ - lib/dbsketch/rendering/sql/index_renderer.rb
104
+ - lib/dbsketch/rendering/sql/operation_renderer.rb
105
+ - lib/dbsketch/rendering/sql/table_renderer.rb
106
+ - lib/dbsketch/rendering/sql/trigger_renderer.rb
107
+ - lib/dbsketch/rendering/sql/type_renderer.rb
108
+ - lib/dbsketch/rendering/sql/view_renderer.rb
109
+ - lib/dbsketch/version.rb
110
+ homepage: https://github.com/Fransez/rproof
111
+ licenses:
112
+ - GPL-3.0
113
+ metadata: {}
114
+ post_install_message:
115
+ rdoc_options: []
116
+ require_paths:
117
+ - lib
118
+ required_ruby_version: !ruby/object:Gem::Requirement
119
+ requirements:
120
+ - - ">="
121
+ - !ruby/object:Gem::Version
122
+ version: '0'
123
+ required_rubygems_version: !ruby/object:Gem::Requirement
124
+ requirements:
125
+ - - ">="
126
+ - !ruby/object:Gem::Version
127
+ version: '0'
128
+ requirements: []
129
+ rubyforge_project:
130
+ rubygems_version: 2.6.7
131
+ signing_key:
132
+ specification_version: 4
133
+ summary: Database framework.
134
+ test_files: []