]> git.ipfire.org Git - thirdparty/rrdtool-1.x.git/commitdiff
Use RRD_READVALUES to read data
authorPeter Stamfest <peter@stamfest.at>
Sat, 15 Mar 2014 20:23:07 +0000 (21:23 +0100)
committerPeter Stamfest <peter@stamfest.at>
Sat, 15 Mar 2014 20:40:41 +0000 (21:40 +0100)
src/rrd_modify.c

index 41f03ab6f9e34205687f04bdf18e6b12ae33f319..d3ff7e197ea61a252ef77015cdea9308545c1a56 100644 (file)
@@ -1088,7 +1088,7 @@ static int rrd_modify_r(const char *infilename,
     rrd_t *out = NULL;
     
     int rc = -1;
-    rrd_file_t *rrd_file;
+    rrd_file_t *rrd_file = NULL;
     char       *old_locale = NULL;
 
     old_locale = setlocale(LC_NUMERIC, NULL);
@@ -1104,36 +1104,12 @@ static int rrd_modify_r(const char *infilename,
 
     rrd_init(&in);
 
-    rrd_file = rrd_open(infilename, &in, RRD_READONLY | RRD_READAHEAD);
+    rrd_file = rrd_open(infilename, &in, RRD_READONLY | RRD_READAHEAD | RRD_READVALUES);
     if (rrd_file == NULL) {
        // rrd error has been set
        goto done;
     }
 
-    // read in data - have to count total number of rows for values array
-
-    int total_in_rra_rows = 0;
-    for (unsigned int i = 0 ; i < in.stat_head->rra_cnt ; i++) {
-       total_in_rra_rows += in.rra_def[i].row_cnt;
-    }
-
-    size_t to_read = total_in_rra_rows * sizeof(rrd_value_t) * in.stat_head->ds_cnt;
-    size_t read_bytes;
-    
-    /* prepare space to read data into */
-    in.rrd_value = realloc(in.rrd_value, to_read);
-    if (in.rrd_value == NULL) {
-       rrd_set_error("Out of memory");
-       goto done;
-    }
-    
-    read_bytes = rrd_read(rrd_file, in.rrd_value, to_read);
-    
-    if (read_bytes != to_read) {
-       rrd_set_error("short read");
-       goto done;
-    }
-
     // now we have read the input RRD...
     unsigned long hashed_name = FnvHash(outfilename);
     out = rrd_modify_r2(&in, removeDS, addDS, rra_mod_ops, rra_mod_ops_cnt, newstep, hashed_name);
@@ -1147,6 +1123,8 @@ static int rrd_modify_r(const char *infilename,
 done:
     setlocale(LC_NUMERIC, old_locale);
     
+    rrd_free(&in);
+
     if (out) {
        rrd_memory_free(out);
        free(out);