rpmDbiTagVal ki_rpmtag;
DBC * ki_dbc;
DBT ki_key;
+ dbiIndexSet ki_set;
};
static rpmdb rpmdbRock;
ki->ki_db = rpmdbLink(db);
ki->ki_rpmtag = rpmtag;
ki->ki_dbi = dbi;
+ ki->ki_set = NULL;
return 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) {
_("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;
}
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)
{
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;
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
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 */
};