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.