Make python ts.problems() return a python list, not rpm.ps object

- rpm.ps object only supports iteration and subscript (with wonderfully
  wacko semantics), returning a regular list serves us better
- rip the now useless rpm.ps object type
This commit is contained in:
Panu Matilainen 2009-11-18 10:41:26 +02:00
parent a237f1eee0
commit 66dd52d94c
4 changed files with 12 additions and 147 deletions

View File

@ -214,7 +214,6 @@ static int prepareInitModule(void)
if (PyType_Ready(&rpmKeyring_Type) < 0) return 0;
if (PyType_Ready(&rpmmi_Type) < 0) return 0;
if (PyType_Ready(&rpmProblem_Type) < 0) return 0;
if (PyType_Ready(&rpmps_Type) < 0) return 0;
if (PyType_Ready(&rpmPubkey_Type) < 0) return 0;
if (PyType_Ready(&rpmtd_Type) < 0) return 0;
if (PyType_Ready(&rpmte_Type) < 0) return 0;
@ -314,9 +313,6 @@ static int initModule(PyObject *m)
Py_INCREF(&rpmProblem_Type);
PyModule_AddObject(m, "prob", (PyObject *) &rpmProblem_Type);
Py_INCREF(&rpmps_Type);
PyModule_AddObject(m, "ps", (PyObject *) &rpmps_Type);
Py_INCREF(&rpmPubkey_Type);
PyModule_AddObject(m, "pubkey", (PyObject *) &rpmPubkey_Type);

View File

@ -10,13 +10,6 @@ struct rpmProblemObject_s {
rpmProblem prob;
};
struct rpmpsObject_s {
PyObject_HEAD
PyObject *md_dict; /*!< to look like PyModuleObject */
rpmps ps;
rpmpsi psi;
};
static char rpmprob_doc[] =
"";
@ -117,7 +110,7 @@ PyTypeObject rpmProblem_Type = {
0, /* tp_is_gc */
};
static PyObject *rpmprob_Wrap(PyTypeObject *subtype, rpmProblem prob)
PyObject *rpmprob_Wrap(PyTypeObject *subtype, rpmProblem prob)
{
rpmProblemObject * s = (rpmProblemObject *)subtype->tp_alloc(subtype, 0);
if (s == NULL) return NULL;
@ -126,133 +119,3 @@ static PyObject *rpmprob_Wrap(PyTypeObject *subtype, rpmProblem prob)
return (PyObject *) s;
}
static PyObject *
rpmps_iternext(rpmpsObject * s)
{
PyObject * result = NULL;
/* Reset loop indices on 1st entry. */
if (s->psi == NULL) {
s->psi = rpmpsInitIterator(s->ps);
}
if (rpmpsNextIterator(s->psi) >= 0) {
result = rpmprob_Wrap(&rpmProblem_Type, rpmpsGetProblem(s->psi));
} else {
s->psi = rpmpsFreeIterator(s->psi);
}
return result;
}
static void
rpmps_dealloc(rpmpsObject * s)
{
s->ps = rpmpsFree(s->ps);
Py_TYPE(s)->tp_free((PyObject *)s);
}
static int
rpmps_length(rpmpsObject * s)
{
int rc;
rc = rpmpsNumProblems(s->ps);
return rc;
}
static PyObject *
rpmps_subscript(rpmpsObject * s, PyObject * key)
{
PyObject * result = NULL;
rpmpsi psi;
int ix, i;
if (!PyInt_Check(key)) {
PyErr_SetString(PyExc_TypeError, "integer expected");
return NULL;
}
ix = (int) PyInt_AsLong(key);
/* XXX range check */
psi = rpmpsInitIterator(s->ps);
while ((i = rpmpsNextIterator(psi)) >= 0) {
if (i == ix) {
char * ps = rpmProblemString(rpmpsGetProblem(psi));
result = Py_BuildValue("s", ps);
free(ps);
break;
}
}
psi = rpmpsFreeIterator(psi);
return result;
}
static PyMappingMethods rpmps_as_mapping = {
(lenfunc) rpmps_length, /* mp_length */
(binaryfunc) rpmps_subscript, /* mp_subscript */
};
static PyObject * rpmps_new(PyTypeObject * subtype, PyObject *args, PyObject *kwds)
{
rpmps ps = rpmpsCreate();
return rpmps_Wrap(subtype, ps);
}
static char rpmps_doc[] =
"";
PyTypeObject rpmps_Type = {
PyVarObject_HEAD_INIT(&PyType_Type, 0)
"rpm.ps", /* tp_name */
sizeof(rpmpsObject), /* tp_basicsize */
0, /* tp_itemsize */
/* methods */
(destructor) rpmps_dealloc, /* tp_dealloc */
0, /* tp_print */
(getattrfunc)0, /* tp_getattr */
(setattrfunc)0, /* tp_setattr */
0, /* tp_compare */
(reprfunc)0, /* tp_repr */
0, /* tp_as_number */
0, /* tp_as_sequence */
&rpmps_as_mapping, /* tp_as_mapping */
(hashfunc)0, /* tp_hash */
(ternaryfunc)0, /* tp_call */
(reprfunc)0, /* tp_str */
PyObject_GenericGetAttr, /* tp_getattro */
PyObject_GenericSetAttr, /* tp_setattro */
0, /* tp_as_buffer */
Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, /* tp_flags */
rpmps_doc, /* tp_doc */
0, /* tp_traverse */
0, /* tp_clear */
(richcmpfunc)0, /* tp_richcompare */
0, /* tp_weaklistoffset */
PyObject_SelfIter, /* tp_iter */
(iternextfunc) rpmps_iternext, /* tp_iternext */
0, /* 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 */
(newfunc) rpmps_new, /* tp_new */
0, /* tp_free */
0, /* tp_is_gc */
};
PyObject * rpmps_Wrap(PyTypeObject *subtype, rpmps ps)
{
rpmpsObject * s = (rpmpsObject *)subtype->tp_alloc(subtype, 0);
if (s == NULL) return NULL;
s->ps = ps; /* XXX refcounts? */
s->psi = NULL;
return (PyObject *) s;
}

View File

@ -4,14 +4,11 @@
#include <rpm/rpmps.h>
typedef struct rpmProblemObject_s rpmProblemObject;
typedef struct rpmpsObject_s rpmpsObject;
extern PyTypeObject rpmProblem_Type;
extern PyTypeObject rpmps_Type;
#define rpmProblemObject_Check(v) ((v)->ob_type == &rpmProblem_Type)
#define rpmpsObject_Check(v) ((v)->ob_type == &rpmps_Type)
PyObject * rpmps_Wrap(PyTypeObject *subtype, rpmps ps);
PyObject * rpmprob_Wrap(PyTypeObject *subtype, rpmProblem prob);
#endif

View File

@ -512,7 +512,16 @@ rpmtsCallback(const void * hd, const rpmCallbackType what,
static PyObject *
rpmts_Problems(rpmtsObject * s)
{
return rpmps_Wrap(&rpmps_Type, rpmtsProblems(s->ts));
PyObject *problems = PyList_New(0);
rpmps ps = rpmtsProblems(s->ts);
rpmpsi psi = rpmpsInitIterator(ps);
while (rpmpsNextIterator(psi) >= 0) {
PyObject *prob = rpmprob_Wrap(&rpmProblem_Type, rpmpsGetProblem(psi));
PyList_Append(problems, prob);
}
rpmpsFreeIterator(psi);
rpmpsFree(ps);
return problems;
}
static PyObject *