class MysqlParser::ValueParser
Constants
- Node
Public Class Methods
parse(input)
click to toggle source
# File lib/mysql_parser/value_parser.rb, line 35 def self.parse(input) new.parse(input) end
Public Instance Methods
error(message)
click to toggle source
# File lib/mysql_parser/value_parser.rb, line 118 def error(message) raise @input.eos? ? "Unexpected end of input (#{message})." : "#{message} at #{$.}:#{@input.pos}: #{@input.peek(16).inspect}" end
parse(input) { |row| ... }
click to toggle source
# File lib/mysql_parser/value_parser.rb, line 39 def parse(input) @input = StringScanner.new(input) rows, block_given = [], block_given? while result = parse_row row = result.value block_given ? yield(row) : rows << row break unless @input.scan(/,\s*/) end @input.skip(/;/) error('Unexpected data') unless @input.eos? rows unless block_given end
parse_keyword()
click to toggle source
# File lib/mysql_parser/value_parser.rb, line 112 def parse_keyword if @input.scan(/null/i) Node.new(nil) end end
parse_number()
click to toggle source
# File lib/mysql_parser/value_parser.rb, line 106 def parse_number if @input.scan(/-?(?:0|[1-9]\d*)(?:\.\d+)?(?:[eE][+-]?\d+)?/) Node.new(eval(@input.matched)) end end
parse_row()
click to toggle source
# File lib/mysql_parser/value_parser.rb, line 57 def parse_row return unless @input.scan(/\(/) row = [] while result = parse_value row << result.value break unless @input.scan(/,\s*/) end error('Unclosed row') unless @input.scan(/\)/) Node.new(row) end
parse_string()
click to toggle source
# File lib/mysql_parser/value_parser.rb, line 78 def parse_string return unless @input.scan(/'/) string = '' while contents = parse_string_content || parse_string_escape string << contents.value end error('Unclosed string') unless @input.scan(/'/) Node.new(string) end
parse_string_content()
click to toggle source
# File lib/mysql_parser/value_parser.rb, line 92 def parse_string_content if @input.scan(/[^\']+/) Node.new(@input.matched) end end
parse_string_escape()
click to toggle source
# File lib/mysql_parser/value_parser.rb, line 98 def parse_string_escape if @input.scan(/\[abtnvfr]/) Node.new(eval(%Q{"#{@input.matched}"})) elsif @input.scan(/\.|''/) Node.new(@input.matched[-1, 1]) end end
parse_value()
click to toggle source
# File lib/mysql_parser/value_parser.rb, line 72 def parse_value parse_string || parse_number || parse_keyword end