- add rpmdbSetIteratorRE() for regex matching in database iterators.
authorjbj <devnull@localhost>
Wed, 13 Jun 2001 20:57:06 +0000 (20:57 +0000)
committerjbj <devnull@localhost>
Wed, 13 Jun 2001 20:57:06 +0000 (20:57 +0000)
- permit rpm -qa to take RE args applied to name tag.
- permit dbiFindMatches() to use version/release patterns.
- eliminate all uses of rpmdbSetIterator{Version,Release}.

CVS patchset: 4859
CVS date: 2001/06/13 20:57:06

CHANGES
lib/psm.c
lib/query.c
lib/rpmcli.h
lib/rpmlib.h
lib/transaction.c
rpmdb/rpmdb.c
rpmdb/rpmdb.h
rpmio/rpmerr.h
rpmqv.c

diff --git a/CHANGES b/CHANGES
index a6ccecb..ff722fb 100644 (file)
--- a/CHANGES
+++ b/CHANGES
        - remove rpmrc Provides: Yet Again, use virtual packages.
        - dump cursor debugging wrappers.
        - rpm --verify can disable rpmFileAttr checks.
+       - add rpmdbSetIteratorRE() for regex matching in database iterators.
+       - permit rpm -qa to take RE args applied to name tag.
+       - permit dbiFindMatches() to use version/release patterns.
+       - eliminate all uses of rpmdbSetIterator{Version,Release}.
 
 4.0 -> 4.0.[12]
        - add doxygen and lclint annotations most everywhere.
index 60f2bb7..9998c72 100644 (file)
--- a/lib/psm.c
+++ b/lib/psm.c
@@ -1332,8 +1332,13 @@ int psmStage(PSM_t psm, pkgStage stage)
 
 assert(psm->mi == NULL);
            psm->mi = rpmdbInitIterator(ts->rpmdb, RPMTAG_NAME, fi->name, 0);
-           rpmdbSetIteratorVersion(psm->mi, fi->version);
-           rpmdbSetIteratorRelease(psm->mi, fi->release);
+#ifdef DYING
+           (void) rpmdbSetIteratorVersion(psm->mi, fi->version);
+           (void) rpmdbSetIteratorRelease(psm->mi, fi->release);
+#else
+           (void) rpmdbSetIteratorRE(psm->mi, RPMTAG_VERSION, fi->version);
+           (void) rpmdbSetIteratorRE(psm->mi, RPMTAG_RELEASE, fi->release);
+#endif
            while ((psm->oh = rpmdbNextIterator(psm->mi))) {
                fi->record = rpmdbGetIteratorOffset(psm->mi);
                if (ts->transFlags & RPMTRANS_FLAG_MULTILIB)
index 309a556..b9bbb2b 100644 (file)
@@ -497,12 +497,12 @@ int rpmQueryVerify(QVA_t qva, rpmQVSources source, const char * arg,
     int rc;
     int isSource;
     int retcode = 0;
+    const char ** av = NULL;
     char * end = NULL;
 
     switch (source) {
     case RPMQV_RPM:
     {  int ac = 0;
-       const char ** av = NULL;
        const char * fileURL = NULL;
        rpmRC rpmrc;
        int i;
@@ -632,7 +632,15 @@ restart:
            rpmError(RPMERR_QUERYINFO, _("no packages\n"));
            retcode = 1;
        } else {
-           retcode = showMatches(qva, mi, showPackage);
+           for (av = (const char **) arg; av && *av; av++) {
+               if (!rpmdbSetIteratorRE(mi, RPMTAG_NAME, *av))
+                   continue;
+               mi = rpmdbFreeIterator(mi);
+               retcode = 1;
+               /*@loopbreak@*/ break;
+           }
+           if (!retcode)
+               retcode = showMatches(qva, mi, showPackage);
        }
        break;
 
index a4f334b..358a438 100644 (file)
@@ -177,6 +177,7 @@ int showQueryPackage(QVA_t qva, rpmdb db, Header h)
 
 /** \ingroup rpmcli
  * Display package information.
+ * @todo hack: RPMQV_ALL can pass char ** arglist = NULL, not char * arg. Union?
  * @param qva          parsed query/verify options
  * @param source       type of source to query
  * @param arg          name of source to query
index d1f7657..557a566 100644 (file)
@@ -763,22 +763,39 @@ int rpmdbPruneIterator(/*@null@*/ rpmdbMatchIterator mi,
        /*@modifies mi, hdrNums @*/;
 
 /** \ingroup rpmdb
+ * Add regular expression to iterator selector.
+ * @param mi           rpm database iterator
+ * @param tag          rpm tag
+ * @param pattern      regex pattern to match
+ * @return             0 on success
+ */
+int rpmdbSetIteratorRE(/*@null@*/ rpmdbMatchIterator mi, rpmTag tag,
+               /*@null@*/ const char * pattern)
+       /*@modifies mi @*/;
+
+/** \ingroup rpmdb
  * Modify iterator to filter out headers that do not match version.
- * @todo Replace with a more general mechanism using RE's on tag content.
+ * @deprecated Use rpmdbSetIteratorRE(mi, RPMTAG_VERSION, version) instead.
+ * @todo Eliminate from API.
  * @param mi           rpm database iterator
- * @param version      version to check for
+ * @param version      version to match (can be a regex pattern)
+ * @return             0 on success
  */
-void rpmdbSetIteratorVersion(/*@null@*/ rpmdbMatchIterator mi,
+/*@unused@*/
+int rpmdbSetIteratorVersion(/*@null@*/ rpmdbMatchIterator mi,
                /*@null@*/ const char * version)
        /*@modifies mi @*/;
 
 /** \ingroup rpmdb
  * Modify iterator to filter out headers that do not match release.
- * @todo Replace with a more general mechanism using RE's on tag content.
+ * @deprecated Use rpmdbSetIteratorRE(mi, RPMTAG_RELEASE, release) instead.
+ * @todo Eliminate from API.
  * @param mi           rpm database iterator
- * @param release      release to check for
+ * @param release      release to match (can be a regex pattern)
+ * @return             0 on success
  */
-void rpmdbSetIteratorRelease(/*@null@*/ rpmdbMatchIterator mi,
+/*@unused@*/
+int rpmdbSetIteratorRelease(/*@null@*/ rpmdbMatchIterator mi,
                /*@null@*/ const char * release)
        /*@modifies mi @*/;
 
index 20d6acf..da80a78 100644 (file)
@@ -1650,8 +1650,13 @@ int rpmRunTransactions(  rpmTransactionSet ts,
        if (!(ts->ignoreSet & RPMPROB_FILTER_REPLACEPKG) && !alp->multiLib) {
            rpmdbMatchIterator mi;
            mi = rpmdbInitIterator(ts->rpmdb, RPMTAG_NAME, alp->name, 0);
-           rpmdbSetIteratorVersion(mi, alp->version);
-           rpmdbSetIteratorRelease(mi, alp->release);
+#ifdef DYING
+           (void) rpmdbSetIteratorVersion(mi, alp->version);
+           (void) rpmdbSetIteratorRelease(mi, alp->release);
+#else
+           (void) rpmdbSetIteratorRE(mi, RPMTAG_VERSION, alp->version);
+           (void) rpmdbSetIteratorRE(mi, RPMTAG_RELEASE, alp->release);
+#endif
            while (rpmdbNextIterator(mi) != NULL) {
                psAppend(ts->probs, RPMPROB_PKG_INSTALLED, alp,
                        NULL, NULL, NULL, 0);
index 015ebe0..a5c067a 100644 (file)
@@ -11,6 +11,8 @@ static int _debug = 0;
 #include <signal.h>
 #include <sys/signal.h>
 
+#include <regex.h>
+
 #include <rpmcli.h>
 
 #include "rpmdb.h"
@@ -714,34 +716,22 @@ dbiIndexSet dbiFreeIndexSet(dbiIndexSet set) {
 /**
  * Disable all signals, returning previous signal mask.
  */
-static void blockSignals(/*@unused@*/ rpmdb db, /*@out@*/ sigset_t * oldMask)
+static int blockSignals(/*@unused@*/ rpmdb db, /*@out@*/ sigset_t * oldMask)
        /*@modifies *oldMask, internalState @*/
 {
     sigset_t newMask;
 
-#ifdef DYING
-    /* XXX HACK (disabled) permit ^C aborts for now ... */
-    if (!(db && db->db_api == 4))
-#endif
-    {
-       (void) sigfillset(&newMask);            /* block all signals */
-       (void) sigprocmask(SIG_BLOCK, &newMask, oldMask);
-    }
+    (void) sigfillset(&newMask);               /* block all signals */
+    return sigprocmask(SIG_BLOCK, &newMask, oldMask);
 }
 
 /**
  * Restore signal mask.
  */
-static void unblockSignals(/*@unused@*/ rpmdb db, sigset_t * oldMask)
+static int unblockSignals(/*@unused@*/ rpmdb db, sigset_t * oldMask)
        /*@modifies internalState @*/
 {
-#ifdef DYING
-    /* XXX HACK (disabled) permit ^C aborts for now ... */
-    if (!(db && db->db_api == 4))
-#endif
-    {
-       (void) sigprocmask(SIG_SETMASK, oldMask, NULL);
-    }
+    return sigprocmask(SIG_SETMASK, oldMask, NULL);
 }
 
 #define        _DB_ROOT        "/"
@@ -1202,6 +1192,16 @@ int rpmdbCountPackages(rpmdb db, const char * name)
 /* 0 found matches */
 /* 1 no matches */
 /* 2 error */
+/**
+ * Attempt partial matches on name[-version[-release]] strings.
+ * @param dbi          index database handle (always RPMTAG_NAME)
+ * @param dbcursor     index database cursor
+ * @param name         package name
+ * @param version      package version (can be a regex pattern)
+ * @param release      package release (can be a regex pattern)
+ * @retval matches     set of header instances that match
+ * @return             0 on match, 1 on no match, 2 on error
+ */
 static int dbiFindMatches(dbiIndex dbi, DBC * dbcursor,
                const char * name,
                /*@null@*/ const char * version,
@@ -1230,40 +1230,34 @@ static int dbiFindMatches(dbiIndex dbi, DBC * dbcursor,
     /* make sure the version and releases match */
     for (i = 0; i < dbiIndexSetCount(*matches); i++) {
        unsigned int recoff = dbiIndexRecordOffset(*matches, i);
-       int goodRelease, goodVersion;
-       const char * pkgVersion;
-       const char * pkgRelease;
        Header h;
 
        if (recoff == 0)
            continue;
 
-    {  rpmdbMatchIterator mi;
-       mi = rpmdbInitIterator(dbi->dbi_rpmdb, RPMDBI_PACKAGES, &recoff, sizeof(recoff));
-       h = rpmdbNextIterator(mi);
-       if (h)
-           h = headerLink(h);
-       mi = rpmdbFreeIterator(mi);
-    }
-
-       if (h == NULL) {
-           rpmError(RPMERR_DBCORRUPT, _("%s: cannot read header at 0x%x\n"),
-               "findMatches", recoff);
-           rc = 2;
-           goto exit;
-       }
+       {   rpmdbMatchIterator mi;
+           mi = rpmdbInitIterator(dbi->dbi_rpmdb,
+                       RPMDBI_PACKAGES, &recoff, sizeof(recoff));
 
-       (void) headerNVR(h, NULL, &pkgVersion, &pkgRelease);
-           
-       goodRelease = goodVersion = 1;
+           /* Set iterator selectors for version/release if available. */
+           if (version && rpmdbSetIteratorRE(mi, RPMTAG_VERSION, version)) {
+               rc = 2;
+               goto exit;
+           }
+           if (release && rpmdbSetIteratorRE(mi, RPMTAG_RELEASE, release)) {
+               rc = 2;
+               goto exit;
+           }
 
-       if (release && strcmp(release, pkgRelease)) goodRelease = 0;
-       if (version && strcmp(version, pkgVersion)) goodVersion = 0;
+           h = rpmdbNextIterator(mi);
+           if (h)
+               h = headerLink(h);
+           mi = rpmdbFreeIterator(mi);
+       }
 
-       if (goodRelease && goodVersion) {
-           /* structure assignment */
+       if (h)  /* structure assignment */
            (*matches)->recs[gotMatches++] = (*matches)->recs[i];
-       } else 
+       else
            (*matches)->recs[i].hdrNum = 0;
 
        h = headerFree(h);
@@ -1272,13 +1266,12 @@ static int dbiFindMatches(dbiIndex dbi, DBC * dbcursor,
     if (gotMatches) {
        (*matches)->count = gotMatches;
        rc = 0;
-    } else {
+    } else
        rc = 1;
-    }
 
 exit:
     if (rc && matches && *matches) {
-       /*@-unqualifiedtrans@*/
+       /*@-unqualifiedtrans@*/         /* FIX: double indirection */
        *matches = dbiFreeIndexSet(*matches);
        /*@=unqualifiedtrans@*/
     }
@@ -1287,11 +1280,14 @@ exit:
 
 /**
  * Lookup by name, name-version, and finally by name-version-release.
- * @param dbi          index database handle (always RPMDBI_PACKAGES)
+ * Both version and release can be regex patterns.
+ * @todo Name must be an exact match, as name is a db key.
+ * @todo N-V-R split needs to be made RE aware, i.e. '[0-9]' is split badly.
+ * @param dbi          index database handle (always RPMTAG_NAME)
  * @param dbcursor     index database cursor
- * @param arg
- * @param matches
- * @return             0 on success, 1 on no mtches, 2 on error
+ * @param arg          name[-version[-release]] string
+ * @retval matches     set of header instances that match
+ * @return             0 on match, 1 on no match, 2 on error
  */
 static int dbiFindByLabel(dbiIndex dbi, DBC * dbcursor,
                /*@null@*/ const char * arg, /*@out@*/ dbiIndexSet * matches)
@@ -1365,15 +1361,23 @@ static int dbiUpdateRecord(dbiIndex dbi, DBC * dbcursor, int offset, Header h)
     uhlen = headerSizeof(h, HEADER_MAGIC_NO);
     uh = headerUnload(h);
     if (uh) {
-       blockSignals(dbi->dbi_rpmdb, &signalMask);
+       (void) blockSignals(dbi->dbi_rpmdb, &signalMask);
        rc = dbiPut(dbi, dbcursor, &offset, sizeof(offset), uh, uhlen, pflags);
        xx = dbiSync(dbi, 0);
-       unblockSignals(dbi->dbi_rpmdb, &signalMask);
+       (void) unblockSignals(dbi->dbi_rpmdb, &signalMask);
        uh = _free(uh);
     }
     return rc;
 }
 
+typedef struct miRE_s {
+    rpmTag             tag;            /*!< header tag */
+/*@only@*/ const char *        pattern;        /*!< regular expression */
+    int                        cflags;         /*!< compile flags */
+/*@only@*/ regex_t *   preg;           /*!< compiled pattern buffer */
+    int                        eflags;         /*!< match flags */
+} * miRE;
+
 struct _rpmdbMatchIterator {
 /*@only@*/ const void *        mi_keyp;
     size_t             mi_keylen;
@@ -1392,14 +1396,17 @@ struct _rpmdbMatchIterator {
     unsigned int       mi_filenum;
     unsigned int       mi_fpnum;
     unsigned int       mi_dbnum;
-/*@only@*//*@null@*/ const char *      mi_version;
-/*@only@*//*@null@*/ const char *      mi_release;
+    int                        mi_nre;
+/*@only@*//*@null@*/ miRE mi_re;
+/*@only@*//*@null@*/ const char * mi_version;
+/*@only@*//*@null@*/ const char * mi_release;
 };
 
 rpmdbMatchIterator rpmdbFreeIterator(rpmdbMatchIterator mi)
 {
     dbiIndex dbi = NULL;
     int xx;
+    int i;
 
     if (mi == NULL)
        return mi;
@@ -1417,6 +1424,17 @@ rpmdbMatchIterator rpmdbFreeIterator(rpmdbMatchIterator mi)
        dbi->dbi_rmw = NULL;
     }
 
+    if (mi->mi_re != NULL)
+    for (i = 0; i < mi->mi_nre; i++) {
+       miRE mire = mi->mi_re + i;
+       mire->pattern = _free(mire->pattern);
+       if (mire->preg != NULL) {
+           regfree(mire->preg);
+           mire->preg = _free(mire->preg);
+       }
+    }
+    mi->mi_re = _free(mi->mi_re);
+
     mi->mi_release = _free(mi->mi_release);
     mi->mi_version = _free(mi->mi_version);
     if (dbi && mi->mi_dbc)
@@ -1454,18 +1472,198 @@ int rpmdbGetIteratorCount(rpmdbMatchIterator mi) {
     return mi->mi_set->count;
 }
 
-void rpmdbSetIteratorRelease(rpmdbMatchIterator mi, const char * release) {
-    if (mi == NULL)
-       return;
-    mi->mi_release = _free(mi->mi_release);
-    mi->mi_release = (release ? xstrdup(release) : NULL);
+/**
+ * Return pattern match.
+ * @param mi           rpm database iterator
+ * @return             0 if pattern matches
+ */
+static int miregexec(miRE mire, const char * val)
+       /*@*/
+{
+    int rc = regexec(mire->preg, val, 0, NULL, mire->eflags);
+
+    if (rc && rc != REG_NOMATCH) {
+       char msg[256];
+       (void) regerror(rc, mire->preg, msg, sizeof(msg)-1);
+       msg[sizeof(msg)-1] = '\0';
+       rpmError(RPMERR_REGEXEC, "%s: regexec failed: %s\n", mire->pattern, msg);
+    }
+    return rc;
 }
 
-void rpmdbSetIteratorVersion(rpmdbMatchIterator mi, const char * version) {
-    if (mi == NULL)
-       return;
-    mi->mi_version = _free(mi->mi_version);
-    mi->mi_version = (version ? xstrdup(version) : NULL);
+/**
+ * Compare iterator selctors by rpm tag (qsort/bsearch).
+ * @param a            1st iterator selector
+ * @param b            2nd iterator selector
+ * @return             result of comparison
+ */
+static int mireCmp(const void * a, const void * b)
+{
+    const miRE mireA = (const miRE) a;
+    const miRE mireB = (const miRE) b;
+    return (mireA->tag - mireB->tag);
+}
+
+int rpmdbSetIteratorRE(rpmdbMatchIterator mi, rpmTag tag, const char * pattern)
+{
+    const char * allpat = NULL;
+    regex_t * preg = NULL;
+    miRE mire = NULL;
+    int cflags = (REG_EXTENDED | REG_NOSUB);
+    int eflags = 0;
+    int rc = 0;
+
+    if (mi == NULL || pattern == NULL)
+       return rc;
+
+    {  int nb = strlen(pattern);
+       char * t = xmalloc(nb + sizeof("^.$"));
+       allpat = t;
+       if (pattern[0] != '^') *t++ = '^';
+
+       /* XXX let's fix a common error with RE's */
+       if (pattern[0] == '*') *t++ = '.';
+
+       t = stpcpy(t, pattern);
+       if (pattern[nb-1] != '$') *t++ = '$';
+       *t = '\0';
+    }
+    preg = xcalloc(1, sizeof(*preg));
+    rc = regcomp(preg, allpat, cflags);
+    if (rc) {
+       char msg[256];
+       (void) regerror(rc, preg, msg, sizeof(msg)-1);
+       msg[sizeof(msg)-1] = '\0';
+       rpmError(RPMERR_REGCOMP, "%s: regcomp failed: %s\n", allpat, msg);
+       goto exit;
+    }
+
+    mi->mi_re = xrealloc(mi->mi_re, (mi->mi_nre + 1) * sizeof(*mi->mi_re));
+    mire = mi->mi_re + mi->mi_nre;
+    mi->mi_nre++;
+    
+    mire->tag = tag;
+    mire->pattern = allpat;
+    mire->cflags = cflags;
+    mire->preg = preg;
+    mire->eflags = eflags;
+
+    (void) qsort(mi->mi_re, mi->mi_nre, sizeof(*mi->mi_re), mireCmp);
+
+exit:
+    if (rc) {
+       /*@-kepttrans@*/        /* FIX: mire has kept values */
+       allpat = _free(allpat);
+       regfree(preg);
+       preg = _free(preg);
+       /*@=kepttrans@*/
+    }
+    return rc;
+}
+
+/**
+ * Return iterator selector match.
+ * @param mi           rpm database iterator
+ * @return             1 if header should be skipped
+ */
+static int mireSkip (const rpmdbMatchIterator mi)
+       /*@*/
+{
+
+    HGE_t hge = (HGE_t) headerGetEntryMinMemory;
+    HFD_t hfd = (HFD_t) headerFreeData;
+    union {
+       void * ptr;
+       const char ** argv;
+       const char * str;
+       int_32 * i32p;
+       int_16 * i16p;
+       int_8 * i8p;
+    } u;
+    char numbuf[32];
+    rpmTagType t;
+    int_32 c;
+    miRE mire;
+    int ntags = 0;
+    int nmatches = 0;
+    int i, j;
+
+    if (mi->mi_h == NULL)      /* XXX can't happen */
+       return 0;
+
+    /*
+     * Apply tag tests, implictly "||" for multiple patterns/values of a
+     * single tag, implictly "&&" between multiple tag patterns.
+     */
+    if ((mire = mi->mi_re) != NULL)
+    for (i = 0; i < mi->mi_nre; i++, mire++) {
+       int anymatch;
+
+       if (!hge(mi->mi_h, mire->tag, &t, (void **)&u, &c))
+           continue;
+
+       anymatch = 0;           /* no matches yet */
+       while (1) {
+           switch (t) {
+           case RPM_CHAR_TYPE:
+           case RPM_INT8_TYPE:
+               sprintf(numbuf, "%d", (int) *u.i8p);
+               if (!miregexec(mire, numbuf))
+                   anymatch++;
+               break;
+           case RPM_INT16_TYPE:
+               sprintf(numbuf, "%d", (int) *u.i16p);
+               if (!miregexec(mire, numbuf))
+                   anymatch++;
+               break;
+           case RPM_INT32_TYPE:
+               sprintf(numbuf, "%d", (int) *u.i32p);
+               if (!miregexec(mire, numbuf))
+                   anymatch++;
+               break;
+           case RPM_STRING_TYPE:
+               if (!miregexec(mire, u.str))
+                   anymatch++;
+               break;
+           case RPM_I18NSTRING_TYPE:
+           case RPM_STRING_ARRAY_TYPE:
+               for (j = 0; j < c; j++) {
+                   if (miregexec(mire, u.argv[j]))
+                       continue;
+                   anymatch++;
+                   /*@innerbreak@*/ break;
+               }
+               break;
+           case RPM_NULL_TYPE:
+           case RPM_BIN_TYPE:
+           default:
+               break;
+           }
+           if ((i+1) < mi->mi_nre && mire[0].tag == mire[1].tag) {
+               i++;
+               mire++;
+               continue;
+           }
+           /*@innerbreak@*/ break;
+       }
+
+       u.ptr = hfd(u.ptr, t);
+
+       ntags++;
+       if (anymatch)
+           nmatches++;
+    }
+
+    return (ntags == nmatches ? 0 : 1);
+
+}
+
+int rpmdbSetIteratorRelease(rpmdbMatchIterator mi, const char * release) {
+    return rpmdbSetIteratorRE(mi, RPMTAG_RELEASE, release);
+}
+
+int rpmdbSetIteratorVersion(rpmdbMatchIterator mi, const char * version) {
+    return rpmdbSetIteratorRE(mi, RPMTAG_VERSION, version);
 }
 
 int rpmdbSetIteratorRewrite(rpmdbMatchIterator mi, int rewrite) {
@@ -1590,18 +1788,14 @@ if (dbi->dbi_api == 1 && dbi->dbi_rpmtag == RPMDBI_PACKAGES && rc == EFAULT) {
        goto top;
     }
 
-    if (mi->mi_release) {
-       const char * release;
-       (void) headerNVR(mi->mi_h, NULL, NULL, &release);
-       if (mi->mi_release && strcmp(mi->mi_release, release))
-           goto top;
-    }
-
-    if (mi->mi_version) {
-       const char * version;
-       (void) headerNVR(mi->mi_h, NULL, &version, NULL);
-       if (mi->mi_version && strcmp(mi->mi_version, version))
+    /*
+     * Skip this header if iterator selector (if any) doesn't match.
+     */
+    if (mireSkip(mi)) {
+       /* XXX hack, can't restart with Packages locked on single instance. */
+       if (mi->mi_set || mi->mi_keyp == NULL)
            goto top;
+       return NULL;
     }
 
     mi->mi_prevoffset = mi->mi_offset;
@@ -1792,6 +1986,8 @@ fprintf(stderr, "*** RMW %s %p\n", tagName(rpmtag), dbi->dbi_rmw);
     mi->mi_filenum = 0;
     mi->mi_fpnum = 0;
     mi->mi_dbnum = 0;
+    mi->mi_nre = 0;
+    mi->mi_re = NULL;
     mi->mi_version = NULL;
     mi->mi_release = NULL;
     /*@-nullret@*/
@@ -1867,7 +2063,7 @@ int rpmdbRemove(rpmdb rpmdb, int rid, unsigned int hdrNum)
        rpmMessage(RPMMESS_DEBUG, "  --- %10u %s-%s-%s\n", hdrNum, n, v, r);
     }
 
-    blockSignals(rpmdb, &signalMask);
+    (void) blockSignals(rpmdb, &signalMask);
 
     {  int dbix;
        dbiIndexItem rec = dbiIndexNewItem(hdrNum, 0);
@@ -1991,7 +2187,7 @@ int rpmdbRemove(rpmdb rpmdb, int rid, unsigned int hdrNum)
        rec = _free(rec);
     }
 
-    unblockSignals(rpmdb, &signalMask);
+    (void) unblockSignals(rpmdb, &signalMask);
 
     h = headerFree(h);
 
@@ -2071,7 +2267,7 @@ int rpmdbAdd(rpmdb rpmdb, int iid, Header h)
     if (_noDirTokens)
        expandFilelist(h);
 
-    blockSignals(rpmdb, &signalMask);
+    (void) blockSignals(rpmdb, &signalMask);
 
     {
        unsigned int firstkey = 0;
@@ -2294,7 +2490,7 @@ int rpmdbAdd(rpmdb rpmdb, int iid, Header h)
     }
 
 exit:
-    unblockSignals(rpmdb, &signalMask);
+    (void) unblockSignals(rpmdb, &signalMask);
 
     return rc;
 }
@@ -2715,8 +2911,13 @@ int rpmdbRebuild(const char * rootdir)
                /*@-shadow@*/
                {   rpmdbMatchIterator mi;
                    mi = rpmdbInitIterator(newdb, RPMTAG_NAME, name, 0);
-                   rpmdbSetIteratorVersion(mi, version);
-                   rpmdbSetIteratorRelease(mi, release);
+#ifdef DYING
+                   (void) rpmdbSetIteratorVersion(mi, version);
+                   (void) rpmdbSetIteratorRelease(mi, release);
+#else
+                   (void) rpmdbSetIteratorRE(mi, RPMTAG_VERSION, version);
+                   (void) rpmdbSetIteratorRE(mi, RPMTAG_RELEASE, release);
+#endif
                    while (rpmdbNextIterator(mi)) {
                        skip = 1;
                        /*@innerbreak@*/ break;
index 2d28d9f..1a413a3 100644 (file)
@@ -286,7 +286,7 @@ struct _dbiIndex {
     unsigned int       dbi_q_extentsize;
 
 /*@kept@*/ rpmdb       dbi_rpmdb;
-    int                dbi_rpmtag;             /*!< rpm tag used for index */
+    rpmTag     dbi_rpmtag;             /*!< rpm tag used for index */
     int                dbi_jlen;               /*!< size of join key */
 
     unsigned int dbi_lastoffset;       /*!< db1 with falloc.c needs this */
index 36d50a2..7932386 100644 (file)
@@ -121,6 +121,8 @@ typedef enum rpmerrCode_e {
     RPMERR_MANIFEST    = _nm(138), /*!< %s: read manifest failed: %s */
     RPMERR_BADHEADER   = _em(139), /*!< */
     RPMERR_FSEEK       = _em(140), /*!< %s: Fseek failed: %s */
+    RPMERR_REGCOMP     = _em(141), /*!< %s: regcomp failed: %s */
+    RPMERR_REGEXEC     = _em(142), /*!< %s: regexec failed: %s */
 
     RPMERR_BADSIGTYPE  = _em(200), /*!< Unknown signature type */
     RPMERR_SIGGEN      = _em(201), /*!< Error generating signature */
diff --git a/rpmqv.c b/rpmqv.c
index a360ed6..de2ee55 100755 (executable)
--- a/rpmqv.c
+++ b/rpmqv.c
@@ -943,10 +943,15 @@ int main(int argc, const char ** argv)
 
        qva->qva_prefix = rootdir;
        if (qva->qva_source == RPMQV_ALL) {
+#ifdef DYING
            if (poptPeekArg(optCon))
                argerror(_("extra arguments given for query of all packages"));
-
-           ec = rpmQuery(qva, RPMQV_ALL, NULL);
+#else
+           const char ** av = poptGetArgs(optCon);
+#endif
+           /*@-nullpass@*/     /* FIX: av can be NULL */
+           ec = rpmQuery(qva, RPMQV_ALL, (const char *) av);
+           /*@=nullpass@*/
        } else {
            if (!poptPeekArg(optCon))
                argerror(_("no arguments given for query"));