class OCI8AutoBinder::OCI8

OCI8#execを上書きし、OracleSqlParser::Grammar::GrammarParserで構文解析した結果をOCI8#execに渡します。 Pass the result that was parsed by OracleSqlParser::Grammar::GrammarParser to OCI8#exec

Public Instance Methods

exec(sql, *bindvars, &block)
Also aliased as: exec_without_auto_binder
exec_with_auto_binder(sql, *bindvars, &block) click to toggle source

OracleSqlParser::Grammar::GrammarParserで構文解析し、NumberLiteralとTextLiteralをbinding変数としてOCI8#execに渡す

# File lib/oci8-auto-binder/base.rb, line 36
def exec_with_auto_binder(sql, *bindvars, &block)
  if bindvars.length != 0
    logger.info {"FOUND_BINDVARS:#{sql}, #{bindvars.inspect}"} if logger
    return exec_without_auto_binder(sql, *bindvars, &block)
  end
  syntax_tree = parser.parse(sql)
  unless syntax_tree
    logger.error {"PARSE_ERROR:#{sql}, #{bindvars.inspect}"} if logger
    return exec_without_auto_binder(sql, *bindvars, &block)
  end
  p = syntax_tree.ast.to_parameterized
  if p.params.size == 0
    logger.info {"NO_PARAMS:#{sql}, #{bindvars.inspect}"} if logger
    return exec_without_auto_binder(sql, *bindvars, &block)
  end

  values = p.params.values.map do |v|
    case v
    when OracleSqlParser::Ast::NumberLiteral
      v.to_decimal
    when OracleSqlParser::Ast::TextLiteral
      v.to_s
    else
      raise 'unsupported type'
    end
  end

  logger.info {"PARSE_SUCCESS:#{sql}, #{p.to_sql}, #{values.inspect}"} if logger
  return exec_without_auto_binder(p.to_sql, *values, &block)
end
Also aliased as: exec
exec_without_auto_binder(sql, *bindvars, &block)
Alias for: exec
logger() click to toggle source
# File lib/oci8-auto-binder/base.rb, line 70
def logger
  OCI8AutoBinder.logger
end

Private Instance Methods

parser() click to toggle source

GrammerParserを取得する get GrammerParser

# File lib/oci8-auto-binder/base.rb, line 77
def parser
  @parser ||= OracleSqlParser::Grammar::GrammarParser.new
end