Sha256: d45bc2533497561c9a07d085195cfc7f5943bb65917d6bc85435c7fd334fad73

Contents?: true

Size: 1.1 KB

Versions: 2

Compression:

Stored size: 1.1 KB

Contents

require 'citrus'
require 'erubis'
require 'quote_unquote'

class EachSQL
module Parser
  @@parser = {}
  # @param[Symbol] type RDBMS type: :default|:mysql|:oracle|:postgres
  # @param[String] delimiter SQL delimiter
  # @return[Module] Citrus parser
  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
end#Parser
end#EachSQL

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
each_sql-0.4.1 lib/each_sql/parser.rb
each_sql-0.4.0 lib/each_sql/parser.rb