prepare for the release of rrdtool-1.3.0
[rrdtool.git] / src / rrd_dump.c
index d839bf6..accf2f7 100644 (file)
@@ -1,5 +1,5 @@
 /*****************************************************************************
- * RRDtool 1.2.23  Copyright by Tobi Oetiker, 1997-2007
+ * RRDtool 1.3.0  Copyright by Tobi Oetiker, 1997-2008
  *****************************************************************************
  * rrd_dump  Display a RRD
  *****************************************************************************
 extern char *tzname[2];
 #endif
 
-int rrd_dump(
-    int argc,
-    char **argv)
-{
-    int       rc;
-
-    if (argc < 2) {
-        rrd_set_error("Not enough arguments");
-        return -1;
-    }
 
-    if (argc == 3) {
-        rc = rrd_dump_r(argv[1], argv[2]);
-    } else {
-        rc = rrd_dump_r(argv[1], NULL);
-    }
-
-    return rc;
-}
-
-int rrd_dump_r(
+int rrd_dump_opt_r(
     const char *filename,
-    char *outname)
+    char *outname,
+    int opt_noheader)
 {
     unsigned int i, ii, ix, iii = 0;
     time_t    now;
@@ -83,7 +65,7 @@ int rrd_dump_r(
     rrd_value_t value;
     struct tm tm;
 
-    rrd_file = rrd_open(filename, &rrd, RRD_READONLY);
+    rrd_file = rrd_open(filename, &rrd, RRD_READONLY | RRD_READAHEAD);
     if (rrd_file == NULL) {
         rrd_free(&rrd);
         return (-1);
@@ -98,9 +80,19 @@ int rrd_dump_r(
         out_file = stdout;
     }
 
+    if (!opt_noheader) {
+        fputs("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n", out_file);
+        fputs
+            ("<!DOCTYPE rrd SYSTEM \"http://oss.oetiker.ch/rrdtool/rrdtool.dtd\">\n",
+             out_file);
+    }
     fputs("<!-- Round Robin Database Dump -->", out_file);
     fputs("<rrd>", out_file);
-    fprintf(out_file, "\t<version> %s </version>\n", RRD_VERSION);
+    if (atoi(rrd.stat_head->version) <= 3) {
+        fprintf(out_file, "\t<version> %s </version>\n", RRD_VERSION3);
+    } else {
+        fprintf(out_file, "\t<version> %s </version>\n", RRD_VERSION);
+    }
     fprintf(out_file, "\t<step> %lu </step> <!-- Seconds -->\n",
             rrd.stat_head->pdp_step);
 #if HAVE_STRFTIME
@@ -109,8 +101,8 @@ int rrd_dump_r(
 #else
 # error "Need strftime"
 #endif
-    fprintf(out_file, "\t<lastupdate> %ld </lastupdate> <!-- %s -->\n\n",
-            rrd.live_head->last_up, somestring);
+    fprintf(out_file, "\t<lastupdate> %lu </lastupdate> <!-- %s -->\n\n",
+            (unsigned long) rrd.live_head->last_up, somestring);
     for (i = 0; i < rrd.stat_head->ds_cnt; i++) {
         fprintf(out_file, "\t<ds>\n");
         fprintf(out_file, "\t\t<name> %s </name>\n", rrd.ds_def[i].ds_nam);
@@ -134,7 +126,7 @@ int rrd_dump_r(
         } else {        /* DST_CDEF */
             char     *str = NULL;
 
-            rpn_compact2str((rpn_cdefds_t *) & (rrd.ds_def[i].par[DS_cdef]),
+            rpn_compact2str((rpn_cdefds_t *) &(rrd.ds_def[i].par[DS_cdef]),
                             rrd.ds_def, &str);
             fprintf(out_file, "\t\t<cdef> %s </cdef>\n", str);
             free(str);
@@ -176,6 +168,7 @@ int rrd_dump_r(
         fprintf(out_file, "\t\t<params>\n");
         switch (cf_conv(rrd.rra_def[i].cf_nam)) {
         case CF_HWPREDICT:
+        case CF_MHWPREDICT:
             fprintf(out_file, "\t\t<hw_alpha> %0.10e </hw_alpha>\n",
                     rrd.rra_def[i].par[RRA_hw_alpha].u_val);
             fprintf(out_file, "\t\t<hw_beta> %0.10e </hw_beta>\n",
@@ -192,6 +185,12 @@ int rrd_dump_r(
             fprintf(out_file,
                     "\t\t<seasonal_smooth_idx> %lu </seasonal_smooth_idx>\n",
                     rrd.rra_def[i].par[RRA_seasonal_smooth_idx].u_cnt);
+            if (atoi(rrd.stat_head->version) >= 4) {
+                fprintf(out_file,
+                        "\t\t<smoothing_window> %0.10e </smoothing_window>\n",
+                        rrd.rra_def[i].par[RRA_seasonal_smoothing_window].
+                        u_val);
+            }
             fprintf(out_file,
                     "\t\t<dependent_rra_idx> %lu </dependent_rra_idx>\n",
                     rrd.rra_def[i].par[RRA_dependent_rra_idx].u_cnt);
@@ -255,6 +254,7 @@ int rrd_dump_r(
             }
             switch (cf_conv(rrd.rra_def[i].cf_nam)) {
             case CF_HWPREDICT:
+            case CF_MHWPREDICT:
                 value =
                     rrd.cdp_prep[i * rrd.stat_head->ds_cnt +
                                  ii].scratch[CDP_hw_intercept].u_val;
@@ -421,9 +421,69 @@ int rrd_dump_r(
     }
     fprintf(out_file, "</rrd>\n");
     rrd_free(&rrd);
-    close(rrd_file->fd);
     if (out_file != stdout) {
         fclose(out_file);
     }
-    return (0);
+    return rrd_close(rrd_file);
+}
+
+/* backward compatibility with 1.2.x */
+int rrd_dump_r(
+    const char *filename,
+    char *outname)
+{
+    return rrd_dump_opt_r(filename, outname, 0);
+}
+
+int rrd_dump(
+    int argc,
+    char **argv)
+{
+    int       rc;
+    int       opt_noheader = 0;
+
+    /* init rrd clean */
+
+    optind = 0;
+    opterr = 0;         /* initialize getopt */
+
+    while (42) {
+        int       opt;
+        int       option_index = 0;
+        static struct option long_options[] = {
+            {"no-header", no_argument, 0, 'n'},
+            {0, 0, 0, 0}
+        };
+
+        opt = getopt_long(argc, argv, "n", long_options, &option_index);
+
+        if (opt == EOF)
+            break;
+
+        switch (opt) {
+        case 'n':
+            opt_noheader = 1;
+            break;
+
+        default:
+            rrd_set_error("usage rrdtool %s [--no-header|-n] "
+                          "file.rrd [file.xml]", argv[0]);
+            return (-1);
+            break;
+        }
+    }                   /* while (42) */
+
+    if ((argc - optind) < 1 || (argc - optind) > 2) {
+        rrd_set_error("usage rrdtool %s [--no-header|-n] "
+                      "file.rrd [file.xml]", argv[0]);
+        return (-1);
+    }
+
+    if ((argc - optind) == 2) {
+        rc = rrd_dump_opt_r(argv[optind], argv[optind + 1], opt_noheader);
+    } else {
+        rc = rrd_dump_opt_r(argv[optind], NULL, opt_noheader);
+    }
+
+    return rc;
 }