diff options
Diffstat (limited to 'python/rpmstrpool-py.c')
-rw-r--r-- | python/rpmstrpool-py.c | 156 |
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); +} |