jueves, 26 de julio de 2007

Compilar programas en "C" para acceso a datos PostgreSQL

Para compilar un programa escrito en C que emplee la libreria libpq de PostgreSQL es necesario tener instalado los archivos de desarrollo includes para C.

En el siguiente caso probado en Fedora Core 4 funcionaba instalado desde las fuentes.

gcc testpq.c -I/usr/local/pgsql/include -L/usr/local/pgsql/lib -lpq -o testpq

Pero para ubuntu instalado mediante apt-get quedaria de la siguiente forma:

gcc libpqe.c -o libpqe -I/usr/include/postgresql/ -L/usr/include/postgresql -lpq

A continuacion pongo un pequeño programa en C que accesa a una base de datos postgresql y sirve como ejemplo para probar la compilacion de codigo C con las librerias libpq:


/*
/ Programa : sqlt.c
/ Autor : Julio Cesar Sánchez González (juliocesar_dark@hotmail.com) GNU GPL.
/ Fecha : 25 - Mayo - 2006.
/ Ultimo Update: 25 - Mayo - 2006.
/ Revisión : 2
/ Descripción : Obtiene un conjunto resultado de una base de datos postgres proporcionandole la consulta y la base.
*/

#include
#include
#include "libpq-fe.h"
#include

void exit_nicely(PGconn *);

int main(int argc, char *argv[]){

if(argc != 5){
perror ("Sintaxix: sqlt <\"query\">\n");
exit(EXIT_FAILURE);
}

char *pghost,
*pgport,
*pgoptions,
*pgtty,
*dbname,
*query,
*cursor_command,
*login,
*pwd;
int nFields;
int i, j;

pghost = argv[1];
dbname = argv[2];
login = argv[3];
pwd = NULL;
query = argv[4];


PGconn *conn;
PGresult *result;

// pghost = "localhost";
pgport = NULL;
pgoptions = NULL;
pgtty = NULL;
// dbname = "memoria_sql";

//conn = PQsetdb(pghost, pgport, pgoptions, pgtty, dbname);
conn = PQsetdbLogin(pghost, pgport, pgoptions, pgtty, dbname, login, pwd);

if(PQstatus(conn) == CONNECTION_BAD){
fprintf(stderr, "Conexión fallida con la base de datos %s\n", dbname);
fprintf(stderr, "%s", PQerrorMessage(conn));
exit_nicely(conn);
}

// Transaccion
result = PQexec(conn, "BEGIN");

if(!result || PQresultStatus(result) != PGRES_COMMAND_OK){
fprintf(stderr, "Imposible realizar transaccion\n");
PQclear(result);
exit_nicely(conn);
}

PQclear(result); // Limpiamos el result para evitar fugas de memoria

cursor_command = (char *) malloc((size_t)1024*sizeof(char));

sprintf(cursor_command, "DECLARE mycursor CURSOR FOR %s", query);

result = PQexec(conn, cursor_command);

if(!result || PQresultStatus(result) != PGRES_COMMAND_OK){
fprintf(stderr,"Declaración de CURSOR fallida\n");
PQclear(result);
exit_nicely(conn);
}

PQclear(result);

result = PQexec(conn, "FETCH ALL in mycursor");

if(!result || PQresultStatus(result) != PGRES_TUPLES_OK){
fprintf(stderr,"El comando no regreso ninguna tupla.\n");
PQclear(result);
exit_nicely(conn);
}


nFields = PQnfields(result);

for(i = 0; i < PQntuples(result); i++){

printf ("\n\n=========================\n\t=> Registro: %d\n=========================\n\n", i+1);

for(j = 0; j < nFields; j++){
printf("%-15s: %-15s\n", PQfname(result, j), PQgetvalue(result, i, j));

//printf("\n");
}
}

PQclear(result);

result = PQexec(conn, "CLOSE mycursor");

PQclear(result);

// Aseguramos la transaccion
result = PQexec(conn, "COMMIT");

PQclear(result);

PQfinish(conn);

return 0;
}


void exit_nicely(PGconn *conn){
PQfinish(conn);
exit(1);
}




Saludos...

No hay comentarios.:

Bahia desde el balcon...

Bahia desde el balcon...
Ixtapa Zihuatanejo