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 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
# 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
# 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 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 defined?(yield) 250 yield(stmt) 251 else 252 stmt.affected 253 end 254 ensure 255 stmt.free_result if stmt 256 end 257 end 258 end
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 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 defined?(yield) 272 yield(stmt) 273 else 274 stmt.affected 275 end 276 ensure 277 stmt.free if stmt 278 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.
Sequel::Database#_metadata_dataset
# File lib/sequel/adapters/ibmdb.rb 315 def _metadata_dataset 316 super.with_convert_smallint_to_bool(false) 317 end
# 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
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
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
# File lib/sequel/adapters/ibmdb.rb 299 def database_error_classes 300 [Connection::Error] 301 end
# File lib/sequel/adapters/ibmdb.rb 303 def database_exception_sqlstate(exception, opts) 304 exception.sqlstate if exception.respond_to?(:sqlstate) 305 end
# File lib/sequel/adapters/ibmdb.rb 307 def dataset_class_default 308 Dataset 309 end
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
Set autocommit back on
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
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
Convert smallint type to boolean if convert_smallint_to_bool
is true
Sequel::DB2::DatabaseMethods#schema_column_type
# 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