module Upsert::Connection::Jdbc

@private

Constants

GETTER

/Users/seamusabshere/.rvm/gems/jruby-head/gems/activerecord-jdbc-adapter-1.2.2.1/src/java/arjdbc/jdbc/RubyJdbcConnection.java

SETTER

Public Instance Methods

binary(v) click to toggle source
# File lib/upsert/connection/jdbc.rb, line 32
def binary(v)
  v.value.to_java_bytes.java_object
end
execute(sql, params = nil) click to toggle source
# File lib/upsert/connection/jdbc.rb, line 36
def execute(sql, params = nil)
  has_result = if params
    Upsert.logger.debug { %{[upsert] #{sql} with #{params.inspect}} }
    setters = self.class.const_get(:SETTER)
    statement = metal.prepareStatement sql
    params.each_with_index do |v, i|
      if v.is_a?(Fixnum) && v > 2_147_483_647
        statement.setLong i+1, v
        next
      end

      case v
      when Upsert::Binary
        statement.setBytes i+1, binary(v)
      when Float, BigDecimal
        statement.setBigDecimal i+1, java.math.BigDecimal.new(v.to_s)
      when NilClass
        # http://stackoverflow.com/questions/4243513/why-does-preparedstatement-setnull-requires-sqltype
        statement.setObject i+1, nil
      when java.time.LocalDateTime, java.time.Instant, java.time.LocalDate
        statement.setObject i+1, v
      else
        setter = setters[v.class.name]
        Upsert.logger.debug { "Setting [#{v.class}, #{v}] via #{setter}" }
        statement.send setter, i+1, v
      end
    end
    statement.execute
  else
    Upsert.logger.debug { %{[upsert] #{sql}} }
    statement = metal.createStatement
    statement.execute sql
  end
  if not has_result
    statement.close
    return
  end
  getters = self.class.const_get(:GETTER)
  raw_result = statement.getResultSet
  meta = raw_result.getMetaData
  count = meta.getColumnCount
  column_name_and_getter = (1..count).inject({}) do |memo, i|
    memo[i] = [ meta.getColumnName(i), getters[meta.getColumnType(i)] ]
    memo
  end
  result = []
  while raw_result.next
    row = {}
    column_name_and_getter.each do |i, cg|
      column_name, getter = cg
      if getter == 'getNull'
        row[column_name] = nil
      elsif getter.respond_to?(:call)
        row[column_name] = getter.call(raw_result, i)
      else
        row[column_name] = raw_result.send(getter, i)
      end
    end
    result << row
  end
  statement.close
  result
end
in_transaction?() click to toggle source
# File lib/upsert/connection/jdbc.rb, line 100
def in_transaction?
  raise "Not implemented"
end