Give access to the pkg offset and tag num of the index entry the key iterator is...
authorFlorian Festi <ffesti@redhat.com>
Sun, 24 Oct 2010 17:10:35 +0000 (19:10 +0200)
committerFlorian Festi <ffesti@redhat.com>
Wed, 3 Nov 2010 09:03:14 +0000 (10:03 +0100)
lib/rpmdb.c
lib/rpmdb.h
python/rpmki-py.c

index ce7c705..32f2c54 100644 (file)
@@ -517,6 +517,7 @@ struct rpmdbKeyIterator_s {
     rpmDbiTagVal       ki_rpmtag;
     DBC *              ki_dbc;
     DBT                        ki_key;
+    dbiIndexSet                ki_set;
 };
 
 static rpmdb rpmdbRock;
@@ -2266,6 +2267,7 @@ rpmdbKeyIterator rpmdbKeyIteratorInit(rpmdb db, rpmDbiTagVal rpmtag)
     ki->ki_db = rpmdbLink(db);
     ki->ki_rpmtag = rpmtag;
     ki->ki_dbi = dbi;
+    ki->ki_set = NULL;
 
     return ki;
 }
@@ -2282,7 +2284,6 @@ int rpmdbKeyIteratorNext(rpmdbKeyIterator ki)
         xx = dbiCopen(ki->ki_dbi, &ki->ki_dbc, 0);
 
     memset(&data, 0, sizeof(data));
-    data.flags = DB_DBT_PARTIAL;
     rc = dbiGet(ki->ki_dbi, ki->ki_dbc, &ki->ki_key, &data, DB_NEXT);
 
     if (rc != 0 && rc != DB_NOTFOUND) {
@@ -2290,6 +2291,9 @@ int rpmdbKeyIteratorNext(rpmdbKeyIterator ki)
                _("error(%d:%s) getting next key from %s index\n"),
                rc, db_strerror(rc), rpmTagGetName(ki->ki_rpmtag));
     }
+    ki->ki_set = dbiFreeIndexSet(ki->ki_set);
+    (void) dbt2set(ki->ki_dbi, &data, &ki->ki_set);
+
     return rc;
 }
 
@@ -2305,6 +2309,28 @@ size_t rpmdbKeyIteratorKeySize(rpmdbKeyIterator ki)
     return (size_t)(ki->ki_key.size);
 }
 
+int rpmdbKeyIteratorNumPkgs(rpmdbKeyIterator ki)
+{
+    return (ki && ki->ki_set) ? dbiIndexSetCount(ki->ki_set) : 0;
+}
+
+int rpmdbKeyIteratorPkgOffset(rpmdbKeyIterator ki, int nr)
+{
+    if (!ki || !ki->ki_set)
+        return -1;
+    if (dbiIndexSetCount(ki->ki_set) <= nr)
+        return -1;
+    return dbiIndexRecordOffset(ki->ki_set, nr);
+}
+
+int rpmdbKeyIteratorTagNum(rpmdbKeyIterator ki, int nr)
+{
+    if (!ki || !ki->ki_set)
+        return -1;
+    if (dbiIndexSetCount(ki->ki_set) <= nr)
+        return -1;
+    return dbiIndexRecordFileNumber(ki->ki_set, nr);
+}
 
 rpmdbKeyIterator rpmdbKeyIteratorFree(rpmdbKeyIterator ki)
 {
@@ -2325,8 +2351,9 @@ rpmdbKeyIterator rpmdbKeyIteratorFree(rpmdbKeyIterator ki)
     if (ki->ki_dbc)
         xx = dbiCclose(ki->ki_dbi, ki->ki_dbc, 0);
     ki->ki_dbc = NULL;
-    ki->ki_dbi = NULL; /* ??? */
+    ki->ki_dbi = NULL;
     ki->ki_db = rpmdbUnlink(ki->ki_db);
+    ki->ki_set = dbiFreeIndexSet(ki->ki_set);
 
     ki = _free(ki);
     return ki;
index 0473a83..80e25c6 100644 (file)
@@ -249,6 +249,29 @@ const void * rpmdbKeyIteratorKey(rpmdbKeyIterator ki);
 size_t rpmdbKeyIteratorKeySize(rpmdbKeyIterator ki);
 
 /** \ingroup rpmdb
+ * Get number of entries for current key
+ * @param ki            key iterator
+ * @return             number of entries. -1 on error.
+ */
+int rpmdbKeyIteratorNumPkgs(rpmdbKeyIterator ki);
+
+/** \ingroup rpmdb
+ * Get package offset of entry
+ * @param ki            key iterator
+ * @param nr           number of the entry
+ * @return             db offset of pkg
+ */
+int rpmdbKeyIteratorPkgOffset(rpmdbKeyIterator ki, int nr);
+
+/** \ingroup rpmdb
+ * Get tag number of entry
+ * @param ki            key iterator
+ * @param nr           number of the entry
+ * @return             number of tag within the package
+ */
+int rpmdbKeyIteratorTagNum(rpmdbKeyIterator ki, int nr);
+
+/** \ingroup rpmdb
  * Free key iterator
  * @param ki            key iterator
  * return              NULL
index 1bc53e1..5138606 100644 (file)
@@ -51,7 +51,26 @@ rpmki_iternext(rpmkiObject * s)
                                       rpmdbKeyIteratorKeySize(s->ki));
 };
 
+static PyObject *
+rpmki_offsets(rpmkiObject * s)
+{
+    int entries = rpmdbKeyIteratorNumPkgs(s->ki);
+    PyObject * list = PyList_New(0);
+    PyObject * tuple;
+    for (int i = 0; i < entries; i++) {
+        tuple = PyTuple_New(2);
+        PyTuple_SET_ITEM(tuple, 0,
+                         PyInt_FromLong(rpmdbKeyIteratorPkgOffset(s->ki, i)));
+        PyTuple_SET_ITEM(tuple, 1,
+                         PyInt_FromLong(rpmdbKeyIteratorTagNum(s->ki, i)));
+        PyList_Append(list, tuple);
+    }
+    return list;
+}
+
 static struct PyMethodDef rpmki_methods[] = {
+    {"offsets",    (PyCFunction) rpmki_offsets,       METH_NOARGS,
+     NULL },
     {NULL,             NULL}           /* sentinel */
 };