Big bunch of improvements for the caching daemon.
[rrdtool.git] / src / rrd_graph.c
index e445cad..dc12ed6 100644 (file)
@@ -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
  ****************************************************************************/
@@ -307,11 +307,8 @@ int im_free(
     if (im == NULL)
         return 0;
 
-    if (im->use_rrdcached)
-    {
-        rrdc_disconnect ();
-        im->use_rrdcached = 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) {
@@ -845,7 +842,7 @@ int data_fetch(
              * - a connection to the daemon has been established
              * - this is the first occurrence of that RRD file
              */
-            if (im->use_rrdcached)
+            if (rrdc_is_connected(im->daemon_addr))
             {
                 int status;
 
@@ -869,7 +866,7 @@ int data_fetch(
                         return (-1);
                     }
                 }
-            } /* if (im->use_rrdcached) */
+            } /* if (rrdc_is_connected()) */
 
             if ((rrd_fetch_fn(im->gdes[i].rrd,
                               im->gdes[i].cf,
@@ -3716,41 +3713,11 @@ 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);
-        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)); 
+    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].size = size;
+    im->text_prop[prop].font_desc =   pango_font_description_from_string( font );
+    pango_font_description_set_size(im->text_prop[prop].font_desc, size * PANGO_SCALE);
 }
 
 void rrd_graph_init(
@@ -3759,6 +3726,8 @@ void rrd_graph_init(
 {
     unsigned int i;
     char     *deffont = getenv("RRD_DEFAULT_FONT");
+    static PangoFontMap *fontmap = NULL;
+    PangoContext *context;
 
 #ifdef HAVE_TZSET
     tzset();
@@ -3770,6 +3739,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,7 +3755,6 @@ void rrd_graph_init(
     im->grinfo_current = (rrd_info_t *) NULL;
     im->imgformat = IF_PNG;
     im->imginfo = NULL;
-    im->use_rrdcached = 0;
     im->lazy = 0;
     im->logarithmic = 0;
     im->maxval = DNAN;
@@ -3824,8 +3793,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);
@@ -4264,21 +4245,20 @@ void rrd_graph_options(
             break;
         case 'd':
         {
-            int status;
-            if (im->use_rrdcached)
+            if (im->daemon_addr != NULL)
             {
                 rrd_set_error ("You cannot specify --daemon "
                         "more than once.");
                 return;
             }
-            status = rrdc_connect (optarg);
-            if (status != 0)
+
+            im->daemon_addr = strdup(optarg);
+            if (im->daemon_addr == NULL)
             {
-                rrd_set_error ("rrdc_connect(%s) failed with status %i.",
-                        optarg, status);
-                return;
+              rrd_set_error("strdup failed");
+              return;
             }
-            im->use_rrdcached = 1;
+
             break;
         }
         case '?':
@@ -4290,24 +4270,9 @@ void rrd_graph_options(
         }
     } /* while (1) */
 
-    if (im->use_rrdcached == 0)
-    {
-        char *temp;
-
-        temp = getenv (ENV_RRDCACHED_ADDRESS);
-        if (temp != NULL)
-        {
-            int status;
-
-            status = rrdc_connect (temp);
-            if (status != 0)
-            {
-                rrd_set_error ("rrdc_connect(%s) failed with status %i.",
-                        temp, status);
-                return;
-            }
-            im->use_rrdcached = 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);