Procesamiento Asíncrono de Consultas

La función PQexec es adecuada para emitir consultas en aplicaciones síncronas sencillas. Sin embargo, tiene una porción de definciencias importantes:

Las aplicaciones que no se quieren encontrar con estas limitaciones, pueden utilizar en su lugar las funciones que subyacen bajo PQexec: PQsendQuery y PQgetResult.

Para los programas antiguos que utilizaban esta funcionalidad utilizando PQputline y PQputnbytes y esperaban bloqueados el envío de datos del servidor, se añadió la función PQsetnonblocking.

Las aplicaciones antíguas pueden rechazar el uso de PQsetnonblocking y mantener el comportamiento anterior potencialmente bloquante. Los programas más nuevos pueden utilizar PQsetnonblocking para conseguir una conexión con el servidor completamente no bloqueante.

Utilizando PQsendQuery y PQgetResult se resuelve uno de los problemas de PQexec: Si una cadena de consulta contiene múltiples comandos SQL, los resultados de esos comandos se pueden obtener individualmente. (Esto permite una forma sencilla de procesamiento paralelo: la aplicación cliente puede estar manipulando los resultados de una consulta mientras el servidor sigue trabajando sobre consultas posteriores de la misma cadena de consulta). Sin embargo, la llamada a PQgetResult seguirá probocando que el cliente quede bloqueado hasta que el servidor complete el siguiente comando SQL de la cadena. Esto se puede impedir con el uso adecuado de tres funciones más:

Una aplicación cliente típica que utilice estas funciones tendrá un bucle principal que utiliza select(2) para esperar todas las condiciones a las que debe responder. Una de estas condiciones será la entrada disponible desde el servidor, lo que en terminos de select son datos legibles en el descriptor de fichero identificado por PQsocket. Cuando el bucle principal detecta que hay preparada una entrada, debería llamar a PQconsumeInput para leer la entrada. Puede después llamar a PQisBusy, seguido de PQgetResult si PQisBusy devuelve falso (0). Puede llamar también a PQnotifies para detectar mensajes NOTIFY (ver "Notificación Asíncrona", más abajo).

Una aplicación cliente que utilice PQsendQuery/PQgetResult también puede intentar cancelar una consulta que aún se esté procesando en el servidor.

Nótese que si la consulta forma parte de una transacción, la cancelación abortará la transacción completa.

PQrequestCancel se puede invocar de modo seguro desde un manipulador de señales. De esta forma, se puede utilizar en conjunción con PQexec plano, si la decisión de cancelar se puede tomar en un manipulador de señales. Por ejemplo, psql invoca a PQrequestCancel desde un manipulador de la señal SIGINT, permitiendo de este modo la cancelación interactiva de consultas que él gestiona a través de PQexec. Observese que PQrequestCancel no tendrá efecto si la conexión no está abierta en ese momento, o si el servidor no está procesando una consulta.