diff options
-rw-r--r-- | rpmmodule/rpmmodule.c | 64 | ||||
-rwxr-xr-x | rpmmodule/t | 15 |
2 files changed, 71 insertions, 8 deletions
diff --git a/rpmmodule/rpmmodule.c b/rpmmodule/rpmmodule.c index 4f831df5a..77df0fcb3 100644 --- a/rpmmodule/rpmmodule.c +++ b/rpmmodule/rpmmodule.c @@ -21,6 +21,9 @@ static void rpmdbDealloc(rpmdbObject * s); static PyObject * rpmdbGetAttr(rpmdbObject * s, char * name); static PyObject * rpmdbFirst(rpmdbObject * s, PyObject * args); static PyObject * rpmdbNext(rpmdbObject * s, PyObject * args); +static PyObject * rpmdbByName(rpmdbObject * s, PyObject * args); +static PyObject * rpmdbByProvides(rpmdbObject * s, PyObject * args); +static PyObject * rpmdbByFile(rpmdbObject * s, PyObject * args); static int rpmdbLength(rpmdbObject * s); static hdrObject * rpmdbSubscript(rpmdbObject * s, PyObject * key); @@ -158,8 +161,11 @@ static PyTypeObject rpmtransType = { }; static struct PyMethodDef rpmdbMethods[] = { - {"firstkey", (PyCFunction) rpmdbFirst, 1 }, - {"nextkey", (PyCFunction) rpmdbNext, 1 }, + {"firstkey", (PyCFunction) rpmdbFirst, 1 }, + {"nextkey", (PyCFunction) rpmdbNext, 1 }, + {"findbyfile", (PyCFunction) rpmdbByFile, 1 }, + {"findbyname", (PyCFunction) rpmdbByName, 1 }, + {"findbyprovides", (PyCFunction) rpmdbByProvides, 1 }, {NULL, NULL} /* sentinel */ }; @@ -585,6 +591,60 @@ static PyObject * rpmdbNext(rpmdbObject * s, PyObject * args) { return Py_BuildValue("i", where); } +static PyObject * handleDbResult(int rc, dbiIndexSet matches) { + PyObject * list; + int i; + + if (rc == -1) { + PyErr_SetString(pyrpmError, "error reading from database"); + return NULL; + } else if (rc) { + Py_INCREF(Py_None); + return Py_None; + } + + list = PyList_New(0); + for (i = 0; i < matches.count; i++) + PyList_Append(list, PyInt_FromLong(matches.recs[i].recOffset)); + + dbiFreeIndexRecord(matches); + + return list; +} + +static PyObject * rpmdbByName(rpmdbObject * s, PyObject * args) { + char * str; + dbiIndexSet matches; + int rc; + + if (!PyArg_ParseTuple(args, "s", &str)) return NULL; + + rc = rpmdbFindPackage(s->db, str, &matches); + return handleDbResult(rc, matches); +} + +static PyObject * rpmdbByFile(rpmdbObject * s, PyObject * args) { + char * str; + dbiIndexSet matches; + int rc; + + if (!PyArg_ParseTuple(args, "s", &str)) return NULL; + + rc = rpmdbFindByFile(s->db, str, &matches); + return handleDbResult(rc, matches); +} + +static PyObject * rpmdbByProvides(rpmdbObject * s, PyObject * args) { + char * str; + dbiIndexSet matches; + int rc; + + if (!PyArg_ParseTuple(args, "s", &str)) return NULL; + + rc = rpmdbFindByProvides(s->db, str, &matches); + return handleDbResult(rc, matches); +} + static int rpmdbLength(rpmdbObject * s) { int first; int count = 0; diff --git a/rpmmodule/t b/rpmmodule/t index bbd85bb7b..e5359dde1 100755 --- a/rpmmodule/t +++ b/rpmmodule/t @@ -3,11 +3,14 @@ import rpm import os -fd = os.open('/mnt/redhat/comps/dist/6.1/i386/fileutils-4.0-2.i386.rpm', 0) -(h, isSource) = rpm.headerFromPackage(fd) +db = rpm.opendb() -print "name", h[1000] -print "name", h['NAME'] +for n in db.findbyprovides('libc.so.6'): + print "match:", db[n]['name'] + +for n in db.findbyname('glibc'): + print "match:", db[n]['name'] + +for n in db.findbyfile('/bin/bash'): + print "match:", db[n]['name'] -for n in h.keys(): - print rpm.tagnames[n], h[n] |