module ActiveQuery::SQLParser

Constants

ALL_COMMENTS
NAME
PARAM
PARAMS
QNAME
Query
SEMICOLON
WHITESPACE

Public Class Methods

parse_query(query) click to toggle source
# File lib/active_query/sql_parser.rb, line 25
def self.parse_query(query)
  @scanner = StringScanner.new(query.strip)
  @line = 0
  @query = Query.new 

  until @scanner.eos?
    @line += 1
    parse_line
  end
  @query.query = make_params(@query.query, @query.params)
  @query
end

Private Class Methods

make_params(query, params) click to toggle source

and this only work for postgres - split transform from struct

# File lib/active_query/sql_parser.rb, line 76
def self.make_params(query, params)
  if params && query
    params.each_with_index do |param, i| 
      pos = "$#{i+1}"
      query.gsub!(param, pos) 
    end
    query.strip if query
  else
    query.strip if query
  end
end
parse_line() click to toggle source
# File lib/active_query/sql_parser.rb, line 39
def self.parse_line
  @query.params = []
  # Query name match: --name:
  header = @scanner.check_until(NAME)
  unless header
     fail SyntaxError.new("'-- name:'", line: @line, pos: @scanner.pos)
  end

  ## ===============================
  # Query name match after: --name:
  # Todo: test missing name
  query_name = @scanner.scan_until(NAME)
  unless query_name 
    fail SyntaxError.new("query name", line: @line, pos: @scanner.pos)        
  end
  @query.name = @scanner.captures&.first.strip

  # SQL expression
  @scanner.skip_until(ALL_COMMENTS)
  @scanner.skip_until(/^\s+/)
  query = @scanner.check_until(SEMICOLON)
  if query && query != ';'
    @query.query = query.strip
  else
     fail SyntaxError.new("SQL expression", line: @line, pos: @scanner.pos)
  end

  # All params
  until @scanner.check_until(PARAM).nil?
    @scanner.scan_until(PARAM)
    @query.params.push @scanner.matched
  end
  # done
  @scanner.scan_until(SEMICOLON) # important! don't touch
end
valid_query?(query) click to toggle source
# File lib/active_query/sql_parser.rb, line 88
def self.valid_query?(query)
  query.name && query.name != "" && 
  query.query && query.query != ""
end