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