class Libis::Services::OracleClient

Attributes

oci[R]
url[R]

Public Class Methods

finalize(oci) click to toggle source
# File lib/libis/services/oracle_client.rb, line 35
def self.finalize(oci)
  if RUBY_PLATFORM == 'java'
    proc { oci.close }
  else
    proc { oci.logoff }
  end
end
new(url) click to toggle source
# File lib/libis/services/oracle_client.rb, line 18
def initialize(url)
  @url = url
  @oci = if RUBY_PLATFORM == 'java'
    raise RuntimeError, 'Malformed database URL' unless url =~ /^(.*)\/(.*)@(.*)$/
    user, pass, db = $1, $2, $3
    uri = "jdbc:oracle:thin:@#{db}"
    ods = OracleDataSource.new
    ods.set_url(uri)
    ods.set_user(user)
    ods.set_password(pass)
    ods.get_connection
  else
    OCI8.new(url)
  end
  ObjectSpace.define_finalizer(self, self.class.finalize(@oci))
end

Public Instance Methods

blocking=(value) click to toggle source

@param [Boolean] value

# File lib/libis/services/oracle_client.rb, line 44
def blocking=(value)
  oci.non_blocking = !value
  blocking?
end
blocking?() click to toggle source
# File lib/libis/services/oracle_client.rb, line 49
def blocking?
  !oci.non_blocking?
end
call(procedure, parameters = []) click to toggle source
# File lib/libis/services/oracle_client.rb, line 53
def call(procedure, parameters = [])
  params = ''
  params = "'" + parameters.map(&:to_s).join("','") + "'" if parameters and parameters.size > 0
  oci.exec("call #{procedure}(#{params})")
end
execute(statement, *bindvars, &block) click to toggle source
# File lib/libis/services/oracle_client.rb, line 59
def execute(statement, *bindvars, &block)
  oci.exec(statement, *bindvars, &block)
end
run(script, parameters = []) click to toggle source
# File lib/libis/services/oracle_client.rb, line 84
def run(script, parameters = [])
  params = ''
  params = "\"" + parameters.join("\" \"") + "\"" if parameters&.size.to_i > 0
  process_result `sqlplus -S #{url} @#{script} #{params}`
end
table(name) click to toggle source
# File lib/libis/services/oracle_client.rb, line 63
def table(name)
  metadata = oci.describe_table(name)
  {
      columns: metadata.columns.map do |column|
        {
            name: column.name,
            type: column.data_type,
            size: case column.data_type
                    when :number
                      column.precision
                    when :varchar2
                      column.char_size
                    else
                      column.data_size
                  end,
            required: !column.nullable?
        }
      end
  }
end

Private Instance Methods

process_result(log) click to toggle source
# File lib/libis/services/oracle_client.rb, line 92
def process_result(log)
  log.gsub!(/\n\n/, "\n")
  rows_created = 0
  log.match(/^(\d+) rows? created.$/) { |m| rows_created += m[1] }
  rows_deleted = 0
  log.match(/^(\d+) rows? deleted.$/) { |m| rows_deleted += m[1] }
  rows_updated = 0
  log.match(/^(\d+) rows? updated.$/) { |m| rows_updated += m[1] }
  errors = Hash.new(0)
  error_count = 0
  log.match(/\nERROR .*\n([^\n]*)\n/) { |m| errors[m[1]] += 1; error_count += 1 }
  {created: rows_created, updated: rows_updated, deleted: rows_deleted, errors: error_count, error_detail: errors}
end