chiark / gitweb /
systemd-python: add _Reader.get_catalog()
[elogind.git] / src / python-systemd / _reader.c
index 42029abd4647234f12fd631f55a7fd05e770c141..a257757e127187404f6754a890678d70949b78ea 100644 (file)
 #include "macro.h"
 #include "util.h"
 
-#if PY_MAJOR_VERSION >=3
-# define unicode_FromStringAndSize PyUnicode_FromStringAndSize
-# define unicode_FromString PyUnicode_FromString
-# define long_FromLong PyLong_FromLong
-# define long_FromSize_t PyLong_FromSize_t
-# define long_Check PyLong_Check
-# define long_AsLong PyLong_AsLong
-#else
-/* Python 3 type naming convention is used */
-# define unicode_FromStringAndSize PyString_FromStringAndSize
-# define unicode_FromString PyString_FromString
-# define long_FromLong PyInt_FromLong
-# define long_FromSize_t PyInt_FromSize_t
-# define long_Check PyInt_Check
-# define long_AsLong PyInt_AsLong
-#endif
-
 typedef struct {
     PyObject_HEAD
     sd_journal *j;
@@ -164,13 +147,43 @@ static PyObject* Reader_reliable_fd(Reader *self, PyObject *args)
 }
 
 PyDoc_STRVAR(Reader_close__doc__,
-             "reliable_fd() -> None\n\n"
+             "close() -> None\n\n"
              "Free resources allocated by this Reader object.\n"
              "This method invokes sd_journal_close().\n"
              "See man:sd_journal_close(3).");
 static PyObject* Reader_close(Reader *self, PyObject *args)
 {
+    assert(self);
+    assert(!args);
+
+    sd_journal_close(self->j);
+    self->j = NULL;
+    Py_RETURN_NONE;
+}
+
+PyDoc_STRVAR(Reader___enter____doc__,
+             "__enter__() -> self\n\n"
+             "Part of the context manager protocol.\n"
+             "Returns self.\n");
+static PyObject* Reader___enter__(PyObject *self, PyObject *args)
+{
+    assert(self);
+    assert(!args);
+
+    Py_INCREF(self);
+    return self;
+}
+
+PyDoc_STRVAR(Reader___exit____doc__,
+             "__exit__(type, value, traceback) -> None\n\n"
+             "Part of the context manager protocol.\n"
+             "Closes the journal.\n");
+static PyObject* Reader___exit__(Reader *self, PyObject *args)
+{
+    assert(self);
+
     sd_journal_close(self->j);
+    self->j = NULL;
     Py_RETURN_NONE;
 }
 
@@ -428,7 +441,7 @@ static PyObject* Reader_seek_head(Reader *self, PyObject *args)
 
 PyDoc_STRVAR(Reader_seek_tail__doc__,
              "seek_tail() -> None\n\n"
-             "Jump to the beginning of the journal.\n"
+             "Jump to the end of the journal.\n"
              "This method invokes sd_journal_seek_tail().\n"
              "See man:sd_journal_seek_tail(3).");
 static PyObject* Reader_seek_tail(Reader *self, PyObject *args)
@@ -621,6 +634,29 @@ static PyObject* Reader_query_unique(Reader *self, PyObject *args)
     return value_set;
 }
 
+
+PyDoc_STRVAR(Reader_get_catalog__doc__,
+             "get_catalog() -> str\n\n"
+             "Retrieve a message catalog entry for the current journal entry.\n"
+             "Wraps man:sd_journal_get_catalog(3).");
+static PyObject* Reader_get_catalog(Reader *self, PyObject *args)
+{
+    int r;
+    char _cleanup_free_ *msg = NULL;
+
+    assert(self);
+    assert(!args);
+
+    Py_BEGIN_ALLOW_THREADS
+    r = sd_journal_get_catalog(self->j, &msg);
+    Py_END_ALLOW_THREADS
+    if (set_error(r, NULL, NULL))
+        return NULL;
+
+    return unicode_FromString(msg);
+}
+
+
 PyDoc_STRVAR(data_threshold__doc__,
              "Threshold for field size truncation in bytes.\n\n"
              "Fields longer than this will be truncated to the threshold size.\n"
@@ -653,12 +689,24 @@ static int Reader_set_data_threshold(Reader *self, PyObject *value, void *closur
     return set_error(r, NULL, NULL);
 }
 
-static PyGetSetDef Reader_getseters[] = {
+PyDoc_STRVAR(closed__doc__,
+             "True iff journal is closed");
+static PyObject* Reader_get_closed(Reader *self, void *closure)
+{
+    return PyBool_FromLong(self->j == NULL);
+}
+
+static PyGetSetDef Reader_getsetters[] = {
     {(char*) "data_threshold",
      (getter) Reader_get_data_threshold,
      (setter) Reader_set_data_threshold,
      (char*) data_threshold__doc__,
      NULL},
+    {(char*) "closed",
+     (getter) Reader_get_closed,
+     NULL,
+     (char*) closed__doc__,
+     NULL},
     {NULL}
 };
 
@@ -666,6 +714,9 @@ static PyMethodDef Reader_methods[] = {
     {"fileno",          (PyCFunction) Reader_fileno, METH_NOARGS, Reader_fileno__doc__},
     {"reliable_fd",     (PyCFunction) Reader_reliable_fd, METH_NOARGS, Reader_reliable_fd__doc__},
     {"close",           (PyCFunction) Reader_close, METH_NOARGS, Reader_close__doc__},
+    {"__enter__",       (PyCFunction) Reader___enter__, METH_NOARGS, Reader___enter____doc__},
+    {"__exit__",        (PyCFunction) Reader___exit__, METH_VARARGS, Reader___exit____doc__},
+    {"close",           (PyCFunction) Reader_close, METH_NOARGS, Reader_close__doc__},
     {"get_next",        (PyCFunction) Reader_get_next, METH_VARARGS, Reader_get_next__doc__},
     {"get_previous",    (PyCFunction) Reader_get_previous, METH_VARARGS, Reader_get_previous__doc__},
     {"add_match",       (PyCFunction) Reader_add_match, METH_VARARGS|METH_KEYWORDS, Reader_add_match__doc__},
@@ -678,6 +729,7 @@ static PyMethodDef Reader_methods[] = {
     {"wait",            (PyCFunction) Reader_wait, METH_VARARGS, Reader_wait__doc__},
     {"seek_cursor",     (PyCFunction) Reader_seek_cursor, METH_VARARGS, Reader_seek_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 */
 };
 
@@ -711,7 +763,7 @@ static PyTypeObject ReaderType = {
     Reader_iternext,                          /* tp_iternext */
     Reader_methods,                           /* tp_methods */
     0,                                        /* tp_members */
-    Reader_getseters,                         /* tp_getset */
+    Reader_getsetters,                        /* tp_getset */
     0,                                        /* tp_base */
     0,                                        /* tp_dict */
     0,                                        /* tp_descr_get */