Simon Riggs wrote:
> On Wed, 2006-11-01 at 10:06 -0500, Tom Lane wrote:
> > "Simon Riggs" <[EMAIL PROTECTED]> writes:
> > > On Tue, 2006-10-31 at 23:51 -0500, Tom Lane wrote:
> > >> With what logging settings?  log_duration has rather different behavior
> > >> from what it used to do.
> > 
> > > I think it would be useful to have the log results from a test program
> > > in the protocol section,
> > 
> > The contents of the postmaster log are surely not part of the FE protocol.
> > Clients can't even see the log without resorting to nonstandard hacks.
> 
> OK, can we please put the example from -hackers into the docs,
> somewhere, with particular note of which protocol messages result in
> which logging output?

If people want to know the output, run a program and look at the
postmaster logs.  If we document it, we have to keep it current, even if
we improve it later.  I will say I had trouble testing this logging
because it requires a C program to use that protocol.  Here is the test
program I used.

-- 
  Bruce Momjian   [EMAIL PROTECTED]
  EnterpriseDB    http://www.enterprisedb.com

  + If your life is a hard drive, Christ can be your backup. +
/*
 * prepare test program
 *
 *        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;
        const char              *val[2];
        int                     types[2];
        

        /*
         * 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);
        }

    res = PQexec(conn, "SET log_min_duration_statement = 0;");
//    res = PQexec(conn, "SET log_statement = 'all';");
    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);

        /*
         * 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.
         */

        /*
         * Fetch rows from pg_database, the system catalog of databases
         */
        types[0] = 25;
//      types[1] = 23;
        res = PQprepare(conn, "sel1", "SELECT $1;", 1, types);
        if (PQresultStatus(res) != PGRES_COMMAND_OK)
        {
                fprintf(stderr, "prepared failed: %s", PQerrorMessage(conn));
                PQclear(res);
                exit_nicely(conn);
        }
        PQclear(res);

        val[0] = "a'b";
        val[1] = "9";
        res = PQexecPrepared(conn, "sel1", 1, val, NULL, NULL, 0);
        if (PQresultStatus(res) != PGRES_TUPLES_OK)
        {
                fprintf(stderr, "exec 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 connection to the database and cleanup */
        PQfinish(conn);

        return 0;
}
---------------------------(end of broadcast)---------------------------
TIP 2: Don't 'kill -9' the postmaster

Reply via email to