diff --git a/src/utils_search.c b/src/utils_search.c
index cb01a41268921f529d27494bf1453cdcaa79d1df..84c9035609fa26452c219c7993b1ddfbe1c7456f 100644 (file)
--- a/src/utils_search.c
+++ b/src/utils_search.c
#include <stdio.h>
#include <string.h>
#include <ctype.h>
+#include <errno.h>
#include "utils_search.h"
+#include "graph_ident.h"
+#include "graph_instance.h"
#include "utils_array.h"
#include <fcgiapp.h>
str_array_t *terms;
};
+/*
+ * Private functions
+ */
static char *read_quoted_string (const char **buffer) /* {{{ */
{
const char *ptr = *buffer;
return (ret);
} /* }}} char *next_token */
+static int store_token_field (char **field, const char *token) /* {{{ */
+{
+ char *copy;
+
+ if ((field == NULL) || (token == NULL))
+ return (EINVAL);
+
+ copy = strdup (token);
+ if (copy == NULL)
+ return (ENOMEM);
+
+ free (*field);
+ *field = copy;
+
+ return (0);
+} /* }}} int store_token_field */
+
+static int store_token (search_info_t *si, const char *token) /* {{{ */
+{
+ if (strncmp ("host:", token, strlen ("host:")) == 0)
+ return (store_token_field (&si->host, token + strlen ("host:")));
+ else if (strncmp ("plugin:", token, strlen ("plugin:")) == 0)
+ return (store_token_field (&si->plugin, token + strlen ("plugin:")));
+ else if (strncmp ("plugin_instance:", token, strlen ("plugin_instance:")) == 0)
+ return (store_token_field (&si->plugin_instance, token + strlen ("plugin_instance:")));
+ else if (strncmp ("type:", token, strlen ("type:")) == 0)
+ return (store_token_field (&si->type, token + strlen ("type:")));
+ else if (strncmp ("type_instance:", token, strlen ("type_instance:")) == 0)
+ return (store_token_field (&si->type_instance, token + strlen ("type_instance:")));
+
+ return (array_append (si->terms, token));
+} /* }}} int store_token */
+
+/*
+ * Public functions
+ */
search_info_t *search_parse (const char *search) /* {{{ */
{
const char *ptr;
char *token;
search_info_t *si;
+ if (search == NULL)
+ return (NULL);
+
si = malloc (sizeof (*si));
if (si == NULL)
return (NULL);
while ((token = next_token (&ptr)) != NULL)
{
- array_append (si->terms, token);
-
+ store_token (si, token);
free (token);
}
array_destroy (si->terms);
} /* }}} void search_destroy */
+_Bool search_has_selector (search_info_t *si) /* {{{ */
+{
+ if (si == NULL)
+ return (0);
+
+ if ((si->host != NULL)
+ || (si->plugin != NULL) || (si->plugin_instance != NULL)
+ || (si->type != NULL) || (si->type_instance != NULL))
+ return (1);
+
+ return (0);
+} /* }}} _Bool search_has_selector */
+
+graph_ident_t *search_to_ident (search_info_t *si) /* {{{ */
+{
+ if (si == NULL)
+ return (NULL);
+
+ return (ident_create ((si->host == NULL) ? ANY_TOKEN : si->host,
+ (si->plugin == NULL) ? ANY_TOKEN : si->plugin,
+ (si->plugin_instance == NULL) ? ANY_TOKEN : si->plugin_instance,
+ (si->type == NULL) ? ANY_TOKEN : si->type,
+ (si->type_instance == NULL) ? ANY_TOKEN : si->type_instance));
+} /* }}} graph_ident_t *search_to_ident */
+
+search_info_t *search_from_ident (const graph_ident_t *ident) /* {{{ */
+{
+ search_info_t *si;
+
+ if (ident == NULL)
+ return (NULL);
+
+ si = malloc (sizeof (*si));
+ if (si == NULL)
+ return (NULL);
+ memset (si, 0, sizeof (*si));
+ si->terms = NULL;
+
+#define COPY_FIELD(f) do { \
+ const char *tmp = ident_get_##f (ident); \
+ if (tmp == NULL) \
+ si->f = NULL; \
+ else \
+ si->f = strdup (tmp); \
+} while (0)
+
+ COPY_FIELD(host);
+ COPY_FIELD(plugin);
+ COPY_FIELD(plugin_instance);
+ COPY_FIELD(type);
+ COPY_FIELD(type_instance);
+
+#undef COPY_FIELD
+
+ return (si);
+} /* }}} search_info_t *search_from_ident */
+
+_Bool search_graph_title_matches (search_info_t *si, /* {{{ */
+ const char *title)
+{
+ char **argv;
+ int argc;
+ int i;
+
+ if ((si == NULL) || (title == NULL))
+ return (0);
+
+ if (si->terms == NULL)
+ return (1);
+
+ argc = array_argc (si->terms);
+ argv = array_argv (si->terms);
+ for (i = 0; i < argc; i++)
+ if (strstr (title, argv[i]) == NULL)
+ return (0);
+
+ return (1);
+} /* }}} _Bool search_graph_title_matches */
+
+_Bool search_graph_inst_matches (search_info_t *si, /* {{{ */
+ graph_config_t *cfg, graph_instance_t *inst,
+ const char *title)
+{
+ char **argv;
+ int argc;
+ int i;
+
+ if ((si == NULL) || (cfg == NULL) || (inst == NULL))
+ return (0);
+
+ if ((si->host != NULL)
+ && !inst_matches_field (inst, GIF_HOST, si->host))
+ return (0);
+ else if ((si->plugin != NULL)
+ && !inst_matches_field (inst, GIF_PLUGIN, si->plugin))
+ return (0);
+ else if ((si->plugin_instance != NULL)
+ && !inst_matches_field (inst, GIF_PLUGIN_INSTANCE, si->plugin_instance))
+ return (0);
+ else if ((si->type != NULL)
+ && !inst_matches_field (inst, GIF_TYPE, si->type))
+ return (0);
+ else if ((si->type_instance != NULL)
+ && !inst_matches_field (inst, GIF_TYPE_INSTANCE, si->type_instance))
+ return (0);
+
+ if (si->terms == NULL)
+ return (1);
+
+ argc = array_argc (si->terms);
+ argv = array_argv (si->terms);
+ for (i = 0; i < argc; i++)
+ {
+ if (inst_matches_string (cfg, inst, argv[i]))
+ continue;
+
+ if ((title != NULL) && (strstr (title, argv[i]) != NULL))
+ continue;
+
+ return (0);
+ }
+
+ return (1);
+} /* }}} _Bool search_graph_inst_matches */
+
/* vim: set sw=2 sts=2 et fdm=marker : */