/*
 * test program to demonstrate connection hangs
 */
#include <stdio.h>
#include "libpq-fe.h"

static int tries = 0;
static int successes = 0;

void logmsg(const char *msg) {
    char timestamp[256];
    time_t t;
    
    t = time(NULL);
    strcpy(timestamp, asctime(localtime(&t)));
    timestamp[strlen(timestamp)-1] = '\0';
    fprintf(stderr,"%s [%d]  %s\n", timestamp, getpid(), msg);
    fflush(stderr);
}

const char* get_dbhname(PGconn *conn, char *dbhname)
{
    sprintf(dbhname, "%s@%s:%s:%s:%d", 
        PQuser(conn), PQhost(conn), PQport(conn), 
        PQdb(conn), PQbackendPID(conn));
    return dbhname;
}

main()
{
    char        msg[1024];
    char        dbhname[1024];

    PGconn     *conn;
    PGresult   *res;

    if ( ! (getenv("PGPORT") && getenv("PGHOST") &&
            getenv("PGUSER") && getenv("PGDATABASE") ) ) {
        logmsg("Please export PGPORT, PGUSER, PGHOST, and PGDATABASE for me.");
        exit(-1);
    }

    sprintf(dbhname, "%s@%s:%s:db=%s",
            getenv("PGUSER"), getenv("PGHOST"), 
            getenv("PGPORT"), getenv("PGDATABASE"));

    while ( 1 ) {
        tries++;
        sprintf(msg,"[%d/%d] Connecting to %s", tries, successes, dbhname);
        logmsg(msg);
        conn = PQconnectdb("connect_timeout=30");

        if (PQstatus(conn) == CONNECTION_BAD)
        {
            sprintf(msg, "Connection to database '%s' failed.", 
                    getenv("PGDATABASE"));
            logmsg(msg);
            sprintf(msg, "%s", PQerrorMessage(conn));
            logmsg(msg);
            PQfinish(conn);
            return 0;
        }

        successes++;
        res = PQexec(conn, "SELECT version()");
        if (!res || PQresultStatus(res) != PGRES_TUPLES_OK)
        {
            sprintf(msg, "SELECT query failed");
            logmsg(msg);
            PQclear(res);
            PQfinish(conn);
            return 0;
        }
        PQclear(res);
        sprintf(msg,"[%d/%d] Closing connection to %s", 
                tries, successes, get_dbhname(conn,dbhname));
        logmsg(msg);
        PQfinish(conn);
    }

    return 0;
}
