lib/scheman/parsers/mysql.rb in scheman-0.0.2 vs lib/scheman/parsers/mysql.rb in scheman-0.0.3

- old
+ new

@@ -97,22 +97,45 @@ rule(:spaces?) do spaces.maybe end + rule(:string) do + ( + single_quoted( + ( + (str('\\') >> match('.')) | + str("''") | + match('[^\\\']') + ).repeat + ) | double_quoted( + ( + (str('\\') >> match('.')) | + str('""') | + match('[^\\\"]') + ).repeat + ) + ).as(:string) + end + + rule(:bit) do + ( + str("b") >> ( + single_quoted(match("0|1").repeat(1, 64)) | + double_quoted(match("0|1").repeat(1, 64)) + ) + ).as(:bit) + end + rule(:delimiter) do str(";") end rule(:something) do spaces >> match('[\S]').repeat >> spaces end - rule(:string) do - any.repeat(1) - end - rule(:eol) do delimiter >> spaces? end rule(:comment) do @@ -256,21 +279,40 @@ rule(:field_qualifiers) do (field_qualifier >> (spaces >> field_qualifier).repeat) end - # TODO: default value, on update + # TODO: on update rule(:field_qualifier) do not_null_qualifier | null_qualifier | primary_key_qualifier | auto_increment_qualifier | character_set_qualifier | collate_qualifier | - unique_key_qualifier + unique_key_qualifier | + default_qualifier end + rule(:default_qualifier) do + ( + case_insensitive_str("default") >> spaces >> default_value + ).as(:default_qualifier) + end + + rule(:default_value) do + (current_timestamp | string | bit | unclassified_default_value).as(:default_value) + end + + rule(:unclassified_default_value) do + (match('[\w\d:.-]')).repeat(1).as(:unclassified_default_value) + end + + rule(:current_timestamp) do + (case_insensitive_str("current_timestamp()") | case_insensitive_str("now()")).as(:current_timestamp) + end + rule(:unique_key_qualifier) do (case_insensitive_str("unique ") >> word_index).as(:unique_key_qualifier) end rule(:collate_qualifier) do @@ -439,10 +481,32 @@ # "utf8" rule(identifier: simple(:identifier)) do identifier.to_s end + rule(string: simple(:value)) do + { + type: "string", + value: value.to_s[1..-2], + } + end + + rule(bit: simple(:value)) do + { + type: "bit", + value: value.to_s[2..-2].to_i(2), + } + end + + + rule(unclassified_default_value: simple(:value)) do + { + type: "unclassified", + value: value.to_s, + } + end + rule(field_value: simple(:field_value)) do field_value.to_s end rule( @@ -524,9 +588,24 @@ end rule(key_qualifier: simple(:key_qualifier)) do { type: "key", + } + end + + rule(default_qualifier: subtree(:tree)) do + { + type: "default", + value: tree, + } + end + + # @note We use Symbol to distinguish from string value + rule(current_timestamp: simple(:current_timestamp)) do + { + type: "current_timestamp", + value: nil, } end rule(database_name: simple(:database_name)) do {