class Sequel::DB2::Database

Constants

DatasetClass
ERROR_MAP
NullHandle
TEMPORARY

Attributes

conversion_procs[R]

Hash of connection procs for converting

Public Class Methods

new(opts={}) click to toggle source
Calls superclass method Sequel::Database.new
# File lib/sequel/adapters/db2.rb, line 47
def initialize(opts={})
  super
  @conversion_procs = DB2_TYPES.dup
  @conversion_procs[DB2CLI::SQL_TYPE_TIMESTAMP] = method(:to_application_timestamp_db2)
end

Public Instance Methods

check_error(rc, msg) click to toggle source
# File lib/sequel/adapters/db2.rb, line 92
def check_error(rc, msg)
  case rc
  when DB2CLI::SQL_SUCCESS, DB2CLI::SQL_SUCCESS_WITH_INFO, DB2CLI::SQL_NO_DATA_FOUND
    nil
  when DB2CLI::SQL_INVALID_HANDLE, DB2CLI::SQL_STILL_EXECUTING
    e = DB2Error.new("#{ERROR_MAP[rc]}: #{msg}")
    e.set_backtrace(caller)
    raise_error(e, :disconnect=>true)
  else
    e = DB2Error.new("#{ERROR_MAP[rc] || "Error code #{rc}"}: #{msg}")
    e.set_backtrace(caller)
    raise_error(e, :disconnect=>true)
  end
end
checked_error(msg) { || ... } click to toggle source
# File lib/sequel/adapters/db2.rb, line 107
def checked_error(msg)
  rc, *ary= yield
  check_error(rc, msg)
  ary.length <= 1 ? ary.first : ary
end
connect(server) click to toggle source
# File lib/sequel/adapters/db2.rb, line 53
def connect(server)
  opts = server_opts(server)
  dbc = checked_error("Could not allocate database connection"){DB2CLI.SQLAllocHandle(DB2CLI::SQL_HANDLE_DBC, NullHandle)}
  checked_error("Could not connect to database"){DB2CLI.SQLConnect(dbc, opts[:database], opts[:user], opts[:password])}
  dbc
end
disconnect_connection(conn) click to toggle source
# File lib/sequel/adapters/db2.rb, line 60
def disconnect_connection(conn)
  DB2CLI.SQLDisconnect(conn)
  DB2CLI.SQLFreeHandle(DB2CLI::SQL_HANDLE_DBC, conn)
end
do(sql, opts={}, &block)
Alias for: execute
execute(sql, opts={}, &block) click to toggle source
# File lib/sequel/adapters/db2.rb, line 65
def execute(sql, opts={}, &block)
  synchronize(opts[:server]){|conn| log_connection_execute(conn, sql, &block)}
end
Also aliased as: do
execute_insert(sql, opts={}) click to toggle source
# File lib/sequel/adapters/db2.rb, line 70
def execute_insert(sql, opts={})
  synchronize(opts[:server]) do |conn|
    log_connection_execute(conn, sql)
    sql = "SELECT IDENTITY_VAL_LOCAL() FROM SYSIBM.SYSDUMMY1"
    log_connection_execute(conn, sql) do |sth|
      name, buflen, datatype, size, digits, nullable = checked_error("Could not describe column"){DB2CLI.SQLDescribeCol(sth, 1, 256)}
      if DB2CLI.SQLFetch(sth) != DB2CLI::SQL_NO_DATA_FOUND
        v, _ = checked_error("Could not get data"){DB2CLI.SQLGetData(sth, 1, datatype, size)}
        if v.is_a?(String) 
          return v.to_i
        else
          return nil
        end
      end
    end
  end
end
to_application_timestamp_db2(v) click to toggle source
# File lib/sequel/adapters/db2.rb, line 113
def to_application_timestamp_db2(v)
  to_application_timestamp(v.to_s)
end

Private Instance Methods

begin_transaction(conn, opts={}) click to toggle source
# File lib/sequel/adapters/db2.rb, line 123
def begin_transaction(conn, opts={})
  log_yield(TRANSACTION_BEGIN){DB2CLI.SQLSetConnectAttr(conn, DB2CLI::SQL_ATTR_AUTOCOMMIT, DB2CLI::SQL_AUTOCOMMIT_OFF)}
  set_transaction_isolation(conn, opts)
end
commit_transaction(conn, opts={}) click to toggle source
# File lib/sequel/adapters/db2.rb, line 138
def commit_transaction(conn, opts={})
  log_yield(TRANSACTION_COMMIT){DB2CLI.SQLEndTran(DB2CLI::SQL_HANDLE_DBC, conn, DB2CLI::SQL_COMMIT)}
end
database_error_classes() click to toggle source
# File lib/sequel/adapters/db2.rb, line 119
def database_error_classes
  [DB2Error]
end
log_connection_execute(conn, sql) { |sth| ... } click to toggle source
# File lib/sequel/adapters/db2.rb, line 142
def log_connection_execute(conn, sql)
  sth = checked_error("Could not allocate statement"){DB2CLI.SQLAllocHandle(DB2CLI::SQL_HANDLE_STMT, conn)}

  begin
    checked_error("Could not execute statement: #{sql}"){log_yield(sql){DB2CLI.SQLExecDirect(sth, sql)}}
    
    if block_given?
      yield(sth)
    else
      checked_error("Could not get RPC"){DB2CLI.SQLRowCount(sth)}
    end
  ensure
    checked_error("Could not free statement"){DB2CLI.SQLFreeHandle(DB2CLI::SQL_HANDLE_STMT, sth)}
  end
end
remove_transaction(conn, committed) click to toggle source
Calls superclass method Sequel::Database#remove_transaction
# File lib/sequel/adapters/db2.rb, line 128
def remove_transaction(conn, committed)
  DB2CLI.SQLSetConnectAttr(conn, DB2CLI::SQL_ATTR_AUTOCOMMIT, DB2CLI::SQL_AUTOCOMMIT_ON)
ensure
  super
end
rollback_transaction(conn, opts={}) click to toggle source
# File lib/sequel/adapters/db2.rb, line 134
def rollback_transaction(conn, opts={})
  log_yield(TRANSACTION_ROLLBACK){DB2CLI.SQLEndTran(DB2CLI::SQL_HANDLE_DBC, conn, DB2CLI::SQL_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/db2.rb, line 159
def schema_column_type(db_type)
  if DB2.convert_smallint_to_bool && db_type =~ /smallint/ 
    :boolean
  else
    super
  end
end