Attached a patch for the rrd-tool LIBDBI integration with the following improvements:
[rrdtool.git] / bindings / ruby / main.c
index 353aa4d..d18b905 100644 (file)
@@ -4,6 +4,7 @@
 
 #include <unistd.h>
 #include <ruby.h>
+#include <math.h>
 #include "../../src/rrd_tool.h"
 
 typedef struct string_arr_t {
@@ -19,6 +20,11 @@ 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()); \
@@ -142,7 +148,7 @@ VALUE rb_rrd_update(
 /* Calls Returning Data via the Info Interface */
 
 VALUE rb_rrd_infocall(
-    RRDFUNC func,
+    RRDINFOFUNC func,
     VALUE args)
 {
     string_arr a;
@@ -155,6 +161,7 @@ VALUE rb_rrd_infocall(
 
     RRD_CHECK_ERROR result = rb_hash_new();
 
+    p = data;
     while (data) {
         VALUE     key = rb_str_new2(data->key);
 
@@ -171,19 +178,19 @@ VALUE rb_rrd_infocall(
             break;
         case RD_I_STR:
             rb_hash_aset(result, key, rb_str_new2(data->value.u_str));
-            free(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));
-            free(data->value.u_blo.ptr);
             break;
         }
-        p = data;
         data = data->next;
-        free(p);
     }
+    rrd_info_free(p);
     return result;
 }
 
@@ -191,21 +198,21 @@ VALUE rb_rrd_info(
     VALUE self,
     VALUE args)
 {
-    return rrd_infocall(rrd_info, args);
+    return rb_rrd_infocall(rrd_info, args);
 }
 
 VALUE rb_rrd_updatev(
     VALUE self,
     VALUE args)
 {
-    return rrd_infocall(rrd_update_v, args);
+    return rb_rrd_infocall(rrd_update_v, args);
 }
 
 VALUE rb_rrd_graphv(
     VALUE self,
     VALUE args)
 {
-    return rrd_infocall(rrd_graph_v, args);
+    return rb_rrd_infocall(rrd_graph_v, args);
 }
 
 
@@ -232,9 +239,9 @@ VALUE rb_rrd_fetch(
 
     for (i = 0; i < ds_cnt; i++) {
         rb_ary_push(names, rb_str_new2(raw_names[i]));
-        free(raw_names[i]);
+        rrd_freemem(raw_names[i]);
     }
-    free(raw_names);
+    rrd_freemem(raw_names);
 
     k = 0;
     data = rb_ary_new();
@@ -247,7 +254,7 @@ VALUE rb_rrd_fetch(
         }
         rb_ary_push(data, line);
     }
-    free(raw_data);
+    rrd_freemem(raw_data);
 
     result = rb_ary_new2(5);
     rb_ary_store(result, 0, INT2NUM(start));
@@ -279,9 +286,9 @@ VALUE rb_rrd_graph(
     p = calcpr;
     for (p = calcpr; p && *p; p++) {
         rb_ary_push(print_results, rb_str_new2(*p));
-        free(*p);
+        rrd_freemem(*p);
     }
-    free(calcpr);
+    rrd_freemem(calcpr);
     rb_ary_store(result, 0, print_results);
     rb_ary_store(result, 1, INT2FIX(xsize));
     rb_ary_store(result, 2, INT2FIX(ysize));