async notify con libpq

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

Responses

Browse pgsql-es-ayuda by date

  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