Llibreria libpg: accedir a PostgreSQL
$ sudo apt-get install libpq5 libpq-dev
Els fiftxes de capçalera estan a /usr/include/postgresql. Concretament, en el codi següent s'utilitza libpq-fe.h. Aquest directori també es pot trobar fent:
$ pg_config --includedir
Per compilar:
$ cc -c -I/usr/include/postgresql testlibpq.c
When linking the final program, specify the option -lpq so that the libpq library gets pulled in, as well as the option -Ldirectory to point the compiler to the directory where the libpq library resides. (Again, the compiler will search some directories by default.) For maximum portability, put the -L option before the -lpq option. For example:
$ cc -o testlibpq testlibpq.o -L/usr/include/postgresql/
Error messages that point to problems in this area could look like the following (el que a mi em passa...).
testlibpq.o: In function `main': testlibpq.o(.text+0x60): undefined reference to `PQsetdbLogin' testlibpq.o(.text+0x71): undefined reference to `PQstatus' testlibpq.o(.text+0xa4): undefined reference to `PQerrorMessage'
This means you forgot -lpq.
/usr/bin/ld: cannot find -lpq
This means you forgot the -L option or did not specify the right directory.
Finalment:
$ cc -o testlibpq testlibpq.o -lpq -L/usr/include/postgresql/
These examples and others can be found in the directory src/test/examples in the source code distribution.
testlibpq.c: del codi original, canvio
conninfo = "dbname = postgres"; per conninfo = "host=localhost dbname = postgres user=postgres password=postgres";
/*
* testlibpq.c
*
* Test the C version of libpq, the PostgreSQL frontend library.
*/
#include <stdio.h>
#include <stdlib.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;
int nFields;
int i,
j;
/*
* If the user supplies a parameter on the command line, use it as the
* conninfo string; otherwise default to setting dbname=postgres and using
* environment variables or defaults for all other connection parameters.
*/
if (argc > 1)
conninfo = argv[1];
else
conninfo = "dbname = postgres";
/* Make a connection to the database */
conn = PQconnectdb(conninfo);
/* Check to see that the backend connection was successfully made */
if (PQstatus(conn) != CONNECTION_OK)
{
fprintf(stderr, "Connection to database failed: %s",
PQerrorMessage(conn));
exit_nicely(conn);
}
/*
* Our test case here involves using a cursor, for which we must be inside
* a transaction block. We could do the whole thing with a single
* PQexec() of "select * from pg_database", but that's too trivial to make
* a good example.
*/
/* Start a transaction block */
res = PQexec(conn, "BEGIN");
if (PQresultStatus(res) != PGRES_COMMAND_OK)
{
fprintf(stderr, "BEGIN command failed: %s", PQerrorMessage(conn));
PQclear(res);
exit_nicely(conn);
}
/*
* Should PQclear PGresult whenever it is no longer needed to avoid memory
* leaks
*/
PQclear(res);
/*
* Fetch rows from pg_database, the system catalog of databases
*/
res = PQexec(conn, "DECLARE myportal CURSOR FOR select * from pg_database");
if (PQresultStatus(res) != PGRES_COMMAND_OK)
{
fprintf(stderr, "DECLARE CURSOR failed: %s", PQerrorMessage(conn));
PQclear(res);
exit_nicely(conn);
}
PQclear(res);
res = PQexec(conn, "FETCH ALL in myportal");
if (PQresultStatus(res) != PGRES_TUPLES_OK)
{
fprintf(stderr, "FETCH ALL failed: %s", PQerrorMessage(conn));
PQclear(res);
exit_nicely(conn);
}
/* first, print out the attribute names */
nFields = PQnfields(res);
for (i = 0; i < nFields; i++)
printf("%-15s", PQfname(res, i));
printf("\n\n");
/* next, print out the rows */
for (i = 0; i < PQntuples(res); i++)
{
for (j = 0; j < nFields; j++)
printf("%-15s", PQgetvalue(res, i, j));
printf("\n");
}
PQclear(res);
/* close the portal ... we don't bother to check for errors ... */
res = PQexec(conn, "CLOSE myportal");
PQclear(res);
/* end the transaction */
res = PQexec(conn, "END");
PQclear(res);
/* close the connection to the database and cleanup */
PQfinish(conn);
return 0;
}
i el resultats és:
datname datdba encoding datcollate datctype datistemplate datallowconn datconnlimit datlastsysoid datfrozenxid dattablespace datconfig datacl
template1 10 6 es_ES.UTF-8 es_ES.UTF-8 t t -1 11563 648 1663 {=c/postgres,postgres=CTc/postgres}
template0 10 6 es_ES.UTF-8 es_ES.UTF-8 t f -1 11563 648 1663 {=c/postgres,postgres=CTc/postgres}
postgres 10 6 es_ES.UTF-8 es_ES.UTF-8 f t -1 11563 648 1663
foodmart 10 6 es_ES.UTF-8 es_ES.UTF-8 f t -1 11563 648 1663
hibernate 146714 6 es_ES.UTF-8 es_ES.UTF-8 f t -1 11563 648 1663 {=Tc/hibuser,hibuser=CTc/hibuser}
quartz 146763 6 es_ES.UTF-8 es_ES.UTF-8 f t -1 11563 648 1663 {=Tc/pentaho_user,pentaho_user=CTc/pentaho_user}
sampledata 10 6 es_ES.UTF-8 es_ES.UTF-8 f t -1 11563 648 1663
openbravo 245020 6 es_ES.UTF-8 es_ES.UTF-8 f t -1 11563 648 1663
Per tant, resumint:
$ cc -c -I/usr/include/postgresql testlibpq.c $ cc -o testlibpq testlibpq.o -lpq -L/usr/include/postgresql/ $ ./testlibpq