X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Frrd_graph.c;h=ea5d8c3b2be2715c9baa77a07f019c696d04103c;hb=a12627275ff8487174cbb907a066f62a00b6ae44;hp=cb93192598bc98239306e091b035bd38cc6164ba;hpb=d49e24866f6f989a0e3a00a29281f1f9a1a1d54c;p=rrdtool.git diff --git a/src/rrd_graph.c b/src/rrd_graph.c index cb93192..ea5d8c3 100644 --- a/src/rrd_graph.c +++ b/src/rrd_graph.c @@ -1,5 +1,5 @@ /**************************************************************************** - * RRDtool 1.3.1 Copyright by Tobi Oetiker, 1997-2008 + * RRDtool 1.3.2 Copyright by Tobi Oetiker, 1997-2008 **************************************************************************** * rrd__graph.c produce graphs from data in rrdfiles ****************************************************************************/ @@ -26,6 +26,7 @@ #endif #include "rrd_graph.h" +#include "rrd_client.h" /* some constant definitions */ @@ -305,6 +306,10 @@ int im_free( if (im == NULL) return 0; + + if (im->daemon_addr != NULL) + free(im->daemon_addr); + for (i = 0; i < (unsigned) im->gdes_c; i++) { if (im->gdes[i].data_first) { /* careful here, because a single pointer can occur several times */ @@ -833,6 +838,36 @@ int data_fetch( if (!skip) { unsigned long ft_step = im->gdes[i].step; /* ft_step will record what we got from fetch */ + /* Flush the file if + * - a connection to the daemon has been established + * - this is the first occurrence of that RRD file + */ + if (rrdc_is_connected(im->daemon_addr)) + { + int status; + + status = 0; + for (ii = 0; ii < i; ii++) + { + if (strcmp (im->gdes[i].rrd, im->gdes[ii].rrd) == 0) + { + status = 1; + break; + } + } + + if (status == 0) + { + status = rrdc_flush (im->gdes[i].rrd); + if (status != 0) + { + rrd_set_error ("rrdc_flush (%s) failed with status %i.", + im->gdes[i].rrd, status); + return (-1); + } + } + } /* if (rrdc_is_connected()) */ + if ((rrd_fetch_fn(im->gdes[i].rrd, im->gdes[i].cf, &im->gdes[i].start, @@ -3678,41 +3713,17 @@ rrd_info_t *rrd_graph_v( static void rrd_set_font_desc ( image_desc_t *im,int prop,char *font, double size ){ - static text_prop_t tp_cache[] = { {-1,"",NULL}, {-1,"",NULL}, {-1,"",NULL}, {-1,"",NULL}, {-1,"",NULL}, {-1,"",NULL}}; - - if (tp_cache[prop].font_desc == NULL){ - if (prop > 0 && tp_cache[0].font_desc != NULL){ - tp_cache[prop].font_desc = pango_font_description_copy (tp_cache[0].font_desc); - strcpy(tp_cache[prop].font,tp_cache[0].font); - tp_cache[prop].size = tp_cache[0].size; - } - else { - tp_cache[prop].font_desc = pango_font_description_new(); - } - im->text_prop[prop].font_desc = pango_font_description_copy (tp_cache[prop].font_desc); - } - - if (font != NULL && strcmp(tp_cache[prop].font,font) != 0){ - pango_font_description_free(tp_cache[prop].font_desc); - pango_font_description_free(im->text_prop[prop].font_desc); - tp_cache[prop].font_desc = pango_font_description_from_string( font ); - im->text_prop[prop].font_desc = pango_font_description_copy( tp_cache[prop].font_desc ); - strncpy(tp_cache[prop].font, font, sizeof(text_prop[prop].font) - 1); - tp_cache[prop].font[sizeof(text_prop[prop].font) - 1] = '\0'; - strcpy(im->text_prop[prop].font,tp_cache[prop].font); - } - if (size != 0 && size != (tp_cache[prop].size)){ - pango_font_description_set_size(tp_cache[prop].font_desc, size * PANGO_SCALE); - pango_font_description_set_size(im->text_prop[prop].font_desc, size * PANGO_SCALE); + if (font){ + strncpy(im->text_prop[prop].font, font, sizeof(text_prop[prop].font) - 1); + im->text_prop[prop].font[sizeof(text_prop[prop].font) - 1] = '\0'; + im->text_prop[prop].font_desc = pango_font_description_from_string( font ); + }; + if (size > 0){ im->text_prop[prop].size = size; - tp_cache[prop].size = size; - } - if (im->text_prop[prop].size < 0){ - im->text_prop[prop].size = tp_cache[prop].size; - im->text_prop[prop].font_desc = pango_font_description_copy( tp_cache[prop].font_desc ); - strcpy(im->text_prop[prop].font,tp_cache[prop].font); - } - // fprintf(stderr,"%d %s\n",prop,pango_font_description_to_string(im->text_prop[prop].font_desc)); + }; + if (im->text_prop[prop].font_desc && im->text_prop[prop].size ){ + pango_font_description_set_size(im->text_prop[prop].font_desc, im->text_prop[prop].size * PANGO_SCALE); + }; } void rrd_graph_init( @@ -3721,6 +3732,8 @@ void rrd_graph_init( { unsigned int i; char *deffont = getenv("RRD_DEFAULT_FONT"); + static PangoFontMap *fontmap = NULL; + PangoContext *context; #ifdef HAVE_TZSET tzset(); @@ -3732,6 +3745,7 @@ void rrd_graph_init( #endif #endif im->base = 1000; + im->daemon_addr = NULL; im->draw_x_grid = 1; im->draw_y_grid = 1; im->extra_flags = 0; @@ -3785,8 +3799,20 @@ void rrd_graph_init( rrd_set_font_desc(im,i, deffont ? deffont : text_prop[i].font,text_prop[i].size); } - im->layout = pango_cairo_create_layout(im->cr); - pango_cairo_context_set_resolution(pango_layout_get_context(im->layout), 100); + if (fontmap == NULL){ + fontmap = pango_cairo_font_map_get_default(); + } + + context = pango_cairo_font_map_create_context((PangoCairoFontMap*)fontmap); + + pango_cairo_context_set_resolution(context, 100); + + pango_cairo_update_context(im->cr,context); + + im->layout = pango_layout_new(context); + +// im->layout = pango_cairo_create_layout(im->cr); + cairo_font_options_set_hint_style (im->font_options, CAIRO_HINT_STYLE_FULL); @@ -3866,6 +3892,7 @@ void rrd_graph_options( { "watermark", required_argument, 0, 'W'}, { "alt-y-mrtg", no_argument, 0, 1000}, /* this has no effect it is just here to save old apps from crashing when they use it */ { "pango-markup", no_argument, 0, 'P'}, + { "daemon", required_argument, 0, 'd'}, { 0, 0, 0, 0} }; /* *INDENT-ON* */ @@ -3880,7 +3907,7 @@ void rrd_graph_options( int col_start, col_end; opt = getopt_long(argc, argv, - "s:e:x:y:v:w:h:D:iu:l:rb:oc:n:m:t:f:a:I:zgjFYAMEX:L:S:T:NR:B:W:kP", + "s:e:x:y:v:w:h:D:iu:l:rb:oc:n:m:t:f:a:I:zgjFYAMEX:L:S:T:NR:B:W:kPd:", long_options, &option_index); if (opt == EOF) break; @@ -4222,6 +4249,24 @@ void rrd_graph_options( strncpy(im->watermark, optarg, 100); im->watermark[99] = '\0'; break; + case 'd': + { + if (im->daemon_addr != NULL) + { + rrd_set_error ("You cannot specify --daemon " + "more than once."); + return; + } + + im->daemon_addr = strdup(optarg); + if (im->daemon_addr == NULL) + { + rrd_set_error("strdup failed"); + return; + } + + break; + } case '?': if (optopt != 0) rrd_set_error("unknown option '%c'", optopt); @@ -4229,6 +4274,11 @@ void rrd_graph_options( rrd_set_error("unknown option '%s'", argv[optind - 1]); return; } + } /* while (1) */ + + { /* try to connect to rrdcached */ + int status = rrdc_connect(im->daemon_addr); + if (status != 0) return; } pango_cairo_context_set_font_options(pango_layout_get_context(im->layout), im->font_options);