+
+ if (rrd_xport(argc, argv, &xsize, &start, &end,
+ &step, &col_cnt, &legend_v, &data) == -1) {
+ PyErr_SetString(ErrorObject, rrd_get_error());
+ rrd_clear_error();
+ r = NULL;
+ } else {
+ PyObject *meta_dict, *data_list, *legend_list, *t;
+ unsigned long i, j;
+ rrd_value_t dv;
+
+ unsigned long row_cnt = (end - start) / step;
+
+ r = PyDict_New();
+ meta_dict = PyDict_New();
+ legend_list = PyList_New(col_cnt);
+ data_list = PyList_New(row_cnt);
+ PyDict_SetItem(r, PyString_FromString("meta"), meta_dict);
+ PyDict_SetItem(r, PyString_FromString("data"), data_list);
+
+ datai = data;
+
+ PyDict_SetItem(meta_dict, PyString_FromString("start"), PyInt_FromLong((long) start));
+ PyDict_SetItem(meta_dict, PyString_FromString("end"), PyInt_FromLong((long) end));
+ PyDict_SetItem(meta_dict, PyString_FromString("step"), PyInt_FromLong((long) step));
+ PyDict_SetItem(meta_dict, PyString_FromString("rows"), PyInt_FromLong((long) row_cnt));
+ PyDict_SetItem(meta_dict, PyString_FromString("columns"), PyInt_FromLong((long) col_cnt));
+ PyDict_SetItem(meta_dict, PyString_FromString("legend"), legend_list);
+
+ for (i = 0; i < col_cnt; i++) {
+ PyList_SET_ITEM(legend_list, i, PyString_FromString(legend_v[i]));
+ }
+
+ for (i = 0; i < row_cnt; i++) {
+ t = PyTuple_New(col_cnt);
+ PyList_SET_ITEM(data_list, i, t);
+
+ for (j = 0; j < col_cnt; j++) {
+ dv = *(datai++);
+ if (isnan(dv)) {
+ PyTuple_SET_ITEM(t, j, Py_None);
+ Py_INCREF(Py_None);
+ } else {
+ PyTuple_SET_ITEM(t, j, PyFloat_FromDouble((double) dv));
+ }
+ }
+ }
+
+ for (i = 0; i < col_cnt; i++) {
+ rrd_freemem(legend_v[i]);
+ }
+ rrd_freemem(legend_v);
+ rrd_freemem(data);