Method: PG::EM::ConnectionPool#hold
- Defined in:
- lib/pg/em/connection_pool.rb
#hold {|pg| ... } ⇒ Object Also known as: execute
Acquires PG::EM::Client connection and passes it to the given block.
The connection is allocated to the current fiber and ensures that any subsequent query from the same fiber will be performed on the connection.
It is possible to nest hold calls from the same fiber, so each time the block will be given the same PG::EM::Client instance. This feature is needed e.g. for nesting transaction calls.
314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 |
# File 'lib/pg/em/connection_pool.rb', line 314 def hold fiber = Fiber.current id = fiber.object_id if conn = @allocated[id] skip_release = true else conn = acquire(fiber) until conn end begin yield conn if block_given? rescue PG::Error if conn.status != PG::CONNECTION_OK conn.finish unless conn.finished? drop_failed(id) skip_release = true end raise ensure release(id) unless skip_release end end |