From: | Mario Soto Cordones - Venezuela <msotocl(at)gmail(dot)com> |
---|---|
To: | "pgsql-es-ayuda(at)postgresql(dot)org" <pgsql-es-ayuda(at)postgresql(dot)org> |
Subject: | async notify con libpq |
Date: | 2005-10-10 15:33:20 |
Message-ID: | e9b17cde0510100833rad2533dp@mail.gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-es-ayuda |
Hola Lista, tengo la siguiente consulta:.
1.- he creado un demonio en lenguaje c, que se conecta a postgresql
via libpq para actualizar mediante un proceso notify;
/*
* vasaf_systbl1_libpq_01.c
*
*
* Demonio para actualizar la vista materializada
'public._vasaf_systbl_1_vis_modelos_mv';
*
*
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <sys/time.h>
#include "libpq-fe.h"
static void
exit_nicely(PGconn *conn)
{
PQfinish(conn);
exit(1);
}
int
main(int argc, char **argv)
{
const char *conninfo;
PGconn *conn;
PGresult *res;
PGnotify *notify;
int nnotifies;
int sock;
fd_set input_mask;
if (argc > 1)
conninfo = argv[1];
else
conninfo = "dbname = test";
conn = PQconnectdb(conninfo);
if (PQstatus(conn) != CONNECTION_OK)
{
fprintf(stderr, "Conexion a la Base de Datos fallo: %s",
PQerrorMessage(conn));
exit_nicely(conn);
}
conninfo = "SELECT
refresh_matview('public._vasaf_systbl_1_vis_modelos_mv')";
res = PQexec(conn, "LISTEN vasaf_systbl1_vis_modelos_mv");
if (PQresultStatus(res) != PGRES_COMMAND_OK)
{
fprintf(stderr, "comando LISTEN fallo: %s",
PQerrorMessage(conn));
PQclear(res);
exit_nicely(conn);
}
PQclear(res);
nnotifies = 0;
while ((nnotifies == 0))
{
sock = PQsocket(conn);
if (sock < 0)
break;
FD_ZERO(&input_mask);
FD_SET(sock, &input_mask);
if (select(sock + 1, &input_mask, NULL, NULL, NULL) < 0)
{
fprintf(stderr, "select() fallo: %s\n", strerror(errno));
nnotifies = 1;
exit_nicely(conn);
}
PQconsumeInput(conn);
while ((notify = PQnotifies(conn)) != NULL)
{
fprintf(stderr,
"Sistema Vasaf ha recibido un ASYNC NOTIFY de '%s' , desde el
backend pid %d\n",
notify->relname, notify->be_pid);
fprintf(stderr, "Actualizando Vista
Materializada...\n");
res = PQexec(conn, conninfo);
fprintf(stderr, "Actualizacion de Vista
Materializada OK.\n");
fprintf(stderr, autinfo);
PQfreemem(notify);
PQclear(res);
}
}
PQfinish(conn);
return 0;
}
Este demonio esta siempre corriendo a la espera de ejecutarse. Para
ejecutarse tengo una regla, en la tabla que quiero que se actualice.
CREATE RULE "r1" AS ON INSERT TO "public"."_vasaf_systbl_1"
DO (NOTIFY vasaf_systbl1_vis_modelos_mv;);
Mi pregunta es la siguiente:
Necesito en este mismo demonio (para no hacer varios) implementar la
actualizacion de otras 2 vistas., lo que no se hacer es como evaluar
que regla es la que me esta gatillando el notify, en este caso lo
tengo para una regla y el demonio funciona perfectamente y hace lo que
tiene que hacer.
conninfo = "SELECT
refresh_matview('public._vasaf_systbl_1_vis_modelos_mv')";
res = PQexec(conn, "LISTEN vasaf_systbl1_vis_modelos_mv");
Como ven, la variable conninfo y res, me indican lo que yo quiero que
se ejecute. Pero si yo pudiera evaluar que regla se me disparo, yo
podria crear un case para incorporar las otras dos vistas
materializadas que quiero que se me actualicen.
Muchas gracias a todos
--
cordialmente,
Ing. Mario Soto Cordones
From | Date | Subject | |
---|---|---|---|
Next Message | Manuel Sugawara | 2005-10-10 15:53:21 | Re: async notify con libpq |
Previous Message | Luis Vazquez | 2005-10-10 15:24:00 | Driver ODBC postgres version 7.03.01 |