PostgreSQL soporta notificaci�n as�ncrona a trav�s de los comandos LISTEN y NOTIFY. Un servidor registra su inter�s en una condici�n de notificaci�n particular con el comando LISTEN (y puede dejar de escuchar con el comando UNLISTEN). Todos los servidores que est�n escuchando una condici�n de notificaci�n particular recibir�n la notificaci�n as�ncronamente cuando cualquier servidor ejecute un NOTIFY de ese nombre de condici�n. El servidor que realiza la notificaci�n no pasar� ninguna otra informaci�n particular a los servidores que est�n escuchando. Por ello, cualquier dato que deba ser comunicado se transfiere habitualmente a trav�s de una relaci�n de base de datos. Tambi�n habitualmente el nombre de la condici�n es el mismo de la relaci�n asociada, pero no s�lo no es necesario, sino que tampoco lo es que exista ninguna relaci�n asociada.
Las aplicaciones libpq emiten los comandos LISTEN y UNLISTEN como consultas SQL ordinarias. Subsiguientemenet, la llegada de mensajes NOTIFY se puede detectar llamando a PQnotifies().
PQnotifies Devuelve la siguiente noficaci�n de una lista de mensajes de notificaci�n a�n no manipulados recibidos desde el servidor. Devuelve NULL si no hay notificaciones pendientes. Una vez se devuelve una notificaci�n con PQnotifies, esta se considera manipulada y se borrar� de la lista de notificaciones.
PGnotify* PQnotifies(PGconn *conn); typedef struct PGnotify { char relname[NAMEDATALEN]; /* nombre de la relaci�n */ /* que contiene los datos */ int be_pid; /* identificador del proceso servidor */ } PGnotify; |
En PostgreSQL 6.4 y posteriores, el be_pid corresponde al servidor que realiza la notificaci�n, mientras que en versiones anteriores era siempre el PID del propio servidor. |
La segunda muestra de programa da un ejemplo del uso de la notificaci�n as�ncrona.
PQnotifies() actualmente no lee datos del servidor; �nicamente devuelve mensajes previamente absorvidos por otra funci�n libpq. En versiones previas de libpq, la �nica forma de asegurar la recepci�n a tiempo de mensajes NOTIFY era emitir constantemente consultas, incluso vac�as, y comprobar entonces PQnotifies() tras cada PQexec(). Aunque esto funcionaba, se menospreciaba como una forma de malgastar poder de proceso.
Una forma mejor de comprobar los mensajes NOTIFY cuando no se dispone de consultas utilizables es hacer una llamada PQconsumeInput(), y comprobar entonces PQnotifies(). Se puede usar select(2) para esperar la llegada de datos del servidor, no utilizando en este caso potencia de CPU a menos que se tenga algo que hacer. N�tese que esta forma funcionar� correctamente mientras utilice usted PQsendQuery/PQgetResult o s�mplemente PQexec para las consultas. Deber�a usted, sin embargo, recordar comprobar PQnotifies() tras cada PQgetResult o PQexec para comprobar si ha llegado alguna notificaci�n durante el procesado de la consulta.