summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: 4066685)
raw | patch | inline | side by side (parent: 4066685)
author | oetiker <oetiker@a5681a0c-68f1-0310-ab6d-d61299d08faa> | |
Fri, 24 Feb 2012 07:44:25 +0000 (07:44 +0000) | ||
committer | oetiker <oetiker@a5681a0c-68f1-0310-ab6d-d61299d08faa> | |
Fri, 24 Feb 2012 07:44:25 +0000 (07:44 +0000) |
src/rrd_tool.c | patch | blob | history | |
src/rrd_xport.c | patch | blob | history |
diff --git a/src/rrd_tool.c b/src/rrd_tool.c
index 4dd4cae1f1c6524cbe6b56a8cf74e7a1681ed96b..24abcdce9c36a4ad445e4cc9ddd3bd8509fbdf45 100644 (file)
--- a/src/rrd_tool.c
+++ b/src/rrd_tool.c
}
} else if (strcmp("xport", argv[1]) == 0) {
#ifdef HAVE_RRD_GRAPH
- int xxsize;
- unsigned long int j = 0;
- time_t start, end, ti;
- unsigned long step, col_cnt, row_cnt;
- rrd_value_t *data, *ptr;
- char **legend_v;
- int enumds = 0;
- int json = 0;
- int i;
- size_t vtag_s = strlen(COL_DATA_TAG) + 10;
- char *vtag = malloc(vtag_s);
-
- for (i = 2; i < argc; i++) {
- if (strcmp("--enumds", argv[i]) == 0)
- enumds = 1;
- if (strcmp("--json", argv[i]) == 0)
- json = 1;
- }
-
- if (rrd_xport
- (argc - 1, &argv[1], &xxsize, &start, &end, &step, &col_cnt,
- &legend_v, &data) == 0) {
- char *old_locale = setlocale(LC_NUMERIC,NULL);
- setlocale(LC_NUMERIC, "C");
- row_cnt = (end - start) / step;
- ptr = data;
- if (json == 0){
- printf("<?xml version=\"1.0\" encoding=\"%s\"?>\n\n",
- XML_ENCODING);
- printf("<%s>\n", ROOT_TAG);
- printf(" <%s>\n", META_TAG);
- }
- else {
- printf("{ about: 'RRDtool xport JSON output',\n meta: {\n");
- }
-
-
-#define pXJV(indent,fmt,tag,value) \
- if (json) { \
- printf(indent "\"%s\": " fmt ",\n",tag,value); \
- } else { \
- printf(indent "<%s>" fmt "</%s>\n",tag,value,tag); \
- }
-
- pXJV(" ","%lld",META_START_TAG,(long long int) start + step);
- pXJV(" ","%lu", META_STEP_TAG, step);
- pXJV(" ","%lld",META_END_TAG,(long long int) start + step);
- if (! json){
- pXJV(" ","%lu", META_ROWS_TAG, row_cnt);
- pXJV(" ","%lu", META_COLS_TAG, col_cnt);
- }
-
- if (json){
- printf(" \"%s\": [\n", LEGEND_TAG);
- }
- else {
- printf(" <%s>\n", LEGEND_TAG);
- }
- for (j = 0; j < col_cnt; j++) {
- char *entry = NULL;
- entry = legend_v[j];
- if (json){
- printf(" '%s'", entry);
- if (j < col_cnt -1){
- printf(",");
- }
- printf("\n");
- }
- else {
- printf(" <%s>%s</%s>\n", LEGEND_ENTRY_TAG, entry,
- LEGEND_ENTRY_TAG);
- }
- free(entry);
- }
- free(legend_v);
- if (json){
- printf(" ]\n },\n");
- }
- else {
- printf(" </%s>\n", LEGEND_TAG);
- printf(" </%s>\n", META_TAG);
- }
-
- if (json){
- printf(" \"%s\": [\n",DATA_TAG);
- } else {
- printf(" <%s>\n", DATA_TAG);
- }
- for (ti = start + step; ti <= end; ti += step) {
- if (json){
- printf(" [ ");
- }
- else {
- printf(" <%s>", DATA_ROW_TAG);
- printf("<%s>%lld</%s>", COL_TIME_TAG, (long long int)ti, COL_TIME_TAG);
- }
- for (j = 0; j < col_cnt; j++) {
- rrd_value_t newval = DNAN;
- newval = *ptr;
- if (json){
- if (isnan(newval)){
- printf("null");
- } else {
- printf("%0.10e",newval);
- }
- if (j < col_cnt -1){
- printf(", ");
- }
- }
- else {
- if (enumds == 1)
- snprintf(vtag, vtag_s, "%s%lu", COL_DATA_TAG, j);
- else
- snprintf(vtag, vtag_s, "%s", COL_DATA_TAG);
- if (isnan(newval)) {
- printf("<%s>NaN</%s>", vtag, vtag);
- } else {
- printf("<%s>%0.10e</%s>", vtag, newval, vtag);
- };
- }
- ptr++;
- }
- if (json){
- printf(ti < end ? " ],\n" : " ]\n");
- }
- else {
- printf("</%s>\n", DATA_ROW_TAG);
- }
- }
- free(data);
- if (json){
- printf(" ]\n}\n");
- }
- else {
- printf(" </%s>\n", DATA_TAG);
- printf("</%s>\n", ROOT_TAG);
- }
- setlocale(LC_NUMERIC, old_locale);
- }
- free(vtag);
+ time_t start, end;
+ unsigned long step, col_cnt;
+ rrd_value_t *data;
+ char **legend_v;
+ rrd_xport
+ (argc - 1, &argv[1], NULL, &start, &end, &step, &col_cnt,
+ &legend_v, &data);
#else
rrd_set_error("the instance of rrdtool has been compiled without graphics");
#endif
diff --git a/src/rrd_xport.c b/src/rrd_xport.c
index c4173e4c9f570799b7453d6eaf32e82426134322..4457b60f9478dbe13159137b3ec7b50ddd3baf0d 100644 (file)
--- a/src/rrd_xport.c
+++ b/src/rrd_xport.c
#include <fcntl.h>
#endif
-
int rrd_xport(
int,
char **,
rrd_value_t **,
int);
+/* helper function for buffer handling */
+typedef struct stringbuffer_t {
+ size_t allocated;
+ size_t len;
+ unsigned char* data;
+ FILE *file;
+} stringbuffer_t;
+int addToBuffer(stringbuffer_t *,char*,size_t);
+void escapeJSON(char*,size_t);
+int rrd_graph_xport(image_desc_t *);
+int rrd_xport_format_xmljson(int,stringbuffer_t *,image_desc_t*,time_t, time_t, unsigned long, unsigned long, char**, rrd_value_t*);
+int rrd_xport_format_sv(char,stringbuffer_t *,image_desc_t*,time_t, time_t, unsigned long, unsigned long, char**, rrd_value_t*);
+int rrd_xport_format_addprints(int,stringbuffer_t *,image_desc_t *);
int rrd_xport(
int argc,
rrd_parsetime("end-24h", &start_tv);
rrd_parsetime("now", &end_tv);
+ int enumds=0;
+ int json=0;
+
while (1) {
int option_index = 0;
int opt;
im.step = atoi(optarg);
break;
case 262:
+ enumds=1;
+ break;
+ case 263:
+ json=1;
break;
case 's':
if ((parsetime_error = rrd_parsetime(optarg, &start_tv))) {
return -1;
}
+ /* and create the export */
+ if (!xsize) {
+ int flags=0;
+ if (json) { flags|=1; }
+ if (enumds) { flags|=4; }
+ stringbuffer_t buffer={0,0,NULL,stdout};
+ rrd_xport_format_xmljson(flags,&buffer,&im,
+ *start, *end, *step,
+ *col_cnt, *legend_v,
+ *data);
+ }
+
im_free(&im);
return 0;
}
}
-/* helper function for buffer handling */
-typedef struct stringbuffer_t {
- size_t allocated;
- size_t len;
- unsigned char* data;
- FILE *file;
-} stringbuffer_t;
-int addToBuffer(stringbuffer_t *,char*,size_t);
-void escapeJSON(char*,size_t);
-
-int rrd_graph_xport(image_desc_t *);
-int rrd_xport_format_xmljson(int,stringbuffer_t *,image_desc_t*,time_t, time_t, unsigned long, unsigned long, char**, rrd_value_t*);
-int rrd_xport_format_sv(char,stringbuffer_t *,image_desc_t*,time_t, time_t, unsigned long, unsigned long, char**, rrd_value_t*);
-int rrd_xport_format_addprints(int,stringbuffer_t *,image_desc_t *);
-
int rrd_graph_xport(image_desc_t *im) {
/* prepare the data for processing */
unsigned long col_cnt=0;
@@ -690,9 +706,11 @@ int rrd_xport_format_xmljson(int flags,stringbuffer_t *buffer,image_desc_t *im,t
if (rrd_xport_format_addprints(json,buffer,im)) {return -1;}
/* if we have got a trailing , then kill it */
- if (buffer->data[buffer->len-2]==',') {
- buffer->data[buffer->len-2]=buffer->data[buffer->len-1];
- buffer->len--;
+ if (buffer->data) {
+ if (buffer->data[buffer->len-2]==',') {
+ buffer->data[buffer->len-2]=buffer->data[buffer->len-1];
+ buffer->len--;
+ }
}
/* end meta */