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

Execute a prepared statement named by name on the database.

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

Private Instance Methods

_execute(conn, sql, opts) { || ... } 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
270 def _execute(conn, sql, opts)
271   stmt = log_connection_yield(sql, conn){conn.execute(sql)}
272   if defined?(yield)
273     yield(stmt)
274   else  
275     stmt.affected
276   end
277 ensure
278   stmt.free if stmt
279 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
316 def _metadata_dataset
317   super.with_convert_smallint_to_bool(false)
318 end
adapter_initialize() click to toggle source
    # File lib/sequel/adapters/ibmdb.rb
281 def adapter_initialize
282   @convert_smallint_to_bool = typecast_value_boolean(opts.fetch(:convert_smallint_to_bool, true))
283   @conversion_procs = DB2_TYPES.dup
284   @conversion_procs[:timestamp] = method(:to_application_timestamp)
285 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
289 def begin_transaction(conn, opts=OPTS)
290   log_connection_yield('Transaction.begin', conn){conn.autocommit = false}
291   set_transaction_isolation(conn, opts)
292 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
296 def commit_transaction(conn, opts=OPTS)
297   log_connection_yield('Transaction.commit', conn){conn.commit}
298 end
database_error_classes() click to toggle source
    # File lib/sequel/adapters/ibmdb.rb
300 def database_error_classes
301   [Connection::Error]
302 end
database_exception_sqlstate(exception, opts) click to toggle source
    # File lib/sequel/adapters/ibmdb.rb
304 def database_exception_sqlstate(exception, opts)
305   exception.sqlstate if exception.respond_to?(:sqlstate)
306 end
dataset_class_default() click to toggle source
    # File lib/sequel/adapters/ibmdb.rb
308 def dataset_class_default
309   Dataset
310 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
322 def prepared_statement_arg(v)
323   case v
324   when Numeric
325     v.to_s
326   when Date, Time
327     literal(v).gsub("'", '')
328   else
329     v
330   end
331 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
334 def remove_transaction(conn, committed)
335   conn.autocommit = true
336 ensure
337   super
338 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
342 def rollback_transaction(conn, opts=OPTS)
343   log_connection_yield('Transaction.rollback', conn){conn.rollback}
344 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
347 def schema_column_type(db_type)
348   if convert_smallint_to_bool && db_type =~ /smallint/i 
349     :boolean
350   else
351     super
352   end
353 end