/* * call-seq: * conn.async_exec(sql [, params, result_format ] ) -> PGresult * conn.async_exec(sql [, params, result_format ] ) {|pg_result| block } * * This function has the same behavior as +PGconn#exec+, * except that it's implemented using asynchronous command * processing and ruby's +rb_thread_select+ in order to * allow other threads to process while waiting for the * server to complete the request. */ static VALUE pgconn_async_exec(int argc, VALUE *argv, VALUE self) { VALUE rb_pgresult = Qnil; /* remove any remaining results from the queue */ pgconn_block( 0, NULL, self ); /* wait for input (without blocking) before reading the last result */ pgconn_get_last_result( self ); pgconn_send_query( argc, argv, self ); pgconn_block( 0, NULL, self ); rb_pgresult = pgconn_get_last_result( self ); if ( rb_block_given_p() ) { return rb_ensure( rb_yield, rb_pgresult, pgresult_clear, rb_pgresult ); } return rb_pgresult; }