summaryrefslogtreecommitdiff
path: root/python/rpmstrpool-py.c
diff options
context:
space:
mode:
Diffstat (limited to 'python/rpmstrpool-py.c')
-rw-r--r--python/rpmstrpool-py.c156
1 files changed, 156 insertions, 0 deletions
diff --git a/python/rpmstrpool-py.c b/python/rpmstrpool-py.c
new file mode 100644
index 000000000..356bd1de5
--- /dev/null
+++ b/python/rpmstrpool-py.c
@@ -0,0 +1,156 @@
+#include "rpmsystem-py.h"
+#include <rpm/rpmstrpool.h>
+#include "rpmstrpool-py.h"
+
+struct rpmstrPoolObject_s {
+ PyObject_HEAD
+ PyObject *md_dict;
+ rpmstrPool pool;
+};
+
+static char strpool_doc[] = "";
+
+static void strpool_dealloc(rpmstrPoolObject *s)
+{
+ s->pool = rpmstrPoolFree(s->pool);
+ Py_TYPE(s)->tp_free((PyObject *)s);
+}
+
+static PyObject *strpool_new(PyTypeObject *subtype,
+ PyObject *args, PyObject *kwds)
+{
+ return rpmstrPool_Wrap(subtype, NULL);
+}
+
+static PyObject *strpool_str2id(rpmstrPoolObject *s,
+ PyObject *args, PyObject *kwds)
+{
+ char * kwlist[] = { "str", "create", NULL };
+ const char *str = NULL;
+ int create = 1;
+
+ if (!PyArg_ParseTupleAndKeywords(args, kwds, "s|i", kwlist, &str, &create))
+ return NULL;
+
+ return PyLong_FromLong(rpmstrPoolId(s->pool, str, create));
+}
+
+static PyObject *strpool_id2str(rpmstrPoolObject *s, PyObject *item)
+{
+ PyObject *ret = NULL;
+ rpmsid id = 0;
+
+ if (PyArg_Parse(item, "I", &id)) {
+ const char *str = rpmstrPoolStr(s->pool, id);
+
+ if (str)
+ ret = PyBytes_FromString(str);
+ else
+ PyErr_SetObject(PyExc_KeyError, item);
+ }
+ return ret;
+}
+
+static PyObject *strpool_freeze(rpmstrPoolObject *s,
+ PyObject *args, PyObject *kwds)
+{
+ char * kwlist[] = { "keephash", NULL };
+ int keephash = 0;
+
+ if (!PyArg_ParseTupleAndKeywords(args, kwds, "|i", kwlist, &keephash))
+ return NULL;
+
+ rpmstrPoolFreeze(s->pool, keephash);
+ Py_RETURN_NONE;
+}
+
+static PyObject *strpool_unfreeze(rpmstrPoolObject *s)
+{
+ rpmstrPoolUnfreeze(s->pool);
+ Py_RETURN_NONE;
+}
+
+static Py_ssize_t strpool_length(rpmstrPoolObject *s)
+{
+ return rpmstrPoolNumStr(s->pool);
+}
+
+static struct PyMethodDef strpool_methods[] = {
+ { "str2id", (PyCFunction)strpool_str2id, METH_VARARGS|METH_KEYWORDS,
+ NULL },
+ { "id2str", (PyCFunction)strpool_id2str, METH_O,
+ NULL },
+ { "freeze", (PyCFunction)strpool_freeze, METH_VARARGS|METH_KEYWORDS,
+ NULL },
+ { "unfreeze", (PyCFunction)strpool_unfreeze, METH_NOARGS,
+ NULL },
+ { NULL, NULL }
+};
+
+static PyMappingMethods strpool_as_mapping = {
+ (lenfunc) strpool_length, /* mp_length */
+ (binaryfunc) strpool_id2str, /* mp_subscript */
+ (objobjargproc) 0, /* mp_ass_subscript */
+};
+
+PyTypeObject rpmstrPool_Type = {
+ PyVarObject_HEAD_INIT(&PyType_Type, 0)
+ "rpm.strpool", /* tp_name */
+ sizeof(rpmstrPoolObject), /* tp_size */
+ 0, /* tp_itemsize */
+ (destructor) strpool_dealloc, /* tp_dealloc */
+ 0, /* tp_print */
+ (getattrfunc)0, /* tp_getattr */
+ 0, /* tp_setattr */
+ 0, /* tp_compare */
+ 0, /* tp_repr */
+ 0, /* tp_as_number */
+ 0, /* tp_as_sequence */
+ &strpool_as_mapping, /* tp_as_mapping */
+ 0, /* tp_hash */
+ 0, /* tp_call */
+ 0, /* tp_str */
+ PyObject_GenericGetAttr, /* tp_getattro */
+ PyObject_GenericSetAttr, /* tp_setattro */
+ 0, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, /* tp_flags */
+ strpool_doc, /* tp_doc */
+ 0, /* tp_traverse */
+ 0, /* tp_clear */
+ 0, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ 0, /* tp_iter */
+ 0, /* tp_iternext */
+ strpool_methods, /* tp_methods */
+ 0, /* tp_members */
+ 0, /* tp_getset */
+ 0, /* tp_base */
+ 0, /* tp_dict */
+ 0, /* tp_descr_get */
+ 0, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ 0, /* tp_init */
+ 0, /* tp_alloc */
+ strpool_new, /* tp_new */
+ 0, /* tp_free */
+ 0, /* tp_is_gc */
+};
+
+PyObject * rpmstrPool_Wrap(PyTypeObject *subtype, rpmstrPool pool)
+{
+ rpmstrPoolObject *s = (rpmstrPoolObject *)subtype->tp_alloc(subtype, 0);
+ if (s == NULL) return NULL;
+
+ /* permit referencing a pre-existing pool as well */
+ s->pool = (pool != NULL) ? rpmstrPoolLink(pool) : rpmstrPoolCreate();
+
+ return (PyObject *) s;
+}
+
+int poolFromPyObject(PyObject *item, rpmstrPool *pool)
+{
+ rpmstrPoolObject *p = NULL;
+ if (PyArg_Parse(item, "O!", &rpmstrPool_Type, &p))
+ *pool = p->pool;
+ return (p != NULL);
+}