class DBI::DBD::OCI8::Database

def [](attr)

def [](attr)
  case attr
  when 'AutoCommit'
    @handle.autocommit?
  end
end

def []=(attr, value)

def []=(attr, value)
  case attr
  when 'AutoCommit'
    @handle.autocommit = value
  end
end

def columns(table)

SQLs are copied from DBD::Oracle.
def columns(table)
  tab = @handle.describe_table(table)
  cols = tab.columns
  cols.collect! do |col|
    column_metadata_to_column_info(col)
  end
  dbh = DBI::DatabaseHandle.new(self)
  primaries = {}
  dbh.select_all(<<EOS, tab.obj_schema, tab.obj_name) do |row|
lect column_name
from all_cons_columns a, all_constraints b
here a.owner = b.owner
 and a.constraint_name = b.constraint_name
 and a.table_name = b.table_name
 and b.constraint_type = 'P'
 and b.owner = :1
 and b.table_name = :2
S
    primaries[row[0]] = true
  end
  indices = {}
  uniques = {}
  dbh.select_all(<<EOS, tab.obj_schema, tab.obj_name) do |row|
lect a.column_name, a.index_name, b.uniqueness
from all_ind_columns a, all_indexes b
here a.index_name = b.index_name
 and a.index_owner = b.owner
 and a.table_owner = :1
 and a.table_name = :2
S
    col_name, index_name, uniqueness = row
    indices[col_name] = true
    uniques[col_name] = true if uniqueness == 'UNIQUE'
  end
  dbh.select_all(<<EOS, tab.obj_schema, tab.obj_name).collect do |row|
lect column_id, column_name, data_default
from all_tab_columns
here owner = :1
 and table_name = :2
S
    col_id, col_name, default = row
    col = cols[col_id.to_i - 1]
    col_name = col['name']
    if default && default[0] == ?'
      default = default[1..-2].gsub(/''/, "'")
    end
    col['indexed']   = indices[col_name]   || false
    col['primary']   = primaries[col_name] || false
    col['unique']    = uniques[col_name]   || false
    col['default']   = default
    col
  end
rescue OCIException => err
  raise_dbierror(err)
end

def commit

def commit
  @handle.commit()
rescue OCIException => err
  raise_dbierror(err)
end

def disconnect

def disconnect
  @handle.logoff
rescue OCIException => err
  raise_dbierror(err)
end

def ping

def ping
  @handle.exec("BEGIN NULL; END;")
  true
rescue
  false
end

def prepare( statement )

def prepare( statement )
  # convert ?-style parameters to :1, :2 etc.
  prep_statement = DBI::SQL::PreparedStatement.new(DummyQuoter.new, statement)
  if prep_statement.unbound.size > 0
    arr = (1..(prep_statement.unbound.size)).collect{|i| ":#{i}"}
    statement = prep_statement.bind( arr ) 
  end
  cursor = @handle.parse(statement)
  Statement.new(cursor)
rescue OCIException => err
  raise_dbierror(err)
end

def rollback

def rollback
  @handle.rollback()
rescue OCIException => err
  raise_dbierror(err)
end

def tables

def tables
  stmt = execute("SELECT object_name FROM user_objects where object_type in ('TABLE', 'VIEW')")
  rows = stmt.fetch_all || []
  stmt.finish
  rows.collect {|row| row[0]} 
end