Blame nextiteratorheaderblob.diff

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