class Sequel::IBMDB::Database
Constants
- DatasetClass
Attributes
Hash of connection procs for converting
Public Instance Methods
Create a new connection object for the given server.
# File lib/sequel/adapters/ibmdb.rb, line 192 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 213 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 225 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 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_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
# File lib/sequel/adapters/ibmdb.rb, line 267 def freeze @conversion_procs.freeze super end
Private Instance Methods
Execute the given SQL on the database.
# File lib/sequel/adapters/ibmdb.rb, line 275 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
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 316 def _metadata_dataset super.with_convert_smallint_to_bool(false) end
# File lib/sequel/adapters/ibmdb.rb, line 286 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 293 def begin_transaction(conn, opts=OPTS) log_connection_yield(TRANSACTION_BEGIN, conn){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 300 def commit_transaction(conn, opts=OPTS) log_connection_yield(TRANSACTION_COMMIT, conn){conn.commit} end
# File lib/sequel/adapters/ibmdb.rb, line 304 def database_error_classes [Connection::Error] end
# File lib/sequel/adapters/ibmdb.rb, line 308 def database_exception_sqlstate(exception, opts) exception.sqlstate end
Format Numeric, Date, and Time types specially for use as IBM_DB prepared statements argument vlaues.
# File lib/sequel/adapters/ibmdb.rb, line 322 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 334 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 342 def rollback_transaction(conn, opts=OPTS) log_connection_yield(TRANSACTION_ROLLBACK, conn){conn.rollback} end
Convert smallint type to boolean if convert_smallint_to_bool is true
# File lib/sequel/adapters/ibmdb.rb, line 347 def schema_column_type(db_type) if Sequel::IBMDB.convert_smallint_to_bool && db_type =~ /smallint/i :boolean else super end end