rpm/nextiteratorheaderblob.diff

69 lines
2.0 KiB
Diff

--- lib/rpmdb.c.orig 2020-11-27 13:09:17.968992873 +0000
+++ lib/rpmdb.c 2020-11-27 13:14:21.524165780 +0000
@@ -2679,6 +2679,48 @@ int rpmdbCtrl(rpmdb db, rpmdbCtrlOp ctrl
return dbctrl ? dbCtrl(db, dbctrl) : 1;
}
+const unsigned char *rpmdbNextIteratorHeaderBlob(rpmdbMatchIterator mi, unsigned int *size)
+{
+ dbiIndex dbi = NULL;
+ unsigned char * uh;
+ unsigned int uhlen;
+ int rc;
+ if (mi == NULL || mi->mi_re != NULL)
+ return NULL;
+ if (pkgdbOpen(mi->mi_db, 0, &dbi))
+ return NULL;
+ if (mi->mi_dbc == NULL)
+ mi->mi_dbc = dbiCursorInit(dbi, mi->mi_cflags);
+ miFreeHeader(mi, dbi);
+ uh = NULL;
+ uhlen = 0;
+ do {
+ if (mi->mi_set) {
+ if (!(mi->mi_setx < mi->mi_set->count))
+ return NULL;
+ mi->mi_offset = dbiIndexRecordOffset(mi->mi_set, mi->mi_setx);
+ mi->mi_filenum = dbiIndexRecordFileNumber(mi->mi_set, mi->mi_setx);
+ } else {
+ rc = pkgdbGet(dbi, mi->mi_dbc, 0, &uh, &uhlen);
+ if (rc == 0)
+ mi->mi_offset = pkgdbKey(dbi, mi->mi_dbc);
+
+ /* Terminate on error or end of keys */
+ if (rc || (mi->mi_setx && mi->mi_offset == 0))
+ return NULL;
+ }
+ mi->mi_setx++;
+ } while (mi->mi_offset == 0);
+ if (uh == NULL) {
+ rc = pkgdbGet(dbi, mi->mi_dbc, mi->mi_offset, &uh, &uhlen);
+ if (rc || uh == NULL)
+ return NULL;
+ }
+ if (size)
+ *size = uhlen;
+ return uh;
+}
+
char *rpmdbCookie(rpmdb db)
{
void *cookie = NULL;
--- include/rpm/rpmdb.h.orig 2020-11-27 13:09:17.968992873 +0000
+++ include/rpm/rpmdb.h 2020-11-27 13:09:36.352942782 +0000
@@ -253,6 +253,14 @@ int rpmdbStat(const char *prefix, struct
*/
int rpmdbFStat(rpmdb db, struct stat *statbuf);
+/** \ingroup rpmdb
+ * Return next unverified package header blob from iteration.
+ * @param mi rpm database iterator
+ * @retval size header blob size in bytes
+ * @return NULL on end of iteration.
+ */
+const unsigned char *rpmdbNextIteratorHeaderBlob(rpmdbMatchIterator mi, unsigned int *size);
+
#ifdef __cplusplus
}
#endif