class Sequel::IBMDB::Database

Attributes

conversion_procs[R]

Hash of connection procs for converting

convert_smallint_to_bool[RW]

Whether to convert smallint values to bool for this Database instance

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 188
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
# File lib/sequel/adapters/ibmdb.rb, line 208
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
# File lib/sequel/adapters/ibmdb.rb, line 218
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 232
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 260
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, yielding the related statement if a block is given or returning the number of affected rows if not, and ensuring the statement is freed.

# File lib/sequel/adapters/ibmdb.rb, line 269
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 315
def _metadata_dataset
  super.with_convert_smallint_to_bool(false)
end
adapter_initialize() click to toggle source
# File lib/sequel/adapters/ibmdb.rb, line 280
def adapter_initialize
  @convert_smallint_to_bool = typecast_value_boolean(opts.fetch(:convert_smallint_to_bool, true))
  @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 288
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 295
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 299
def database_error_classes
  [Connection::Error]
end
database_exception_sqlstate(exception, opts) click to toggle source
# File lib/sequel/adapters/ibmdb.rb, line 303
def database_exception_sqlstate(exception, opts)
  exception.sqlstate
end
dataset_class_default() click to toggle source
# File lib/sequel/adapters/ibmdb.rb, line 307
def dataset_class_default
  Dataset
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 321
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 333
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 341
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 346
def schema_column_type(db_type)
  if convert_smallint_to_bool && db_type =~ /smallint/i 
    :boolean
  else
    super
  end
end