class Sequel::IBMDB::Database

Constants

DatasetClass

Attributes

conversion_procs[R]

Hash of connection procs for converting

Public Instance Methods

connect(server) click to toggle source

Create a new connection object for the given server.

# File lib/sequel/adapters/ibmdb.rb, line 192
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 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_connection_yield("PREPARE #{ps_name}: #{sql}", conn){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_connection_yield(log_sql, conn, 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
freeze() click to toggle source
Calls superclass method Sequel::DB2::DatabaseMethods#freeze
# File lib/sequel/adapters/ibmdb.rb, line 267
def freeze
  @conversion_procs.freeze
  super
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 275
def _execute(conn, sql, opts)
  stmt = log_connection_yield(sql, conn){conn.execute(sql)}
  if block_given?
    yield(stmt)
  else  
    stmt.affected
  end
ensure
  stmt.free if stmt
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 316
def _metadata_dataset
  super.with_convert_smallint_to_bool(false)
end
adapter_initialize() click to toggle source
# File lib/sequel/adapters/ibmdb.rb, line 286
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 293
def begin_transaction(conn, opts=OPTS)
  log_connection_yield(TRANSACTION_BEGIN, conn){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 300
def commit_transaction(conn, opts=OPTS)
  log_connection_yield(TRANSACTION_COMMIT, conn){conn.commit}
end
database_error_classes() click to toggle source
# File lib/sequel/adapters/ibmdb.rb, line 304
def database_error_classes
  [Connection::Error]
end
database_exception_sqlstate(exception, opts) click to toggle source
# File lib/sequel/adapters/ibmdb.rb, line 308
def database_exception_sqlstate(exception, opts)
  exception.sqlstate
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 322
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 334
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 342
def rollback_transaction(conn, opts=OPTS)
  log_connection_yield(TRANSACTION_ROLLBACK, conn){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 347
def schema_column_type(db_type)
  if Sequel::IBMDB.convert_smallint_to_bool && db_type =~ /smallint/i 
    :boolean
  else
    super
  end
end