X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=bindings%2Fruby%2Fmain.c;h=35b5f6020dd1ea0d1315358360e14b097f18bfba;hb=d9822df7ed5e8122cf3a62e4e99678e94007f504;hp=0e022e45d2722c17bcf313ae3080b4b4eb6ec1b5;hpb=be3cca08c4031f46d4e2b872ab0eb825c5b69b4e;p=pkg-rrdtool.git diff --git a/bindings/ruby/main.c b/bindings/ruby/main.c index 0e022e4..35b5f60 100644 --- a/bindings/ruby/main.c +++ b/bindings/ruby/main.c @@ -1,9 +1,10 @@ -/* $Id: main.c 1700 2008-12-08 16:07:27Z oetiker $ +/* $Id$ * Substantial penalty for early withdrawal. */ #include #include +#include #include "../../src/rrd_tool.h" typedef struct string_arr_t { @@ -19,9 +20,14 @@ typedef int ( int argc, char **argv); +typedef rrd_info_t *( + *RRDINFOFUNC) ( + int argc, + char **argv); + #define RRD_CHECK_ERROR \ if (rrd_test_error()) \ - rb_raise(rb_eRRDError, rrd_get_error()); \ + rb_raise(rb_eRRDError, "%s", rrd_get_error()); \ rrd_clear_error(); string_arr string_arr_new( @@ -32,7 +38,7 @@ string_arr string_arr_new( int i; Check_Type(rb_strings, T_ARRAY); - a.len = RARRAY(rb_strings)->len + 1; + a.len = RARRAY_LEN(rb_strings) + 1; a.strings = malloc(a.len * sizeof(char *)); a.strings[0] = "dummy"; /* first element is a dummy element */ @@ -42,16 +48,16 @@ string_arr string_arr_new( switch (TYPE(v)) { case T_STRING: - a.strings[i + 1] = strdup(STR2CSTR(v)); + a.strings[i + 1] = strdup(StringValuePtr(v)); break; case T_FIXNUM: - snprintf(buf, 63, "%d", FIX2INT(v)); + snprintf(buf, 63, "%ld", (long)FIX2INT(v)); a.strings[i + 1] = strdup(buf); break; default: rb_raise(rb_eTypeError, - "invalid argument - %s, expected T_STRING or T_FIXNUM on index %d", - rb_class2name(CLASS_OF(v)), i); + "invalid argument - %s, expected T_STRING or T_FIXNUM on index %ld", + rb_class2name(CLASS_OF(v)), (long)i); break; } } @@ -138,11 +144,18 @@ VALUE rb_rrd_update( return rrd_call(rrd_update, args); } +VALUE rb_rrd_flushcached( + VALUE self, + VALUE args) +{ + return rrd_call(rrd_flushcached, args); +} + /* Calls Returning Data via the Info Interface */ VALUE rb_rrd_infocall( - RRDFUNC func, + RRDINFOFUNC func, VALUE args) { string_arr a; @@ -150,6 +163,7 @@ VALUE rb_rrd_infocall( VALUE result; a = string_arr_new(args); + reset_rrd_state(); data = func(a.len, a.strings); string_arr_delete(a); @@ -173,9 +187,12 @@ VALUE rb_rrd_infocall( case RD_I_STR: rb_hash_aset(result, key, rb_str_new2(data->value.u_str)); break; + case RD_I_INT: + rb_hash_aset(result, key, INT2FIX(data->value.u_int)); + break; case RD_I_BLO: rb_hash_aset(result, key, - rb_str_new(data->value.u_blo.ptr, + rb_str_new((char *)data->value.u_blo.ptr, data->value.u_blo.size)); break; } @@ -303,6 +320,54 @@ VALUE rb_rrd_last( return rb_funcall(rb_cTime, rb_intern("at"), 1, UINT2NUM(last)); } +VALUE rb_rrd_xport( + VALUE self, + VALUE args) +{ + string_arr a; + unsigned long i, j, k, step, col_cnt; + int xxsize; + rrd_value_t *data; + char **legend_v; + VALUE legend, result, rdata; + time_t start, end; + + a = string_arr_new(args); + reset_rrd_state(); + rrd_xport(a.len, a.strings, &xxsize, &start, &end, &step, &col_cnt, &legend_v, &data); + string_arr_delete(a); + + RRD_CHECK_ERROR; + + legend = rb_ary_new(); + for (i = 0; i < col_cnt; i++) { + rb_ary_push(legend, rb_str_new2(legend_v[i])); + free(legend_v[i]); + } + free(legend_v); + + k = 0; + rdata = rb_ary_new(); + for (i = start; i <= end; i += step) { + VALUE line = rb_ary_new2(col_cnt); + for (j = 0; j < col_cnt; j++) { + rb_ary_store(line, j, rb_float_new(data[k])); + k++; + } + rb_ary_push(rdata, line); + } + free(data); + + result = rb_ary_new2(6); + rb_ary_store(result, 0, INT2FIX(start)); + rb_ary_store(result, 1, INT2FIX(end)); + rb_ary_store(result, 2, INT2FIX(step)); + rb_ary_store(result, 3, INT2FIX(col_cnt)); + rb_ary_store(result, 4, legend); + rb_ary_store(result, 5, rdata); + return result; +} + void Init_RRD( ) { @@ -318,7 +383,9 @@ void Init_RRD( rb_define_module_function(mRRD, "restore", rb_rrd_restore, -2); rb_define_module_function(mRRD, "tune", rb_rrd_tune, -2); rb_define_module_function(mRRD, "update", rb_rrd_update, -2); + rb_define_module_function(mRRD, "flushcached", rb_rrd_flushcached, -2); rb_define_module_function(mRRD, "info", rb_rrd_info, -2); rb_define_module_function(mRRD, "updatev", rb_rrd_updatev, -2); rb_define_module_function(mRRD, "graphv", rb_rrd_graphv, -2); + rb_define_module_function(mRRD, "xport", rb_rrd_xport, -2); }