X-Git-Url: https://git.octo.it/?p=rrdtool.git;a=blobdiff_plain;f=bindings%2Fperl-shared%2FRRDs.xs;h=bf108e375a1f7dcd3d12cb7eda52655e05cc8443;hp=a0001f7904af42069ef2d9c39e1958e5de3d4f9e;hb=b837c0527f117b54845242ee7626df6d88394444;hpb=23be36896d8cf89dd9dbcdb2bb62677ca01810f8 diff --git a/bindings/perl-shared/RRDs.xs b/bindings/perl-shared/RRDs.xs index a0001f7..bf108e3 100644 --- a/bindings/perl-shared/RRDs.xs +++ b/bindings/perl-shared/RRDs.xs @@ -17,6 +17,7 @@ extern "C" { #define PL_sv_undef sv_undef #endif + #define rrdcode(name) \ argv = (char **) malloc((items+1)*sizeof(char *));\ argv[0] = "dummy";\ @@ -38,6 +39,58 @@ extern "C" { \ if (rrd_test_error()) XSRETURN_UNDEF; +#define hvs(VAL) hv_store_ent(hash, sv_2mortal(newSVpv(data->key,0)),VAL,0) + +#define rrdinfocode(name) \ + /* prepare argument list */ \ + argv = (char **) malloc((items+1)*sizeof(char *)); \ + argv[0] = "dummy"; \ + for (i = 0; i < items; i++) { \ + STRLEN len; \ + char *handle= SvPV(ST(i),len); \ + /* actually copy the data to make sure possible modifications \ + on the argv data does not backfire into perl */ \ + argv[i+1] = (char *) malloc((strlen(handle)+1)*sizeof(char)); \ + strcpy(argv[i+1],handle); \ + } \ + optind=0; opterr=0; \ + rrd_clear_error(); \ + data=name(items+1, argv); \ + for (i=0; i < items; i++) { \ + free(argv[i+1]); \ + } \ + free(argv); \ + if (rrd_test_error()) XSRETURN_UNDEF; \ + hash = newHV(); \ + while (data) { \ + save=data; \ + /* the newSV will get copied by hv so we create it as a mortal \ + to make sure it does not keep hanging round after the fact */ \ + switch (data->type) { \ + case RD_I_VAL: \ + if (isnan(data->value.u_val)) \ + hvs(&PL_sv_undef); \ + else \ + hvs(newSVnv(data->value.u_val)); \ + break; \ + case RD_I_INT: \ + hvs(newSViv(data->value.u_int)); \ + break; \ + case RD_I_CNT: \ + hvs(newSViv(data->value.u_cnt)); \ + break; \ + case RD_I_STR: \ + hvs(newSVpv(data->value.u_str,0)); \ + rrd_freemem(data->value.u_str); \ + break; \ + } \ + rrd_freemem(data->key); \ + data = data->next; \ + rrd_freemem(save); \ + } \ + rrd_freemem(data); \ + RETVAL = newRV_noinc((SV*)hash); + /* * should not be needed if libc is linked (see ntmake.pl) #ifdef WIN32 @@ -123,7 +176,7 @@ void rrd_graph(...) PROTOTYPE: @ PREINIT: - char **calcpr; + char **calcpr=NULL; int i,xsize,ysize; char **argv; AV *retar; @@ -140,7 +193,7 @@ rrd_graph(...) } optind=0; opterr=0; rrd_clear_error(); - rrd_graph(items+1,argv,&calcpr,&xsize,&ysize); + rrd_graph(items+1,argv,&calcpr,&xsize,&ysize,NULL); for (i=0; i < items; i++) { free(argv[i+1]); } @@ -149,16 +202,16 @@ rrd_graph(...) if (rrd_test_error()) { if(calcpr) for(i=0;calcpr[i];i++) - free(calcpr[i]); + rrd_freemem(calcpr[i]); XSRETURN_UNDEF; } retar=newAV(); if(calcpr){ for(i=0;calcpr[i];i++){ av_push(retar,newSVpv(calcpr[i],0)); - free(calcpr[i]); + rrd_freemem(calcpr[i]); } - free(calcpr); + rrd_freemem(calcpr); } EXTEND(sp,4); PUSHs(sv_2mortal(newRV_noinc((SV*)retar))); @@ -198,9 +251,9 @@ rrd_fetch(...) names=newAV(); for (ii = 0; ii < ds_cnt; ii++){ av_push(names,newSVpv(ds_namv[ii],0)); - free(ds_namv[ii]); + rrd_freemem(ds_namv[ii]); } - free(ds_namv); + rrd_freemem(ds_namv); /* convert the data array into perl format */ datai=data; retar=newAV(); @@ -212,13 +265,37 @@ rrd_fetch(...) } av_push(retar,newRV_noinc((SV*)line)); } - free(data); + rrd_freemem(data); EXTEND(sp,5); PUSHs(sv_2mortal(newSViv(start+step))); PUSHs(sv_2mortal(newSViv(step))); PUSHs(sv_2mortal(newRV_noinc((SV*)names))); PUSHs(sv_2mortal(newRV_noinc((SV*)retar))); +void +rrd_times(start, end) + char *start + char *end + PREINIT: + struct rrd_time_value start_tv, end_tv; + char *parsetime_error = NULL; + time_t start_tmp, end_tmp; + PPCODE: + rrd_clear_error(); + if( (parsetime_error = parsetime( start, &start_tv))) { + rrd_set_error( "start time: %s", parsetime_error); + XSRETURN_UNDEF; + } + if( (parsetime_error = parsetime( end, &end_tv))) { + rrd_set_error( "end time: %s", parsetime_error); + XSRETURN_UNDEF; + } + if( proc_start_end( &start_tv, &end_tv, &start_tmp, &end_tmp) == -1) { + XSRETURN_UNDEF; + } + EXTEND(sp,2); + PUSHs(sv_2mortal(newSVuv(start_tmp))); + PUSHs(sv_2mortal(newSVuv(end_tmp))); int rrd_xport(...) @@ -254,9 +331,9 @@ rrd_xport(...) names=newAV(); for (ii = 0; ii < col_cnt; ii++){ av_push(names,newSVpv(legend_v[ii],0)); - free(legend_v[ii]); + rrd_freemem(legend_v[ii]); } - free(legend_v); + rrd_freemem(legend_v); /* convert the data array into perl format */ ptr=data; @@ -269,7 +346,7 @@ rrd_xport(...) } av_push(retar,newRV_noinc((SV*)line)); } - free(data); + rrd_freemem(data); EXTEND(sp,7); PUSHs(sv_2mortal(newSViv(start+step))); @@ -288,54 +365,20 @@ rrd_info(...) char **argv; HV *hash; CODE: - /* prepare argument list */ - argv = (char **) malloc((items+1)*sizeof(char *)); - argv[0] = "dummy"; - for (i = 0; i < items; i++) { - STRLEN len; - char *handle= SvPV(ST(i),len); - /* actually copy the data to make sure possible modifications - on the argv data does not backfire into perl */ - argv[i+1] = (char *) malloc((strlen(handle)+1)*sizeof(char)); - strcpy(argv[i+1],handle); - } - optind=0; opterr=0; - rrd_clear_error(); - data=rrd_info(items+1, argv); - for (i=0; i < items; i++) { - free(argv[i+1]); - } - free(argv); - if (rrd_test_error()) XSRETURN_UNDEF; - hash = newHV(); - while (data) { - save=data; - /* the newSV will get copied by hv so we create it as a mortal to make sure - it does not keep hanging round after the fact */ -#define hvs(VAL) hv_store_ent(hash, sv_2mortal(newSVpv(data->key,0)),VAL,0) - switch (data->type) { - case RD_I_VAL: - if (isnan(data->value.u_val)) - hvs(&PL_sv_undef); - else - hvs(newSVnv(data->value.u_val)); - break; - case RD_I_CNT: - hvs(newSViv(data->value.u_cnt)); - break; - case RD_I_STR: - hvs(newSVpv(data->value.u_str,0)); - free(data->value.u_str); - break; - } -#undefine hvs - free(data->key); - data = data->next; - free(save); - } - free(data); - RETVAL = newRV_noinc((SV*)hash); - OUTPUT: - RETVAL + rrdinfocode(rrd_info); + OUTPUT: + RETVAL +SV* +rrd_updatev(...) + PROTOTYPE: @ + PREINIT: + info_t *data,*save; + int i; + char **argv; + HV *hash; + CODE: + rrdinfocode(rrd_update_v); + OUTPUT: + RETVAL