/* * repmgr-action-cluster.c * * Implements cluster information actions for the repmgr command line utility * * Copyright (c) 2ndQuadrant, 2010-2017 */ #include "repmgr.h" #include "repmgr-client-global.h" #include "repmgr-action-cluster.h" /* * CLUSTER EVENT * * Parameters: * --limit[=20] * --all * --node_[id|name] * --event */ void do_cluster_event(void) { PGconn *conn; PQExpBufferData query; PQExpBufferData where_clause; PGresult *res; int i; conn = establish_db_connection(config_file_options.conninfo, true); initPQExpBuffer(&query); initPQExpBuffer(&where_clause); appendPQExpBuffer(&query, " SELECT node_id, event, successful, \n" " TO_CHAR(event_timestamp, 'YYYY-MM-DD HH24:MI:SS') AS timestamp, \n" " details \n" " FROM repmgr.events"); if (runtime_options.node_id != UNKNOWN_NODE_ID) { append_where_clause(&where_clause, "node_id=%i", runtime_options.node_id); } if (runtime_options.event[0] != '\0') { char *escaped = escape_string(conn, runtime_options.event); if (escaped == NULL) { log_error(_("unable to escape value provided for event")); } else { append_where_clause(&where_clause, "event='%s'", escaped); pfree(escaped); } } appendPQExpBuffer(&query, "\n%s\n", where_clause.data); appendPQExpBuffer(&query, " ORDER BY event_timestamp DESC"); if (runtime_options.all == false && runtime_options.limit > 0) { appendPQExpBuffer(&query, " LIMIT %i", runtime_options.limit); } log_debug("do_cluster_event():\n%s", query.data); res = PQexec(conn, query.data); if (PQresultStatus(res) != PGRES_TUPLES_OK) { log_error(_("unable to execute event query:\n %s"), PQerrorMessage(conn)); PQclear(res); PQfinish(conn); exit(ERR_DB_QUERY); } if (PQntuples(res) == 0) { printf(_("no matching events found\n")); PQclear(res); PQfinish(conn); return; } /* XXX improve formatting */ puts("node_id,event,ok,timestamp,details"); puts("----------------------------------"); for(i = 0; i < PQntuples(res); i++) { printf("%s,%s,%s,%s,%s\n", PQgetvalue(res, i, 0), PQgetvalue(res, i, 1), PQgetvalue(res, i, 2), PQgetvalue(res, i, 3), PQgetvalue(res, i, 4)); } PQclear(res); PQfinish(conn); }