RE: SQL en function en C

From: "Mario Soto Cordones" <msotocl(at)gmail(dot)com>
To: "'Edwin Quijada'" <listas_quijada(at)hotmail(dot)com>, <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: RE: SQL en function en C
Date: 2009-05-26 00:14:25
Message-ID: 000001c9dd96$f2840120$d78c0360$@com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Edwin,

Te adjunto un script en C++ , el cual lo tengo corriendo en Linux,y que hace
lo que tu quieres, se conecta a postgrSQL y ejecuta sentencias SQL
Para actualizar vistas materializadas.. por medio de querys
asincrónicos, para lo cual Utilizo la librería libpq.

Espero te sirva

/*
* vasaf_systbl1_libpq_01.c
*
*
* Demonio para actualizar la vista materializada
'public._saf_systbl_1_vis_modelos_mv';
*
*
* Creado por : Ing. Mario Alberto Soto Cordones;
* Version : 1.0;
* Fecha : Septiembre 2005;
* Sistema : Saf;
* Plataforma : Linux Fedora Core 4;
*
*
*
*/

#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)
{
char *paso;
const char *autinfo;
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 = compuall";

conn = PQconnectdb(conninfo);

if (PQstatus(conn) != CONNECTION_OK)
{
fprintf(stderr, "Conexion a la Base de Datos fallo: %s",
PQerrorMessage(conn));
exit_nicely(conn);
}

autinfo = "(c)Ing. Mario Soto Cordones - Compu(at)ll Ingeniería\n";

res = PQexec(conn, "LISTEN saf_systbl1_vis_modelos_mv");
res = PQexec(conn, "LISTEN his_estadis_mv");
res = PQexec(conn, "LISTEN his_estadis_mv_sahidep");
res = PQexec(conn, "LISTEN contabilidad.his_sahidep_mv");
res = PQexec(conn, "LISTEN his_estadis_mv_sahiaju");

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)
{

paso = notify->relname;

if (strcmp(paso,"saf_systbl1_vis_modelos_mv") == 0)
{
conninfo = "SELECT
refresh_matview('public._saf_systbl_1_vis_modelos_mv')";
}
if (strcmp(paso,"his_estadis_mv") == 0 )
{
conninfo = "SELECT
refresh_matview('contabilidad.his_estadis_mv')";
}

if (strcmp(paso,"his_estadis_mv_sahidep") == 0)
{
conninfo = "SELECT
refresh_matview('contabilidad.his_estadis_mv')";
}

if (strcmp(paso,"contabilidad.his_sahidep_mv") == 0)
{
conninfo = "SELECT
refresh_matview('contabilidad.his_sahidep_mv')";
}

if (strcmp(paso,"his_estadis_mv_sahiaju") == 0)
{
conninfo = "SELECT
refresh_matview('contabilidad.his_estadis_mv')";
}

fprintf(stderr,
"Sistema Saf 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;
}

atentamente,

Mario Soto Cordones

Porfavor antes de Imprimir éste correo, piense en los árboles de nuestro
planeta.

-----Mensaje original-----
De: pgsql-es-ayuda-owner(at)postgresql(dot)org
[mailto:pgsql-es-ayuda-owner(at)postgresql(dot)org] En nombre de Edwin Quijada
Enviado el: lunes, 25 de mayo de 2009 12:42
Para: pgsql-es-ayuda(at)postgresql(dot)org
Asunto: [pgsql-es-ayuda] SQL en function en C

Hola!
He creado una pequena funcion en C para una tarea ahora necesito desde la
misma funcion poder hacer un select y ese resultado trabajarlo en mi
funcion.
Hasta ahora solo he ehcho cosas simples pero no se como puedo tomar la
informacion que me genera un select y poder usarla dentro de C en la funcion
que estoy creando.

Alguien puede decirme como puedo hacer esto. Estaba viendo el asunto de SPI
pero no se si es con esto que se hace. Alguien tiene algun ejemplo en C de
al menos un select que se haga y poder usarlo dentro de la funcion?

*-------------------------------------------------------*
*-Edwin Quijada
*-Developer DataBase
*-JQ Microsistemas
*-809-849-8087

* " Si deseas lograr cosas excepcionales debes de hacer cosas fuera de lo
comun"
*-------------------------------------------------------*
_________________________________________________________________
Windows Live Hotmail now works up to 70% faster.
http://windowslive.com/Explore/Hotmail?ocid=TXT_TAGLM_WL_hotmail_acq_faster_
112008--
TIP 2: puedes desuscribirte de todas las listas simultáneamente
(envía "unregister TuDirecciónDeCorreo" a majordomo(at)postgresql(dot)org)

__________ Information from ESET Smart Security, version of virus signature
database 4101 (20090525) __________

The message was checked by ESET Smart Security.

http://www.eset.com

__________ Information from ESET Smart Security, version of virus signature
database 4103 (20090525) __________

The message was checked by ESET Smart Security.

http://www.eset.com

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Fernando Moreno 2009-05-26 03:18:01 Re: Mejorar update
Previous Message Alvaro Herrera 2009-05-25 23:25:26 Re: Problema con client_encoding='WIN1251' y base de datos UTF8