14 * rrd_tool.h includes config.h, but at least on Ubuntu Breezy Badger
15 * 5.10 with gcc 4.0.2, the C preprocessor picks up Perl's config.h
16 * which is included from the Perl includes and never reads rrdtool's
17 * config.h. Without including rrdtool's config.h, this module does
18 * not compile, so include it here with an explicit path.
20 * Because rrdtool's config.h redefines VERSION which is originally
21 * set via Perl's Makefile.PL and passed down to the C compiler's
22 * command line, save the original value and reset it after the
25 #define VERSION_SAVED VERSION
27 #include "../../rrd_config.h"
28 #include "../../src/rrd_tool.h"
30 #define VERSION VERSION_SAVED
33 /* perl 5.004 compatibility */
34 #if PERLPATCHLEVEL < 5
35 #define PL_sv_undef sv_undef
39 #define rrdcode(name) \
40 argv = (char **) malloc((items+1)*sizeof(char *));\
42 for (i = 0; i < items; i++) { \
44 char *handle= SvPV(ST(i),len);\
45 /* actually copy the data to make sure possible modifications \
46 on the argv data does not backfire into perl */ \
47 argv[i+1] = (char *) malloc((strlen(handle)+1)*sizeof(char)); \
48 strcpy(argv[i+1],handle); \
51 RETVAL=name(items+1,argv); \
52 for (i=0; i < items; i++) {\
57 if (rrd_test_error()) XSRETURN_UNDEF;
59 #define hvs(VAL) hv_store_ent(hash, sv_2mortal(newSVpv(data->key,0)),VAL,0)
61 #define rrdinfocode(name) \
62 /* prepare argument list */ \
63 argv = (char **) malloc((items+1)*sizeof(char *)); \
65 for (i = 0; i < items; i++) { \
67 char *handle= SvPV(ST(i),len); \
68 /* actually copy the data to make sure possible modifications \
69 on the argv data does not backfire into perl */ \
70 argv[i+1] = (char *) malloc((strlen(handle)+1)*sizeof(char)); \
71 strcpy(argv[i+1],handle); \
74 data=name(items+1, argv); \
75 for (i=0; i < items; i++) { \
79 if (rrd_test_error()) XSRETURN_UNDEF; \
83 /* the newSV will get copied by hv so we create it as a mortal \
84 to make sure it does not keep hanging round after the fact */ \
85 switch (data->type) { \
87 if (isnan(data->value.u_val)) \
90 hvs(newSVnv(data->value.u_val)); \
93 hvs(newSViv(data->value.u_int)); \
96 hvs(newSViv(data->value.u_cnt)); \
99 hvs(newSVpv(data->value.u_str,0)); \
100 rrd_freemem(data->value.u_str); \
103 hvs(newSVpv(data->value.u_blo.ptr,data->value.u_blo.size)); \
104 rrd_freemem(data->value.u_blo.ptr); \
107 rrd_freemem(data->key); \
112 RETVAL = newRV_noinc((SV*)hash);
115 * should not be needed if libc is linked (see ntmake.pl)
118 #define malloc malloc
119 #define realloc realloc
124 MODULE = RRDs PACKAGE = RRDs PREFIX = rrd_
127 #ifdef MUST_DISABLE_SIGFPE
128 signal(SIGFPE,SIG_IGN);
130 #ifdef MUST_DISABLE_FPMASK
138 if (! rrd_test_error()) XSRETURN_UNDEF;
139 RETVAL = newSVpv(rrd_get_error(),0);
216 argv = (char **) malloc((items+1)*sizeof(char *));
218 for (i = 0; i < items; i++) {
220 char *handle = SvPV(ST(i),len);
221 /* actually copy the data to make sure possible modifications
222 on the argv data does not backfire into perl */
223 argv[i+1] = (char *) malloc((strlen(handle)+1)*sizeof(char));
224 strcpy(argv[i+1],handle);
227 rrd_graph(items+1,argv,&calcpr,&xsize,&ysize,NULL,&ymin,&ymax);
228 for (i=0; i < items; i++) {
233 if (rrd_test_error()) {
235 for(i=0;calcpr[i];i++)
236 rrd_freemem(calcpr[i]);
241 for(i=0;calcpr[i];i++){
242 av_push(retar,newSVpv(calcpr[i],0));
243 rrd_freemem(calcpr[i]);
248 PUSHs(sv_2mortal(newRV_noinc((SV*)retar)));
249 PUSHs(sv_2mortal(newSViv(xsize)));
250 PUSHs(sv_2mortal(newSViv(ysize)));
257 unsigned long step, ds_cnt,i,ii;
258 rrd_value_t *data,*datai;
261 AV *retar,*line,*names;
263 argv = (char **) malloc((items+1)*sizeof(char *));
265 for (i = 0; i < items; i++) {
267 char *handle= SvPV(ST(i),len);
268 /* actually copy the data to make sure possible modifications
269 on the argv data does not backfire into perl */
270 argv[i+1] = (char *) malloc((strlen(handle)+1)*sizeof(char));
271 strcpy(argv[i+1],handle);
274 rrd_fetch(items+1,argv,&start,&end,&step,&ds_cnt,&ds_namv,&data);
275 for (i=0; i < items; i++) {
279 if (rrd_test_error()) XSRETURN_UNDEF;
280 /* convert the ds_namv into perl format */
282 for (ii = 0; ii < ds_cnt; ii++){
283 av_push(names,newSVpv(ds_namv[ii],0));
284 rrd_freemem(ds_namv[ii]);
286 rrd_freemem(ds_namv);
287 /* convert the data array into perl format */
290 for (i = start+step; i <= end; i += step){
292 for (ii = 0; ii < ds_cnt; ii++){
293 av_push(line,(isnan(*datai) ? &PL_sv_undef : newSVnv(*datai)));
296 av_push(retar,newRV_noinc((SV*)line));
300 PUSHs(sv_2mortal(newSViv(start+step)));
301 PUSHs(sv_2mortal(newSViv(step)));
302 PUSHs(sv_2mortal(newRV_noinc((SV*)names)));
303 PUSHs(sv_2mortal(newRV_noinc((SV*)retar)));
306 rrd_times(start, end)
310 struct rrd_time_value start_tv, end_tv;
311 char *parsetime_error = NULL;
312 time_t start_tmp, end_tmp;
315 if( (parsetime_error = parsetime( start, &start_tv))) {
316 rrd_set_error( "start time: %s", parsetime_error);
319 if( (parsetime_error = parsetime( end, &end_tv))) {
320 rrd_set_error( "end time: %s", parsetime_error);
323 if( proc_start_end( &start_tv, &end_tv, &start_tmp, &end_tmp) == -1) {
327 PUSHs(sv_2mortal(newSVuv(start_tmp)));
328 PUSHs(sv_2mortal(newSVuv(end_tmp)));
336 unsigned long step, col_cnt,row_cnt,i,ii;
337 rrd_value_t *data,*ptr;
338 char **argv,**legend_v;
339 AV *retar,*line,*names;
341 argv = (char **) malloc((items+1)*sizeof(char *));
343 for (i = 0; i < items; i++) {
345 char *handle = SvPV(ST(i),len);
346 /* actually copy the data to make sure possible modifications
347 on the argv data does not backfire into perl */
348 argv[i+1] = (char *) malloc((strlen(handle)+1)*sizeof(char));
349 strcpy(argv[i+1],handle);
352 rrd_xport(items+1,argv,&xsize,&start,&end,&step,&col_cnt,&legend_v,&data);
353 for (i=0; i < items; i++) {
357 if (rrd_test_error()) XSRETURN_UNDEF;
359 /* convert the legend_v into perl format */
361 for (ii = 0; ii < col_cnt; ii++){
362 av_push(names,newSVpv(legend_v[ii],0));
363 rrd_freemem(legend_v[ii]);
365 rrd_freemem(legend_v);
367 /* convert the data array into perl format */
370 for (i = start+step; i <= end; i += step){
372 for (ii = 0; ii < col_cnt; ii++){
373 av_push(line,(isnan(*ptr) ? &PL_sv_undef : newSVnv(*ptr)));
376 av_push(retar,newRV_noinc((SV*)line));
381 PUSHs(sv_2mortal(newSViv(start+step)));
382 PUSHs(sv_2mortal(newSViv(end)));
383 PUSHs(sv_2mortal(newSViv(step)));
384 PUSHs(sv_2mortal(newSViv(col_cnt)));
385 PUSHs(sv_2mortal(newRV_noinc((SV*)names)));
386 PUSHs(sv_2mortal(newRV_noinc((SV*)retar)));
397 rrdinfocode(rrd_info);
410 rrdinfocode(rrd_update_v);
423 rrdinfocode(rrd_graph_v);
446 rrdcode(rrd_restore);