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 192
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 199
def connect(server)
  opts = server_opts(server)

  connection_params = if opts[:host].nil? && opts[:port].nil? && opts[:database]
    # use a cataloged connection
    opts.values_at(:database, :user, :password)
  else
    # use uncataloged connection so that host and port can be supported
    'Driver={IBM DB2 ODBC DRIVER};'            "Database=#{opts[:database]};"            "Hostname=#{opts[:host]};"            "Port=#{opts[:port] || 50000};"            'Protocol=TCPIP;'            "Uid=#{opts[:user]};"            "Pwd=#{opts[:password]};"          end 

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

Execute the given SQL on the database.

# File lib/sequel/adapters/ibmdb.rb, line 220
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 232
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 246
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 277
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 296
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 307
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 314
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 321
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 325
def database_error_classes
  [Connection::Error]
end
database_exception_sqlstate(exception, opts) click to toggle source
# File lib/sequel/adapters/ibmdb.rb, line 329
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 337
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 345
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 357
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 365
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 370
def schema_column_type(db_type)
  if Sequel::IBMDB.convert_smallint_to_bool && db_type =~ /smallint/i 
    :boolean
  else
    super
  end
end