57 lines
1.5 KiB
Ruby
Executable File
57 lines
1.5 KiB
Ruby
Executable File
#!/usr/bin/env ruby
|
|
|
|
require 'pg'
|
|
|
|
$stdout.sync = true
|
|
|
|
# This is a example of how to mix and match synchronous and async APIs. In this case,
|
|
# the connection to the server is made syncrhonously, and then queries are
|
|
# asynchronous.
|
|
|
|
TIMEOUT = 5.0 # seconds to wait for an async operation to complete
|
|
CONN_OPTS = {
|
|
:host => 'localhost',
|
|
:dbname => 'test',
|
|
}
|
|
|
|
# Output progress messages
|
|
def output_progress( msg )
|
|
puts ">>> #{msg}\n"
|
|
end
|
|
|
|
# Start the (synchronous) connection
|
|
output_progress "Starting connection..."
|
|
conn = PG.connect( CONN_OPTS ) or abort "Unable to create a new connection!"
|
|
|
|
abort "Connect failed: %s" % [ conn.error_message ] unless conn.status == PG::CONNECTION_OK
|
|
|
|
# Now grab a reference to the underlying socket to select() on while the query is running
|
|
socket = IO.for_fd( conn.socket )
|
|
|
|
# Send the (asynchronous) query
|
|
output_progress "Sending query"
|
|
conn.send_query( "SELECT * FROM pg_stat_activity" )
|
|
|
|
# Fetch results until there aren't any more
|
|
loop do
|
|
output_progress " waiting for a response"
|
|
|
|
# Buffer any incoming data on the socket until a full result is ready.
|
|
conn.consume_input
|
|
while conn.is_busy
|
|
output_progress " waiting for data to be available on %p..." % [ socket ]
|
|
select( [socket], nil, nil, TIMEOUT ) or
|
|
raise "Timeout waiting for query response."
|
|
conn.consume_input
|
|
end
|
|
|
|
# Fetch the next result. If there isn't one, the query is finished
|
|
result = conn.get_result or break
|
|
|
|
output_progress "Query result:\n%p\n" % [ result.values ]
|
|
end
|
|
|
|
output_progress "Done."
|
|
conn.finish
|
|
|