#include <unistd.h>
#include "libpq-fe.h"
char *hostname = "";
char *port = "55432";
char *dbname = "alvherre";
char *username = "alvherre";
char *password = "";
PGconn *
sql_conn(void)
{
PGconn *conn;
conn = PQsetdbLogin(hostname,
port,
NULL,
NULL,
dbname,
username,
password);
if (PQstatus(conn) != CONNECTION_OK)
{
fprintf(stderr, "la conexión a %s falló.\n", dbname);
fprintf(stderr, "%s", PQerrorMessage(conn));
PQfinish(conn);
exit(1);
}
return conn;
}
int
sql_exec(PGconn *conn, const char *sql)
{
PGresult *res;
int nfields;
int nrows;
int i, j, l;
int *length;
char *pad;
res = PQexec(conn, sql);
if (!res || PQresultStatus(res) > 2)
{
fprintf(stderr, "falló la consulta: %s\n", PQerrorMessage(conn));
fprintf(stderr, "la consulta era: %s\n", sql);
PQclear(res);
PQfinish(conn);
exit(-1);
}
nrows = PQntuples(res);
nfields = PQnfields(res);
length = (int *) malloc(sizeof(int) * nfields);
for (j = 0; j < nfields; j++)
length[j] = strlen(PQfname(res, j));
for (i = 0; i < nrows; i++)
{
for (j = 0; j < nfields; j++)
{
l = strlen(PQgetvalue(res, i, j));
if (l > length[j])
length[j] = strlen(PQgetvalue(res, i, j));
}
}
for (j = 0, l = 0; j < nfields; j++)
{
fprintf(stdout, "%*s", length[j] + 2, PQfname(res, j));
l += length[j] + 2;
}
fprintf(stdout, "\n");
pad = (char *) malloc(l + 1);
memset(pad, '-', l);
pad[l] = '\0';
fprintf(stdout, "%s\n", pad);
free(pad);
for (i = 0; i < nrows; i++)
{
for (j = 0; j < nfields; j++)
fprintf(stdout, "%*s", length[j] + 2, PQgetvalue(res, i, j));
fprintf(stdout, "\n");
}
PQclear(res);
free(length);
return 0;
}
int main(int argc, char **argv)
{
PGconn *pgconn;
pgconn = sql_conn();
sql_exec(pgconn, argv[1]);
}