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.:
Publicar un comentario