X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Futils_db_query.c;h=5f892a408b0c49f14e4560ad34100bfadfa0f398;hb=4b357298a23cfb0583851e7cd5cc937470949623;hp=e1ed7e6de6535b1e59cc7c91fae1474738b8bb4d;hpb=0bd2ee0aaa95cef6155ba0418ddcc1f68bfa7521;p=collectd.git diff --git a/src/utils_db_query.c b/src/utils_db_query.c index e1ed7e6d..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 " @@ -918,63 +900,90 @@ void udb_query_free (udb_query_t **query_list, size_t query_list_len) /* {{{ */ sfree (query_list); } /* }}} void udb_query_free */ -int udb_query_pick_from_list (oconfig_item_t *ci, /* {{{ */ +int udb_query_pick_from_list_by_name (const char *name, /* {{{ */ udb_query_t **src_list, size_t src_list_len, udb_query_t ***dst_list, size_t *dst_list_len) { - const char *name; - udb_query_t *q; - udb_query_t **tmp_list; - size_t tmp_list_len; size_t i; + int num_added; - if ((ci == NULL) || (src_list == NULL) || (dst_list == NULL) + if ((name == NULL) || (src_list == NULL) || (dst_list == NULL) || (dst_list_len == NULL)) { - ERROR ("db query utils: Invalid argument."); + ERROR ("db query utils: udb_query_pick_from_list_by_name: " + "Invalid argument."); return (-EINVAL); } - if ((ci->values_num != 1) - || (ci->values[0].type != OCONFIG_TYPE_STRING)) + num_added = 0; + for (i = 0; i < src_list_len; i++) { - ERROR ("db query utils: The `%s' config option " - "needs exactly one string argument.", ci->key); - return (-1); - } - name = ci->values[0].value.string; + udb_query_t **tmp_list; + size_t tmp_list_len; - q = NULL; - for (i = 0; i < src_list_len; i++) - if (strcasecmp (name, src_list[i]->name) == 0) + if (strcasecmp (name, src_list[i]->name) != 0) + continue; + + tmp_list_len = *dst_list_len; + tmp_list = (udb_query_t **) realloc (*dst_list, (tmp_list_len + 1) + * sizeof (udb_query_t *)); + if (tmp_list == NULL) { - q = src_list[i]; - break; + ERROR ("db query utils: realloc failed."); + return (-ENOMEM); } - if (q == NULL) + tmp_list[tmp_list_len] = src_list[i]; + tmp_list_len++; + + *dst_list = tmp_list; + *dst_list_len = tmp_list_len; + + num_added++; + } /* for (i = 0; i < src_list_len; i++) */ + + if (num_added <= 0) { - ERROR ("db query utils: Cannot find query `%s'. Make sure the <%s> " + ERROR ("db query utils: Cannot find query `%s'. Make sure the " "block is above the database definition!", - name, ci->key); + name); return (-ENOENT); } + else + { + DEBUG ("db query utils: Added %i versions of query `%s'.", + num_added, name); + } - tmp_list_len = *dst_list_len; - tmp_list = (udb_query_t **) realloc (*dst_list, (tmp_list_len + 1) - * sizeof (udb_query_t *)); - if (tmp_list == NULL) + return (0); +} /* }}} int udb_query_pick_from_list_by_name */ + +int udb_query_pick_from_list (oconfig_item_t *ci, /* {{{ */ + udb_query_t **src_list, size_t src_list_len, + udb_query_t ***dst_list, size_t *dst_list_len) +{ + const char *name; + + if ((ci == NULL) || (src_list == NULL) || (dst_list == NULL) + || (dst_list_len == NULL)) { - ERROR ("db query utils: realloc failed."); - return (-ENOMEM); + ERROR ("db query utils: udb_query_pick_from_list: " + "Invalid argument."); + return (-EINVAL); } - tmp_list[tmp_list_len] = q; - tmp_list_len++; - *dst_list = tmp_list; - *dst_list_len = tmp_list_len; + if ((ci->values_num != 1) + || (ci->values[0].type != OCONFIG_TYPE_STRING)) + { + ERROR ("db query utils: The `%s' config option " + "needs exactly one string argument.", ci->key); + return (-1); + } + name = ci->values[0].value.string; - return (0); + return (udb_query_pick_from_list_by_name (name, + src_list, src_list_len, + dst_list, dst_list_len)); } /* }}} int udb_query_pick_from_list */ const char *udb_query_get_name (udb_query_t *q) /* {{{ */