class Sequel::IBMDB::Database
Constants
- DatasetClass
Attributes
Hash of connection procs for converting
Public Instance Methods
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; 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 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
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
Private Instance Methods
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? yield(stmt) else stmt.affected end ensure stmt.free if stmt end
# File lib/sequel/adapters/ibmdb.rb, line 300 def adapter_initialize @conversion_procs = DB2_TYPES.dup @conversion_procs[:timestamp] = method(:to_application_timestamp) 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 307 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 314 def commit_transaction(conn, opts={}) log_yield(TRANSACTION_COMMIT){conn.commit} end
# File lib/sequel/adapters/ibmdb.rb, line 318 def database_error_classes [Connection::Error] end
# File lib/sequel/adapters/ibmdb.rb, line 322 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 330 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 338 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 350 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 358 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 363 def schema_column_type(db_type) if Sequel::IBMDB.convert_smallint_to_bool && db_type =~ /smallint/i :boolean else super end end