Re: [HACKERS] Extended protocol logging - Mailing list pgsql-patches
From | Bruce Momjian |
---|---|
Subject | Re: [HACKERS] Extended protocol logging |
Date | |
Msg-id | 200611162319.kAGNJYp08860@momjian.us Whole thread Raw |
Responses |
Re: [HACKERS] Extended protocol logging
|
List | pgsql-patches |
Simon Riggs wrote: > On Wed, 2006-11-01 at 10:06 -0500, Tom Lane wrote: > > "Simon Riggs" <simon@2ndquadrant.com> 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 bruce@momjian.us 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; }
pgsql-patches by date: