Module: EachSQL::Parser

Defined in:
lib/each_sql/parser.rb

Constant Summary collapse

@@parser =
{}

Class Method Summary collapse

Class Method Details

.parser_for(type, delimiter = ';') ⇒ Object

@param type RDBMS type: :default|:mysql|:oracle|:postgres @param delimiter SQL delimiter @return Citrus parser



11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# File 'lib/each_sql/parser.rb', line 11

def self.parser_for type, delimiter = ';'
  # Is there any better way of handling dynamic changes?

  return @@parser[[type, delimiter]] if @@parser[[type, delimiter]]

  path   = File.join( File.dirname(__FILE__), 'parser/sql.citrus.erb' )
  erb    = Erubis::Eruby.new( File.read path )
  suffix = @@parser.length.to_s

  Citrus.eval erb.result(binding)

  @@parser[[type, delimiter]] =
    case type
    when :default
      eval "EachSQL::Parser::Default#{suffix}"
    when :mysql
      eval "EachSQL::Parser::MySQL#{suffix}"
    when :oracle
      eval "EachSQL::Parser::Oracle#{suffix}"
    when :postgres, :postgresql
      eval "EachSQL::Parser::PostgreSQL#{suffix}"
    else
      raise NotImplementedError.new(
        "Parser not implemented for #{type}. Try use :default instead.")
    end
end