Thread: libpq Newbie question

libpq Newbie question

From
"Ronggolawe"
Date:
Hi, I'm a newbie in postgresql, would like to know how to access database
using libpq. I found example code on postgresql's site, however i'm not able
to execute the code it always giving me an error.
I hope anyone could explain to me how to fix this.
Thank you.

Error:
Undefined                       first referenced
 symbol                             in file
PQresultStatus                      /var/tmp/ccED8fcw.o
PQclear                             /var/tmp/ccED8fcw.o
PQexec                              /var/tmp/ccED8fcw.o
PQerrorMessage                      /var/tmp/ccED8fcw.o
PQstatus                            /var/tmp/ccED8fcw.o
PQconsumeInput                      /var/tmp/ccED8fcw.o
PQnotifies                          /var/tmp/ccED8fcw.o
PQfinish                            /var/tmp/ccED8fcw.o
PQsetdbLogin                        /var/tmp/ccED8fcw.o
ld: fatal: Symbol referencing errors. No output written to a.out
collect2: ld returned 1 exit status

The code:
/*
 * testlibpq2.c
 *  Test of the asynchronous notification interface
 *
 * Start this program, then from psql in another window do
 *   NOTIFY TBL2;
 *
 * Or, if you want to get fancy, try this:
 * Populate a database with the following:
 *
 *   CREATE TABLE TBL1 (i int4);
 *
 *   CREATE TABLE TBL2 (i int4);
 *
 *   CREATE RULE r1 AS ON INSERT TO TBL1 DO
 *     (INSERT INTO TBL2 values (new.i); NOTIFY TBL2);
 *
 * and do
 *
 *   INSERT INTO TBL1 values (10);
 *
 */
#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;
    PGconn     *conn;
    PGresult   *res;
    PGnotify   *notify;
    /*
     * 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 = getenv("USER");    /* change this to the name of your test
                                 * database */
    /* 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);
    }
    res = PQexec(conn, "LISTEN TBL2");
    if (!res || PQresultStatus(res) != PGRES_COMMAND_OK)
    {
        fprintf(stderr, "LISTEN command failed\n");
        PQclear(res);
        exit_nicely(conn);
    }
    /*
     * should PQclear PGresult whenever it is no longer needed to avoid
     * memory leaks
     */
    PQclear(res);
    while (1)
    {
        /*
         * wait a little bit between checks; waiting with select()
         * would be more efficient.
         */
        sleep(1);
        /* collect any asynchronous backend messages */
        PQconsumeInput(conn);
        /* check for asynchronous notify messages */
        while ((notify = PQnotifies(conn)) != NULL)
        {
            fprintf(stderr,
                 "ASYNC NOTIFY of '%s' from backend pid '%d' received\n",
                    notify->relname, notify->be_pid);
            free(notify);
        }
    }
    /* close the connection to the database and cleanup */
    PQfinish(conn);
    return 0;
}

Re: libpq Newbie question

From
"Aryo Sukarno"
Date:
On Thu, 29 Nov 2001 22:34:32 -0800, Ronggolawe wrote:

> Error:
> Undefined                       first referenced
>  symbol                             in file
> PQresultStatus                      /var/tmp/ccED8fcw.o PQclear
>                    /var/tmp/ccED8fcw.o PQexec
>   /var/tmp/ccED8fcw.o PQerrorMessage
> /var/tmp/ccED8fcw.o PQstatus
> /var/tmp/ccED8fcw.o PQconsumeInput
> /var/tmp/ccED8fcw.o PQnotifies
> /var/tmp/ccED8fcw.o PQfinish
> /var/tmp/ccED8fcw.o PQsetdbLogin
> /var/tmp/ccED8fcw.o ld: fatal: Symbol referencing errors. No output
> written to a.out collect2: ld returned 1 exit status
>
>
>
I assume you doing:
cc -o output file.c

instead of:
cc -o output file.c -I/opt/local/include -L/opt/local/lib -lpq

Note the compiler switch, I think that error was produce because the
compiler can't find libpq.

Re: libpq Newbie question

From
"Tim Barnard"
Date:
This is a linker error. You need to tell the linker "where" to find the
libpq library.
Add -L/usr/local/pgsql or your equivalent to your compiler call in your make
file.

Tim

----- Original Message -----
From: "Ronggolawe" <ngelawak@www2.us.postgresql.org>
To: <pgsql-general@postgresql.org.pgsql-interfaces@postgresql.org>
Sent: Thursday, November 29, 2001 10:34 PM
Subject: [GENERAL] libpq Newbie question


> Hi, I'm a newbie in postgresql, would like to know how to access database
> using libpq. I found example code on postgresql's site, however i'm not
able
> to execute the code it always giving me an error.
> I hope anyone could explain to me how to fix this.
> Thank you.
>
> Error:
> Undefined                       first referenced
>  symbol                             in file
> PQresultStatus                      /var/tmp/ccED8fcw.o
> PQclear                             /var/tmp/ccED8fcw.o
> PQexec                              /var/tmp/ccED8fcw.o
> PQerrorMessage                      /var/tmp/ccED8fcw.o
> PQstatus                            /var/tmp/ccED8fcw.o
> PQconsumeInput                      /var/tmp/ccED8fcw.o
> PQnotifies                          /var/tmp/ccED8fcw.o
> PQfinish                            /var/tmp/ccED8fcw.o
> PQsetdbLogin                        /var/tmp/ccED8fcw.o
> ld: fatal: Symbol referencing errors. No output written to a.out
> collect2: ld returned 1 exit status
>
> The code:
> /*
>  * testlibpq2.c
>  *  Test of the asynchronous notification interface
>  *
>  * Start this program, then from psql in another window do
>  *   NOTIFY TBL2;
>  *
>  * Or, if you want to get fancy, try this:
>  * Populate a database with the following:
>  *
>  *   CREATE TABLE TBL1 (i int4);
>  *
>  *   CREATE TABLE TBL2 (i int4);
>  *
>  *   CREATE RULE r1 AS ON INSERT TO TBL1 DO
>  *     (INSERT INTO TBL2 values (new.i); NOTIFY TBL2);
>  *
>  * and do
>  *
>  *   INSERT INTO TBL1 values (10);
>  *
>  */
> #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;
>     PGconn     *conn;
>     PGresult   *res;
>     PGnotify   *notify;
>     /*
>      * 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 = getenv("USER");    /* change this to the name of your test
>                                  * database */
>     /* 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);
>     }
>     res = PQexec(conn, "LISTEN TBL2");
>     if (!res || PQresultStatus(res) != PGRES_COMMAND_OK)
>     {
>         fprintf(stderr, "LISTEN command failed\n");
>         PQclear(res);
>         exit_nicely(conn);
>     }
>     /*
>      * should PQclear PGresult whenever it is no longer needed to avoid
>      * memory leaks
>      */
>     PQclear(res);
>     while (1)
>     {
>         /*
>          * wait a little bit between checks; waiting with select()
>          * would be more efficient.
>          */
>         sleep(1);
>         /* collect any asynchronous backend messages */
>         PQconsumeInput(conn);
>         /* check for asynchronous notify messages */
>         while ((notify = PQnotifies(conn)) != NULL)
>         {
>             fprintf(stderr,
>                  "ASYNC NOTIFY of '%s' from backend pid '%d' received\n",
>                     notify->relname, notify->be_pid);
>             free(notify);
>         }
>     }
>     /* close the connection to the database and cleanup */
>     PQfinish(conn);
>     return 0;
> }
>
> ---------------------------(end of broadcast)---------------------------
> TIP 3: if posting/reading through Usenet, please send an appropriate
> subscribe-nomail command to majordomo@postgresql.org so that your
> message can get through to the mailing list cleanly
>
>



Re: libpq Newbie question

From
"Tim Barnard"
Date:
Oops, fat fingered that one :-(

Make that -L/usr/local/pgsql/lib -lpq

Tim

----- Original Message -----
From: "Ronggolawe" <ngelawak@www2.us.postgresql.org>
To: <pgsql-general@postgresql.org.pgsql-interfaces@postgresql.org>
Sent: Thursday, November 29, 2001 10:34 PM
Subject: [GENERAL] libpq Newbie question


> Hi, I'm a newbie in postgresql, would like to know how to access database
> using libpq. I found example code on postgresql's site, however i'm not
able
> to execute the code it always giving me an error.
> I hope anyone could explain to me how to fix this.
> Thank you.
>
> Error:
> Undefined                       first referenced
>  symbol                             in file
> PQresultStatus                      /var/tmp/ccED8fcw.o
> PQclear                             /var/tmp/ccED8fcw.o
> PQexec                              /var/tmp/ccED8fcw.o
> PQerrorMessage                      /var/tmp/ccED8fcw.o
> PQstatus                            /var/tmp/ccED8fcw.o
> PQconsumeInput                      /var/tmp/ccED8fcw.o
> PQnotifies                          /var/tmp/ccED8fcw.o
> PQfinish                            /var/tmp/ccED8fcw.o
> PQsetdbLogin                        /var/tmp/ccED8fcw.o
> ld: fatal: Symbol referencing errors. No output written to a.out
> collect2: ld returned 1 exit status
>
> The code:
> /*
>  * testlibpq2.c
>  *  Test of the asynchronous notification interface
>  *
>  * Start this program, then from psql in another window do
>  *   NOTIFY TBL2;
>  *
>  * Or, if you want to get fancy, try this:
>  * Populate a database with the following:
>  *
>  *   CREATE TABLE TBL1 (i int4);
>  *
>  *   CREATE TABLE TBL2 (i int4);
>  *
>  *   CREATE RULE r1 AS ON INSERT TO TBL1 DO
>  *     (INSERT INTO TBL2 values (new.i); NOTIFY TBL2);
>  *
>  * and do
>  *
>  *   INSERT INTO TBL1 values (10);
>  *
>  */
> #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;
>     PGconn     *conn;
>     PGresult   *res;
>     PGnotify   *notify;
>     /*
>      * 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 = getenv("USER");    /* change this to the name of your test
>                                  * database */
>     /* 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);
>     }
>     res = PQexec(conn, "LISTEN TBL2");
>     if (!res || PQresultStatus(res) != PGRES_COMMAND_OK)
>     {
>         fprintf(stderr, "LISTEN command failed\n");
>         PQclear(res);
>         exit_nicely(conn);
>     }
>     /*
>      * should PQclear PGresult whenever it is no longer needed to avoid
>      * memory leaks
>      */
>     PQclear(res);
>     while (1)
>     {
>         /*
>          * wait a little bit between checks; waiting with select()
>          * would be more efficient.
>          */
>         sleep(1);
>         /* collect any asynchronous backend messages */
>         PQconsumeInput(conn);
>         /* check for asynchronous notify messages */
>         while ((notify = PQnotifies(conn)) != NULL)
>         {
>             fprintf(stderr,
>                  "ASYNC NOTIFY of '%s' from backend pid '%d' received\n",
>                     notify->relname, notify->be_pid);
>             free(notify);
>         }
>     }
>     /* close the connection to the database and cleanup */
>     PQfinish(conn);
>     return 0;
> }
>
> ---------------------------(end of broadcast)---------------------------
> TIP 3: if posting/reading through Usenet, please send an appropriate
> subscribe-nomail command to majordomo@postgresql.org so that your
> message can get through to the mailing list cleanly
>
>