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