Merge branch 'collectd-5.4' into collectd-5.5
[collectd.git] / src / postgresql.c
index 635abfc..23c4af3 100644 (file)
@@ -135,6 +135,7 @@ typedef struct {
        /* writer "caching" settings */
        cdtime_t commit_interval;
        cdtime_t next_commit;
+       cdtime_t expire_delay;
 
        char *host;
        char *port;
@@ -257,6 +258,7 @@ static c_psql_database_t *c_psql_database_new (const char *name)
 
        db->commit_interval = 0;
        db->next_commit     = 0;
+       db->expire_delay    = 0;
 
        db->database   = sstrdup (name);
        db->host       = NULL;
@@ -770,7 +772,7 @@ static char *values_to_sqlarray (const data_set_t *ds, const value_list_t *vl,
 
                if (ds->ds[i].type == DS_TYPE_GAUGE)
                        status = ssnprintf (str_ptr, str_len,
-                                       ",%f", vl->values[i].gauge);
+                                       ","GAUGE_FORMAT, vl->values[i].gauge);
                else if (store_rates) {
                        if (rates == NULL)
                                rates = uc_get_rate (ds, vl);
@@ -867,6 +869,12 @@ static int c_psql_write (const data_set_t *ds, const value_list_t *vl,
 
 #undef VALUE_OR_NULL
 
+       if( db->expire_delay > 0 && vl->time < (cdtime() - vl->interval - db->expire_delay) ) {
+               log_info ("c_psql_write: Skipped expired value @ %s - %s/%s-%s/%s-%s/%s", 
+                       params[0], params[1], params[2], params[3], params[4], params[5], params[6] );
+               return 0;
+        }
+
        pthread_mutex_lock (&db->db_lock);
 
        if (0 != c_psql_check_connection (db)) {
@@ -1037,17 +1045,19 @@ static int config_query_param_add (udb_query_t *q, oconfig_item_t *ci)
 
        data = udb_query_get_user_data (q);
        if (NULL == data) {
-               data = (c_psql_user_data_t *) smalloc (sizeof (*data));
+               data = malloc (sizeof (*data));
                if (NULL == data) {
                        log_err ("Out of memory.");
                        return -1;
                }
                memset (data, 0, sizeof (*data));
                data->params = NULL;
+               data->params_num = 0;
+
+               udb_query_set_user_data (q, data);
        }
 
-       tmp = (c_psql_param_t *) realloc (data->params,
-                       (data->params_num + 1) * sizeof (c_psql_param_t));
+       tmp = realloc (data->params, (data->params_num + 1) * sizeof (*data->params));
        if (NULL == tmp) {
                log_err ("Out of memory.");
                return -1;
@@ -1071,8 +1081,6 @@ static int config_query_param_add (udb_query_t *q, oconfig_item_t *ci)
        }
 
        data->params_num++;
-       udb_query_set_user_data (q, data);
-
        return (0);
 } /* config_query_param_add */
 
@@ -1156,7 +1164,7 @@ static int c_psql_config_writer (oconfig_item_t *ci)
 
        writers = tmp;
        writer  = writers + writers_num;
-       ++writers_num;
+       memset (writer, 0, sizeof (*writer));
 
        writer->name = sstrdup (ci->values[0].value.string);
        writer->statement = NULL;
@@ -1176,10 +1184,10 @@ static int c_psql_config_writer (oconfig_item_t *ci)
        if (status != 0) {
                sfree (writer->statement);
                sfree (writer->name);
-               sfree (writer);
                return status;
        }
 
+       ++writers_num;
        return 0;
 } /* c_psql_config_writer */
 
@@ -1236,6 +1244,8 @@ static int c_psql_config_database (oconfig_item_t *ci)
                        cf_util_get_cdtime (c, &db->interval);
                else if (strcasecmp ("CommitInterval", c->key) == 0)
                        cf_util_get_cdtime (c, &db->commit_interval);
+               else if (strcasecmp ("ExpireDelay", c->key) == 0)
+                       cf_util_get_cdtime (c, &db->expire_delay);
                else
                        log_warn ("Ignoring unknown config key \"%s\".", c->key);
        }