X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Futils_db_query.c;h=1bd5b21664d85653b5c427a36c5be70fe9208b30;hb=c4265fb5a792db45b84ed3e2f93b871ac51af3d5;hp=27e8a55f9a94aeeb88758bacd007fb5bd8fe97eb;hpb=4c9b0f6dd36455ad853af1b5b2b1a63f6964cbfd;p=collectd.git diff --git a/src/utils_db_query.c b/src/utils_db_query.c index 27e8a55f..1bd5b216 100644 --- a/src/utils_db_query.c +++ b/src/utils_db_query.c @@ -55,6 +55,9 @@ struct udb_query_s /* {{{ */ char *statement; void *user_data; + unsigned int min_version; + unsigned int max_version; + /* Preparation area */ size_t column_num; char *host; @@ -144,6 +147,27 @@ static int udb_config_add_string (char ***ret_array, /* {{{ */ return (0); } /* }}} int udb_config_add_string */ +static int udb_config_set_uint (unsigned int *ret_value, /* {{{ */ + oconfig_item_t *ci) +{ + double tmp; + + if ((ci->values_num != 1) + || (ci->values[0].type != OCONFIG_TYPE_NUMBER)) + { + WARNING ("db query utils: The `%s' config option " + "needs exactly one numeric argument.", ci->key); + return (-1); + } + + tmp = ci->values[0].value.number; + if ((tmp < 0.0) || (tmp > ((double) UINT_MAX))) + return (-ERANGE); + + *ret_value = (unsigned int) (tmp + .5); + return (0); +} /* }}} int udb_config_set_uint */ + /* * Result private functions */ @@ -545,6 +569,8 @@ int udb_query_create (udb_query_t ***ret_query_list, /* {{{ */ return (-1); } memset (q, 0, sizeof (*q)); + q->min_version = 0; + q->max_version = UINT_MAX; status = udb_config_set_string (&q->name, ci); if (status != 0) @@ -562,6 +588,10 @@ int udb_query_create (udb_query_t ***ret_query_list, /* {{{ */ status = udb_config_set_string (&q->statement, child); else if (strcasecmp ("Result", child->key) == 0) status = udb_result_create (q->name, &q->results, child); + else if (strcasecmp ("MinVersion", child->key) == 0) + status = udb_config_set_uint (&q->min_version, child); + else if (strcasecmp ("MaxVersion", child->key) == 0) + status = udb_config_set_uint (&q->max_version, child); else { WARNING ("db query utils: Query `%s': Option `%s' not allowed here.", @@ -726,6 +756,17 @@ void *udb_query_get_user_data (udb_query_t *q) /* {{{ */ return (q->user_data); } /* }}} void *udb_query_get_user_data */ +int udb_query_check_version (udb_query_t *q, unsigned int version) /* {{{ */ +{ + if (q == NULL) + return (-EINVAL); + + if ((version < q->min_version) || (version > q->max_version)) + return (0); + + return (1); +} /* }}} int udb_query_check_version */ + void udb_query_finish_result (udb_query_t *q) /* {{{ */ { udb_result_t *r;