- API: replace rpmdbUpdateRecord with rpmdbRemove/rpmdbAdd.
authorjbj <devnull@localhost>
Thu, 27 Apr 2000 00:10:28 +0000 (00:10 +0000)
committerjbj <devnull@localhost>
Thu, 27 Apr 2000 00:10:28 +0000 (00:10 +0000)
- API: replace rpmdbFindByLabel with RPMDBI_LABEL iteration.
- API: replace rpmdbGetRecord with iterators.
- API: replace findMatches with iterators.

CVS patchset: 3704
CVS date: 2000/04/27 00:10:28

17 files changed:
CHANGES
lib/db0.c
lib/db3.c
lib/depends.c
lib/install.c
lib/query.c
lib/rpmdb.c
lib/rpmdb.h
lib/rpminstall.c
lib/rpmlib.h
lib/tagName.c
lib/transaction.c
lib/uninstall.c
po/rpm.pot
python/rpmmodule.c
python/upgrade.c
tools/dumpdb.c

diff --git a/CHANGES b/CHANGES
index bc3d57d..ca1675f 100644 (file)
--- a/CHANGES
+++ b/CHANGES
        - make db indices as lightweight as possible, with per-dbi config.
        - db1.c will never be needed, eliminate.
        - API: merge rebuilddb.c into rpmdb.c.
-
+       - API: replace rpmdbUpdateRecord with rpmdbRemove/rpmdbAdd.
+       - API: replace rpmdbFindByLabel with RPMDBI_LABEL iteration.
+       - API: replace rpmdbGetRecord with iterators.
+       - API: replace findMatches with iterators.
+       
 3.0.3 -> 3.0.4
        - use compressed filenames on install side.
        - start unifying FD types, CFD_t now gone.
index e8963c2..1dc8f1d 100644 (file)
--- a/lib/db0.c
+++ b/lib/db0.c
@@ -178,6 +178,7 @@ static int db0copen(dbiIndex dbi, DBC ** dbcp, unsigned int flags) {
 }
 
 static int db0cclose(dbiIndex dbi, DBC * dbcursor, unsigned int flags) {
+    dbi->dbi_lastoffset = 0;
     return 0;
 }
 
index 7c7893f..32a6f3e 100644 (file)
--- a/lib/db3.c
+++ b/lib/db3.c
@@ -935,10 +935,10 @@ static int db3open(rpmdb rpmdb, int rpmtag, dbiIndex * dbip)
     }
 
     oflags = (dbi->dbi_oeflags | dbi->dbi_oflags);
-#if NOTYET
-    if ( dbi->dbi_mode & O_EXCL) oflags |= DB_EXCL;
-#endif
-    if (!dbi->dbi_mode & O_RDWR) oflags |= DB_RDONLY;
+    if (dbi->dbi_mode & O_RDWR) {
+       if ( dbi->dbi_mode & O_EXCL) oflags |= DB_EXCL;
+    } else
+       oflags |= DB_RDONLY;
     if ( dbi->dbi_mode & O_CREAT) oflags |= DB_CREATE;
     if ( dbi->dbi_mode & O_TRUNC) oflags |= DB_TRUNCATE;
 
index c5ca136..c9fb40b 100644 (file)
@@ -889,7 +889,7 @@ static int unsatisfiedDepend(rpmTransactionSet rpmdep,
 
     if (suggestion) *suggestion = NULL;
 
-    {  mi =  rpmdbInitIterator(rpmdep->db, 1, keyDepend, 0);
+    {  mi =  rpmdbInitIterator(rpmdep->db, RPMDBI_DEPENDS, keyDepend, 0);
        if (mi) {
            rc = rpmdbGetIteratorOffset(mi);
            rpmdbFreeIterator(mi);
@@ -1393,6 +1393,7 @@ int rpmdepCheck(rpmTransactionSet rpmdep,
     struct availablePackage * p;
     int i, j;
     int rc;
+    rpmdbMatchIterator mi = NULL;
     Header h = NULL;
     struct problemsSet ps;
 
@@ -1436,15 +1437,10 @@ int rpmdepCheck(rpmTransactionSet rpmdep,
     }
 
     /* now look at the removed packages and make sure they aren't critical */
-    for (i = 0; i < rpmdep->numRemovedPackages; i++) {
-
-       h = rpmdbGetRecord(rpmdep->db, rpmdep->removedPackages[i]);
-       if (h == NULL) {
-           rpmError(RPMERR_DBCORRUPT,
-                       _("cannot read header at %d for dependency check"),
-                       rpmdep->removedPackages[i]);
-           goto exit;
-       }
+    mi = rpmdbInitIterator(rpmdep->db, RPMDBI_PACKAGES, NULL, 0);
+    rpmdbAppendIteratorMatches(mi, rpmdep->removedPackages,
+               rpmdep->numRemovedPackages);
+    while ((h = rpmdbNextIterator(mi)) != NULL) {
 
        {   const char * name;
            headerNVR(h, &name, NULL, NULL);
@@ -1511,7 +1507,8 @@ int rpmdepCheck(rpmTransactionSet rpmdep,
            }
        }
 
-       headerFree(h);  h = NULL;
+       rpmdbFreeIterator(mi);
+       mi = NULL;
     }
 
     if (!ps.num) {
@@ -1525,8 +1522,8 @@ int rpmdepCheck(rpmTransactionSet rpmdep,
     return 0;
 
 exit:
-    if (h) 
-       headerFree(h);
+    if (mi)
+       rpmdbFreeIterator(mi);
     if (ps.problems)   free(ps.problems);
     return 1;
 }
index e44e36e..bef1d7f 100644 (file)
@@ -244,21 +244,25 @@ static int markReplacedFiles(rpmdb db, struct sharedFileInfo * replList)
 
     for (fileInfo = replList; fileInfo->otherPkg; fileInfo++) {
        if (secOffset != fileInfo->otherPkg) {
+           rpmdbMatchIterator mi;
+
            if (secHeader != NULL) {
                /* ignore errors here - just do the best we can */
 
-               rpmdbUpdateRecord(db, secOffset, secHeader);
+               rpmdbRemove(db, secOffset, 1);
+               rpmdbAdd(db, secHeader);
                headerFree(secHeader);
            }
 
            secOffset = fileInfo->otherPkg;
-           sh = rpmdbGetRecord(db, secOffset);
-           if (sh == NULL) {
+
+           mi = rpmdbInitIterator(db, RPMDBI_PACKAGES, &secOffset, sizeof(secOffset));
+           sh = rpmdbNextIterator(mi);
+           if (sh == NULL)
                secOffset = 0;
-           } else {
+           else
                secHeader = headerCopy(sh);     /* so we can modify it */
-               headerFree(sh);
-           }
+           rpmdbFreeIterator(mi);
 
            headerGetEntry(secHeader, RPMTAG_FILESTATES, &type,
                           (void **) &secStates, &count);
@@ -273,7 +277,8 @@ static int markReplacedFiles(rpmdb db, struct sharedFileInfo * replList)
     if (secHeader != NULL) {
        /* ignore errors here - just do the best we can */
 
-       rpmdbUpdateRecord(db, secOffset, secHeader);
+       rpmdbRemove(db, secOffset, 1);
+       rpmdbAdd(db, secHeader);
        headerFree(secHeader);
     }
 
index 0002ab9..ed5174b 100644 (file)
@@ -418,7 +418,8 @@ void rpmDisplayQueryTags(FILE * f)
     }
 }
 
-int XshowMatches(QVA_t *qva, rpmdbMatchIterator mi, QVF_t showPackage)
+#ifndef        DYING
+int showMatches(QVA_t *qva, rpmdbMatchIterator mi, QVF_t showPackage)
 {
     Header h;
     int ec = 0;
@@ -431,7 +432,7 @@ int XshowMatches(QVA_t *qva, rpmdbMatchIterator mi, QVF_t showPackage)
     rpmdbFreeIterator(mi);
     return ec;
 }
-
+#else
 int showMatches(QVA_t *qva, rpmdb db, dbiIndexSet matches, QVF_t showPackage)
 {
     Header h;
@@ -457,6 +458,7 @@ int showMatches(QVA_t *qva, rpmdb db, dbiIndexSet matches, QVF_t showPackage)
     }
     return ec;
 }
+#endif
 
 /*
  * XXX Eliminate linkage loop into librpmbuild.a
@@ -469,7 +471,9 @@ void        (*freeSpecVec) (Spec spec) = NULL;
 int rpmQueryVerify(QVA_t *qva, enum rpmQVSources source, const char * arg,
        rpmdb db, QVF_t showPackage)
 {
+#ifdef DYING
     dbiIndexSet matches = NULL;                /* XXX DYING */
+#endif
     rpmdbMatchIterator mi = NULL;
     Header h;
     int rc;
@@ -576,12 +580,12 @@ int rpmQueryVerify(QVA_t *qva, enum rpmQVSources source, const char * arg,
 
     case RPMQV_ALL:
        /* RPMDBI_PACKAGES */
-       mi = rpmdbInitIterator(db, 0, NULL, 0);
+       mi = rpmdbInitIterator(db, RPMDBI_PACKAGES, NULL, 0);
        if (mi == NULL) {
            fprintf(stderr, _("no packages\n"));
            retcode = 1;
        } else {
-           retcode = XshowMatches(qva, mi, showPackage);
+           retcode = showMatches(qva, mi, showPackage);
        }
        break;
 
@@ -591,7 +595,7 @@ int rpmQueryVerify(QVA_t *qva, enum rpmQVSources source, const char * arg,
            fprintf(stderr, _("group %s does not contain any packages\n"), arg);
            retcode = 1;
        } else {
-           retcode = XshowMatches(qva, mi, showPackage);
+           retcode = showMatches(qva, mi, showPackage);
        }
        break;
 
@@ -601,7 +605,7 @@ int rpmQueryVerify(QVA_t *qva, enum rpmQVSources source, const char * arg,
            fprintf(stderr, _("no package triggers %s\n"), arg);
            retcode = 1;
        } else {
-           retcode = XshowMatches(qva, mi, showPackage);
+           retcode = showMatches(qva, mi, showPackage);
        }
        break;
 
@@ -611,7 +615,7 @@ int rpmQueryVerify(QVA_t *qva, enum rpmQVSources source, const char * arg,
            fprintf(stderr, _("no package requires %s\n"), arg);
            retcode = 1;
        } else {
-           retcode = XshowMatches(qva, mi, showPackage);
+           retcode = showMatches(qva, mi, showPackage);
        }
        break;
 
@@ -622,7 +626,7 @@ int rpmQueryVerify(QVA_t *qva, enum rpmQVSources source, const char * arg,
                fprintf(stderr, _("no package provides %s\n"), arg);
                retcode = 1;
            } else {
-               retcode = XshowMatches(qva, mi, showPackage);
+               retcode = showMatches(qva, mi, showPackage);
            }
            break;
        }
@@ -643,7 +647,7 @@ int rpmQueryVerify(QVA_t *qva, enum rpmQVSources source, const char * arg,
            }
            retcode = 1;
        } else {
-           retcode = XshowMatches(qva, mi, showPackage);
+           retcode = showMatches(qva, mi, showPackage);
        }
        break;
 
@@ -668,16 +672,17 @@ int rpmQueryVerify(QVA_t *qva, enum rpmQVSources source, const char * arg,
        }
        rpmMessage(RPMMESS_DEBUG, _("package record number: %u\n"), recOffset);
        /* RPMDBI_PACKAGES */
-       mi = rpmdbInitIterator(db, 0, &recOffset, sizeof(recOffset));
+       mi = rpmdbInitIterator(db, RPMDBI_PACKAGES, &recOffset, sizeof(recOffset));
        if (mi == NULL) {
            fprintf(stderr, _("record %d could not be read\n"), recOffset);
            retcode = 1;
        } else {
-           retcode = XshowMatches(qva, mi, showPackage);
+           retcode = showMatches(qva, mi, showPackage);
        }
     }  break;
 
     case RPMQV_PACKAGE:
+#ifdef DYING
        rc = rpmdbFindByLabel(db, arg, &matches);
        if (rc == 1) {
            retcode = 1;
@@ -688,13 +693,25 @@ int rpmQueryVerify(QVA_t *qva, enum rpmQVSources source, const char * arg,
        } else {
            retcode = showMatches(qva, db, matches, showPackage);
        }
+#else
+       /* XXX HACK to get rpmdbFindByLabel out of the API */
+       mi = rpmdbInitIterator(db, RPMDBI_LABEL, arg, 0);
+       if (mi == NULL) {
+           fprintf(stderr, _("package %s is not installed\n"), arg);
+           retcode = 1;
+       } else {
+           retcode = showMatches(qva, mi, showPackage);
+       }
+#endif
        break;
     }
    
+#ifdef DYING
     if (matches) {     /* XXX DYING */
        dbiFreeIndexSet(matches);
        matches = NULL;
     }
+#endif
     return retcode;
 }
 
index b50d6f5..80ae931 100644 (file)
@@ -260,7 +260,7 @@ union _dbswap {
  * @param setp         address of items retrieved from index database
  * @return             -1 error, 0 success, 1 not found
  */
-static int dbiSearchIndex(dbiIndex dbi, const char * keyp, size_t keylen,
+static int dbiSearch(dbiIndex dbi, const char * keyp, size_t keylen,
                dbiIndexSet * setp)
 {
     int rc;
@@ -410,23 +410,19 @@ static int dbiUpdateIndex(dbiIndex dbi, const char * keyp, dbiIndexSet set)
 /*@=compmempass@*/
 
 /**
- * Append element to set of index database items.
- * @param set  set of index database items
- * @param rec  item to append to set
- * @return     0 success (always)
+ * Append element(s) to set of index database items.
+ * @param set          set of index database items
+ * @param recs         array of items to append to set
+ * @param nrecs                number of items
+ * @return             0 success (always)
  */
-static inline int dbiAppendIndexRecord(dbiIndexSet set, dbiIndexRecord rec)
+static inline int dbiAppendSet(dbiIndexSet set, dbiIndexRecord recs, int nrecs)
 {
-    set->count++;
-
-    if (set->count == 1) {
-       set->recs = xmalloc(set->count * sizeof(*(set->recs)));
-    } else {
-       set->recs = xrealloc(set->recs, set->count * sizeof(*(set->recs)));
-    }
-    set->recs[set->count - 1].recOffset = rec->recOffset;
-    set->recs[set->count - 1].fileNumber = rec->fileNumber;
-
+    set->recs = (set->count == 0)
+       ? xmalloc(nrecs * sizeof(*(set->recs)))
+       : xrealloc(set->recs, (set->count + nrecs) * sizeof(*(set->recs)));
+    memcpy(set->recs + set->count, recs, nrecs * sizeof(*recs));
+    set->count += nrecs;
     return 0;
 }
 
@@ -712,8 +708,9 @@ int rpmdbInit (const char * prefix, int perms)
     return rc;
 }
 
-/* XXX depends.c, install.c, query.c, transaction.c, uninstall.c */
-Header rpmdbGetRecord(rpmdb rpmdb, unsigned int offset)
+#ifndef        DYING_NOTYET
+/* XXX install.c, query.c, transaction.c, uninstall.c */
+static Header rpmdbGetRecord(rpmdb rpmdb, unsigned int offset)
 {
     int rpmtag;
     dbiIndex dbi;
@@ -732,6 +729,7 @@ Header rpmdbGetRecord(rpmdb rpmdb, unsigned int offset)
        return NULL;
     return headerLoad(uh);
 }
+#endif
 
 static int rpmdbFindByFile(rpmdb rpmdb, const char * filespec,
                        /*@out@*/ dbiIndexSet * matches)
@@ -765,7 +763,7 @@ static int rpmdbFindByFile(rpmdb rpmdb, const char * filespec,
     fp1 = fpLookup(fpc, dirName, baseName, 1);
 
     dbi = dbiOpen(rpmdb, RPMTAG_BASENAMES, 0);
-    rc = dbiSearchIndex(dbi, baseName, 0, &allMatches);
+    rc = dbiSearch(dbi, baseName, 0, &allMatches);
     if (rc) {
        dbiFreeIndexSet(allMatches);
        allMatches = NULL;
@@ -783,7 +781,19 @@ static int rpmdbFindByFile(rpmdb rpmdb, const char * filespec,
        unsigned int prevoff;
        Header h;
 
-       if ((h = rpmdbGetRecord(rpmdb, offset)) == NULL) {
+#ifndef        DYING_NOTYET
+       h = rpmdbGetRecord(rpmdb, offset);
+#else
+       {   rpmdbMatchIterator mi;
+           mi = rpmdbInitIterator(rpmdb, RPMDBI_PACKAGES, &offset, sizeof(offset));
+           h = rpmdbNextIterator(mi);
+           if (h)
+               h = headerLink(h);
+           rpmdbFreeIterator(mi);
+       }
+#endif
+
+       if (h == NULL) {
            i++;
            continue;
        }
@@ -803,7 +813,7 @@ static int rpmdbFindByFile(rpmdb rpmdb, const char * filespec,
            if (FP_EQUAL(fp1, fp2)) {
                rec->recOffset = dbiIndexRecordOffset(allMatches, i);
                rec->fileNumber = dbiIndexRecordFileNumber(allMatches, i);
-               dbiAppendIndexRecord(*matches, rec);
+               dbiAppendSet(*matches, rec, 1);
            }
 
            prevoff = offset;
@@ -845,7 +855,7 @@ int rpmdbCountPackages(rpmdb rpmdb, const char * name)
     int rc;
 
     dbix = dbiTagToDbix(RPMTAG_NAME);
-    rc = dbiSearchIndex(rpmdb->_dbi[dbix], name, 0, &matches);
+    rc = dbiSearch(rpmdb->_dbi[dbix], name, 0, &matches);
 
     switch (rc) {
     default:
@@ -868,8 +878,129 @@ int rpmdbCountPackages(rpmdb rpmdb, const char * name)
     return rc;
 }
 
+/* XXX transaction.c */
+/* 0 found matches */
+/* 1 no matches */
+/* 2 error */
+static int dbiFindMatches(dbiIndex dbi, const char * name, const char * version,
+                       const char * release, dbiIndexSet * matches)
+{
+    int gotMatches;
+    int rc;
+    int i;
+
+    rc = dbiSearch(dbi, name, 0, matches);
+
+    if (rc != 0) {
+       rc = ((rc == -1) ? 2 : 1);
+       goto exit;
+    }
+
+    if (!version && !release) {
+       rc = 0;
+       goto exit;
+    }
+
+    gotMatches = 0;
+
+    /* 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;
+
+#ifndef        DYING_NOTYET
+       h = rpmdbGetRecord(dbi->dbi_rpmdb, recoff);
+#else
+    {  rpmdbMatchIterator mi;
+       mi = rpmdbInitIterator(rpmdb, RPMDBI_PACKAGES, &recoff, sizeof(recoff));
+       h = rpmdbNextIterator(mi);
+       if (h)
+           h = headerLink(h);
+       rpmdbFreeIterator(mi);
+    }
+#endif
+       if (h == NULL) {
+           rpmError(RPMERR_DBCORRUPT, _("%s: cannot read header at 0x%x"),
+               "findMatches", recoff);
+           rc = 2;
+           goto exit;
+       }
+
+       headerNVR(h, NULL, &pkgVersion, &pkgRelease);
+           
+       goodRelease = goodVersion = 1;
+
+       if (release && strcmp(release, pkgRelease)) goodRelease = 0;
+       if (version && strcmp(version, pkgVersion)) goodVersion = 0;
+
+       if (goodRelease && goodVersion) 
+           gotMatches = 1;
+       else 
+           dbiIndexRecordOffsetSave(*matches, i, 0);
+
+       headerFree(h);
+    }
+
+    if (!gotMatches) {
+       rc = 1;
+       goto exit;
+    }
+    rc = 0;
+
+exit:
+    if (rc && matches && *matches) {
+       dbiFreeIndexSet(*matches);
+       *matches = NULL;
+    }
+    return rc;
+}
+
+/* XXX query.c, rpminstall.c */
+/* 0 found matches */
+/* 1 no matches */
+/* 2 error */
+static int dbiFindByLabel(dbiIndex dbi, const char * arg, dbiIndexSet * matches)
+{
+    char * localarg, * chptr;
+    char * release;
+    int rc;
+    if (!strlen(arg)) return 1;
+
+    /* did they give us just a name? */
+    rc = dbiFindMatches(dbi, arg, NULL, NULL, matches);
+    if (rc != 1) return rc;
+
+    /* maybe a name and a release */
+    localarg = alloca(strlen(arg) + 1);
+    strcpy(localarg, arg);
+
+    chptr = (localarg + strlen(localarg)) - 1;
+    while (chptr > localarg && *chptr != '-') chptr--;
+    if (chptr == localarg) return 1;
+
+    *chptr = '\0';
+    rc = dbiFindMatches(dbi, localarg, chptr + 1, NULL, matches);
+    if (rc != 1) return rc;
+    
+    /* how about name-version-release? */
+
+    release = chptr + 1;
+    while (chptr > localarg && *chptr != '-') chptr--;
+    if (chptr == localarg) return 1;
+
+    *chptr = '\0';
+    return dbiFindMatches(dbi, localarg, chptr + 1, release, matches);
+}
+
 struct _rpmdbMatchIterator {
-    const void *       mi_key;
+    const void *       mi_keyp;
     size_t             mi_keylen;
     rpmdb              mi_rpmdb;
     dbiIndex           mi_dbi;
@@ -905,14 +1036,13 @@ void rpmdbFreeIterator(rpmdbMatchIterator mi)
        dbiFreeIndexSet(mi->mi_set);
        mi->mi_set = NULL;
     } else {
-       int dbix = 0;   /* RPMDBI_PACKAGES */
-       dbiIndex dbi = mi->mi_rpmdb->_dbi[dbix];
+       dbiIndex dbi = dbiOpen(mi->mi_rpmdb, RPMDBI_PACKAGES, 0);
        if (dbi)
            (void) dbiCclose(dbi, NULL, 0);
     }
-    if (mi->mi_key) {
-       xfree(mi->mi_key);
-       mi->mi_key = NULL;
+    if (mi->mi_keyp) {
+       xfree(mi->mi_keyp);
+       mi->mi_keyp = NULL;
     }
     free(mi);
 }
@@ -958,7 +1088,6 @@ void rpmdbSetIteratorVersion(rpmdbMatchIterator mi, const char * version) {
 Header rpmdbNextIterator(rpmdbMatchIterator mi)
 {
     dbiIndex dbi;
-    int rpmtag;
     void * uh = NULL;
     size_t uhlen = 0;
     void * keyp;
@@ -968,8 +1097,7 @@ Header rpmdbNextIterator(rpmdbMatchIterator mi)
     if (mi == NULL)
        return NULL;
 
-    rpmtag = 0;        /* RPMDBI_PACKAGES */
-    dbi = dbiOpen(mi->mi_rpmdb, rpmtag, 0);
+    dbi = dbiOpen(mi->mi_rpmdb, RPMDBI_PACKAGES, 0);
     if (dbi == NULL)
        return NULL;
 
@@ -977,17 +1105,15 @@ top:
     /* XXX skip over instances with 0 join key */
     do {
        if (mi->mi_set) {
-           keyp = &mi->mi_offset;
-           keylen = sizeof(mi->mi_offset);
            if (!(mi->mi_setx < mi->mi_set->count))
                return NULL;
-           if (mi->mi_dbix != 0) {     /* RPMDBI_PACKAGES */
-               mi->mi_offset = dbiIndexRecordOffset(mi->mi_set, mi->mi_setx);
-               mi->mi_filenum = dbiIndexRecordFileNumber(mi->mi_set, mi->mi_setx);
-           }
+           mi->mi_offset = dbiIndexRecordOffset(mi->mi_set, mi->mi_setx);
+           mi->mi_filenum = dbiIndexRecordFileNumber(mi->mi_set, mi->mi_setx);
+           keyp = &mi->mi_offset;
+           keylen = sizeof(mi->mi_offset);
        } else {
-           keyp = NULL;
-           keylen = 0;
+           keyp = (void *)mi->mi_keyp;         /* XXX FIXME const */
+           keylen = mi->mi_keylen;
 
            rc = dbiGet(dbi, &keyp, &keylen, &uh, &uhlen, 0);
 
@@ -1063,7 +1189,7 @@ static int rpmdbGrowIterator(rpmdbMatchIterator mi,
     if (keylen == 0)
        keylen = strlen(keyp);
 
-    rc = dbiSearchIndex(dbi, keyp, keylen, &set);
+    rc = dbiSearch(dbi, keyp, keylen, &set);
 
     switch (rc) {
     default:
@@ -1092,14 +1218,41 @@ static int rpmdbGrowIterator(rpmdbMatchIterator mi,
     return rc;
 }
 
+void rpmdbAppendIteratorMatches(rpmdbMatchIterator mi, int * offsets,
+       int numOffsets)
+{
+    dbiIndexRecord recs;
+    int i;
+
+    if (mi == NULL)
+       return;
+    recs = alloca(numOffsets * sizeof(*recs));
+    for (i = 0; i < numOffsets; i++) {
+       memset(recs + i, 0, sizeof(*recs));
+       recs[i].recOffset = offsets[i];
+    }
+    if (mi->mi_set == NULL)
+       mi->mi_set = xcalloc(1, sizeof(*mi->mi_set));
+    dbiAppendSet(mi->mi_set, recs, numOffsets);
+}
+
 rpmdbMatchIterator rpmdbInitIterator(rpmdb rpmdb, int rpmtag,
        const void * keyp, size_t keylen)
 {
     rpmdbMatchIterator mi = NULL;
     dbiIndexSet set = NULL;
     dbiIndex dbi;
+    int isLabel = 0;
     int dbix;
 
+    /* XXX HACK to remove rpmdbFindByLabel/findMatches from the API */
+    switch (rpmtag) {
+    case RPMDBI_LABEL:
+       rpmtag = RPMTAG_NAME;
+       isLabel = 1;
+       break;
+    }
+
     dbix = dbiTagToDbix(rpmtag);
     if (dbix < 0)
        return NULL;
@@ -1107,12 +1260,20 @@ rpmdbMatchIterator rpmdbInitIterator(rpmdb rpmdb, int rpmtag,
     if (dbi == NULL)
        return NULL;
 
-    if (keyp) {
+    assert(dbi->dbi_rmw == NULL);      /* db3: avoid "lost" cursors */
+    assert(dbi->dbi_lastoffset == 0);  /* db0: avoid "lost" cursors */
+
+    dbi->dbi_lastoffset = 0;           /* db0: rewind to beginning */
+
+    if (rpmtag != RPMDBI_PACKAGES && keyp) {
        int rc;
-       if (rpmtag == RPMTAG_BASENAMES) {
+       if (isLabel) {
+           /* XXX HACK to get rpmdbFindByLabel out of the API */
+           rc = dbiFindByLabel(dbi, keyp, &set);
+       } else if (rpmtag == RPMTAG_BASENAMES) {
            rc = rpmdbFindByFile(rpmdb, keyp, &set);
        } else {
-           rc = dbiSearchIndex(dbi, keyp, keylen, &set);
+           rc = dbiSearch(dbi, keyp, keylen, &set);
        }
        switch (rc) {
        default:
@@ -1127,24 +1288,21 @@ rpmdbMatchIterator rpmdbInitIterator(rpmdb rpmdb, int rpmtag,
        }
     }
 
-    mi = xcalloc(sizeof(*mi), 1);
     if (keyp) {
-       if (keylen == 0)
+       char * k;
+
+       if (rpmtag != RPMDBI_PACKAGES && keylen == 0)
            keylen = strlen(keyp);
+       k = xmalloc(keylen + 1);
+       memcpy(k, keyp, keylen);
+       k[keylen] = '\0';       /* XXX for strings */
+       keyp = k;
+    }
 
-       {   char * k = xmalloc(keylen + 1);
-           memcpy(k, keyp, keylen);
-           k[keylen] = '\0';   /* XXX for strings */
-           mi->mi_key = k;
-       }
+    mi = xcalloc(sizeof(*mi), 1);
+    mi->mi_keyp = keyp;
+    mi->mi_keylen = keylen;
 
-       mi->mi_keylen = keylen;
-    } else {
-       mi->mi_key = NULL;
-       mi->mi_keylen = 0;
-       if (dbi)
-           dbi->dbi_lastoffset = 0;    /* db0: rewind to beginning */
-    }
     mi->mi_rpmdb = rpmdb;
     mi->mi_dbi = dbi;
 
@@ -1166,7 +1324,7 @@ static inline int removeIndexEntry(dbiIndex dbi, const char * keyp, dbiIndexReco
     dbiIndexSet set = NULL;
     int rc;
     
-    rc = dbiSearchIndex(dbi, keyp, 0, &set);
+    rc = dbiSearch(dbi, keyp, 0, &set);
 
     switch (rc) {
     case -1:                   /* error */
@@ -1202,15 +1360,25 @@ static inline int removeIndexEntry(dbiIndex dbi, const char * keyp, dbiIndexReco
     return rc;
 }
 
-/* XXX uninstall.c */
+/* XXX install.c uninstall.c */
 int rpmdbRemove(rpmdb rpmdb, unsigned int offset, int tolerant)
 {
     Header h;
 
+#ifndef        DYING_NOTYET
     h = rpmdbGetRecord(rpmdb, offset);
+#else
+  { rpmdbMatchIterator mi;
+    mi = rpmdbInitIterator(rpmdb, RPMDBI_PACKAGES, &offset, sizeof(offset));
+    h = rpmdbNextIterator(mi);
+    if (h)
+       h = headerLink(h);
+    rpmdbFreeIterator(mi);
+  }
+#endif
     if (h == NULL) {
-       rpmError(RPMERR_DBCORRUPT, _("rpmdbRemove: cannot read header at 0x%x"),
-             offset);
+       rpmError(RPMERR_DBCORRUPT, _("%s: cannot read header at 0x%x"),
+             "rpmdbRemove", offset);
        return 1;
     }
 
@@ -1319,7 +1487,7 @@ static inline int addIndexEntry(dbiIndex dbi, const char *index, dbiIndexRecord
     dbiIndexSet set = NULL;
     int rc;
 
-    rc = dbiSearchIndex(dbi, index, 0, &set);
+    rc = dbiSearch(dbi, index, 0, &set);
 
     switch (rc) {
     default:
@@ -1331,7 +1499,7 @@ static inline int addIndexEntry(dbiIndex dbi, const char *index, dbiIndexRecord
        set = xcalloc(1, sizeof(*set));
        /*@fallthrough@*/
     case 0:                    /* success */
-       dbiAppendIndexRecord(set, rec);
+       dbiAppendSet(set, rec, 1);
        if (dbiUpdateIndex(dbi, index, set))
            rc = 1;
        break;
@@ -1532,20 +1700,6 @@ exit:
     return rc;
 }
 
-/* XXX install.c */
-int rpmdbUpdateRecord(rpmdb rpmdb, int offset, Header newHeader)
-{
-    int rc = 0;
-
-    if (rpmdbRemove(rpmdb, offset, 1))
-       return 1;
-
-    if (rpmdbAdd(rpmdb, newHeader)) 
-       return 1;
-
-    return rc;
-}
-
 static void rpmdbRemoveDatabase(const char * rootdir, const char * dbpath)
 { 
     int i;
@@ -1740,7 +1894,7 @@ int rpmdbFindFpList(rpmdb rpmdb, fingerPrint * fpList, dbiIndexSet * matchList,
        /* Add db (recnum,filenum) to list for fingerprint matches. */
        for (i = 0; i < num; i++, im++) {
            if (FP_EQUAL_DIFFERENT_CACHE(fps[i], fpList[im->fpNum]))
-               dbiAppendIndexRecord(matchList[im->fpNum], im);
+               dbiAppendSet(matchList[im->fpNum], im, 1);
        }
 
        free(fps);
@@ -1760,119 +1914,6 @@ int rpmdbFindFpList(rpmdb rpmdb, fingerPrint * fpList, dbiIndexSet * matchList,
 
 }
 
-/* XXX transaction.c */
-/* 0 found matches */
-/* 1 no matches */
-/* 2 error */
-int findMatches(rpmdb rpmdb, const char * name, const char * version,
-                       const char * release, dbiIndexSet * matches)
-{
-    dbiIndex dbi;
-    int gotMatches;
-    int rc;
-    int i;
-
-    dbi = dbiOpen(rpmdb, RPMTAG_NAME, 0);
-    rc = dbiSearchIndex(dbi, name, 0, matches);
-
-    if (rc != 0) {
-       rc = ((rc == -1) ? 2 : 1);
-       goto exit;
-    }
-
-    if (!version && !release) {
-       rc = 0;
-       goto exit;
-    }
-
-    gotMatches = 0;
-
-    /* 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;
-
-       h = rpmdbGetRecord(rpmdb, recoff);
-       if (h == NULL) {
-           rpmError(RPMERR_DBCORRUPT,_("cannot read header at %d for lookup"), 
-               recoff);
-           rc = 2;
-           goto exit;
-       }
-
-       headerNVR(h, NULL, &pkgVersion, &pkgRelease);
-           
-       goodRelease = goodVersion = 1;
-
-       if (release && strcmp(release, pkgRelease)) goodRelease = 0;
-       if (version && strcmp(version, pkgVersion)) goodVersion = 0;
-
-       if (goodRelease && goodVersion) 
-           gotMatches = 1;
-       else 
-           dbiIndexRecordOffsetSave(*matches, i, 0);
-
-       headerFree(h);
-    }
-
-    if (!gotMatches) {
-       rc = 1;
-       goto exit;
-    }
-    rc = 0;
-
-exit:
-    if (rc && matches && *matches) {
-       dbiFreeIndexSet(*matches);
-       *matches = NULL;
-    }
-    return rc;
-}
-
-/* XXX query.c, rpminstall.c */
-/* 0 found matches */
-/* 1 no matches */
-/* 2 error */
-int rpmdbFindByLabel(rpmdb rpmdb, const char * arg, dbiIndexSet * matches)
-{
-    char * localarg, * chptr;
-    char * release;
-    int rc;
-    if (!strlen(arg)) return 1;
-
-    /* did they give us just a name? */
-    rc = findMatches(rpmdb, arg, NULL, NULL, matches);
-    if (rc != 1) return rc;
-
-    /* maybe a name and a release */
-    localarg = alloca(strlen(arg) + 1);
-    strcpy(localarg, arg);
-
-    chptr = (localarg + strlen(localarg)) - 1;
-    while (chptr > localarg && *chptr != '-') chptr--;
-    if (chptr == localarg) return 1;
-
-    *chptr = '\0';
-    rc = findMatches(rpmdb, localarg, chptr + 1, NULL, matches);
-    if (rc != 1) return rc;
-    
-    /* how about name-version-release? */
-
-    release = chptr + 1;
-    while (chptr > localarg && *chptr != '-') chptr--;
-    if (chptr == localarg) return 1;
-
-    *chptr = '\0';
-    return findMatches(rpmdb, localarg, chptr + 1, release, matches);
-}
-
 /** */
 int rpmdbRebuild(const char * rootdir)
 {
@@ -1959,7 +2000,7 @@ int rpmdbRebuild(const char * rootdir)
 #define        _RECNUM rpmdbGetIteratorOffset(mi)
 
        /* RPMDBI_PACKAGES */
-       mi = rpmdbInitIterator(olddb, 0, NULL, 0);
+       mi = rpmdbInitIterator(olddb, RPMDBI_PACKAGES, NULL, 0);
        while ((h = rpmdbNextIterator(mi)) != NULL) {
 
            /* let's sanity check this record a bit, otherwise just skip it */
index 0c385e6..4a44ce9 100644 (file)
@@ -373,11 +373,6 @@ int rpmdbRemove(rpmdb db, unsigned int offset, int tolerant);
 int rpmdbAdd(rpmdb rpmdb, Header dbentry);
 
 /**
- * @param rpmdb                rpm database
- */
-int rpmdbUpdateRecord(rpmdb rpmdb, int secOffset, Header secHeader);
-
-/**
  */
 unsigned int rpmdbGetIteratorFileNum(rpmdbMatchIterator mi);
 
index 45c1bb1..e9b931c 100644 (file)
@@ -117,7 +117,7 @@ int rpmInstall(const char * rootdir, const char ** fileArgv, int transFlags,
     if (transFlags & RPMTRANS_FLAG_TEST) 
        mode = O_RDONLY;
     else
-       mode = O_RDWR | O_CREAT;
+       mode = O_RDWR | O_CREAT;        /* XXX can't O_EXCL */
 
     for (defaultReloc = relocations; defaultReloc && defaultReloc->oldPath;
         defaultReloc++);
@@ -400,10 +400,10 @@ int rpmErase(const char * rootdir, const char ** argv, int transFlags,
                 int interfaceFlags)
 {
     rpmdb db;
+#ifdef DYING
     dbiIndexSet matches = NULL;
-    int i, j;
+#endif
     int mode;
-    int rc;
     int count;
     const char ** arg;
     int numFailed = 0;
@@ -427,9 +427,12 @@ int rpmErase(const char * rootdir, const char ** argv, int transFlags,
        exit(EXIT_FAILURE);
     }
 
-    j = 0;
     rpmdep = rpmtransCreateSet(db, rootdir);
     for (arg = argv; *arg; arg++) {
+#ifdef DYING
+       int rc;
+       int i;
+
        rc = rpmdbFindByLabel(db, *arg, &matches);
        switch (rc) {
        case 1:
@@ -449,14 +452,13 @@ int rpmErase(const char * rootdir, const char ** argv, int transFlags,
                rpmMessage(RPMMESS_ERROR, _("\"%s\" specifies multiple packages\n"), 
                        *arg);
                numFailed++;
+               break;
            }
-           else { 
-               for (i = 0; i < dbiIndexSetCount(matches); i++) {
-                   unsigned int recOffset = dbiIndexRecordOffset(matches, i);
-                   if (recOffset) {
-                       rpmtransRemovePackage(rpmdep, recOffset);
-                       numPackages++;
-                   }
+           for (i = 0; i < dbiIndexSetCount(matches); i++) {
+               unsigned int recOffset = dbiIndexRecordOffset(matches, i);
+               if (recOffset) {
+                   rpmtransRemovePackage(rpmdep, recOffset);
+                   numPackages++;
                }
            }
 
@@ -466,6 +468,31 @@ int rpmErase(const char * rootdir, const char ** argv, int transFlags,
            dbiFreeIndexSet(matches);
            matches = NULL;
        }
+#else  /* DYING */
+       rpmdbMatchIterator mi;
+
+       /* XXX HACK to get rpmdbFindByLabel out of the API */
+       mi = rpmdbInitIterator(db, RPMDBI_LABEL, *arg, 0);
+       count = rpmdbGetIteratorCount(mi);
+       if (count <= 0) {
+           rpmMessage(RPMMESS_ERROR, _("package %s is not installed\n"), *arg);
+           numFailed++;
+       } else if (!(count == 1 || (interfaceFlags & UNINSTALL_ALLMATCHES))) {
+           rpmMessage(RPMMESS_ERROR, _("\"%s\" specifies multiple packages\n"),
+                       *arg);
+           numFailed++;
+       } else {
+           Header h;   /* XXX iterator owns the reference */
+           while ((h = rpmdbNextIterator(mi)) != NULL) {
+               unsigned int recOffset = rpmdbGetIteratorOffset(mi);
+               if (recOffset) {
+                   rpmtransRemovePackage(rpmdep, recOffset);
+                   numPackages++;
+               }
+           }
+       }
+       rpmdbFreeIterator(mi);
+#endif /* DYING */
     }
 
     if (!(interfaceFlags & UNINSTALL_NODEPS)) {
index fa2bd0b..8a9eae2 100644 (file)
@@ -85,7 +85,12 @@ extern const int rpmTagTableSize;
 /* this chains to headerDefaultFormats[] */
 extern const struct headerSprintfExtension rpmHeaderFormats[];
 
-/* these tags are for both the database and packages */
+/* these pseudo-tags are used in the dbi interface */
+#define        RPMDBI_PACKAGES         0
+#define        RPMDBI_DEPENDS          1
+#define        RPMDBI_LABEL            2       /* XXX remove rpmdbFindByLabel from API */
+
+/* these tags are found in package headers */
 /* none of these can be 0 !!                         */
 
 #define        RPMTAG_NAME                     1000
@@ -381,6 +386,7 @@ void rpmdbClose ( /*@only@*/ rpmdb db);
  */
 int rpmdbOpenForTraversal(const char * prefix, /*@out@*/ rpmdb * dbp);
 
+#ifdef DYING
 /**
  * @param db           rpm database
  */
@@ -398,6 +404,7 @@ int rpmdbFindPackage(rpmdb db, const char * name,
  */
 int rpmdbFindByLabel(rpmdb db, const char * label,
        /*@out@*/ dbiIndexSet * matches);
+#endif
 
 /**
  * Return number of instances of package in rpm database.
@@ -412,32 +419,65 @@ int rpmdbCountPackages(rpmdb db, const char *name);
 typedef /*@abstract@*/ struct _rpmdbMatchIterator * rpmdbMatchIterator;
 
 /**
+ * Destroy rpm database iterator.
+ * @param mi           rpm database iterator
  */
 void rpmdbFreeIterator( /*@only@*/ rpmdbMatchIterator mi);
 
 /**
+ * Return join key for current position of rpm database iterator.
+ * @param mi           rpm database iterator
+ * @return             current join key
  */
 unsigned int rpmdbGetIteratorOffset(rpmdbMatchIterator mi);
 
 /**
+ * Return number of elements in rpm database iterator.
+ * @param mi           rpm database iterator
+ * @return             number of elements
  */
 int rpmdbGetIteratorCount(rpmdbMatchIterator mi);
 
 /**
+ * Modify iterator to append given set of package instances.
+ *  TODO: replace with a more general mechanism.
+ * @param mi           rpm database iterator
+ * @param offsets      array of package instances to match.
+ * @param numOffsets   number of elements in array
+ */
+void rpmdbAppendIteratorMatches(rpmdbMatchIterator mi, int * offsets,
+       int numOffsets);
+
+/**
+ * Modify iterator to filter out headers that do not match version.
+ *  TODO: replace with a more general mechanism.
+ * @param mi           rpm database iterator
  */
 void rpmdbSetIteratorVersion(rpmdbMatchIterator mi, const char * version);
 
 /**
+ * Modify iterator to filter out headers that do not match release.
+ *  TODO: replace with a more general mechanism.
+ * @param mi           rpm database iterator
  */
 void rpmdbSetIteratorRelease(rpmdbMatchIterator mi, const char * release);
 
 /**
+ * Return next package header from iteration.
+ * @param mi           rpm database iterator
+ * @return             NULL on end of iteration.
  */
 Header rpmdbNextIterator(rpmdbMatchIterator mi);
 
 /**
+ * Return database iterator.
+ * @param rpmdb                rpm database
+ * @param rpmtag       rpm tag
+ * @param keyp         key data (NULL for sequential acess)
+ * @param keylen       key data length (0 will use strlen(keyp))
+ * @return             NULL on failure
  */
-/*@only@*/ /*@null@*/ rpmdbMatchIterator rpmdbInitIterator(rpmdb db, int dbix,
+/*@only@*/ /*@null@*/ rpmdbMatchIterator rpmdbInitIterator(rpmdb rpmdb, int rpmtag,
                        const void * key, size_t keylen);
 
 /* we pass these around as an array with a sentinel */
@@ -786,10 +826,12 @@ typedef   struct rpmQVArguments QVA_t;
 typedef        int (*QVF_t) (QVA_t *qva, rpmdb db, Header h);
 
 /**
- * @param db           rpm database
  */
-int XshowMatches(QVA_t *qva, /*@only@*/ rpmdbMatchIterator mi, QVF_t showPackage);
+#ifdef DYING
 int showMatches(QVA_t *qva, rpmdb db, dbiIndexSet matches, QVF_t showPackage);
+#else
+int showMatches(QVA_t *qva, /*@only@*/ rpmdbMatchIterator mi, QVF_t showPackage);
+#endif
 
 #define QUERY_FOR_LIST         (1 << 1)
 #define QUERY_FOR_STATE                (1 << 2)
index 491676e..d297ade 100644 (file)
@@ -9,11 +9,11 @@ const char *const tagName(int tag)
     char *s;
 
     switch (tag) {
-    case 0:
+    case RPMDBI_PACKAGES:
        strcpy(nameBuf, "Packages");
        return nameBuf;
        /*@notreached@*/ break;
-    case 1:
+    case RPMDBI_DEPENDS:
        strcpy(nameBuf, "Depends");
        return nameBuf;
        /*@notreached@*/ break;
@@ -36,9 +36,9 @@ int tagValue(const char * tagstr)
     const struct headerTagTableEntry *t;
 
     if (!strcmp(tagstr, "Packages"))
-       return 0;
+       return RPMDBI_PACKAGES;
     if (!strcmp(tagstr, "Depends"))
-       return 1;
+       return RPMDBI_DEPENDS;
 
     for (t = rpmTagTable; t->name != NULL; t++) {
        if (!strcasecmp(t->name + 7, tagstr))
index 9f6da36..e0ae617 100644 (file)
@@ -756,9 +756,20 @@ static int handleInstInstalledFiles(TFI_t * fi, rpmdb db,
     uint_16 * otherModes;
     int numReplaced = 0;
 
+#ifdef DYING
     h = rpmdbGetRecord(db, shared->otherPkg);
     if (h == NULL)
        return 1;
+#else
+    rpmdbMatchIterator mi;
+
+    mi = rpmdbInitIterator(db, RPMDBI_PACKAGES, &shared->otherPkg, sizeof(shared->otherPkg));
+    h = rpmdbNextIterator(mi);
+    if (h == NULL) {
+       rpmdbFreeIterator(mi);
+       return 1;
+    }
+#endif
 
     headerGetEntryMinMemory(h, RPMTAG_FILEMD5S, NULL,
                            (void **) &otherMd5s, NULL);
@@ -820,7 +831,11 @@ static int handleInstInstalledFiles(TFI_t * fi, rpmdb db,
 
     free(otherMd5s);
     free(otherLinks);
+#ifdef DYING
     headerFree(h);
+#else
+    rpmdbFreeIterator(mi);
+#endif
 
     fi->replaced = xrealloc(fi->replaced,      /* XXX memory leak */
                           sizeof(*fi->replaced) * (numReplaced + 1));
@@ -837,9 +852,20 @@ static int handleRmvdInstalledFiles(TFI_t * fi, rpmdb db,
     const char * otherStates;
     int i;
    
+#ifdef DYING
     h = rpmdbGetRecord(db, shared->otherPkg);
     if (h == NULL)
        return 1;
+#else
+    rpmdbMatchIterator mi;
+
+    mi = rpmdbInitIterator(db, RPMDBI_PACKAGES, &shared->otherPkg, sizeof(shared->otherPkg));
+    h = rpmdbNextIterator(mi);
+    if (h == NULL) {
+       rpmdbFreeIterator(mi);
+       return 1;
+    }
+#endif
 
     headerGetEntryMinMemory(h, RPMTAG_FILESTATES, NULL,
                            (void **) &otherStates, NULL);
@@ -855,7 +881,11 @@ static int handleRmvdInstalledFiles(TFI_t * fi, rpmdb db,
        fi->actions[fileNum] = FA_SKIP;
     }
 
+#ifdef DYING
     headerFree(h);
+#else
+    rpmdbFreeIterator(mi);
+#endif
 
     return 0;
 }
@@ -1183,7 +1213,7 @@ int rpmRunTransactions(rpmTransactionSet ts, rpmCallbackFunction notify,
     int rc, ourrc = 0;
     struct availablePackage * alp;
     rpmProblemSet probs;
-#ifndef DYING
+#ifdef DYING
     dbiIndexSet dbi = NULL;
 #endif
     Header * hdrs;
@@ -1284,7 +1314,7 @@ int rpmRunTransactions(rpmTransactionSet ts, rpmCallbackFunction notify,
            rpmdbFreeIterator(mi);
        }
 
-#ifndef        DYING
+#ifdef DYING
        rc = findMatches(ts->db, alp->name, alp->version, alp->release, &dbi);
        switch (rc) {
        case 2:
@@ -1308,26 +1338,49 @@ int rpmRunTransactions(rpmTransactionSet ts, rpmCallbackFunction notify,
        }
 #else
        if (!(ignoreSet & RPMPROB_FILTER_REPLACEPKG)) {
+           rpmdbMatchIterator mi;
+           mi = rpmdbInitIterator(ts->db, RPMTAG_NAME, alp->name, 0);
+           rpmdbSetIteratorVersion(mi, alp->version);
+           rpmdbSetIteratorRelease(mi, alp->release);
+           while (rpmdbNextIterator(mi) != NULL) {
+               psAppend(probs, RPMPROB_PKG_INSTALLED, alp->key, alp->h, NULL,
+                        NULL, 0);
+               break;
+           }
+           rpmdbFreeIterator(mi);
        }
 #endif
 
-       if (headerGetEntry(alp->h, RPMTAG_BASENAMES, NULL, NULL, 
-                          &fileCount))
+       if (headerGetEntry(alp->h, RPMTAG_BASENAMES, NULL, NULL, &fileCount))
            totalFileCount += fileCount;
     }
 
     /* FIXME: it seems a bit silly to read in all of these headers twice */
     /* The ordering doesn't matter here */
+#ifdef DYING
     for (i = 0; i < ts->numRemovedPackages; i++) {
        Header h;
 
        if ((h = rpmdbGetRecord(ts->db, ts->removedPackages[i]))) {
-           if (headerGetEntry(h, RPMTAG_BASENAMES, NULL, NULL,
-                              &fileCount))
+           if (headerGetEntry(h, RPMTAG_BASENAMES, NULL, NULL, &fileCount))
                totalFileCount += fileCount;
            headerFree(h);
        }
     }
+#else
+    {  rpmdbMatchIterator mi;
+       Header h;
+
+       mi = rpmdbInitIterator(ts->db, RPMDBI_PACKAGES, NULL, 0);
+       rpmdbAppendIteratorMatches(mi,
+               ts->removedPackages, ts->numRemovedPackages);
+       while ((h = rpmdbNextIterator(mi)) != NULL) {
+           if (headerGetEntry(h, RPMTAG_BASENAMES, NULL, NULL, &fileCount))
+               totalFileCount += fileCount;
+       }
+       rpmdbFreeIterator(mi);
+    }
+#endif
 
     /* ===============================================
      * Initialize file list:
@@ -1363,7 +1416,17 @@ int rpmRunTransactions(rpmTransactionSet ts, rpmCallbackFunction notify,
            break;
        case TR_REMOVED:
            fi->record = ts->order[oc].u.removed.dboffset;
+#ifdef DYING
            fi->h = rpmdbGetRecord(ts->db, fi->record);
+#else
+           {   rpmdbMatchIterator mi;
+
+               mi = rpmdbInitIterator(ts->db, RPMDBI_PACKAGES, &fi->record, sizeof(fi->record));
+               if ((fi->h = rpmdbNextIterator(mi)) != NULL)
+                   fi->h = headerLink(fi->h);
+               rpmdbFreeIterator(mi);
+           }
+#endif
            if (fi->h == NULL) {
                /* ACK! */
                continue;
index c791d56..63d8fd9 100644 (file)
@@ -72,7 +72,8 @@ static int removeFile(const char * file, unsigned int flags, short mode,
 int removeBinaryPackage(const char * prefix, rpmdb db, unsigned int offset, 
                        int flags, enum fileActions * actions, FD_t scriptFd)
 {
-    Header h = NULL;
+    rpmdbMatchIterator mi = NULL;
+    Header h;
     int i;
     int fileCount;
     const char * name, * version, * release;
@@ -84,10 +85,11 @@ int removeBinaryPackage(const char * prefix, rpmdb db, unsigned int offset,
     if (flags & RPMTRANS_FLAG_JUSTDB)
        flags |= RPMTRANS_FLAG_NOSCRIPTS;
 
-    h = rpmdbGetRecord(db, offset);
+    mi = rpmdbInitIterator(db, RPMDBI_PACKAGES, &offset, sizeof(offset));
+    h = rpmdbNextIterator(mi);
     if (h == NULL) {
-       rpmError(RPMERR_DBCORRUPT, _("cannot read header at %d for uninstall"),
-             offset);
+       rpmError(RPMERR_DBCORRUPT, _("%s: cannot read header at 0x%x"),
+               "findMatches", offset);
        rc = 1;
        goto exit;
     }
@@ -221,8 +223,8 @@ int removeBinaryPackage(const char * prefix, rpmdb db, unsigned int offset,
     rc = 0;
 
  exit:
-    if (h)
-       headerFree(h);
+    if (mi)
+       rpmdbFreeIterator(mi);
     return rc;
 }
 
index 2760a54..04902e6 100644 (file)
@@ -6,7 +6,7 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
-"POT-Creation-Date: 2000-04-26 09:48-0400\n"
+"POT-Creation-Date: 2000-04-26 20:08-0400\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -2071,36 +2071,31 @@ msgstr ""
 msgid "loop in prerequisite chain: %s"
 msgstr ""
 
-#: lib/depends.c:1444
-#, c-format
-msgid "cannot read header at %d for dependency check"
-msgstr ""
-
-#: lib/db0.c:393
+#: lib/db0.c:394
 #, c-format
 msgid "bad db file %s"
 msgstr ""
 
-#: lib/db0.c:402
+#: lib/db0.c:403
 #, c-format
 msgid "opening database mode 0x%x in %s\n"
 msgstr ""
 
-#: lib/db0.c:407 lib/url.c:445
+#: lib/db0.c:408 lib/url.c:445
 #, c-format
 msgid "failed to open %s: %s\n"
 msgstr ""
 
-#: lib/db0.c:419
+#: lib/db0.c:420
 #, c-format
 msgid "cannot get %s lock on database"
 msgstr ""
 
-#: lib/db0.c:420
+#: lib/db0.c:421
 msgid "exclusive"
 msgstr ""
 
-#: lib/db0.c:420
+#: lib/db0.c:421
 msgid "shared"
 msgstr ""
 
@@ -2264,7 +2259,7 @@ msgstr ""
 msgid "(unknown type)"
 msgstr ""
 
-#: lib/install.c:146 lib/uninstall.c:184
+#: lib/install.c:146 lib/uninstall.c:186
 #, c-format
 msgid "   file: %s action: %s\n"
 msgstr ""
@@ -2285,86 +2280,86 @@ msgstr ""
 
 #. this would probably be a good place to check if disk space
 #. was used up - if so, we should return a different error
-#: lib/install.c:371
+#: lib/install.c:376
 #, c-format
 msgid "unpacking of archive failed%s%s: %s"
 msgstr ""
 
-#: lib/install.c:372
+#: lib/install.c:377
 msgid " on file "
 msgstr ""
 
-#: lib/install.c:416
+#: lib/install.c:421
 msgid "installing a source package\n"
 msgstr ""
 
-#: lib/install.c:436
+#: lib/install.c:441
 #, c-format
 msgid "cannot create sourcedir %s"
 msgstr ""
 
-#: lib/install.c:442 lib/install.c:472
+#: lib/install.c:447 lib/install.c:477
 #, c-format
 msgid "cannot write to %s"
 msgstr ""
 
-#: lib/install.c:446
+#: lib/install.c:451
 #, c-format
 msgid "sources in: %s\n"
 msgstr ""
 
-#: lib/install.c:466
+#: lib/install.c:471
 #, c-format
 msgid "cannot create specdir %s"
 msgstr ""
 
-#: lib/install.c:476
+#: lib/install.c:481
 #, c-format
 msgid "spec file in: %s\n"
 msgstr ""
 
-#: lib/install.c:510 lib/install.c:538
+#: lib/install.c:515 lib/install.c:543
 msgid "source package contains no .spec file"
 msgstr ""
 
-#: lib/install.c:560
+#: lib/install.c:565
 #, c-format
 msgid "renaming %s to %s\n"
 msgstr ""
 
-#: lib/install.c:562 lib/install.c:838 lib/uninstall.c:29
+#: lib/install.c:567 lib/install.c:843 lib/uninstall.c:29
 #, c-format
 msgid "rename of %s to %s failed: %s"
 msgstr ""
 
-#: lib/install.c:653
+#: lib/install.c:658
 msgid "source package expected, binary found"
 msgstr ""
 
-#: lib/install.c:710
+#: lib/install.c:715
 #, c-format
 msgid "package: %s-%s-%s files test = %d\n"
 msgstr ""
 
-#: lib/install.c:768
+#: lib/install.c:773
 msgid "stopping install as we're running --test\n"
 msgstr ""
 
-#: lib/install.c:773
+#: lib/install.c:778
 msgid "running preinstall script (if any)\n"
 msgstr ""
 
-#: lib/install.c:798
+#: lib/install.c:803
 #, c-format
 msgid "warning: %s created as %s"
 msgstr ""
 
-#: lib/install.c:834
+#: lib/install.c:839
 #, c-format
 msgid "warning: %s saved as %s"
 msgstr ""
 
-#: lib/install.c:908
+#: lib/install.c:913
 msgid "running postinstall scripts (if any)\n"
 msgstr ""
 
@@ -2597,155 +2592,155 @@ msgstr ""
 msgid "can't query %s: %s\n"
 msgstr ""
 
-#: lib/query.c:446 lib/query.c:669
+#: lib/query.c:447 lib/query.c:673
 #, c-format
 msgid "package record number: %u\n"
 msgstr ""
 
-#: lib/query.c:450
+#: lib/query.c:451
 msgid "error: could not read database record\n"
 msgstr ""
 
 #. XXX Fstrerror
-#: lib/query.c:494
+#: lib/query.c:498
 #, c-format
 msgid "open of %s failed: %s\n"
 msgstr ""
 
-#: lib/query.c:512
+#: lib/query.c:516
 msgid "old format source packages cannot be queried\n"
 msgstr ""
 
-#: lib/query.c:521 lib/rpminstall.c:231
+#: lib/query.c:525 lib/rpminstall.c:231
 #, c-format
 msgid "%s does not appear to be a RPM package\n"
 msgstr ""
 
-#: lib/query.c:525
+#: lib/query.c:529
 #, c-format
 msgid "query of %s failed\n"
 msgstr ""
 
-#: lib/query.c:558
+#: lib/query.c:562
 #, c-format
 msgid "query of specfile %s failed, can't parse\n"
 msgstr ""
 
-#: lib/query.c:581
+#: lib/query.c:585
 msgid "no packages\n"
 msgstr ""
 
-#: lib/query.c:591
+#: lib/query.c:595
 #, c-format
 msgid "group %s does not contain any packages\n"
 msgstr ""
 
-#: lib/query.c:601
+#: lib/query.c:605
 #, c-format
 msgid "no package triggers %s\n"
 msgstr ""
 
-#: lib/query.c:611
+#: lib/query.c:615
 #, c-format
 msgid "no package requires %s\n"
 msgstr ""
 
-#: lib/query.c:622
+#: lib/query.c:626
 #, c-format
 msgid "no package provides %s\n"
 msgstr ""
 
-#: lib/query.c:638
+#: lib/query.c:642
 #, c-format
 msgid "file %s: %s\n"
 msgstr ""
 
-#: lib/query.c:641
+#: lib/query.c:645
 #, c-format
 msgid "file %s is not owned by any package\n"
 msgstr ""
 
-#: lib/query.c:666
+#: lib/query.c:670
 #, c-format
 msgid "invalid package number: %s\n"
 msgstr ""
 
-#: lib/query.c:673
+#: lib/query.c:677
 #, c-format
 msgid "record %d could not be read\n"
 msgstr ""
 
-#: lib/query.c:684 lib/rpminstall.c:436
+#: lib/query.c:689 lib/query.c:700 lib/rpminstall.c:439 lib/rpminstall.c:478
 #, c-format
 msgid "package %s is not installed\n"
 msgstr ""
 
-#: lib/query.c:687
+#: lib/query.c:692
 #, c-format
 msgid "error looking for package %s\n"
 msgstr ""
 
-#: lib/query.c:712
+#: lib/query.c:729
 msgid "rpmQuery: rpmdbOpen() failed\n"
 msgstr ""
 
-#: lib/query.c:771
+#: lib/query.c:788
 msgid "query package owning file"
 msgstr ""
 
-#: lib/query.c:773
+#: lib/query.c:790
 msgid "query packages in group"
 msgstr ""
 
-#: lib/query.c:775
+#: lib/query.c:792
 msgid "query a package file"
 msgstr ""
 
-#: lib/query.c:779
+#: lib/query.c:796
 msgid "query a spec file"
 msgstr ""
 
-#: lib/query.c:781
+#: lib/query.c:798
 msgid "query the pacakges triggered by the package"
 msgstr ""
 
-#: lib/query.c:783
+#: lib/query.c:800
 msgid "query the packages which require a capability"
 msgstr ""
 
-#: lib/query.c:785
+#: lib/query.c:802
 msgid "query the packages which provide a capability"
 msgstr ""
 
-#: lib/query.c:824
+#: lib/query.c:841
 msgid "list all configuration files"
 msgstr ""
 
-#: lib/query.c:826
+#: lib/query.c:843
 msgid "list all documentation files"
 msgstr ""
 
-#: lib/query.c:828
+#: lib/query.c:845
 msgid "dump basic file information"
 msgstr ""
 
-#: lib/query.c:830
+#: lib/query.c:847
 msgid "list files in package"
 msgstr ""
 
-#: lib/query.c:834
+#: lib/query.c:851
 msgid "use the following query format"
 msgstr ""
 
-#: lib/query.c:836
+#: lib/query.c:853
 msgid "substitute i18n sections into spec file"
 msgstr ""
 
-#: lib/query.c:838
+#: lib/query.c:855
 msgid "display the states of the listed files"
 msgstr ""
 
-#: lib/query.c:840
+#: lib/query.c:857
 msgid "display a verbose file listing"
 msgstr ""
 
@@ -2865,140 +2860,135 @@ msgstr ""
 msgid "error removing record %s from %s"
 msgstr ""
 
-#: lib/rpmdb.c:590 lib/rpmdb.c:1897
+#: lib/rpmdb.c:586 lib/rpmdb.c:1938
 msgid "no dbpath has been set"
 msgstr ""
 
-#: lib/rpmdb.c:668
+#: lib/rpmdb.c:664
 msgid ""
 "old format database is present; use --rebuilddb to generate a new format "
 "database"
 msgstr ""
 
 #. error
-#: lib/rpmdb.c:853
+#: lib/rpmdb.c:863
 #, c-format
 msgid "cannot retrieve package \"%s\" from db"
 msgstr ""
 
-#: lib/rpmdb.c:1178
+#: lib/rpmdb.c:929 lib/rpmdb.c:1380 lib/uninstall.c:91
 #, c-format
-msgid "key \"%s\" not found in %s"
+msgid "%s: cannot read header at 0x%x"
 msgstr ""
 
-#: lib/rpmdb.c:1186
+#: lib/rpmdb.c:1336
 #, c-format
-msgid "key \"%s\" not removed from %s"
+msgid "key \"%s\" not found in %s"
 msgstr ""
 
-#: lib/rpmdb.c:1212
+#: lib/rpmdb.c:1344
 #, c-format
-msgid "rpmdbRemove: cannot read header at 0x%x"
+msgid "key \"%s\" not removed from %s"
 msgstr ""
 
-#: lib/rpmdb.c:1246
+#: lib/rpmdb.c:1414
 #, c-format
 msgid "removing 0 %s entries.\n"
 msgstr ""
 
-#: lib/rpmdb.c:1253
+#: lib/rpmdb.c:1421
 #, c-format
 msgid "removing \"%s\" from %s index.\n"
 msgstr ""
 
-#: lib/rpmdb.c:1261
+#: lib/rpmdb.c:1429
 #, c-format
 msgid "removing %d entries in %s index:\n"
 msgstr ""
 
-#: lib/rpmdb.c:1265
+#: lib/rpmdb.c:1433
 #, c-format
 msgid "\t%6d %s\n"
 msgstr ""
 
-#: lib/rpmdb.c:1412
+#: lib/rpmdb.c:1580
 msgid "cannot allocate new instance in database"
 msgstr ""
 
-#: lib/rpmdb.c:1461
+#: lib/rpmdb.c:1629
 #, c-format
 msgid "adding 0 %s entries.\n"
 msgstr ""
 
-#: lib/rpmdb.c:1474
+#: lib/rpmdb.c:1642
 #, c-format
 msgid "adding \"%s\" to %s index.\n"
 msgstr ""
 
-#: lib/rpmdb.c:1481
+#: lib/rpmdb.c:1649
 #, c-format
 msgid "adding %d entries to %s index:\n"
 msgstr ""
 
-#: lib/rpmdb.c:1485
+#: lib/rpmdb.c:1653
 #, c-format
 msgid "%6d %s\n"
 msgstr ""
 
-#: lib/rpmdb.c:1803
-#, c-format
-msgid "cannot read header at %d for lookup"
-msgstr ""
-
-#: lib/rpmdb.c:1922
+#: lib/rpmdb.c:1963
 #, c-format
 msgid "rebuilding database %s into %s\n"
 msgstr ""
 
-#: lib/rpmdb.c:1926
+#: lib/rpmdb.c:1967
 #, c-format
 msgid "temporary database %s already exists"
 msgstr ""
 
-#: lib/rpmdb.c:1932
+#: lib/rpmdb.c:1973
 #, c-format
 msgid "creating directory: %s\n"
 msgstr ""
 
-#: lib/rpmdb.c:1934
+#: lib/rpmdb.c:1975
 #, c-format
 msgid "error creating directory %s: %s"
 msgstr ""
 
-#: lib/rpmdb.c:1941
+#: lib/rpmdb.c:1982
 #, c-format
 msgid "opening old database with dbi_major %d\n"
 msgstr ""
 
-#: lib/rpmdb.c:1950
+#: lib/rpmdb.c:1991
 #, c-format
 msgid "opening new database with dbi_major %d\n"
 msgstr ""
 
-#: lib/rpmdb.c:1972
+#: lib/rpmdb.c:2013
 #, c-format
 msgid "record number %d in database is bad -- skipping."
 msgstr ""
 
-#: lib/rpmdb.c:2004
+#: lib/rpmdb.c:2045
 #, c-format
 msgid "cannot add record originally at %d"
 msgstr ""
 
-#: lib/rpmdb.c:2022
+#: lib/rpmdb.c:2063
 msgid "failed to rebuild database; original database remains in place\n"
 msgstr ""
 
-#: lib/rpmdb.c:2030
+#: lib/rpmdb.c:2071
 msgid "failed to replace old database with new database!\n"
 msgstr ""
 
-#: lib/rpmdb.c:2032
+#: lib/rpmdb.c:2073
 #, c-format
 msgid "replace files in %s with files from %s to recover"
 msgstr ""
 
-#: lib/rpmdb.c:2038
+#: lib/rpmdb.c:2079
 #, c-format
 msgid "failed to remove directory %s: %s\n"
 msgstr ""
@@ -3048,7 +3038,7 @@ msgstr ""
 msgid "cannot open file %s: %s\n"
 msgstr ""
 
-#: lib/rpminstall.c:235 lib/rpminstall.c:516
+#: lib/rpminstall.c:235 lib/rpminstall.c:543
 #, c-format
 msgid "%s cannot be installed\n"
 msgstr ""
@@ -3081,26 +3071,26 @@ msgstr ""
 msgid "installing binary packages\n"
 msgstr ""
 
-#: lib/rpminstall.c:440
+#: lib/rpminstall.c:443
 #, c-format
 msgid "searching for package %s\n"
 msgstr ""
 
-#: lib/rpminstall.c:449
+#: lib/rpminstall.c:452 lib/rpminstall.c:481
 #, c-format
 msgid "\"%s\" specifies multiple packages\n"
 msgstr ""
 
-#: lib/rpminstall.c:478
+#: lib/rpminstall.c:505
 msgid "removing these packages would break dependencies:\n"
 msgstr ""
 
-#: lib/rpminstall.c:505
+#: lib/rpminstall.c:532
 #, c-format
 msgid "cannot open %s: %s\n"
 msgstr ""
 
-#: lib/rpminstall.c:511
+#: lib/rpminstall.c:538
 #, c-format
 msgid "Installing %s\n"
 msgstr ""
@@ -3434,25 +3424,20 @@ msgstr ""
 msgid "removal of %s failed: %s"
 msgstr ""
 
-#: lib/uninstall.c:89
-#, c-format
-msgid "cannot read header at %d for uninstall"
-msgstr ""
-
-#: lib/uninstall.c:130
+#: lib/uninstall.c:132
 #, c-format
 msgid "will remove files test = %d\n"
 msgstr ""
 
-#: lib/uninstall.c:198
+#: lib/uninstall.c:200
 msgid "running postuninstall script (if any)\n"
 msgstr ""
 
-#: lib/uninstall.c:212
+#: lib/uninstall.c:214
 msgid "removing database entry\n"
 msgstr ""
 
-#: lib/uninstall.c:396
+#: lib/uninstall.c:398
 msgid "execution of script failed"
 msgstr ""
 
index 302dbe7..1511ae9 100644 (file)
@@ -966,7 +966,7 @@ rpmdbLength(rpmdbObject * s) {
     {  rpmdbMatchIterator mi;
 
        /* RPMDBI_PACKAGES */
-       mi = rpmdbInitIterator(s->db, 0, NULL, 0);
+       mi = rpmdbInitIterator(s->db, RPMDBI_PACKAGES, NULL, 0);
        /* XXX FIXME: unnecessary header mallocs are side effect here */
        while (rpmdbNextIterator(mi) != NULL)
            count++;
@@ -991,7 +991,16 @@ rpmdbSubscript(rpmdbObject * s, PyObject * key) {
 
     h = PyObject_NEW(hdrObject, &hdrType);
     h->h = NULL;
+#ifdef DYING
     h->h = rpmdbGetRecord(s->db, offset);
+#else
+    {  rpmdbMatchIterator mi;
+       mi = rpmdbInitIterator(s->db, RPMDBI_PACKAGES, &offset, sizeof(offset));
+       if ((h->h = rpmdbNextIterator(mi)) != NULL)
+           h->h = headerLink(h->h);
+       rpmdbFreeIterator(mi);
+    }
+#endif
     h->fileList = h->linkList = h->md5list = NULL;
     h->uids = h->gids = h->mtimes = h->fileSizes = NULL;
     h->modes = h->rdevs = NULL;
index 4c20425..1ce68e4 100644 (file)
@@ -122,8 +122,7 @@ static void addLostFiles(rpmdb db, struct pkgSet *psp, struct hash_table *ht)
 #else
     rpmdbMatchIterator mi;
 
-    /* RPMDBI_PACKAGES */
-    mi = rpmdbInitIterator(db, 0, NULL, 0);
+    mi = rpmdbInitIterator(db, RPMDBI_PACKAGES, NULL, 0);
     while ((h = rpmdbNextIterator(mi)) != NULL) {
 #endif
 
index 27b31da..55c843e 100644 (file)
@@ -27,8 +27,7 @@ int main(int argc, char ** argv)
        rpmdbMatchIterator mi;
 #define        _RECNUM rpmdbGetIteratorOffset(mi)
 
-       /* RPMDBI_PACKAGES */
-       mi = rpmdbInitIterator(db, 0, NULL, 0);
+       mi = rpmdbInitIterator(db, RPMDBI_PACKAGES, NULL, 0);
 
        while ((h = rpmdbNextIterator(mi)) != NULL) {