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