summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--rpmmodule/rpmmodule.c64
-rwxr-xr-xrpmmodule/t15
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]