*
*/
+#ifdef UNUSED
+#elif defined(__GNUC__)
+# define UNUSED(x) x __attribute__((unused))
+#elif defined(__LCLINT__)
+# define UNUSED(x) /*@unused@*/ x
+#else
+# define UNUSED(x) x
+#endif
+
static const char *__version__ = "$Revision: 1.14 $";
#include "Python.h"
#include "rrd_extra.h"
static PyObject *ErrorObject;
-extern int optind, opterr;
+extern int optind;
+extern int opterr;
+
+/* forward declaration to keep compiler happy */
+void initrrdtool(void);
static int
create_args(char *command, PyObject *args, int *argc, char ***argv)
[RRA:CF:xff:steps:rows]";
static PyObject *
-PyRRD_create(PyObject *self, PyObject *args)
+PyRRD_create(PyObject UNUSED(*self), PyObject *args)
{
PyObject *r;
char **argv;
"N|timestamp:value[:value...] [timestamp:value[:value...] ...]";
static PyObject *
-PyRRD_update(PyObject *self, PyObject *args)
+PyRRD_update(PyObject UNUSED(*self), PyObject *args)
{
PyObject *r;
char **argv;
"[--start|-s start] [--end|-e end]";
static PyObject *
-PyRRD_fetch(PyObject *self, PyObject *args)
+PyRRD_fetch(PyObject UNUSED(*self), PyObject *args)
{
PyObject *r;
rrd_value_t *data, *datai;
/* Return :
((start, end, step), (name1, name2, ...), [(data1, data2, ..), ...]) */
PyObject *range_tup, *dsnam_tup, *data_list, *t;
- int i, j, row;
+ unsigned long i, j, row;
rrd_value_t dv;
row = ((end - start) / step + 1);
"[STACK:vname[#rrggbb[:legend]]]";
static PyObject *
-PyRRD_graph(PyObject *self, PyObject *args)
+PyRRD_graph(PyObject UNUSED(*self), PyObject *args)
{
PyObject *r;
char **argv, **calcpr;
"[--data-source-type|-d ds-name:DST] [--data-source-rename|-r old-name:new-name]";
static PyObject *
-PyRRD_tune(PyObject *self, PyObject *args)
+PyRRD_tune(PyObject UNUSED(*self), PyObject *args)
{
PyObject *r;
char **argv;
return r;
}
+static char PyRRD_first__doc__[] =
+"first(filename): Return the timestamp of the first data sample in an RRD";
+
+static PyObject *
+PyRRD_first(PyObject UNUSED(*self), PyObject *args)
+{
+ PyObject *r;
+ int argc, ts;
+ char **argv;
+
+ if (create_args("first", args, &argc, &argv) < 0)
+ return NULL;
+
+ if ((ts = rrd_first(argc, argv)) == -1) {
+ PyErr_SetString(ErrorObject, rrd_get_error());
+ rrd_clear_error();
+ r = NULL;
+ } else
+ r = PyInt_FromLong((long)ts);
+
+ destroy_args(&argv);
+ return r;
+}
+
static char PyRRD_last__doc__[] =
"last(filename): Return the timestamp of the last data sample in an RRD";
static PyObject *
-PyRRD_last(PyObject *self, PyObject *args)
+PyRRD_last(PyObject UNUSED(*self), PyObject *args)
{
PyObject *r;
int argc, ts;
" resize filename rra-num GROW|SHRINK rows";
static PyObject *
-PyRRD_resize(PyObject *self, PyObject *args)
+PyRRD_resize(PyObject UNUSED(*self), PyObject *args)
{
PyObject *r;
char **argv;
"info(filename): extract header information from an rrd";
static PyObject *
-PyRRD_info(PyObject *self, PyObject *args)
+PyRRD_info(PyObject UNUSED(*self), PyObject *args)
{
PyObject *r, *t, *ds;
rrd_t rrd;
FILE *in_file;
char *filename;
- int i, j;
+ unsigned long i, j;
if (! PyArg_ParseTuple(args, "s:info", &filename))
return NULL;
/* List of methods defined in the module */
#define meth(name, func, doc) {name, (PyCFunction)func, METH_VARARGS, doc}
-static struct PyMethodDef _rrdtool_methods[] = {
+static PyMethodDef _rrdtool_methods[] = {
meth("create", PyRRD_create, PyRRD_create__doc__),
meth("update", PyRRD_update, PyRRD_update__doc__),
meth("fetch", PyRRD_fetch, PyRRD_fetch__doc__),
meth("graph", PyRRD_graph, PyRRD_graph__doc__),
meth("tune", PyRRD_tune, PyRRD_tune__doc__),
+ meth("first", PyRRD_first, PyRRD_first__doc__),
meth("last", PyRRD_last, PyRRD_last__doc__),
meth("resize", PyRRD_resize, PyRRD_resize__doc__),
meth("info", PyRRD_info, PyRRD_info__doc__),
- {NULL, NULL},
+ {NULL, NULL,0,NULL}
};
#define SET_INTCONSTANT(dict, value) \
d = PyModule_GetDict(m);
SET_STRCONSTANT(d, __version__);
- ErrorObject = PyErr_NewException("_rrdtool.error", NULL, NULL);
+ ErrorObject = PyErr_NewException("rrdtool.error", NULL, NULL);
PyDict_SetItemString(d, "error", ErrorObject);
/* Check for errors */