2003-04-18 01:17:27 +08:00
|
|
|
/** \ingroup py_c
|
2002-05-29 07:06:44 +08:00
|
|
|
* \file python/rpmmi-py.c
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include "system.h"
|
|
|
|
|
|
|
|
#include "Python.h"
|
2002-07-15 05:23:29 +08:00
|
|
|
#ifdef __LCLINT__
|
|
|
|
#undef PyObject_HEAD
|
|
|
|
#define PyObject_HEAD int _PyObjectHead;
|
|
|
|
#endif
|
|
|
|
|
2002-05-29 07:06:44 +08:00
|
|
|
#include <rpmlib.h>
|
2002-08-06 05:46:50 +08:00
|
|
|
#include <rpmdb.h>
|
2002-05-29 07:06:44 +08:00
|
|
|
|
|
|
|
#include "rpmmi-py.h"
|
|
|
|
#include "header-py.h"
|
|
|
|
|
|
|
|
#include "debug.h"
|
|
|
|
|
|
|
|
/** \ingroup python
|
2002-06-04 07:27:05 +08:00
|
|
|
* \class Rpmmi
|
2002-05-29 07:06:44 +08:00
|
|
|
* \brief A python rpm.mi match iterator object represents the result of a
|
|
|
|
* database query.
|
|
|
|
*
|
|
|
|
* Instances of the rpm.mi object provide access to headers that match
|
|
|
|
* certain criteria. Typically, a primary index is accessed to find
|
|
|
|
* a set of headers that contain a key, and each header is returned
|
|
|
|
* serially.
|
|
|
|
*
|
|
|
|
* The rpm.mi class conains the following methods:
|
|
|
|
* - next() -> hdr Return the next header that matches.
|
|
|
|
*
|
|
|
|
* - pattern(tag,mire,pattern) Specify secondary match criteria.
|
|
|
|
*
|
|
|
|
* To obtain a rpm.mi object to query the database used by a transaction,
|
|
|
|
* the ts.match(tag,key,len) method is used.
|
|
|
|
*
|
|
|
|
* Here's an example that prints the name of all installed packages:
|
|
|
|
* \code
|
|
|
|
* import rpm
|
|
|
|
* ts = rpm.TransactionSet()
|
2002-08-06 05:46:50 +08:00
|
|
|
* for h in ts.dbMatch():
|
2002-05-29 07:06:44 +08:00
|
|
|
* print h['name']
|
|
|
|
* \endcode
|
|
|
|
*
|
|
|
|
* Here's a more typical example that uses the Name index to retrieve
|
|
|
|
* all installed kernel(s):
|
|
|
|
* \code
|
|
|
|
* import rpm
|
|
|
|
* ts = rpm.TransactionSet()
|
|
|
|
* mi = ts.dbMatch('name', "kernel")
|
2002-08-06 05:46:50 +08:00
|
|
|
* for h in mi:
|
2002-05-29 07:06:44 +08:00
|
|
|
* print "%s-%s-%s" % (h['name'], h['version'], h['release'])
|
|
|
|
* \endcode
|
|
|
|
*
|
|
|
|
* Finally, here's an example that retrieves all packages whose name
|
|
|
|
* matches the glob expression "XFree*":
|
|
|
|
* \code
|
|
|
|
* import rpm
|
|
|
|
* ts = rpm.TransactionSet()
|
|
|
|
* mi = ts.dbMatch()
|
|
|
|
* mi.pattern('name', rpm.RPMMIRE_GLOB, "XFree*")
|
2002-08-06 05:46:50 +08:00
|
|
|
* for h in mi:
|
2002-05-29 07:06:44 +08:00
|
|
|
* print "%s-%s-%s" % (h['name'], h['version'], h['release'])
|
|
|
|
* \endcode
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
/** \ingroup python
|
2002-06-04 07:27:05 +08:00
|
|
|
* \name Class: Rpmmi
|
2002-05-29 07:06:44 +08:00
|
|
|
*/
|
|
|
|
/*@{*/
|
|
|
|
|
2002-07-25 08:13:25 +08:00
|
|
|
/**
|
2002-07-20 04:26:38 +08:00
|
|
|
*/
|
2002-05-29 07:06:44 +08:00
|
|
|
static PyObject *
|
2002-07-20 04:26:38 +08:00
|
|
|
rpmmi_iter(rpmmiObject * s)
|
2002-07-15 05:23:29 +08:00
|
|
|
/*@*/
|
2002-05-29 07:06:44 +08:00
|
|
|
{
|
|
|
|
Py_INCREF(s);
|
|
|
|
return (PyObject *)s;
|
|
|
|
}
|
|
|
|
|
2002-07-25 08:13:25 +08:00
|
|
|
/**
|
2002-05-29 07:06:44 +08:00
|
|
|
*/
|
|
|
|
static PyObject *
|
2002-07-20 04:26:38 +08:00
|
|
|
rpmmi_iternext(rpmmiObject * s)
|
2002-12-11 08:12:17 +08:00
|
|
|
/*@globals rpmGlobalMacroContext @*/
|
|
|
|
/*@modifies s, rpmGlobalMacroContext @*/
|
2002-05-29 07:06:44 +08:00
|
|
|
{
|
|
|
|
Header h;
|
|
|
|
|
|
|
|
if (s->mi == NULL || (h = rpmdbNextIterator(s->mi)) == NULL) {
|
2002-07-20 04:26:38 +08:00
|
|
|
s->mi = rpmdbFreeIterator(s->mi);
|
|
|
|
return NULL;
|
2002-05-29 07:06:44 +08:00
|
|
|
}
|
|
|
|
return (PyObject *) hdr_Wrap(h);
|
|
|
|
}
|
2002-08-06 05:46:50 +08:00
|
|
|
|
|
|
|
/**
|
|
|
|
*/
|
|
|
|
static PyObject *
|
|
|
|
rpmmi_Next(rpmmiObject * s, PyObject *args)
|
2002-12-11 08:12:17 +08:00
|
|
|
/*@globals rpmGlobalMacroContext, _Py_NoneStruct @*/
|
|
|
|
/*@modifies s, rpmGlobalMacroContext, _Py_NoneStruct @*/
|
2002-08-06 05:46:50 +08:00
|
|
|
{
|
|
|
|
PyObject * result;
|
|
|
|
|
|
|
|
if (!PyArg_ParseTuple(args, ":Next"))
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
result = rpmmi_iternext(s);
|
|
|
|
|
|
|
|
if (result == NULL) {
|
|
|
|
Py_INCREF(Py_None);
|
|
|
|
return Py_None;
|
|
|
|
}
|
|
|
|
return result;
|
|
|
|
}
|
2002-05-29 07:06:44 +08:00
|
|
|
|
2002-08-10 07:14:10 +08:00
|
|
|
/**
|
|
|
|
*/
|
|
|
|
static PyObject *
|
|
|
|
rpmmi_Instance(rpmmiObject * s, PyObject * args)
|
2002-12-11 08:12:17 +08:00
|
|
|
/*@*/
|
2002-08-10 07:14:10 +08:00
|
|
|
{
|
|
|
|
int rc = 0;
|
|
|
|
|
|
|
|
if (!PyArg_ParseTuple(args, ":Instance"))
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
if (s->mi)
|
|
|
|
rc = rpmdbGetIteratorOffset(s->mi);
|
|
|
|
|
|
|
|
return Py_BuildValue("i", rc);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
*/
|
|
|
|
static PyObject *
|
|
|
|
rpmmi_Count(rpmmiObject * s, PyObject * args)
|
2002-12-11 08:12:17 +08:00
|
|
|
/*@*/
|
2002-08-10 07:14:10 +08:00
|
|
|
{
|
|
|
|
int rc = 0;
|
|
|
|
|
|
|
|
if (!PyArg_ParseTuple(args, ":Instance"))
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
if (s->mi)
|
|
|
|
rc = rpmdbGetIteratorCount(s->mi);
|
|
|
|
|
|
|
|
return Py_BuildValue("i", rc);
|
|
|
|
}
|
|
|
|
|
2002-06-04 07:27:05 +08:00
|
|
|
/**
|
2002-05-29 07:06:44 +08:00
|
|
|
*/
|
|
|
|
static PyObject *
|
|
|
|
rpmmi_Pattern(rpmmiObject * s, PyObject * args)
|
2002-12-11 08:12:17 +08:00
|
|
|
/*@globals rpmGlobalMacroContext, _Py_NoneStruct @*/
|
|
|
|
/*@modifies s, rpmGlobalMacroContext, _Py_NoneStruct @*/
|
2002-05-29 07:06:44 +08:00
|
|
|
{
|
|
|
|
PyObject *TagN = NULL;
|
|
|
|
int type;
|
|
|
|
char * pattern;
|
|
|
|
rpmTag tag;
|
|
|
|
|
|
|
|
if (!PyArg_ParseTuple(args, "Ois:Pattern", &TagN, &type, &pattern))
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
if ((tag = tagNumFromPyObject (TagN)) == -1) {
|
|
|
|
PyErr_SetString(PyExc_TypeError, "unknown tag type");
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
rpmdbSetIteratorRE(s->mi, tag, type, pattern);
|
|
|
|
|
|
|
|
Py_INCREF (Py_None);
|
|
|
|
return Py_None;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2003-04-18 01:17:27 +08:00
|
|
|
/** \ingroup py_c
|
2002-05-29 07:06:44 +08:00
|
|
|
*/
|
2002-07-15 05:23:29 +08:00
|
|
|
/*@-fullinitblock@*/
|
|
|
|
/*@unchecked@*/ /*@observer@*/
|
2002-05-29 07:06:44 +08:00
|
|
|
static struct PyMethodDef rpmmi_methods[] = {
|
|
|
|
{"next", (PyCFunction) rpmmi_Next, METH_VARARGS,
|
|
|
|
"mi.next() -> hdr\n\
|
2002-08-06 05:46:50 +08:00
|
|
|
- Retrieve next header that matches. Iterate directly in python if possible.\n" },
|
2002-08-10 07:14:10 +08:00
|
|
|
{"instance", (PyCFunction) rpmmi_Instance, METH_VARARGS,
|
|
|
|
NULL },
|
|
|
|
{"count", (PyCFunction) rpmmi_Count, METH_VARARGS,
|
|
|
|
NULL },
|
2002-05-29 07:06:44 +08:00
|
|
|
{"pattern", (PyCFunction) rpmmi_Pattern, METH_VARARGS,
|
|
|
|
"mi.pattern(TagN, mire_type, pattern)\n\
|
|
|
|
- Set a secondary match pattern on tags from retrieved header.\n" },
|
|
|
|
{NULL, NULL} /* sentinel */
|
|
|
|
};
|
2002-07-15 05:23:29 +08:00
|
|
|
/*@=fullinitblock@*/
|
2002-05-29 07:06:44 +08:00
|
|
|
|
2003-04-18 01:17:27 +08:00
|
|
|
/** \ingroup py_c
|
2002-05-29 07:06:44 +08:00
|
|
|
*/
|
2002-07-15 05:23:29 +08:00
|
|
|
static void rpmmi_dealloc(/*@only@*/ /*@null@*/ rpmmiObject * s)
|
2002-12-11 08:12:17 +08:00
|
|
|
/*@globals rpmGlobalMacroContext @*/
|
|
|
|
/*@modifies s, rpmGlobalMacroContext @*/
|
2002-05-29 07:06:44 +08:00
|
|
|
{
|
|
|
|
if (s) {
|
2002-12-11 08:12:17 +08:00
|
|
|
s->mi = rpmdbFreeIterator(s->mi);
|
2002-12-11 03:46:03 +08:00
|
|
|
PyObject_Del(s);
|
2002-05-29 07:06:44 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2003-05-05 01:34:53 +08:00
|
|
|
static PyObject * rpmmi_getattro(PyObject * o, PyObject * n)
|
|
|
|
/*@*/
|
|
|
|
{
|
|
|
|
return PyObject_GenericGetAttr(o, n);
|
|
|
|
}
|
|
|
|
|
|
|
|
static int rpmmi_setattro(PyObject * o, PyObject * n, PyObject * v)
|
2002-07-15 05:23:29 +08:00
|
|
|
/*@*/
|
2002-05-29 07:06:44 +08:00
|
|
|
{
|
2003-05-05 01:34:53 +08:00
|
|
|
return PyObject_GenericSetAttr(o, n, v);
|
2002-05-29 07:06:44 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
*/
|
2002-07-15 05:23:29 +08:00
|
|
|
/*@unchecked@*/ /*@observer@*/
|
2002-05-29 07:06:44 +08:00
|
|
|
static char rpmmi_doc[] =
|
|
|
|
"";
|
|
|
|
|
2003-04-18 01:17:27 +08:00
|
|
|
/** \ingroup py_c
|
2002-05-29 07:06:44 +08:00
|
|
|
*/
|
2002-07-15 05:23:29 +08:00
|
|
|
/*@-fullinitblock@*/
|
2002-05-29 07:06:44 +08:00
|
|
|
PyTypeObject rpmmi_Type = {
|
2002-12-04 10:01:47 +08:00
|
|
|
PyObject_HEAD_INIT(&PyType_Type)
|
2002-05-29 07:06:44 +08:00
|
|
|
0, /* ob_size */
|
|
|
|
"rpm.mi", /* tp_name */
|
|
|
|
sizeof(rpmmiObject), /* tp_size */
|
|
|
|
0, /* tp_itemsize */
|
|
|
|
(destructor) rpmmi_dealloc, /* tp_dealloc */
|
|
|
|
0, /* tp_print */
|
2003-05-05 01:34:53 +08:00
|
|
|
(getattrfunc)0, /* tp_getattr */
|
2002-05-29 07:06:44 +08:00
|
|
|
0, /* tp_setattr */
|
|
|
|
0, /* tp_compare */
|
|
|
|
0, /* tp_repr */
|
|
|
|
0, /* tp_as_number */
|
|
|
|
0, /* tp_as_sequence */
|
|
|
|
0, /* tp_as_mapping */
|
|
|
|
0, /* tp_hash */
|
|
|
|
0, /* tp_call */
|
|
|
|
0, /* tp_str */
|
2003-05-05 01:34:53 +08:00
|
|
|
(getattrofunc) rpmmi_getattro, /* tp_getattro */
|
|
|
|
(setattrofunc) rpmmi_setattro, /* tp_setattro */
|
2002-05-29 07:06:44 +08:00
|
|
|
0, /* tp_as_buffer */
|
|
|
|
Py_TPFLAGS_DEFAULT, /* tp_flags */
|
|
|
|
rpmmi_doc, /* tp_doc */
|
|
|
|
#if Py_TPFLAGS_HAVE_ITER
|
|
|
|
0, /* tp_traverse */
|
|
|
|
0, /* tp_clear */
|
|
|
|
0, /* tp_richcompare */
|
|
|
|
0, /* tp_weaklistoffset */
|
2002-07-20 04:26:38 +08:00
|
|
|
(getiterfunc) rpmmi_iter, /* tp_iter */
|
|
|
|
(iternextfunc) rpmmi_iternext, /* tp_iternext */
|
2002-05-29 07:06:44 +08:00
|
|
|
rpmmi_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 */
|
|
|
|
0, /* tp_new */
|
|
|
|
0, /* tp_free */
|
|
|
|
0, /* tp_is_gc */
|
|
|
|
#endif
|
|
|
|
};
|
2002-07-15 05:23:29 +08:00
|
|
|
/*@=fullinitblock@*/
|
2002-05-29 07:06:44 +08:00
|
|
|
|
|
|
|
rpmmiObject * rpmmi_Wrap(rpmdbMatchIterator mi)
|
|
|
|
{
|
2002-12-11 03:46:03 +08:00
|
|
|
rpmmiObject * mio = (rpmmiObject *) PyObject_New(rpmmiObject, &rpmmi_Type);
|
2002-07-20 04:26:38 +08:00
|
|
|
|
2002-05-29 07:06:44 +08:00
|
|
|
if (mio == NULL) {
|
|
|
|
PyErr_SetString(pyrpmError, "out of memory creating rpmmiObject");
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
mio->mi = mi;
|
|
|
|
return mio;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*@}*/
|