if (im->daemon_addr != NULL)
free(im->daemon_addr);
+ if (im->gdef_map){
+ g_hash_table_destroy(im->gdef_map);
+ }
+
+ if (im->rrd_map){
+ g_hash_table_destroy(im->rrd_map);
+ }
+
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 */
image_desc_t *im)
{
int i, ii;
- int skip;
/* pull the data from the rrd files ... */
for (i = 0; i < (int) im->gdes_c; i++) {
if (im->gdes[i].gf != GF_DEF)
continue;
- skip = 0;
/* do we have it already ? */
- for (ii = 0; ii < i; ii++) {
- if (im->gdes[ii].gf != GF_DEF)
- continue;
- if ((strcmp(im->gdes[i].rrd, im->gdes[ii].rrd) == 0)
- && (im->gdes[i].cf == im->gdes[ii].cf)
- && (im->gdes[i].cf_reduce == im->gdes[ii].cf_reduce)
- && (im->gdes[i].start_orig == im->gdes[ii].start_orig)
- && (im->gdes[i].end_orig == im->gdes[ii].end_orig)
- && (im->gdes[i].step_orig == im->gdes[ii].step_orig)) {
- /* OK, the data is already there.
- ** Just copy the header portion
- */
- im->gdes[i].start = im->gdes[ii].start;
- im->gdes[i].end = im->gdes[ii].end;
- im->gdes[i].step = im->gdes[ii].step;
- im->gdes[i].ds_cnt = im->gdes[ii].ds_cnt;
- im->gdes[i].ds_namv = im->gdes[ii].ds_namv;
- im->gdes[i].data = im->gdes[ii].data;
- im->gdes[i].data_first = 0;
- skip = 1;
- }
- if (skip)
- break;
- }
- if (!skip) {
+ gpointer value;
+ char *key = gdes_fetch_key(im->gdes[i]);
+ gboolean ok = g_hash_table_lookup_extended(im->rrd_map,key,NULL,&value);
+ free(key);
+ if (ok){
+ ii = GPOINTER_TO_INT(value);
+ im->gdes[i].start = im->gdes[ii].start;
+ im->gdes[i].end = im->gdes[ii].end;
+ im->gdes[i].step = im->gdes[ii].step;
+ im->gdes[i].ds_cnt = im->gdes[ii].ds_cnt;
+ im->gdes[i].ds_namv = im->gdes[ii].ds_namv;
+ im->gdes[i].data = im->gdes[ii].data;
+ im->gdes[i].data_first = 0;
+ } else {
unsigned long ft_step = im->gdes[i].step; /* ft_step will record what we got from fetch */
/* Flush the file if
image_desc_t *im,
char *key)
{
- long ii;
-
- for (ii = 0; ii < im->gdes_c - 1; ii++) {
- if ((im->gdes[ii].gf == GF_DEF
- || im->gdes[ii].gf == GF_VDEF || im->gdes[ii].gf == GF_CDEF)
- && (strcmp(im->gdes[ii].vname, key) == 0)) {
- return ii;
- }
+ long match = -1;
+ gpointer value;
+ gboolean ok = g_hash_table_lookup_extended(im->gdef_map,key,NULL,&value);
+ if (ok){
+ match = GPOINTER_TO_INT(value);
}
- return -1;
+
+ /* printf("%s -> %ld\n",key,match); */
+
+ return match;
}
/* find the greatest common divisor for all the numbers
#ifdef HAVE_TZSET
tzset();
#endif
-
+ im->gdef_map = g_hash_table_new_full(g_str_hash, g_str_equal,g_free,NULL);
+ im->rrd_map = g_hash_table_new_full(g_str_hash, g_str_equal,g_free,NULL);
im->base = 1000;
im->daemon_addr = NULL;
im->draw_x_grid = 1;
#define FULL_SIZE_MODE 0x200 /* -width and -height indicate the total size of the image */
#define NO_RRDTOOL_TAG 0x400 /* disable the rrdtool tag */
+#define gdes_fetch_key(x) sprintf_alloc("%s:%d:%d:%d:%d",x.rrd,x.cf,x.cf_reduce,x.start_orig,x.end_orig,x.step_orig)
+
enum tmt_en { TMT_SECOND = 0, TMT_MINUTE, TMT_HOUR, TMT_DAY,
TMT_WEEK, TMT_MONTH, TMT_YEAR
};
PangoLayout *layout; /* the pango layout we use for writing fonts */
rrd_info_t *grinfo; /* root pointer to extra graph info */
rrd_info_t *grinfo_current; /* pointing to current entry */
+ GHashTable* gdef_map; /* a map of all *def gdef entries for quick access */
+ GHashTable* rrd_map; /* a map of all rrd files in use for gdef entries */
} image_desc_t;
/* Prototypes */
graph_desc_t *gdp;
unsigned int eaten = 0;
- if (gdes_alloc(im))
+ if (gdes_alloc(im)) /* gdes_c ++ */
return; /* the error string is already set */
gdp = &im->gdes[im->gdes_c - 1];
#ifdef DEBUG
&argv[i][eaten], argv[i]);
return;
}
+ char *key = gdes_fetch_key((*gdp));
+ if (gdp->gf == GF_DEF && !g_hash_table_lookup_extended(im->rrd_map,key,NULL,NULL)){
+ g_hash_table_insert(im->gdef_map,g_strdup(key),GINT_TO_POINTER(im->gdes_c-1));
+ }
+ free(key);
+ if (gdp->gf == GF_DEF || gdp->gf == GF_VDEF || gdp->gf == GF_CDEF){
+ g_hash_table_insert(im->gdef_map,g_strdup(gdp->vname),GINT_TO_POINTER(im->gdes_c-1));
+ }
}
}