class Sequel::IBMDB::Database

Attributes

conversion_procs[R]

Hash of connection procs for converting

convert_smallint_to_bool[RW]

Whether to convert smallint values to bool for this Database instance

Public Instance Methods

connect(server) click to toggle source

Create a new connection object for the given server.

    # File lib/sequel/adapters/ibmdb.rb
188 def connect(server)
189   opts = server_opts(server)
190 
191   connection_params = if opts[:host].nil? && opts[:port].nil? && opts[:database]
192     # use a cataloged connection
193     opts.values_at(:database, :user, :password)
194   else
195     # use uncataloged connection so that host and port can be supported
196     'Driver={IBM DB2 ODBC DRIVER};' \
197     "Database=#{opts[:database]};" \
198     "Hostname=#{opts[:host]};" \
199     "Port=#{opts[:port] || 50000};" \
200     'Protocol=TCPIP;' \
201     "Uid=#{opts[:user]};" \
202     "Pwd=#{opts[:password]};" \
203   end 
204 
205   Connection.new(connection_params)
206 end
execute(sql, opts=OPTS, &block) click to toggle source
    # File lib/sequel/adapters/ibmdb.rb
208 def execute(sql, opts=OPTS, &block)
209   if sql.is_a?(Symbol)
210     execute_prepared_statement(sql, opts, &block)
211   else
212     synchronize(opts[:server]){|c| _execute(c, sql, opts, &block)}
213   end
214 rescue Connection::Error => e
215   raise_error(e)
216 end
execute_insert(sql, opts=OPTS) click to toggle source
    # File lib/sequel/adapters/ibmdb.rb
218 def execute_insert(sql, opts=OPTS)
219   synchronize(opts[:server]) do |c|
220     if sql.is_a?(Symbol)
221       execute_prepared_statement(sql, opts)
222     else
223       _execute(c, sql, opts)
224     end
225     _execute(c, "SELECT IDENTITY_VAL_LOCAL() FROM SYSIBM.SYSDUMMY1", opts){|stmt| i = stmt.fetch_array.first.to_i; i}
226   end
227 rescue Connection::Error => e
228   raise_error(e)
229 end
execute_prepared_statement(ps_name, opts) { |stmt| ... } click to toggle source

Execute a prepared statement named by name on the database.

    # File lib/sequel/adapters/ibmdb.rb
232 def execute_prepared_statement(ps_name, opts)
233   args = opts[:arguments]
234   ps = prepared_statement(ps_name)
235   sql = ps.prepared_sql
236   synchronize(opts[:server]) do |conn|
237     unless conn.prepared_statements.fetch(ps_name, []).first == sql
238       log_connection_yield("PREPARE #{ps_name}: #{sql}", conn){conn.prepare(sql, ps_name)}
239     end
240     args = args.map{|v| v.nil? ? nil : prepared_statement_arg(v)}
241     log_sql = "EXECUTE #{ps_name}"
242     if ps.log_sql
243       log_sql += " ("
244       log_sql << sql
245       log_sql << ")"
246     end
247     begin
248       stmt = log_connection_yield(log_sql, conn, args){conn.execute_prepared(ps_name, *args)}
249       if block_given?
250         yield(stmt)
251       else  
252         stmt.affected
253       end
254     ensure
255       stmt.free_result if stmt
256     end
257   end
258 end
freeze() click to toggle source
Calls superclass method Sequel::DB2::DatabaseMethods#freeze
    # File lib/sequel/adapters/ibmdb.rb
260 def freeze
261   @conversion_procs.freeze
262   super
263 end

Private Instance Methods

_execute(conn, sql, opts) { |stmt| ... } click to toggle source

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
269 def _execute(conn, sql, opts)
270   stmt = log_connection_yield(sql, conn){conn.execute(sql)}
271   if block_given?
272     yield(stmt)
273   else  
274     stmt.affected
275   end
276 ensure
277   stmt.free if stmt
278 end
_metadata_dataset() click to toggle source

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.

Calls superclass method Sequel::Database#_metadata_dataset
    # File lib/sequel/adapters/ibmdb.rb
315 def _metadata_dataset
316   super.with_convert_smallint_to_bool(false)
317 end
adapter_initialize() click to toggle source
    # File lib/sequel/adapters/ibmdb.rb
280 def adapter_initialize
281   @convert_smallint_to_bool = typecast_value_boolean(opts.fetch(:convert_smallint_to_bool, true))
282   @conversion_procs = DB2_TYPES.dup
283   @conversion_procs[:timestamp] = method(:to_application_timestamp)
284 end
begin_transaction(conn, opts=OPTS) click to toggle source

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
288 def begin_transaction(conn, opts=OPTS)
289   log_connection_yield('Transaction.begin', conn){conn.autocommit = false}
290   set_transaction_isolation(conn, opts)
291 end
commit_transaction(conn, opts=OPTS) click to toggle source

This commits transaction in progress on the connection and sets autocommit back on.

    # File lib/sequel/adapters/ibmdb.rb
295 def commit_transaction(conn, opts=OPTS)
296   log_connection_yield('Transaction.commit', conn){conn.commit}
297 end
database_error_classes() click to toggle source
    # File lib/sequel/adapters/ibmdb.rb
299 def database_error_classes
300   [Connection::Error]
301 end
database_exception_sqlstate(exception, opts) click to toggle source
    # File lib/sequel/adapters/ibmdb.rb
303 def database_exception_sqlstate(exception, opts)
304   exception.sqlstate
305 end
dataset_class_default() click to toggle source
    # File lib/sequel/adapters/ibmdb.rb
307 def dataset_class_default
308   Dataset
309 end
prepared_statement_arg(v) click to toggle source

Format Numeric, Date, and Time types specially for use as IBM_DB prepared statements argument vlaues.

    # File lib/sequel/adapters/ibmdb.rb
321 def prepared_statement_arg(v)
322   case v
323   when Numeric
324     v.to_s
325   when Date, Time
326     literal(v).gsub("'", '')
327   else
328     v
329   end
330 end
remove_transaction(conn, committed) click to toggle source

Set autocommit back on

Calls superclass method Sequel::Database#remove_transaction
    # File lib/sequel/adapters/ibmdb.rb
333 def remove_transaction(conn, committed)
334   conn.autocommit = true
335 ensure
336   super
337 end
rollback_transaction(conn, opts=OPTS) click to toggle source

This rolls back the transaction in progress on the connection and sets autocommit back on.

    # File lib/sequel/adapters/ibmdb.rb
341 def rollback_transaction(conn, opts=OPTS)
342   log_connection_yield('Transaction.rollback', conn){conn.rollback}
343 end
schema_column_type(db_type) click to toggle source

Convert smallint type to boolean if convert_smallint_to_bool is true

    # File lib/sequel/adapters/ibmdb.rb
346 def schema_column_type(db_type)
347   if convert_smallint_to_bool && db_type =~ /smallint/i 
348     :boolean
349   else
350     super
351   end
352 end