X-Git-Url: https://git.octo.it/?p=collection4.git;a=blobdiff_plain;f=src%2Fgraph_def.c;h=c7ecb988069299e233421659882fa6a3028b2219;hp=197c6b50fb55074185045ec2fb8c158ebe1071e7;hb=8db49fed11e36674ff6f4d51b44e5cf0c8fc40ee;hpb=8a3753760230b270c8f4615891cba2586a661d21 diff --git a/src/graph_def.c b/src/graph_def.c index 197c6b5..c7ecb98 100644 --- a/src/graph_def.c +++ b/src/graph_def.c @@ -1,3 +1,26 @@ +/** + * collection4 - graph_def.c + * Copyright (C) 2010 Florian octo Forster + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301 USA + * + * Authors: + * Florian octo Forster + **/ + #include #include #include @@ -125,6 +148,43 @@ static graph_def_t *def_config_get_obj (graph_config_t *cfg, /* {{{ */ return (def); } /* }}} graph_def_t *def_config_get_obj */ +static int def_to_json_recursive (const graph_def_t *def, /* {{{ */ + yajl_gen handler) +{ + char color[16]; + + if (def == NULL) + return (0); + + snprintf (color, sizeof (color), "#%06"PRIx32, def->color); + color[sizeof (color) - 1] = 0; + + yajl_gen_map_open (handler); + +#define yajl_gen_string_cast(h,p,l) \ + yajl_gen_string (h, (unsigned char *) p, (unsigned int) l) + + yajl_gen_string_cast (handler, "select", strlen ("select")); + ident_to_json (def->select, handler); + yajl_gen_string_cast (handler, "ds_name", strlen ("ds_name")); + yajl_gen_string_cast (handler, def->ds_name, strlen (def->ds_name)); + yajl_gen_string_cast (handler, "legend", strlen ("legend")); + yajl_gen_string_cast (handler, def->legend, strlen (def->legend)); + yajl_gen_string_cast (handler, "color", strlen ("color")); + yajl_gen_string_cast (handler, color, strlen (color)); + yajl_gen_string_cast (handler, "stack", strlen ("stack")); + yajl_gen_bool (handler, def->stack); + yajl_gen_string_cast (handler, "area", strlen ("area")); + yajl_gen_bool (handler, def->area); + yajl_gen_string_cast (handler, "format", strlen ("format")); + yajl_gen_string_cast (handler, def->format, strlen (def->format)); + + yajl_gen_map_close (handler); + + return (def_to_json_recursive (def->next, handler)); +#undef yajl_gen_string_cast +} /* }}} int def_to_json_recursive */ + /* * Public functions */ @@ -135,15 +195,22 @@ graph_def_t *def_create (graph_config_t *cfg, graph_ident_t *ident, /* {{{ */ graph_def_t *ret; if ((cfg == NULL) || (ident == NULL) || (ds_name == NULL)) + { + fprintf (stderr, "def_create: An argument is NULL\n"); return (NULL); + } selector = graph_get_selector (cfg); if (selector == NULL) + { + fprintf (stderr, "def_create: graph_get_selector failed\n"); return (NULL); + } ret = malloc (sizeof (*ret)); if (ret == NULL) { + fprintf (stderr, "def_create: malloc failed\n"); ident_destroy (selector); return (NULL); } @@ -154,18 +221,20 @@ graph_def_t *def_create (graph_config_t *cfg, graph_ident_t *ident, /* {{{ */ ret->ds_name = strdup (ds_name); if (ret->ds_name == NULL) { + fprintf (stderr, "def_create: Unable to copy DS name\n"); ident_destroy (selector); free (ret); return (NULL); } - ret->color = get_random_color (); + ret->color = UINT32_MAX; ret->next = NULL; ret->select = ident_copy_with_selector (selector, ident, IDENT_FLAG_REPLACE_ALL); if (ret->select == NULL) { + fprintf (stderr, "def_create: ident_copy_with_selector failed\n"); ident_destroy (selector); free (ret->ds_name); free (ret); @@ -291,6 +360,9 @@ int def_get_rrdargs (graph_def_t *def, graph_ident_t *ident, /* {{{ */ { char *file; int index; + char draw_def[64]; + char legend[256]; + uint32_t color; if ((def == NULL) || (ident == NULL) || (args == NULL)) return (EINVAL); @@ -304,6 +376,27 @@ int def_get_rrdargs (graph_def_t *def, graph_ident_t *ident, /* {{{ */ DEBUG ("gl_ident_get_rrdargs: file = %s;\n", file); + if (def->legend != NULL) + { + strncpy (legend, def->legend, sizeof (legend)); + legend[sizeof (legend) - 1] = 0; + } + else + { + ident_describe (ident, def->select, + legend, sizeof (legend)); + + if ((legend[0] == 0) || (strcmp ("default", legend) == 0)) + { + strncpy (legend, def->ds_name, sizeof (legend)); + legend[sizeof (legend) - 1] = 0; + } + } + + color = def->color; + if (color > 0x00ffffff) + color = get_random_color (); + index = args->index; args->index++; @@ -324,24 +417,58 @@ int def_get_rrdargs (graph_def_t *def, graph_ident_t *ident, /* {{{ */ array_append_format (args->data, "VDEF:vdef_%04i_lst=def_%04i_avg,LAST", index, index); + if (def->stack) + { + if (args->last_stack_cdef[0] != 0) + { + array_append_format (args->calc, "CDEF:cdef_%04i_stack=%s,def_%04i_avg,+", + index, args->last_stack_cdef, index); + snprintf (draw_def, sizeof (draw_def), "cdef_%04i_stack", index); + } + else + { + snprintf (draw_def, sizeof (draw_def), "def_%04i_avg", index); + } + } + else + { + snprintf (draw_def, sizeof (draw_def), "def_%04i_avg", index); + } + + if (def->area) + array_prepend_format (args->areas, "AREA:%s#%06"PRIx32, + draw_def, fade_color (color)); + /* Graph part */ - array_append_format (args->draw, "%s:def_%04i_avg#%06"PRIx32":%s%s", - def->area ? "AREA" : "LINE1", - index, def->color, - (def->legend != NULL) ? def->legend : def->ds_name, - def->stack ? ":STACK" : ""); - array_append_format (args->draw, "GPRINT:vdef_%04i_min:%s min,", + array_prepend_format (args->lines, "GPRINT:vdef_%04i_lst:%s last\\l", index, (def->format != NULL) ? def->format : "%6.2lf"); - array_append_format (args->draw, "GPRINT:vdef_%04i_avg:%s avg,", + array_prepend_format (args->lines, "GPRINT:vdef_%04i_max:%s max,", index, (def->format != NULL) ? def->format : "%6.2lf"); - array_append_format (args->draw, "GPRINT:vdef_%04i_max:%s max,", + array_prepend_format (args->lines, "GPRINT:vdef_%04i_avg:%s avg,", index, (def->format != NULL) ? def->format : "%6.2lf"); - array_append_format (args->draw, "GPRINT:vdef_%04i_lst:%s last\\l", + array_prepend_format (args->lines, "GPRINT:vdef_%04i_min:%s min,", index, (def->format != NULL) ? def->format : "%6.2lf"); + array_prepend_format (args->lines, "LINE1:%s#%06"PRIx32":%s", + draw_def, color, legend); free (file); + memcpy (args->last_stack_cdef, draw_def, sizeof (args->last_stack_cdef)); + return (0); } /* }}} int def_get_rrdargs */ +int def_to_json (const graph_def_t *def, /* {{{ */ + yajl_gen handler) +{ + if (handler == NULL) + return (EINVAL); + + yajl_gen_array_open (handler); + def_to_json_recursive (def, handler); + yajl_gen_array_close (handler); + + return (0); +} /* }}} int def_to_json */ + /* vim: set sw=2 sts=2 et fdm=marker : */