class Sequel::IBMDB::Database
Attributes
Hash of connection procs for converting
Whether to convert smallint values to bool for this Database instance
Public Instance Methods
Create a new connection object for the given server.
# File lib/sequel/adapters/ibmdb.rb, line 188 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
# File lib/sequel/adapters/ibmdb.rb, line 208 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
# File lib/sequel/adapters/ibmdb.rb, line 218 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 232 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 260 def freeze @conversion_procs.freeze super end
Private Instance Methods
Execute the given SQL on the database, yielding the related statement if a block is given or returning the number of affected rows if not, and ensuring the statement is freed.
# File lib/sequel/adapters/ibmdb.rb, line 269 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 315 def _metadata_dataset super.with_convert_smallint_to_bool(false) end
# File lib/sequel/adapters/ibmdb.rb, line 280 def adapter_initialize @convert_smallint_to_bool = typecast_value_boolean(opts.fetch(:convert_smallint_to_bool, true)) @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 288 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 295 def commit_transaction(conn, opts=OPTS) log_connection_yield('Transaction.commit', conn){conn.commit} end
# File lib/sequel/adapters/ibmdb.rb, line 299 def database_error_classes [Connection::Error] end
# File lib/sequel/adapters/ibmdb.rb, line 303 def database_exception_sqlstate(exception, opts) exception.sqlstate end
# File lib/sequel/adapters/ibmdb.rb, line 307 def dataset_class_default Dataset end
Format Numeric, Date, and Time types specially for use as IBM_DB prepared statements argument vlaues.
# File lib/sequel/adapters/ibmdb.rb, line 321 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 333 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 341 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 346 def schema_column_type(db_type) if convert_smallint_to_bool && db_type =~ /smallint/i :boolean else super end end