#include <postgresql/libpq-fe.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

void
reconnect (PGconn** dbh, const char* connInfo)
{
    if (*dbh) PQfinish (*dbh);
    *dbh = PQconnectdb (connInfo);
}

void
reset (PGconn** dbh, const char* connInfo)
{
    PQreset (*dbh);
}

int
main (int argc, char** argv)
{
    if (argc < 2) {
        fprintf (stderr, "Usage: %s CONN-INFO\n", argv[0]);
        exit (1);
    }

    const char* connInfo = argv[1];
    PGconn* dbh = 0;
    reconnect (&dbh, connInfo);

    while (1) {
        if (PQstatus (dbh) != CONNECTION_OK) {
            fprintf (stderr, "Error: %s\n", PQerrorMessage (dbh));
            /* Change this to "reconnect" and you get only the most
             * recent error, not an ever-growing cascade */
            reset (&dbh, connInfo);
        } else {
            PGresult* res = PQexec (dbh, "select now()");
            if (PQresultStatus (res) != PGRES_TUPLES_OK) {
                fprintf (stderr, "Query error: %s\n", PQresultErrorMessage (res));
            } else {
                putc ('.', stdout);
                fflush (stdout);
            }
            if (res) PQclear (res);
        }
        sleep (1);
    }

    if (dbh) PQfinish (dbh);
    exit (0);
}
