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 192 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 199 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 the given SQL on the database.
# File lib/sequel/adapters/ibmdb.rb, line 220 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 the given SQL on the database, returning the last inserted identity value.
# File lib/sequel/adapters/ibmdb.rb, line 232 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 a prepared statement named by name on the database.
# File lib/sequel/adapters/ibmdb.rb, line 246 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 277 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 296 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 307 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 314 def begin_transaction(conn, opts=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 321 def commit_transaction(conn, opts=OPTS) log_yield(TRANSACTION_COMMIT){conn.commit} end
# File lib/sequel/adapters/ibmdb.rb, line 325 def database_error_classes [Connection::Error] end
# File lib/sequel/adapters/ibmdb.rb, line 329 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 337 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 345 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 357 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 365 def rollback_transaction(conn, opts=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 370 def schema_column_type(db_type) if Sequel::IBMDB.convert_smallint_to_bool && db_type =~ /smallint/i :boolean else super end end