C interface

From: Mario Fernandez <mfernandez(at)sia(dot)es>
To: "'pgsql-ports(at)postgresql(dot)org'" <pgsql-ports(at)postgresql(dot)org>
Subject: C interface
Date: 2001-08-20 17:36:38
Message-ID: 2DA55CB79DF6D411BAB500508BEA1F17055164@MAILSRV
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-ports

I´ve got a problem when trying to access Postgresql through C language. I´ve
copied the first example appearing in the integrated docs documentation( for
version 7.0.x). The example is the one beloww, but when I compile it I get
two problems:

Firstly, the include file "libpq-fe.h" wasn´t found. I fixed it writing the
absolute path in the #include.

Secondly, when that one was found, there were a lot of 'undefined
references' to every function in testlibpq.c. The output is the following:

/tmp/ccIKrZnW.o: In function `exit_nicely':
/tmp/ccIKrZnW.o(.text+0xe): undefined reference to `PQfinish'
/tmp/ccIKrZnW.o: In function `main':
/tmp/ccIKrZnW.o(.text+0x6d): undefined reference to `PQsetdbLogin'
/tmp/ccIKrZnW.o(.text+0x81): undefined reference to `PQstatus'
/tmp/ccIKrZnW.o(.text+0xb3): undefined reference to `PQerrorMessage'
/tmp/ccIKrZnW.o(.text+0xeb): undefined reference to `PQexec'
/tmp/ccIKrZnW.o(.text+0x105): undefined reference to `PQresultStatus'
/tmp/ccIKrZnW.o(.text+0x135): undefined reference to `PQclear'
/tmp/ccIKrZnW.o(.text+0x153): undefined reference to `PQclear'
/tmp/ccIKrZnW.o(.text+0x167): undefined reference to `PQexec'
/tmp/ccIKrZnW.o(.text+0x181): undefined reference to `PQresultStatus'
/tmp/ccIKrZnW.o(.text+0x1b1): undefined reference to `PQclear'
/tmp/ccIKrZnW.o(.text+0x1cf): undefined reference to `PQclear'
/tmp/ccIKrZnW.o(.text+0x1e3): undefined reference to `PQexec'
/tmp/ccIKrZnW.o(.text+0x1fd): undefined reference to `PQresultStatus'
/tmp/ccIKrZnW.o(.text+0x22d): undefined reference to `PQclear'
/tmp/ccIKrZnW.o(.text+0x24b): undefined reference to `PQnfields'
/tmp/ccIKrZnW.o(.text+0x27b): undefined reference to `PQfname'
/tmp/ccIKrZnW.o(.text+0x2b8): undefined reference to `PQntuples'
/tmp/ccIKrZnW.o(.text+0x2ef): undefined reference to `PQgetvalue'
/tmp/ccIKrZnW.o(.text+0x32c): undefined reference to `PQclear'
/tmp/ccIKrZnW.o(.text+0x340): undefined reference to `PQexec'
/tmp/ccIKrZnW.o(.text+0x354): undefined reference to `PQclear'
/tmp/ccIKrZnW.o(.text+0x368): undefined reference to `PQexec'
/tmp/ccIKrZnW.o(.text+0x37c): undefined reference to `PQclear'
/tmp/ccIKrZnW.o(.text+0x38b): undefined reference to `PQfinish'

Please can you help me with this two problems??? Thank you

The C program is this one:

/*
* testlibpq.c Test the C version of Libpq, the Postgres frontend
* library.
*
*
*/
#include <stdio.h>
#include "libpq-fe.h"

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

main()
{
char *pghost,
*pgport,
*pgoptions,
*pgtty;
char *dbName;
int nFields;
int i,
j;

/* FILE *debug; */

PGconn *conn;
PGresult *res;

/*
* begin, by setting the parameters for a backend connection if the
* parameters are null, then the system will try to use reasonable
* defaults by looking up environment variables or, failing that,
* using hardwired constants
*/
pghost = NULL; /* host name of the backend server */
pgport = NULL; /* port of the backend server */
pgoptions = NULL; /* special options to start up the backend
* server */
pgtty = NULL; /* debugging tty for the backend server */
dbName = "template1";

/* make a connection to the database */
conn = PQsetdb(pghost, pgport, pgoptions, pgtty, dbName);

/*
* check to see that the backend connection was successfully made
*/
if (PQstatus(conn) == CONNECTION_BAD)
{
fprintf(stderr, "Connection to database '%s' failed.\n", dbName);
fprintf(stderr, "%s", PQerrorMessage(conn));
exit_nicely(conn);
}

/* debug = fopen("/tmp/trace.out","w"); */
/* PQtrace(conn, debug); */

/* start a transaction block */
res = PQexec(conn, "BEGIN");
if (!res || PQresultStatus(res) != PGRES_COMMAND_OK)
{
fprintf(stderr, "BEGIN command failed\n");
PQclear(res);
exit_nicely(conn);
}

/*
* should PQclear PGresult whenever it is no longer needed to avoid
* memory leaks
*/
PQclear(res);

/*
* fetch instances from the pg_database, the system catalog of
* databases
*/
res = PQexec(conn, "DECLARE mycursor CURSOR FOR select * from
pg_database");
if (!res || PQresultStatus(res) != PGRES_COMMAND_OK)
{
fprintf(stderr, "DECLARE CURSOR command failed\n");
PQclear(res);
exit_nicely(conn);
}
PQclear(res);
res = PQexec(conn, "FETCH ALL in mycursor");
if (!res || PQresultStatus(res) != PGRES_TUPLES_OK)
{
fprintf(stderr, "FETCH ALL command didn't return tuples
properly\n");
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 instances */
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 cursor */
res = PQexec(conn, "CLOSE mycursor");
PQclear(res);

/* commit the transaction */
res = PQexec(conn, "COMMIT");
PQclear(res);

/* close the connection to the database and cleanup */
PQfinish(conn);

/* fclose(debug); */
return 0;

}

Responses

Browse pgsql-ports by date

  From Date Subject
Next Message Andy 2001-08-21 09:30:56 mx.rpm
Previous Message ruth 2001-08-19 15:25:35 Listing http://postgresql.rmplc.co.uk