Retrieve header from rpmdb on rpmteOpen() if possible, even for TR_ADDED
authorPanu Matilainen <pmatilai@redhat.com>
Mon, 1 Dec 2008 11:03:05 +0000 (13:03 +0200)
committerPanu Matilainen <pmatilai@redhat.com>
Mon, 1 Dec 2008 11:03:05 +0000 (13:03 +0200)
- as rpmte now knows if it was already installed and the exact rpmdb
  record, we can avoid having to re-re-re-open the package in %posttrans,
  this means yum & the like can throw away package immediately after
  it was processed (rhbz#457126)
- rearrange rpmteOpen() code a bit, split the actual header retrievals
  from fd/rpmdb to separate static helper functions

lib/rpmte.c

index dda5bf5..2f50ff7 100644 (file)
@@ -615,46 +615,59 @@ rpmte rpmtsiNext(rpmtsi tsi, rpmElementType type)
     return te;
 }
 
+static Header rpmteDBHeader(rpmts ts, unsigned int rec)
+{
+    Header h = NULL;
+    rpmdbMatchIterator mi;
+
+    mi = rpmtsInitIterator(ts, RPMDBI_PACKAGES, &rec, sizeof(rec));
+    /* iterator returns weak refs, grab hold of header */
+    if ((h = rpmdbNextIterator(mi)))
+       h = headerLink(h);
+    mi = rpmdbFreeIterator(mi);
+    return h;
+}
+
+static Header rpmteFDHeader(rpmts ts, rpmte te)
+{
+    Header h = NULL;
+    te->fd = rpmtsNotify(ts, te, RPMCALLBACK_INST_OPEN_FILE, 0, 0);
+    if (te->fd != NULL) {
+       rpmVSFlags ovsflags;
+       rpmRC pkgrc;
+
+       ovsflags = rpmtsSetVSFlags(ts, rpmtsVSFlags(ts) | RPMVSF_NEEDPAYLOAD);
+       pkgrc = rpmReadPackageFile(ts, rpmteFd(te), rpmteNEVRA(te), &h);
+       rpmtsSetVSFlags(ts, ovsflags);
+       switch (pkgrc) {
+       default:
+           rpmteClose(te, ts);
+           break;
+       case RPMRC_NOTTRUSTED:
+       case RPMRC_NOKEY:
+       case RPMRC_OK:
+           break;
+       }
+    }
+    return h;
+}
+
 int rpmteOpen(rpmte te, rpmts ts)
 {
     Header h = NULL;
+    unsigned int instance;
     if (te == NULL || ts == NULL)
        goto exit;
 
+    instance = rpmteDBInstance(te);
     rpmteSetHeader(te, NULL);
-    switch (te->type) {
+
+    switch (rpmteType(te)) {
     case TR_ADDED:
-       te->h = NULL;
-       te->fd = rpmtsNotify(ts, te, RPMCALLBACK_INST_OPEN_FILE, 0, 0);
-       if (te->fd != NULL) {
-           rpmVSFlags ovsflags;
-           rpmRC pkgrc;
-
-           ovsflags = rpmtsSetVSFlags(ts, rpmtsVSFlags(ts) | RPMVSF_NEEDPAYLOAD);
-           pkgrc = rpmReadPackageFile(ts, rpmteFd(te), rpmteNEVRA(te), &h);
-           rpmtsSetVSFlags(ts, ovsflags);
-           switch (pkgrc) {
-           default:
-               rpmteClose(te, ts);
-               break;
-           case RPMRC_NOTTRUSTED:
-           case RPMRC_NOKEY:
-           case RPMRC_OK:
-               break;
-           }
-       }
+       h = instance ? rpmteDBHeader(ts, instance) : rpmteFDHeader(ts, te);
        break;
-    case TR_REMOVED: {
-       unsigned int rec = rpmteDBInstance(te);
-       rpmdbMatchIterator mi;
-
-       /* eventually we'll want notifications for erase open too */
-       mi = rpmtsInitIterator(ts, RPMDBI_PACKAGES, &rec, sizeof(rec));
-       /* iterator returns weak refs, grab hold of header */
-       if ((h = rpmdbNextIterator(mi)))
-           h = headerLink(h);
-       mi = rpmdbFreeIterator(mi);
-       }
+    case TR_REMOVED:
+       h = rpmteDBHeader(ts, instance);
        break;
     }
     if (h != NULL) {
@@ -673,8 +686,10 @@ int rpmteClose(rpmte te, rpmts ts)
 
     switch (te->type) {
     case TR_ADDED:
-       rpmtsNotify(ts, te, RPMCALLBACK_INST_CLOSE_FILE, 0, 0);
-       te->fd = NULL;
+       if (te->fd) {
+           rpmtsNotify(ts, te, RPMCALLBACK_INST_CLOSE_FILE, 0, 0);
+           te->fd = NULL;
+       }
        break;
     case TR_REMOVED:
        /* eventually we'll want notifications for erase open too */