2 * Substantial penalty for early withdrawal.
7 #include "../../src/rrd_tool.h"
9 typedef struct string_arr_t {
22 #define RRD_CHECK_ERROR \
23 if (rrd_test_error()) \
24 rb_raise(rb_eRRDError, rrd_get_error()); \
27 string_arr string_arr_new(
34 Check_Type(rb_strings, T_ARRAY);
35 a.len = RARRAY(rb_strings)->len + 1;
37 a.strings = malloc(a.len * sizeof(char *));
38 a.strings[0] = "dummy"; /* first element is a dummy element */
40 for (i = 0; i < a.len - 1; i++) {
41 VALUE v = rb_ary_entry(rb_strings, i);
45 a.strings[i + 1] = strdup(STR2CSTR(v));
48 snprintf(buf, 63, "%d", FIX2INT(v));
49 a.strings[i + 1] = strdup(buf);
52 rb_raise(rb_eTypeError,
53 "invalid argument - %s, expected T_STRING or T_FIXNUM on index %d",
54 rb_class2name(CLASS_OF(v)), i);
62 void string_arr_delete(
67 /* skip dummy first entry */
68 for (i = 1; i < a.len; i++) {
91 a = string_arr_new(args);
93 func(a.len, a.strings);
96 RRD_CHECK_ERROR return Qnil;
103 return rrd_call(rrd_create, args);
110 return rrd_call(rrd_dump, args);
117 return rrd_call(rrd_resize, args);
120 VALUE rb_rrd_restore(
124 return rrd_call(rrd_restore, args);
131 return rrd_call(rrd_tune, args);
138 return rrd_call(rrd_update, args);
142 /* Calls Returning Data via the Info Interface */
144 VALUE rb_rrd_infocall(
149 rrd_info_t *p, *data;
152 a = string_arr_new(args);
153 data = func(a.len, a.strings);
154 string_arr_delete(a);
156 RRD_CHECK_ERROR result = rb_hash_new();
159 VALUE key = rb_str_new2(data->key);
161 switch (data->type) {
163 if (isnan(data->value.u_val)) {
164 rb_hash_aset(result, key, Qnil);
166 rb_hash_aset(result, key, rb_float_new(data->value.u_val));
170 rb_hash_aset(result, key, INT2FIX(data->value.u_cnt));
173 rb_hash_aset(result, key, rb_str_new2(data->value.u_str));
174 rrd_freemem(data->value.u_str);
177 rb_hash_aset(result, key,
178 rb_str_new(data->value.u_blo.ptr,
179 data->value.u_blo.size));
180 rrd_freemem(data->value.u_blo.ptr);
194 return rrd_infocall(rrd_info, args);
197 VALUE rb_rrd_updatev(
201 return rrd_infocall(rrd_update_v, args);
208 return rrd_infocall(rrd_graph_v, args);
219 unsigned long i, j, k, step, ds_cnt;
220 rrd_value_t *raw_data;
222 VALUE data, names, result;
225 a = string_arr_new(args);
227 rrd_fetch(a.len, a.strings, &start, &end, &step, &ds_cnt, &raw_names,
229 string_arr_delete(a);
231 RRD_CHECK_ERROR names = rb_ary_new();
233 for (i = 0; i < ds_cnt; i++) {
234 rb_ary_push(names, rb_str_new2(raw_names[i]));
235 rrd_freemem(raw_names[i]);
237 rrd_freemem(raw_names);
241 for (i = start; i <= end; i += step) {
242 VALUE line = rb_ary_new2(ds_cnt);
244 for (j = 0; j < ds_cnt; j++) {
245 rb_ary_store(line, j, rb_float_new(raw_data[k]));
248 rb_ary_push(data, line);
250 rrd_freemem(raw_data);
252 result = rb_ary_new2(5);
253 rb_ary_store(result, 0, INT2NUM(start));
254 rb_ary_store(result, 1, INT2NUM(end));
255 rb_ary_store(result, 2, names);
256 rb_ary_store(result, 3, data);
257 rb_ary_store(result, 4, INT2FIX(step));
267 VALUE result, print_results;
271 a = string_arr_new(args);
273 rrd_graph(a.len, a.strings, &calcpr, &xsize, &ysize, NULL, &ymin, &ymax);
274 string_arr_delete(a);
276 RRD_CHECK_ERROR result = rb_ary_new2(3);
278 print_results = rb_ary_new();
280 for (p = calcpr; p && *p; p++) {
281 rb_ary_push(print_results, rb_str_new2(*p));
285 rb_ary_store(result, 0, print_results);
286 rb_ary_store(result, 1, INT2FIX(xsize));
287 rb_ary_store(result, 2, INT2FIX(ysize));
299 a = string_arr_new(args);
301 last = rrd_last(a.len, a.strings);
302 string_arr_delete(a);
305 return rb_funcall(rb_cTime, rb_intern("at"), 1, INT2FIX(last));
311 mRRD = rb_define_module("RRD");
312 rb_eRRDError = rb_define_class("RRDError", rb_eStandardError);
314 rb_define_module_function(mRRD, "create", rb_rrd_create, -2);
315 rb_define_module_function(mRRD, "dump", rb_rrd_dump, -2);
316 rb_define_module_function(mRRD, "fetch", rb_rrd_fetch, -2);
317 rb_define_module_function(mRRD, "graph", rb_rrd_graph, -2);
318 rb_define_module_function(mRRD, "last", rb_rrd_last, -2);
319 rb_define_module_function(mRRD, "resize", rb_rrd_resize, -2);
320 rb_define_module_function(mRRD, "restore", rb_rrd_restore, -2);
321 rb_define_module_function(mRRD, "tune", rb_rrd_tune, -2);
322 rb_define_module_function(mRRD, "update", rb_rrd_update, -2);
323 rb_define_module_function(mRRD, "info", rb_rrd_info, -2);
324 rb_define_module_function(mRRD, "updatev", rb_rrd_updatev, -2);
325 rb_define_module_function(mRRD, "graphv", rb_rrd_graphv, -2);