Class: OCI8AutoBinder::OCI8

Inherits:
OCI8
  • Object
show all
Defined in:
lib/oci8-auto-binder/base.rb

Overview

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

Instance Method Summary collapse

Instance Method Details

#exec_with_auto_binder(sql, *bindvars, &block) ⇒ Object Also known as: exec

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



36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
# 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

#loggerObject



70
71
72
# File 'lib/oci8-auto-binder/base.rb', line 70

def logger
  OCI8AutoBinder.logger
end