contrib/docker: add LD_PRELOAD wrapper to fopen/open/opendir syscalls
[collectd.git] / src / postgresql.c
index b4b4ca7..8b60949 100644 (file)
  */
 
 #include "collectd.h"
+
 #include "common.h"
 
-#include "configfile.h"
 #include "plugin.h"
 
 #include "utils_cache.h"
 #include "utils_db_query.h"
 #include "utils_complain.h"
 
-#if HAVE_PTHREAD_H
-# include <pthread.h>
-#endif
-
 #include <pg_config_manual.h>
 #include <libpq-fe.h>
 
@@ -224,7 +220,7 @@ static c_psql_database_t *c_psql_database_new (const char *name)
                return NULL;
        }
 
-       tmp = (c_psql_database_t **)realloc (databases,
+       tmp = realloc (databases,
                        (databases_num + 1) * sizeof (*databases));
        if (NULL == tmp) {
                log_err ("Out of memory.");
@@ -280,8 +276,6 @@ static c_psql_database_t *c_psql_database_new (const char *name)
 
 static void c_psql_database_delete (void *data)
 {
-       size_t i;
-
        c_psql_database_t *db = data;
 
        --db->ref_cnt;
@@ -299,7 +293,7 @@ static void c_psql_database_delete (void *data)
        db->conn = NULL;
 
        if (db->q_prep_areas)
-               for (i = 0; i < db->queries_num; ++i)
+               for (size_t i = 0; i < db->queries_num; ++i)
                        udb_query_delete_preparation_area (db->q_prep_areas[i]);
        free (db->q_prep_areas);
 
@@ -431,14 +425,13 @@ static PGresult *c_psql_exec_query_params (c_psql_database_t *db,
 {
        const char *params[db->max_params_num];
        char        interval[64];
-       int         i;
 
        if ((data == NULL) || (data->params_num == 0))
                return (c_psql_exec_query_noparams (db, q));
 
        assert (db->max_params_num >= data->params_num);
 
-       for (i = 0; i < data->params_num; ++i) {
+       for (int i = 0; i < data->params_num; ++i) {
                switch (data->params[i]) {
                        case C_PSQL_PARAM_HOST:
                                params[i] = C_PSQL_IS_UNIX_DOMAIN_SOCKET (db->host)
@@ -487,7 +480,6 @@ static int c_psql_exec_query (c_psql_database_t *db, udb_query_t *q,
 
        int rows_num;
        int status;
-       int row, col;
 
        /* The user data may hold parameter information, but may be NULL. */
        data = udb_query_get_user_data (q);
@@ -556,7 +548,7 @@ static int c_psql_exec_query (c_psql_database_t *db, udb_query_t *q,
                BAIL_OUT (-1);
        }
 
-       for (col = 0; col < column_num; ++col) {
+       for (int col = 0; col < column_num; ++col) {
                /* Pointers returned by `PQfname' are freed by `PQclear' via
                 * `BAIL_OUT'. */
                column_names[col] = PQfname (res, col);
@@ -581,7 +573,8 @@ static int c_psql_exec_query (c_psql_database_t *db, udb_query_t *q,
                BAIL_OUT (-1);
        }
 
-       for (row = 0; row < rows_num; ++row) {
+       for (int row = 0; row < rows_num; ++row) {
+        int col;
                for (col = 0; col < column_num; ++col) {
                        /* Pointers returned by `PQgetvalue' are freed by `PQclear' via
                         * `BAIL_OUT'. */
@@ -615,7 +608,6 @@ static int c_psql_read (user_data_t *ud)
        c_psql_database_t *db;
 
        int success = 0;
-       size_t i;
 
        if ((ud == NULL) || (ud->data == NULL)) {
                log_err ("c_psql_read: Invalid user data.");
@@ -635,7 +627,7 @@ static int c_psql_read (user_data_t *ud)
                return -1;
        }
 
-       for (i = 0; i < db->queries_num; ++i)
+       for (size_t i = 0; i < db->queries_num; ++i)
        {
                udb_query_preparation_area_t *prep_area;
                udb_query_t *q;
@@ -663,12 +655,11 @@ static char *values_name_to_sqlarray (const data_set_t *ds,
 {
        char  *str_ptr;
        size_t str_len;
-       size_t i;
 
        str_ptr = string;
        str_len = string_len;
 
-       for (i = 0; i < ds->ds_num; ++i) {
+       for (size_t i = 0; i < ds->ds_num; ++i) {
                int status = ssnprintf (str_ptr, str_len, ",'%s'", ds->ds[i].name);
 
                if (status < 1)
@@ -701,12 +692,11 @@ static char *values_type_to_sqlarray (const data_set_t *ds,
 {
        char  *str_ptr;
        size_t str_len;
-       size_t i;
 
        str_ptr = string;
        str_len = string_len;
 
-       for (i = 0; i < ds->ds_num; ++i) {
+       for (size_t i = 0; i < ds->ds_num; ++i) {
                int status;
 
                if (store_rates)
@@ -749,12 +739,11 @@ static char *values_to_sqlarray (const data_set_t *ds, const value_list_t *vl,
        size_t str_len;
 
        gauge_t *rates = NULL;
-       size_t i;
 
        str_ptr = string;
        str_len = string_len;
 
-       for (i = 0; i < vl->values_len; ++i) {
+       for (size_t i = 0; i < vl->values_len; ++i) {
                int status = 0;
 
                if ((ds->ds[i].type != DS_TYPE_GAUGE)
@@ -834,7 +823,6 @@ static int c_psql_write (const data_set_t *ds, const value_list_t *vl,
        const char *params[9];
 
        int success = 0;
-       size_t i;
 
        if ((ud == NULL) || (ud->data == NULL)) {
                log_err ("c_psql_write: Invalid user data.");
@@ -845,7 +833,7 @@ static int c_psql_write (const data_set_t *ds, const value_list_t *vl,
        assert (db->database != NULL);
        assert (db->writers != NULL);
 
-       if (rfc3339nano (time_str, sizeof (time_str), vl->time) != 0) {
+       if (rfc3339nano_local (time_str, sizeof (time_str), vl->time) != 0) {
                log_err ("c_psql_write: Failed to convert time to RFC 3339 format");
                return -1;
        }
@@ -883,7 +871,7 @@ static int c_psql_write (const data_set_t *ds, const value_list_t *vl,
                        && (db->next_commit == 0))
                c_psql_begin (db);
 
-       for (i = 0; i < db->writers_num; ++i) {
+       for (size_t i = 0; i < db->writers_num; ++i) {
                c_psql_writer_t *writer;
                PGresult *res;
 
@@ -971,14 +959,13 @@ static int c_psql_flush (cdtime_t timeout,
 {
        c_psql_database_t **dbs = databases;
        size_t dbs_num = databases_num;
-       size_t i;
 
        if ((ud != NULL) && (ud->data != NULL)) {
                dbs = (void *)&ud->data;
                dbs_num = 1;
        }
 
-       for (i = 0; i < dbs_num; ++i) {
+       for (size_t i = 0; i < dbs_num; ++i) {
                c_psql_database_t *db = dbs[i];
 
                /* don't commit if the timeout is larger than the regular commit
@@ -992,13 +979,11 @@ static int c_psql_flush (cdtime_t timeout,
 
 static int c_psql_shutdown (void)
 {
-       size_t i = 0;
-
        _Bool had_flush = 0;
 
        plugin_unregister_read_group ("postgresql");
 
-       for (i = 0; i < databases_num; ++i) {
+       for (size_t i = 0; i < databases_num; ++i) {
                c_psql_database_t *db = databases[i];
 
                if (db->writers_num > 0) {
@@ -1115,7 +1100,7 @@ static int config_add_writer (oconfig_item_t *ci,
                if (strcasecmp (name, src_writers[i].name) != 0)
                        continue;
 
-               tmp = (c_psql_writer_t **)realloc (*dst_writers,
+               tmp = realloc (*dst_writers,
                                sizeof (**dst_writers) * (*dst_writers_num + 1));
                if (tmp == NULL) {
                        log_err ("Out of memory.");
@@ -1143,7 +1128,6 @@ static int c_psql_config_writer (oconfig_item_t *ci)
        c_psql_writer_t *tmp;
 
        int status = 0;
-       int i;
 
        if ((ci->values_num != 1)
                        || (ci->values[0].type != OCONFIG_TYPE_STRING)) {
@@ -1151,7 +1135,7 @@ static int c_psql_config_writer (oconfig_item_t *ci)
                return 1;
        }
 
-       tmp = (c_psql_writer_t *)realloc (writers,
+       tmp = realloc (writers,
                        sizeof (*writers) * (writers_num + 1));
        if (tmp == NULL) {
                log_err ("Out of memory.");
@@ -1166,7 +1150,7 @@ static int c_psql_config_writer (oconfig_item_t *ci)
        writer->statement = NULL;
        writer->store_rates = 1;
 
-       for (i = 0; i < ci->children_num; ++i) {
+       for (int i = 0; i < ci->children_num; ++i) {
                oconfig_item_t *c = ci->children + i;
 
                if (strcasecmp ("Statement", c->key) == 0)
@@ -1192,25 +1176,19 @@ static int c_psql_config_database (oconfig_item_t *ci)
        c_psql_database_t *db;
 
        char cb_name[DATA_MAX_NAME_LEN];
-       user_data_t ud;
-
        static _Bool have_flush = 0;
 
-       int i;
-
        if ((1 != ci->values_num)
                        || (OCONFIG_TYPE_STRING != ci->values[0].type)) {
                log_err ("<Database> expects a single string argument.");
                return 1;
        }
 
-       memset (&ud, 0, sizeof (ud));
-
        db = c_psql_database_new (ci->values[0].value.string);
        if (db == NULL)
                return -1;
 
-       for (i = 0; i < ci->children_num; ++i) {
+       for (int i = 0; i < ci->children_num; ++i) {
                oconfig_item_t *c = ci->children + i;
 
                if (0 == strcasecmp (c->key, "Host"))
@@ -1247,7 +1225,7 @@ static int c_psql_config_database (oconfig_item_t *ci)
 
        /* If no `Query' options were given, add the default queries.. */
        if ((db->queries_num == 0) && (db->writers_num == 0)){
-               for (i = 0; i < def_queries_num; i++)
+               for (int i = 0; i < def_queries_num; i++)
                        udb_query_pick_from_list_by_name (def_queries[i],
                                        queries, queries_num,
                                        &db->queries, &db->queries_num);
@@ -1264,7 +1242,7 @@ static int c_psql_config_database (oconfig_item_t *ci)
                }
        }
 
-       for (i = 0; (size_t)i < db->queries_num; ++i) {
+       for (int i = 0; (size_t)i < db->queries_num; ++i) {
                c_psql_user_data_t *data;
                data = udb_query_get_user_data (db->queries[i]);
                if ((data != NULL) && (data->params_num > db->max_params_num))
@@ -1280,11 +1258,13 @@ static int c_psql_config_database (oconfig_item_t *ci)
                }
        }
 
-       ud.data = db;
-       ud.free_func = c_psql_database_delete;
-
        ssnprintf (cb_name, sizeof (cb_name), "postgresql-%s", db->instance);
 
+       user_data_t ud = {
+               .data = db,
+               .free_func = c_psql_database_delete
+       };
+
        if (db->queries_num > 0) {
                ++db->ref_cnt;
                plugin_register_complex_read ("postgresql", cb_name, c_psql_read,
@@ -1317,8 +1297,6 @@ static int c_psql_config (oconfig_item_t *ci)
 {
        static int have_def_config = 0;
 
-       int i;
-
        if (0 == have_def_config) {
                oconfig_item_t *c;
 
@@ -1335,7 +1313,7 @@ static int c_psql_config (oconfig_item_t *ci)
                                        "any queries - please check your installation.");
        }
 
-       for (i = 0; i < ci->children_num; ++i) {
+       for (int i = 0; i < ci->children_num; ++i) {
                oconfig_item_t *c = ci->children + i;
 
                if (0 == strcasecmp (c->key, "Query"))