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,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: []