ddl_parser 0.0.9 → 0.0.10

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.
data/.gitignore CHANGED
@@ -17,3 +17,4 @@ test/version_tmp
17
17
  tmp
18
18
 
19
19
  .idea/
20
+ .vagrant/
data/Vagrantfile ADDED
@@ -0,0 +1,9 @@
1
+ # -*- mode: ruby -*-
2
+ # vi: set ft=ruby :
3
+
4
+ # Vagrantfile API/syntax version. Don't touch unless you know what you're doing!
5
+ VAGRANTFILE_API_VERSION = "2"
6
+
7
+ Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
8
+ config.vm.box = 'thoughtbot/ubuntu-14-04-server-with-laptop'
9
+ end
@@ -1,112 +1,112 @@
1
- module DDLParser
2
- module DDL
3
- module DB2
4
- class Parser < Parslet::Parser
5
-
6
- include DDLParser::SharedRules::Constants
7
- include DDLParser::SharedRules::LogicalOperators
8
- include DDLParser::SharedRules::DataTypes
9
-
10
- # column options
11
- rule(:option_not_null) { str('not null') }
12
- rule(:column_option) { (option_not_null).as(:column_option) }
13
- #rule(:lob_options)
14
- rule(:primary_key) { (str('primary key') >> spaces >> references).as(:primary_key) }
15
- rule(:constraint) { (str('constraint') >> spaces >> identifier.as(:column_name) >> spaces >> (str('unique') | str('foreign key')).as(:constraint_type) >>
16
- spaces >> references.as(:constraint_arglist) >> spaces >> reference_clause.maybe).as(:constraint)}
17
- #rule(:unique)
18
- rule(:references) { lparen >> space? >> arglist >> space? >> rparen }
19
- rule(:reference_clause) { str('references') >> spaces >> identifier >> spaces >> references.as(:reference_arglist) >> (identifier >> spaces).repeat }
20
- #rule(:check)
21
- #rule(:check_condition)
22
- #rule(:constraint_attr)
23
- rule(:gen_col_def) { str('generated always') | str('generated by default') }
24
- rule(:default_value) { const | current_timestamp | function }
25
- rule(:default_values) { (default_value >> space?).repeat }
26
- rule(:default_clause) { ((str('with') >> space?).maybe >> str('default') >> space? >> default_values).as(:default_clause) }
27
- rule(:identity_options) { (str('as identity') >> space? >> lparen >> str('start with') >> spaces >>
28
- integer.as(:start_value) >> (comma|space) >> spaces.maybe >>str('increment by') >> spaces >> integer.as(:increment_value)>> (spaces >> str('cache')>>spaces>>integer.as(:cache_value)).maybe >> spaces.maybe >>rparen).as(:identity) }
29
-
30
- rule(:column_options) { ((gen_col_def | column_option | default_clause | identity_options) >> spaces).repeat }
31
-
32
- rule(:column_name) { identifier }
33
- rule(:constraint_name) { identifier }
34
- rule(:column_sort) { str('ascending') | str('descending')}
35
-
36
- rule(:column_definition) { (column_name.as(:field) >> space.repeat >> data_type >> space.repeat >> (column_options.maybe).as(:options)).as(:column)}
37
-
38
- rule(:index_column_definition) { column_name.as(:field) >> space.repeat >> (column_sort.as(:sort_id) >> space.repeat).maybe }
39
-
40
- rule(:element_list) { (lparen >> space? >> (column_definition | constraint | primary_key) >> space? >>
41
- (comma >> space? >> (column_definition | constraint | primary_key) >> space?).repeat >> rparen).as(:elements)
42
- }
43
-
44
- rule(:element_list_index) { space? >> index_column_definition >>
45
- (comma >> space? >> index_column_definition).repeat
46
- }
47
-
48
- rule(:add_constraint_clause) { (str('add constraint') >> space? >>
49
- constraint_name.as(:constraint_name) >> space? >>
50
- foreign_key_clause.as(:foreign_key_clause)).as(:add_constraint)
51
- }
52
- rule(:foreign_key_clause) {str('foreign key') >> space? >> lparen >>
53
- element_list_index.as(:member_fields) >> space? >> rparen >> space? >>
54
- reference_clause.as(:reference_clause) >> space? >>
55
- (on_delete_clause.as(:on_delete_clause) >> space?).maybe >>
56
- (on_update_clause >> space?).maybe
57
- }
58
- rule(:on_delete_clause) {str('on delete') >> space? >>
59
- (str('no action')|str('restrict')|str('cascade')|str('set null')).as(:on_delete_option) >> space?
60
- }
61
- rule(:on_update_clause) {str('on update') >> space? >>
62
- (str('no action')|str('restrict')).as(:on_update_option) >> space?
63
- }
64
-
65
- rule(:alter_table_add_column) do
66
- (str('add') >> space? >> (str('column') >> space? >> column_definition) | primary_key).as(:add)
67
- end
68
-
69
- rule(:alter_table_element) { (alter_table_add_column | add_constraint_clause) >> spaces.maybe }
70
-
71
- #rule(:alter_table_alter) { }
72
- #rule(:alter_table_drop) { }
73
-
74
- rule(:term) { const | item }
75
-
76
- rule(:function) {
77
- (identifier.as(:name) >> space? >>
78
- lparen >> arglist.as(:arguments) >> rparen).as(:function)
79
- }
80
-
81
- rule(:item) { function | identifier | string }
82
- rule(:arglist) {
83
- item.as(:item) >> (comma >> item.as(:item)).repeat
84
- }
85
-
86
- rule(:create_table_statement) {
87
- str('create table').as(:operation) >> space? >> (identifier).as(:table_name)
88
- }
89
- rule(:alter_table_statement) {
90
- str('alter table').as(:operation) >> space? >> (identifier).as(:table_name)
91
- }
92
- rule(:create_index_statement) {
93
- str('create').as(:operation) >> (space? >> str('unique').as(:object_property)).maybe >> space? >> str('index').as(:object_type) >> space? >>
94
- (identifier).as(:index_name) >> space? >> str('on') >> space? >> (identifier).as(:table_name)
95
- }
96
- rule(:create_table) {
97
- spaces.maybe >> create_table_statement >> spaces >> element_list >> spaces.maybe >> (item >> spaces.maybe).repeat
98
- }
99
- rule(:alter_table) {
100
- spaces.maybe >> alter_table_statement >> spaces >> (alter_table_element.repeat).as(:elements)
101
- }
102
- rule(:create_index) {
103
- spaces.maybe >> create_index_statement >> spaces >> lparen >> element_list_index >> spaces.maybe >> rparen
104
- }
105
-
106
- rule(:expression) { create_table | alter_table | create_index}
107
- root :expression
108
- end
109
- end
110
- end
111
- end
112
-
1
+ module DDLParser
2
+ module DDL
3
+ module DB2
4
+ class Parser < Parslet::Parser
5
+
6
+ include DDLParser::SharedRules::Constants
7
+ include DDLParser::SharedRules::LogicalOperators
8
+ include DDLParser::SharedRules::DataTypes
9
+
10
+ # column options
11
+ rule(:option_not_null) { str('not null') }
12
+ rule(:column_option) { (option_not_null).as(:column_option) }
13
+ #rule(:lob_options)
14
+ rule(:primary_key) { (str('primary key') >> spaces >> references).as(:primary_key) }
15
+ rule(:constraint) { (str('constraint') >> spaces >> identifier.as(:column_name) >> spaces >> (str('unique') | str('foreign key')).as(:constraint_type) >>
16
+ spaces >> references.as(:constraint_arglist) >> spaces >> reference_clause.maybe).as(:constraint)}
17
+ #rule(:unique)
18
+ rule(:references) { lparen >> space? >> arglist >> space? >> rparen }
19
+ rule(:reference_clause) { str('references') >> spaces >> identifier >> spaces >> references.as(:reference_arglist) >> (identifier >> spaces).repeat }
20
+ #rule(:check)
21
+ #rule(:check_condition)
22
+ #rule(:constraint_attr)
23
+ rule(:gen_col_def) { str('generated always') | str('generated by default') }
24
+ rule(:default_value) { const | current_timestamp | function }
25
+ rule(:default_values) { (default_value >> space?).repeat }
26
+ rule(:default_clause) { ((str('with') >> space?).maybe >> str('default') >> space? >> default_values).as(:default_clause) }
27
+ rule(:identity_options) { (str('as identity') >> space? >> lparen >> str('start with') >> spaces >>
28
+ integer.as(:start_value) >> (comma|space) >> spaces.maybe >>str('increment by') >> spaces >> integer.as(:increment_value)>> ((comma|space) >> spaces.maybe >> str('cache')>>spaces>>integer.as(:cache_value)).maybe >> spaces.maybe >>rparen).as(:identity) }
29
+
30
+ rule(:column_options) { ((gen_col_def | column_option | default_clause | identity_options) >> spaces).repeat }
31
+
32
+ rule(:column_name) { identifier }
33
+ rule(:constraint_name) { identifier }
34
+ rule(:column_sort) { str('ascending') | str('descending')}
35
+
36
+ rule(:column_definition) { (column_name.as(:field) >> space.repeat >> data_type >> space.repeat >> (column_options.maybe).as(:options)).as(:column)}
37
+
38
+ rule(:index_column_definition) { column_name.as(:field) >> space.repeat >> (column_sort.as(:sort_id) >> space.repeat).maybe }
39
+
40
+ rule(:element_list) { (lparen >> space? >> (column_definition | constraint | primary_key) >> space? >>
41
+ (comma >> space? >> (column_definition | constraint | primary_key) >> space?).repeat >> rparen).as(:elements)
42
+ }
43
+
44
+ rule(:element_list_index) { space? >> index_column_definition >>
45
+ (comma >> space? >> index_column_definition).repeat
46
+ }
47
+
48
+ rule(:add_constraint_clause) { (str('add constraint') >> space? >>
49
+ constraint_name.as(:constraint_name) >> space? >>
50
+ foreign_key_clause.as(:foreign_key_clause)).as(:add_constraint)
51
+ }
52
+ rule(:foreign_key_clause) {str('foreign key') >> space? >> lparen >>
53
+ element_list_index.as(:member_fields) >> space? >> rparen >> space? >>
54
+ reference_clause.as(:reference_clause) >> space? >>
55
+ (on_delete_clause.as(:on_delete_clause) >> space?).maybe >>
56
+ (on_update_clause >> space?).maybe
57
+ }
58
+ rule(:on_delete_clause) {str('on delete') >> space? >>
59
+ (str('no action')|str('restrict')|str('cascade')|str('set null')).as(:on_delete_option) >> space?
60
+ }
61
+ rule(:on_update_clause) {str('on update') >> space? >>
62
+ (str('no action')|str('restrict')).as(:on_update_option) >> space?
63
+ }
64
+
65
+ rule(:alter_table_add_column) do
66
+ (str('add') >> space? >> (str('column') >> space? >> column_definition) | primary_key).as(:add)
67
+ end
68
+
69
+ rule(:alter_table_element) { (alter_table_add_column | add_constraint_clause) >> spaces.maybe }
70
+
71
+ #rule(:alter_table_alter) { }
72
+ #rule(:alter_table_drop) { }
73
+
74
+ rule(:term) { const | item }
75
+
76
+ rule(:function) {
77
+ (identifier.as(:name) >> space? >>
78
+ lparen >> arglist.as(:arguments) >> rparen).as(:function)
79
+ }
80
+
81
+ rule(:item) { function | identifier | string }
82
+ rule(:arglist) {
83
+ item.as(:item) >> (comma >> item.as(:item)).repeat
84
+ }
85
+
86
+ rule(:create_table_statement) {
87
+ str('create table').as(:operation) >> space? >> (identifier).as(:table_name)
88
+ }
89
+ rule(:alter_table_statement) {
90
+ str('alter table').as(:operation) >> space? >> (identifier).as(:table_name)
91
+ }
92
+ rule(:create_index_statement) {
93
+ str('create').as(:operation) >> (space? >> str('unique').as(:object_property)).maybe >> space? >> str('index').as(:object_type) >> space? >>
94
+ (identifier).as(:index_name) >> space? >> str('on') >> space? >> (identifier).as(:table_name)
95
+ }
96
+ rule(:create_table) {
97
+ spaces.maybe >> create_table_statement >> spaces >> element_list >> spaces.maybe >> (item >> spaces.maybe).repeat
98
+ }
99
+ rule(:alter_table) {
100
+ spaces.maybe >> alter_table_statement >> spaces >> (alter_table_element.repeat).as(:elements)
101
+ }
102
+ rule(:create_index) {
103
+ spaces.maybe >> create_index_statement >> spaces >> lparen >> element_list_index >> spaces.maybe >> rparen
104
+ }
105
+
106
+ rule(:expression) { create_table | alter_table | create_index}
107
+ root :expression
108
+ end
109
+ end
110
+ end
111
+ end
112
+
@@ -1,99 +1,132 @@
1
- class DDLParser::Translator::Column
2
-
3
- def initialize(column_hash)
4
- @column_hash = column_hash.is_a?(Hash) ? column_hash : {}
5
- end
6
-
7
- def to_hash
8
- @column_hash
9
- end
10
-
11
- def name
12
- @column_hash[:field]
13
- end
14
-
15
- def data_type
16
- raise "DataType not specified #{@column_hash.inspect}" if @column_hash.nil? || @column_hash[:data_type].nil?
17
- if @column_hash[:data_type].is_a?(Hash)
18
- @column_hash[:data_type].keys.first
19
- else
20
- @column_hash[:data_type].to_sym
21
- end
22
-
23
- end
24
-
25
- def length
26
- case data_type
27
- when :decimal
28
- "#{precision}.#{scale}".to_f
29
- when :char
30
- begin
31
- @column_hash[:data_type][:char][:length][:integer].to_i
32
- rescue
33
- raise "DataType CHAR length wrong format #{@column_hash[:data_type].inspect}"
34
- end
35
- else
36
- nil
37
- end
38
- end
39
-
40
- def precision
41
- case data_type
42
- when :decimal
43
- begin
44
- @column_hash[:data_type][:decimal][:precision][:total][:integer].to_i
45
- rescue
46
- 5 # decimal default if no precision present
47
- end
48
- else
49
- nil
50
- end
51
- end
52
-
53
- def scale
54
- case data_type
55
- when :decimal
56
- begin
57
- @column_hash[:data_type][:decimal][:precision][:scale][:integer].to_i
58
- rescue
59
- 0 # decimal default if no scale present
60
- end
61
- else
62
- nil
63
- end
64
- end
65
-
66
- def options
67
- @column_hash[:options] if @column_hash[:options].length > 0
68
- end
69
-
70
- def not_null
71
- if options.nil?
72
- false
73
- else
74
- options.select{|h|h.has_key?(:column_option) && h.has_value?('not null')}.length > 0
75
- end
76
- end
77
-
78
- def default_clause
79
- unless options.nil?
80
- default_value = options.select{|h|h.has_key?(:default_clause)}.first
81
- if default_value
82
- if default_value[:default_clause].is_a?(Array)
83
- default_value[:default_clause].each do |c|
84
- # TODO must handle other then integer
85
- case c.keys.first
86
- when :integer
87
- return c[:integer].to_i
88
- else
89
- return c[c.keys.first].to_s
90
- end
91
- end
92
- else
93
- raise "Unknown default_clause #{default_value.inspect}"
94
- end
95
- end
96
- end
97
- end
98
-
99
- end
1
+ class DDLParser::Translator::Column
2
+
3
+ def initialize(column_hash)
4
+ @column_hash = column_hash.is_a?(Hash) ? column_hash : {}
5
+ end
6
+
7
+ def to_hash
8
+ @column_hash
9
+ end
10
+
11
+ def name
12
+ @column_hash[:field]
13
+ end
14
+
15
+ def data_type
16
+ raise "DataType not specified #{@column_hash.inspect}" if @column_hash.nil? || @column_hash[:data_type].nil?
17
+ if @column_hash[:data_type].is_a?(Hash)
18
+ @column_hash[:data_type].keys.first
19
+ else
20
+ @column_hash[:data_type].to_sym
21
+ end
22
+
23
+ end
24
+
25
+ def length
26
+ case data_type
27
+ when :decimal
28
+ "#{precision}.#{scale}".to_f
29
+ when :char
30
+ begin
31
+ @column_hash[:data_type][:char][:length][:integer].to_i
32
+ rescue
33
+ raise "DataType CHAR length wrong format #{@column_hash[:data_type].inspect}"
34
+ end
35
+ else
36
+ nil
37
+ end
38
+ end
39
+
40
+ def precision
41
+ case data_type
42
+ when :decimal
43
+ begin
44
+ @column_hash[:data_type][:decimal][:precision][:total][:integer].to_i
45
+ rescue
46
+ 5 # decimal default if no precision present
47
+ end
48
+ else
49
+ nil
50
+ end
51
+ end
52
+
53
+ def scale
54
+ case data_type
55
+ when :decimal
56
+ begin
57
+ @column_hash[:data_type][:decimal][:precision][:scale][:integer].to_i
58
+ rescue
59
+ 0 # decimal default if no scale present
60
+ end
61
+ else
62
+ nil
63
+ end
64
+ end
65
+
66
+ def options
67
+ @column_hash[:options] if @column_hash[:options].length > 0
68
+ end
69
+
70
+ def option(key)
71
+ # return the right option
72
+ options.select{|o| o.is_a?(Hash) || o.has_key?(key)}.first
73
+ end
74
+
75
+ def not_null
76
+ if options.nil?
77
+ false
78
+ else
79
+ options.select{|h|h.has_key?(:column_option) && h.has_value?('not null')}.length > 0
80
+ end
81
+ end
82
+
83
+ def default_clause
84
+ unless options.nil?
85
+ default_value = options.select{|h|h.has_key?(:default_clause)}.first
86
+ if default_value
87
+ if default_value[:default_clause].is_a?(Array)
88
+ default_value[:default_clause].each do |c|
89
+ # TODO must handle other then integer
90
+ case c.keys.first
91
+ when :integer
92
+ return c[:integer].to_i
93
+ else
94
+ return c[c.keys.first].to_s
95
+ end
96
+ end
97
+ else
98
+ raise "Unknown default_clause #{default_value.inspect}"
99
+ end
100
+ end
101
+ end
102
+ end
103
+
104
+ def identity?
105
+ if options.nil?
106
+ false
107
+ else
108
+ options.select{|h|h.has_key?(:column_option) && h.has_value?('identity')}.length > 0
109
+ end
110
+ end
111
+
112
+ def start_value?
113
+ unless option(:identity).nil?
114
+ option(:identity)[:start_value][:integer].to_i
115
+ end
116
+ end
117
+
118
+ def increment_value
119
+ if options.nil?
120
+ false
121
+ else
122
+ options.select{|h|h.has_key?(:column_option) && h.has_value?('identity')}.length > 0
123
+ end
124
+ end
125
+ def cache_value
126
+ if options.nil?
127
+ false
128
+ else
129
+ options.select{|h|h.has_key?(:column_option) && h.has_value?('identity')}.length > 0
130
+ end
131
+ end
132
+ end
@@ -1,3 +1,3 @@
1
1
  module DDLParser
2
- VERSION = '0.0.9'
2
+ VERSION = '0.0.10'
3
3
  end