From c70e076e088589f65160c05ee7cc8db0b3db6d7e Mon Sep 17 00:00:00 2001 From: Florian Festi Date: Sat, 16 Oct 2010 09:45:13 +0200 Subject: [PATCH] Support looping over indexes when giving keyp=NULL to rpmdbInitIterator() --- lib/rpmdb.c | 112 ++++++++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 75 insertions(+), 37 deletions(-) diff --git a/lib/rpmdb.c b/lib/rpmdb.c index 66dcdc9..80d957f 100644 --- a/lib/rpmdb.c +++ b/lib/rpmdb.c @@ -1969,51 +1969,85 @@ rpmdbMatchIterator rpmdbInitIterator(rpmdb db, rpmTag rpmtag, * Handle label and file name special cases. * Otherwise, retrieve join keys for secondary lookup. */ - if (rpmtag != RPMDBI_PACKAGES && keyp) { + if (rpmtag != RPMDBI_PACKAGES) { DBT key, data; DBC * dbcursor = NULL; - int rc; + int rc = 0; int xx; memset(&key, 0, sizeof(key)); memset(&data, 0, sizeof(data)); - if (isLabel) { - xx = dbiCopen(dbi, &dbcursor, 0); - rc = dbiFindByLabel(db, dbi, dbcursor, &key, &data, keyp, &set); - xx = dbiCclose(dbi, dbcursor, 0); - dbcursor = NULL; - } else if (rpmtag == RPMTAG_BASENAMES) { - rc = rpmdbFindByFile(db, keyp, &key, &data, &set); + if (keyp) { + + if (isLabel) { + xx = dbiCopen(dbi, &dbcursor, 0); + rc = dbiFindByLabel(db, dbi, dbcursor, &key, &data, keyp, &set); + xx = dbiCclose(dbi, dbcursor, 0); + dbcursor = NULL; + } else if (rpmtag == RPMTAG_BASENAMES) { + rc = rpmdbFindByFile(db, keyp, &key, &data, &set); + } else { + xx = dbiCopen(dbi, &dbcursor, 0); + + key.data = (void *) keyp; + key.size = keylen; + if (key.data && key.size == 0) + key.size = strlen((char *)key.data); + if (key.data && key.size == 0) + key.size++; /* XXX "/" fixup. */ + + rc = dbiGet(dbi, dbcursor, &key, &data, DB_SET); + if (rc > 0) { + rpmlog(RPMLOG_ERR, + _("error(%d) getting \"%s\" records from %s index\n"), + rc, (key.data ? (char *)key.data : "???"), + rpmTagGetName(rpmtag)); + } + + /* Join keys need to be native endian internally. */ + if (rc == 0) + (void) dbt2set(dbi, &data, &set); + + xx = dbiCclose(dbi, dbcursor, 0); + dbcursor = NULL; + } + if (rc) { /* error/not found */ + set = dbiFreeIndexSet(set); + goto exit; + } } else { - xx = dbiCopen(dbi, &dbcursor, 0); - - key.data = (void *) keyp; - key.size = keylen; - if (key.data && key.size == 0) - key.size = strlen((char *)key.data); - if (key.data && key.size == 0) - key.size++; /* XXX "/" fixup. */ - - rc = dbiGet(dbi, dbcursor, &key, &data, DB_SET); - if (rc > 0) { - rpmlog(RPMLOG_ERR, - _("error(%d) getting \"%s\" records from %s index\n"), - rc, (key.data ? (char *)key.data : "???"), - rpmTagGetName(rpmtag)); - } - - /* Join keys need to be native endian internally. */ - if (rc == 0) - (void) dbt2set(dbi, &data, &set); - - xx = dbiCclose(dbi, dbcursor, 0); - dbcursor = NULL; - } - if (rc) { /* error/not found */ - set = dbiFreeIndexSet(set); - goto exit; - } + /* get all entries from index */ + xx = dbiCopen(dbi, &dbcursor, 0); + + while (rc==0) { + dbiIndexSet newset = NULL; + + rc = dbiGet(dbi, dbcursor, &key, &data, DB_NEXT); + (void) dbt2set(dbi, &data, &newset); + if (set == NULL) { + set = newset; + } else { + dbiAppendSet(set, newset->recs, newset->count, sizeof(*(set->recs)), 0); + dbiFreeIndexSet(newset); + } + } + + if (rc != DB_NOTFOUND) { + rpmlog(RPMLOG_ERR, + _("error(%d) getting \"%s\" records from %s index\n"), + rc, (key.data ? (char *)key.data : "???"), + rpmTagGetName(rpmtag)); + } + + xx = dbiCclose(dbi, dbcursor, 0); + dbcursor = NULL; + + if (rc != DB_NOTFOUND) { /* error */ + set = dbiFreeIndexSet(set); + goto exit; + } + } } /* Copy the retrieval key, byte swapping header instance if necessary. */ @@ -2067,6 +2101,10 @@ rpmdbMatchIterator rpmdbInitIterator(rpmdb db, rpmTag rpmtag, mi->mi_ts = NULL; mi->mi_hdrchk = NULL; + if (rpmtag != RPMDBI_PACKAGES && keyp == NULL) { + rpmdbSortIterator(mi); + } + exit: return mi; } -- 2.7.4