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
Source
# 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
Create a new connection object for the given server.
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
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
Source
# 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
Execute a prepared statement named by name on the database.
Source
# File lib/sequel/adapters/ibmdb.rb 261 def freeze 262 @conversion_procs.freeze 263 super 264 end
Sequel::DB2::DatabaseMethods#freeze
Private Instance Methods
Source
# 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
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.
Source
# File lib/sequel/adapters/ibmdb.rb 316 def _metadata_dataset 317 super.with_convert_smallint_to_bool(false) 318 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
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
Source
# 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
IBM_DB uses an autocommit setting instead of sending SQL
queries. So starting a transaction just turns autocommit off.
Source
# File lib/sequel/adapters/ibmdb.rb 296 def commit_transaction(conn, opts=OPTS) 297 log_connection_yield('Transaction.commit', conn){conn.commit} 298 end
This commits transaction in progress on the connection and sets autocommit back on.
Source
# File lib/sequel/adapters/ibmdb.rb 300 def database_error_classes 301 [Connection::Error] 302 end
Source
# File lib/sequel/adapters/ibmdb.rb 304 def database_exception_sqlstate(exception, opts) 305 exception.sqlstate if exception.respond_to?(:sqlstate) 306 end
Source
# File lib/sequel/adapters/ibmdb.rb 308 def dataset_class_default 309 Dataset 310 end
Source
# 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
Format Numeric
, Date, and Time types specially for use as IBM_DB prepared statements argument vlaues.
Source
# File lib/sequel/adapters/ibmdb.rb 334 def remove_transaction(conn, committed) 335 conn.autocommit = true 336 ensure 337 super 338 end
Set autocommit back on
Sequel::Database#remove_transaction
Source
# File lib/sequel/adapters/ibmdb.rb 342 def rollback_transaction(conn, opts=OPTS) 343 log_connection_yield('Transaction.rollback', conn){conn.rollback} 344 end
This rolls back the transaction in progress on the connection and sets autocommit back on.
Source
# 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
Convert smallint type to boolean if convert_smallint_to_bool
is true
Sequel::DB2::DatabaseMethods#schema_column_type