class Sequel::IBMDB::Database

Constants

DatasetClass

Attributes

conversion_procs[R]

Hash of connection procs for converting

Public Instance Methods

alter_table(name, generator=nil) click to toggle source

REORG the related table whenever it is altered. This is not always required, but it is necessary for compatibilty with other Sequel code in many cases.

Calls superclass method Sequel::Database#alter_table
# File lib/sequel/adapters/ibmdb.rb, line 188
def alter_table(name, generator=nil)
  res = super
  reorg(name)
  res
end
connect(server) click to toggle source

Create a new connection object for the given server.

# File lib/sequel/adapters/ibmdb.rb, line 195
def connect(server)
  opts = server_opts(server)
  
  # use uncataloged connection so that host and port can be supported
  connection_string = (              'Driver={IBM DB2 ODBC DRIVER};'              "Database=#{opts[:database]};"              "Hostname=#{opts[:host]};"              "Port=#{opts[:port] || 50000};"              'Protocol=TCPIP;'              "Uid=#{opts[:user]};"              "Pwd=#{opts[:password]};"          )

  Connection.new(connection_string)
end
execute(sql, opts=OPTS, &block) click to toggle source

Execute the given SQL on the database.

# File lib/sequel/adapters/ibmdb.rb, line 213
def execute(sql, opts=OPTS, &block)
  if sql.is_a?(Symbol)
    execute_prepared_statement(sql, opts, &block)
  else
    synchronize(opts[:server]){|c| _execute(c, sql, opts, &block)}
  end
rescue Connection::Error => e
  raise_error(e)
end
execute_insert(sql, opts=OPTS) click to toggle source

Execute the given SQL on the database, returning the last inserted identity value.

# File lib/sequel/adapters/ibmdb.rb, line 225
def execute_insert(sql, opts=OPTS)
  synchronize(opts[:server]) do |c|
    if sql.is_a?(Symbol)
      execute_prepared_statement(sql, opts)
    else
      _execute(c, sql, opts)
    end
    _execute(c, "SELECT IDENTITY_VAL_LOCAL() FROM SYSIBM.SYSDUMMY1", opts){|stmt| i = stmt.fetch_array.first.to_i; i}
  end
rescue Connection::Error => e
  raise_error(e)
end
execute_prepared_statement(ps_name, opts) { |stmt| ... } click to toggle source

Execute a prepared statement named by name on the database.

# File lib/sequel/adapters/ibmdb.rb, line 239
def execute_prepared_statement(ps_name, opts)
  args = opts[:arguments]
  ps = prepared_statement(ps_name)
  sql = ps.prepared_sql
  synchronize(opts[:server]) do |conn|
    unless conn.prepared_statements.fetch(ps_name, []).first == sql
      log_yield("PREPARE #{ps_name}: #{sql}"){conn.prepare(sql, ps_name)}
    end
    args = args.map{|v| v.nil? ? nil : prepared_statement_arg(v)}
    log_sql = "EXECUTE #{ps_name}"
    if ps.log_sql
      log_sql << " ("
      log_sql << sql
      log_sql << ")"
    end
    begin
      stmt = log_yield(log_sql, args){conn.execute_prepared(ps_name, *args)}
      if block_given?
        yield(stmt)
      else  
        stmt.affected
      end
    ensure
      stmt.free_result if stmt
    end
  end
end
table_exists?(name) click to toggle source

On DB2, a table might need to be REORGed if you are testing existence of it. This REORGs automatically if the database raises a specific error that indicates it should be REORGed.

# File lib/sequel/adapters/ibmdb.rb, line 270
def table_exists?(name)
  v ||= false # only retry once
  sch, table_name = schema_and_table(name)
  name = SQL::QualifiedIdentifier.new(sch, table_name) if sch
  from(name).first
  true
rescue DatabaseError => e
  if e.to_s =~ /Operation not allowed for reason code "7" on table/ && v == false
    # table probably needs reorg
    reorg(name)
    v = true
    retry 
  end
  false
end

Private Instance Methods

_execute(conn, sql, opts) { |stmt| ... } click to toggle source

Execute the given SQL on the database.

# File lib/sequel/adapters/ibmdb.rb, line 289
def _execute(conn, sql, opts)
  stmt = log_yield(sql){conn.execute(sql)}
  if block_given?
    yield(stmt)
  else  
    stmt.affected
  end
ensure
  stmt.free if stmt
end
adapter_initialize() click to toggle source
# File lib/sequel/adapters/ibmdb.rb, line 300
def adapter_initialize
  @conversion_procs = DB2_TYPES.dup
  @conversion_procs[:timestamp] = method(:to_application_timestamp)
end
begin_transaction(conn, opts=OPTS) click to toggle source

IBM_DB uses an autocommit setting instead of sending SQL queries. So starting a transaction just turns autocommit off.

# File lib/sequel/adapters/ibmdb.rb, line 307
def begin_transaction(conn, opts=OPTS)
  log_yield(TRANSACTION_BEGIN){conn.autocommit = false}
  set_transaction_isolation(conn, opts)
end
commit_transaction(conn, opts=OPTS) click to toggle source

This commits transaction in progress on the connection and sets autocommit back on.

# File lib/sequel/adapters/ibmdb.rb, line 314
def commit_transaction(conn, opts=OPTS)
  log_yield(TRANSACTION_COMMIT){conn.commit}
end
database_error_classes() click to toggle source
# File lib/sequel/adapters/ibmdb.rb, line 318
def database_error_classes
  [Connection::Error]
end
database_exception_sqlstate(exception, opts) click to toggle source
# File lib/sequel/adapters/ibmdb.rb, line 322
def database_exception_sqlstate(exception, opts)
  exception.sqlstate
end
metadata_dataset() click to toggle source

Don't convert smallint to boolean for the metadata dataset, since the DB2 metadata does not use boolean columns, and some smallint columns are accidently treated as booleans.

Calls superclass method Sequel::Database#metadata_dataset
# File lib/sequel/adapters/ibmdb.rb, line 330
def metadata_dataset
  ds = super
  ds.convert_smallint_to_bool = false
  ds
end
prepared_statement_arg(v) click to toggle source

Format Numeric, Date, and Time types specially for use as IBM_DB prepared statements argument vlaues.

# File lib/sequel/adapters/ibmdb.rb, line 338
def prepared_statement_arg(v)
  case v
  when Numeric
    v.to_s
  when Date, Time
    literal(v).gsub("'", '')
  else
    v
  end
end
remove_transaction(conn, committed) click to toggle source

Set autocommit back on

Calls superclass method Sequel::Database#remove_transaction
# File lib/sequel/adapters/ibmdb.rb, line 350
def remove_transaction(conn, committed)
  conn.autocommit = true
ensure
  super
end
rollback_transaction(conn, opts=OPTS) click to toggle source

This rolls back the transaction in progress on the connection and sets autocommit back on.

# File lib/sequel/adapters/ibmdb.rb, line 358
def rollback_transaction(conn, opts=OPTS)
  log_yield(TRANSACTION_ROLLBACK){conn.rollback}
end
schema_column_type(db_type) click to toggle source

Convert smallint type to boolean if convert_smallint_to_bool is true

# File lib/sequel/adapters/ibmdb.rb, line 363
def schema_column_type(db_type)
  if Sequel::IBMDB.convert_smallint_to_bool && db_type =~ /smallint/ 
    :boolean
  else
    super
  end
end