From: Zbigniew Jędrzejewski-Szmek Date: Wed, 20 Mar 2013 23:00:37 +0000 (-0400) Subject: systemd-python: implement _Reader.test_cursor X-Git-Tag: v199~94 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=commitdiff_plain;h=1cdcd71be06a7f51012766d6b2f9e828b715f5e7 systemd-python: implement _Reader.test_cursor Getting the cursor is split out from .get_next() into .get_cursor(). This mirrors the C API more closely, and also makes things a bit faster if the cursor is not needed. --- diff --git a/TODO b/TODO index 2be45038b..8c99afcd7 100644 --- a/TODO +++ b/TODO @@ -585,7 +585,6 @@ Features: * systemd-python: - allow reading of only select fields in systemd.journal._reader.Reader - - export sd_journal_test_cursor in systemd.journal._reader.Reader - figure out a simple way to wait for journal events in a way that works with ^C - add documentation to systemd.daemon diff --git a/src/python-systemd/_reader.c b/src/python-systemd/_reader.c index 4fe784761..b74d2beab 100644 --- a/src/python-systemd/_reader.c +++ b/src/python-systemd/_reader.c @@ -374,26 +374,6 @@ static PyObject* Reader_get_next(Reader *self, PyObject *args) goto error; } - { - PyObject _cleanup_Py_DECREF_ *key = NULL, *value = NULL; - char _cleanup_free_ *cursor = NULL; - - r = sd_journal_get_cursor(self->j, &cursor); - if (set_error(r, NULL, NULL)) - goto error; - - key = unicode_FromString("__CURSOR"); - if (!key) - goto error; - - value = PyBytes_FromString(cursor); - if (!value) - goto error; - - if (PyDict_SetItem(dict, key, value)) - goto error; - } - return dict; error: Py_DECREF(dict); @@ -602,6 +582,50 @@ static PyObject* Reader_seek_cursor(Reader *self, PyObject *args) } +PyDoc_STRVAR(Reader_get_cursor__doc__, + "get_cursor() -> str\n\n" + "Return a cursor string for the current journal entry.\n\n" + "Wraps sd_journal_get_cursor(). See man:sd_journal_get_cursor(3)."); +static PyObject* Reader_get_cursor(Reader *self, PyObject *args) +{ + char _cleanup_free_ *cursor = NULL; + int r; + + assert(self); + assert(!args); + + r = sd_journal_get_cursor(self->j, &cursor); + if (set_error(r, NULL, NULL)) + return NULL; + + return unicode_FromString(cursor); +} + + +PyDoc_STRVAR(Reader_test_cursor__doc__, + "test_cursor(str) -> bool\n\n" + "Test whether the cursor string matches current journal entry.\n\n" + "Wraps sd_journal_test_cursor(). See man:sd_journal_test_cursor(3)."); +static PyObject* Reader_test_cursor(Reader *self, PyObject *args) +{ + const char *cursor; + int r; + + assert(self); + assert(args); + + if (!PyArg_ParseTuple(args, "s:_Reader.get_cursor", &cursor)) + return NULL; + + r = sd_journal_test_cursor(self->j, cursor); + set_error(r, NULL, NULL); + if (r < 0) + return NULL; + + return PyBool_FromLong(r); +} + + static PyObject* Reader_iter(PyObject *self) { Py_INCREF(self); @@ -792,6 +816,8 @@ static PyMethodDef Reader_methods[] = { {"seek_monotonic", (PyCFunction) Reader_seek_monotonic, METH_VARARGS, Reader_seek_monotonic__doc__}, {"wait", (PyCFunction) Reader_wait, METH_VARARGS, Reader_wait__doc__}, {"seek_cursor", (PyCFunction) Reader_seek_cursor, METH_VARARGS, Reader_seek_cursor__doc__}, + {"get_cursor", (PyCFunction) Reader_get_cursor, METH_NOARGS, Reader_get_cursor__doc__}, + {"test_cursor", (PyCFunction) Reader_test_cursor, METH_VARARGS, Reader_test_cursor__doc__}, {"query_unique", (PyCFunction) Reader_query_unique, METH_VARARGS, Reader_query_unique__doc__}, {"get_catalog", (PyCFunction) Reader_get_catalog, METH_NOARGS, Reader_get_catalog__doc__}, {NULL} /* Sentinel */