X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Futils_db_query.c;h=5f892a408b0c49f14e4560ad34100bfadfa0f398;hb=3b4201d2235c25ed21174c41c526c9b7894de539;hp=33107649f1f7be1b298b6f49c4c5084534530c7e;hpb=bcdb011cfc86a3a7317128a969bfe6fd57cd063b;p=collectd.git diff --git a/src/utils_db_query.c b/src/utils_db_query.c index 33107649..5f892a40 100644 --- a/src/utils_db_query.c +++ b/src/utils_db_query.c @@ -197,7 +197,7 @@ static int udb_legacy_result_handle_result (udb_result_t *r, /* {{{ */ { value_list_t vl = VALUE_LIST_INIT; value_t value; - char *endptr; + char *value_str; assert (r->legacy_mode == 1); assert (r->ds != NULL); @@ -206,23 +206,14 @@ static int udb_legacy_result_handle_result (udb_result_t *r, /* {{{ */ vl.values = &value; vl.values_len = 1; - endptr = NULL; - errno = 0; - if (r->ds->ds[0].type == DS_TYPE_COUNTER) - vl.values[0].counter = (counter_t) strtoll (column_values[r->legacy_position], - &endptr, /* base = */ 0); - else if (r->ds->ds[0].type == DS_TYPE_GAUGE) - vl.values[0].gauge = (gauge_t) strtod (column_values[r->legacy_position], - &endptr); - else - errno = EINVAL; - - if ((endptr == column_values[r->legacy_position]) || (errno != 0)) + value_str = column_values[r->legacy_position]; + if (0 != parse_value (value_str, &vl.values[0], r->ds->ds[0].type)) { - WARNING ("db query utils: udb_result_submit: Parsing `%s' as %s failed.", - column_values[r->legacy_position], - (r->ds->ds[0].type == DS_TYPE_COUNTER) ? "counter" : "gauge"); - vl.values[0].gauge = NAN; + ERROR ("db query utils: udb_legacy_result_handle_result: " + "Parsing `%s' as %s failed.", value_str, + DS_TYPE_TO_STRING (r->ds->ds[0].type)); + errno = EINVAL; + return (-1); } sstrncpy (vl.host, q->host, sizeof (vl.host)); @@ -351,7 +342,7 @@ static int udb_legacy_result_create (const char *query_name, /* {{{ */ /* * Result private functions */ -static void udb_result_submit (udb_result_t *r, udb_query_t *q) /* {{{ */ +static int udb_result_submit (udb_result_t *r, udb_query_t *q) /* {{{ */ { value_list_t vl = VALUE_LIST_INIT; size_t i; @@ -361,42 +352,24 @@ static void udb_result_submit (udb_result_t *r, udb_query_t *q) /* {{{ */ assert (r->ds != NULL); assert (((size_t) r->ds->ds_num) == r->values_num); - DEBUG ("db query utils: udb_result_submit: r->instance_prefix = %s;", - (r->instance_prefix == NULL) ? "NULL" : r->instance_prefix); - for (i = 0; i < r->instances_num; i++) - { - DEBUG ("db query utils: udb_result_submit: r->instances_buffer[%zu] = %s;", - i, r->instances_buffer[i]); - } - vl.values = (value_t *) calloc (r->ds->ds_num, sizeof (value_t)); if (vl.values == NULL) { ERROR ("db query utils: malloc failed."); - return; + return (-1); } vl.values_len = r->ds->ds_num; for (i = 0; i < r->values_num; i++) { - char *endptr; - - endptr = NULL; - errno = 0; - if (r->ds->ds[i].type == DS_TYPE_COUNTER) - vl.values[i].counter = (counter_t) strtoll (r->values_buffer[i], - &endptr, /* base = */ 0); - else if (r->ds->ds[i].type == DS_TYPE_GAUGE) - vl.values[i].gauge = (gauge_t) strtod (r->values_buffer[i], &endptr); - else - errno = EINVAL; + char *value_str = r->values_buffer[i]; - if ((endptr == r->values_buffer[i]) || (errno != 0)) + if (0 != parse_value (value_str, &vl.values[i], r->ds->ds[i].type)) { - WARNING ("db query utils: udb_result_submit: Parsing `%s' as %s failed.", - r->values_buffer[i], - (r->ds->ds[i].type == DS_TYPE_COUNTER) ? "counter" : "gauge"); - vl.values[i].gauge = NAN; + ERROR ("db query utils: udb_result_submit: Parsing `%s' as %s failed.", + value_str, DS_TYPE_TO_STRING (r->ds->ds[i].type)); + errno = EINVAL; + return (-1); } } @@ -405,26 +378,40 @@ static void udb_result_submit (udb_result_t *r, udb_query_t *q) /* {{{ */ sstrncpy (vl.plugin_instance, q->db_name, sizeof (vl.type_instance)); sstrncpy (vl.type, r->type, sizeof (vl.type)); - if (r->instance_prefix == NULL) + /* Set vl.type_instance {{{ */ + if (r->instances_num <= 0) { - strjoin (vl.type_instance, sizeof (vl.type_instance), - r->instances_buffer, r->instances_num, "-"); + if (r->instance_prefix == NULL) + vl.type_instance[0] = 0; + else + sstrncpy (vl.type_instance, r->instance_prefix, + sizeof (vl.type_instance)); } - else + else /* if ((r->instances_num > 0) */ { - char tmp[DATA_MAX_NAME_LEN]; + if (r->instance_prefix == NULL) + { + strjoin (vl.type_instance, sizeof (vl.type_instance), + r->instances_buffer, r->instances_num, "-"); + } + else + { + char tmp[DATA_MAX_NAME_LEN]; - strjoin (tmp, sizeof (tmp), r->instances_buffer, r->instances_num, "-"); - tmp[sizeof (tmp) - 1] = 0; + strjoin (tmp, sizeof (tmp), r->instances_buffer, r->instances_num, "-"); + tmp[sizeof (tmp) - 1] = 0; - snprintf (vl.type_instance, sizeof (vl.type_instance), "%s-%s", - r->instance_prefix, tmp); + snprintf (vl.type_instance, sizeof (vl.type_instance), "%s-%s", + r->instance_prefix, tmp); + } } vl.type_instance[sizeof (vl.type_instance) - 1] = 0; + /* }}} */ plugin_dispatch_values (&vl); sfree (vl.values); + return (0); } /* }}} void udb_result_submit */ static void udb_result_finish_result (udb_result_t *r) /* {{{ */ @@ -463,9 +450,7 @@ static int udb_result_handle_result (udb_result_t *r, /* {{{ */ for (i = 0; i < r->values_num; i++) r->values_buffer[i] = column_values[r->values_pos[i]]; - udb_result_submit (r, q); - - return (0); + return udb_result_submit (r, q); } /* }}} int udb_result_handle_result */ static int udb_result_prepare_result (udb_result_t *r, /* {{{ */ @@ -517,12 +502,22 @@ static int udb_result_prepare_result (udb_result_t *r, /* {{{ */ /* Allocate r->instances_pos, r->values_pos, r->instances_buffer, and * r->values_buffer {{{ */ - r->instances_pos = (size_t *) calloc (r->instances_num, sizeof (size_t)); - if (r->instances_pos == NULL) + if (r->instances_num > 0) { - ERROR ("db query utils: udb_result_prepare_result: malloc failed."); - BAIL_OUT (-ENOMEM); - } + r->instances_pos = (size_t *) calloc (r->instances_num, sizeof (size_t)); + if (r->instances_pos == NULL) + { + ERROR ("db query utils: udb_result_prepare_result: malloc failed."); + BAIL_OUT (-ENOMEM); + } + + r->instances_buffer = (char **) calloc (r->instances_num, sizeof (char *)); + if (r->instances_buffer == NULL) + { + ERROR ("db query utils: udb_result_prepare_result: malloc failed."); + BAIL_OUT (-ENOMEM); + } + } /* if (r->instances_num > 0) */ r->values_pos = (size_t *) calloc (r->values_num, sizeof (size_t)); if (r->values_pos == NULL) @@ -531,13 +526,6 @@ static int udb_result_prepare_result (udb_result_t *r, /* {{{ */ BAIL_OUT (-ENOMEM); } - r->instances_buffer = (char **) calloc (r->instances_num, sizeof (char *)); - if (r->instances_buffer == NULL) - { - ERROR ("db query utils: udb_result_prepare_result: malloc failed."); - BAIL_OUT (-ENOMEM); - } - r->values_buffer = (char **) calloc (r->values_num, sizeof (char *)); if (r->values_buffer == NULL) { @@ -679,12 +667,6 @@ static int udb_result_create (const char *query_name, /* {{{ */ "result in query `%s'", query_name); status = -1; } - if (r->instances == NULL) - { - WARNING ("db query utils: `InstancesFrom' not given for " - "result in query `%s'", query_name); - status = -1; - } if (r->values == NULL) { WARNING ("db query utils: `ValuesFrom' not given for "