Hash of connection procs for converting
# File lib/sequel/adapters/ibmdb.rb, line 179 def initialize(opts={}) super @conversion_procs = DB2_TYPES.dup @conversion_procs[:timestamp] = method(:to_application_timestamp) end
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.
# File lib/sequel/adapters/ibmdb.rb, line 188 def alter_table(name, generator=nil) res = super reorg(name) res end
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 the given SQL on the database.
# File lib/sequel/adapters/ibmdb.rb, line 213 def execute(sql, 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 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={}) 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; stmt.free; i} end rescue Connection::Error => e raise_error(e) end
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 stmt = log_yield(log_sql, args){conn.execute_prepared(ps_name, *args)} if block_given? begin yield(stmt) ensure stmt.free end else stmt.affected end end end
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
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? begin yield(stmt) ensure stmt.free end else stmt.affected end end
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 304 def begin_transaction(conn, opts={}) log_yield(TRANSACTION_BEGIN){conn.autocommit = false} set_transaction_isolation(conn, opts) end
This commits transaction in progress on the connection and sets autocommit back on.
# File lib/sequel/adapters/ibmdb.rb, line 311 def commit_transaction(conn, opts={}) log_yield(TRANSACTION_COMMIT){conn.commit} end
# File lib/sequel/adapters/ibmdb.rb, line 315 def database_error_classes [Connection::Error] end
# File lib/sequel/adapters/ibmdb.rb, line 319 def database_exception_sqlstate(exception, opts) exception.sqlstate end
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.
# File lib/sequel/adapters/ibmdb.rb, line 327 def metadata_dataset ds = super ds.convert_smallint_to_bool = false ds end
Format Numeric, Date, and Time types specially for use as IBM_DB prepared statements argument vlaues.
# File lib/sequel/adapters/ibmdb.rb, line 335 def prepared_statement_arg(v) case v when Numeric v.to_s when Date, Time literal(v).gsub("'", '') else v end end
Set autocommit back on
# File lib/sequel/adapters/ibmdb.rb, line 347 def remove_transaction(conn, committed) conn.autocommit = true ensure super end
This rolls back the transaction in progress on the connection and sets autocommit back on.
# File lib/sequel/adapters/ibmdb.rb, line 355 def rollback_transaction(conn, opts={}) log_yield(TRANSACTION_ROLLBACK){conn.rollback} end
Convert smallint type to boolean if convert_smallint_to_bool is true
# File lib/sequel/adapters/ibmdb.rb, line 360 def schema_column_type(db_type) if Sequel::IBMDB.convert_smallint_to_bool && db_type =~ /smallint/ :boolean else super end end