From 7ea78b4927bdf86bc09f2dee025cb43c44609099 Mon Sep 17 00:00:00 2001 From: Panu Matilainen Date: Mon, 1 Dec 2008 13:03:05 +0200 Subject: [PATCH] Retrieve header from rpmdb on rpmteOpen() if possible, even for TR_ADDED - 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 | 81 ++++++++++++++++++++++++++++++++++++------------------------- 1 file changed, 48 insertions(+), 33 deletions(-) diff --git a/lib/rpmte.c b/lib/rpmte.c index dda5bf5..2f50ff7 100644 --- a/lib/rpmte.c +++ b/lib/rpmte.c @@ -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 */ -- 2.7.4