Add limited support for modifying headers to python

- for now we only support tag deletion and assigning rpmtd objects, limiting
  this to copying data from other headers
This commit is contained in:
Panu Matilainen 2009-10-12 14:43:44 +03:00
parent bc716457e0
commit c6649c55a8
3 changed files with 34 additions and 1 deletions

View File

@ -456,6 +456,24 @@ static PyObject * hdr_subscript(hdrObject * s, PyObject * item)
return hdrGetTag(s->h, tag);
}
static int hdr_ass_subscript(hdrObject *s, PyObject *key, PyObject *value)
{
rpmTag tag;
rpmtd td;
if (!tagNumFromPyObject(key, &tag)) return -1;
if (value == NULL) {
/* XXX should failure raise key error? */
headerDel(s->h, tag);
} else if (rpmtdFromPyObject(value, &td)) {
headerPut(s->h, td, HEADERPUT_DEFAULT);
} else {
PyErr_SetString(PyExc_TypeError, "rpm.td type expected");
return -1;
}
return 0;
}
static PyObject * hdr_getattro(hdrObject * s, PyObject * n)
{
PyObject *res = PyObject_GenericGetAttr((PyObject *) s, n);
@ -477,7 +495,7 @@ static int hdr_setattro(PyObject * o, PyObject * n, PyObject * v)
static PyMappingMethods hdr_as_mapping = {
(lenfunc) 0, /* mp_length */
(binaryfunc) hdr_subscript, /* mp_subscript */
(objobjargproc)0, /* mp_ass_subscript */
(objobjargproc)hdr_ass_subscript,/* mp_ass_subscript */
};
static char hdr_doc[] =

View File

@ -178,3 +178,14 @@ PyTypeObject rpmtd_Type = {
0, /* tp_free */
0, /* tp_is_gc */
};
int rpmtdFromPyObject(PyObject *obj, rpmtd *td)
{
if (rpmtdObject_Check(obj)) {
*td = &(((rpmtdObject *)obj)->td);
return 1;
} else {
return 0;
}
}

View File

@ -5,6 +5,10 @@ typedef struct rpmtdObject_s rpmtdObject;
extern PyTypeObject rpmtd_Type;
#define rpmtdObject_Check(v) ((v)->ob_type == &rpmtd_Type)
PyObject * rpmtd_AsPyobj(rpmtd td);
int rpmtdFromPyObject(PyObject *obj, rpmtd *td);
#endif