RPM Community Forums

Mailing List Message of <rpm-cvs>

[CVS] RPM: rpm/ CHANGES rpm/lib/ rpmts.c rpmts.h

From: Jeff Johnson <jbj@rpm5.org>
Date: Fri 13 Aug 2010 - 23:38:39 CEST
Message-Id: <20100813213839.4D0EAD1CCC@rpm5.org>
  RPM Package Manager, CVS Repository
  /cvs/
  ____________________________________________________________________________

  Server: rpm5.org                         Name:   Jeff Johnson
  Root:   /v/rpm/cvs                       Email:  jbj@rpm5.org
  Module: rpm                              Date:   13-Aug-2010 23:38:39
  Branch: HEAD                             Handle: 2010081321383800

  Modified files:
    rpm                     CHANGES
    rpm/lib                 rpmts.c rpmts.h

  Log:
    - solve: loop over solve db's in a bag.

  Summary:
    Revision    Changes     Path
    1.3414      +1  -0      rpm/CHANGES
    2.185       +128 -52    rpm/lib/rpmts.c
    2.133       +2  -2      rpm/lib/rpmts.h
  ____________________________________________________________________________

  patch -p0 <<'@@ .'
  Index: rpm/CHANGES
  ============================================================================
  $ cvs diff -u -r1.3413 -r1.3414 CHANGES
  --- rpm/CHANGES	13 Aug 2010 21:34:02 -0000	1.3413
  +++ rpm/CHANGES	13 Aug 2010 21:38:38 -0000	1.3414
  @@ -1,4 +1,5 @@
   5.3.2 -> 5.4a1:
  +    - jbj: solve: loop over solve db's in a bag.
       - jbj: solve: stub-in toy add/del methods.
       - jbj: solve: permit multiple solvedb's in a rpmbag.
       - jbj: solve: generalize %_dbpath to permit multiple rpmdb's.
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/lib/rpmts.c
  ============================================================================
  $ cvs diff -u -r2.184 -r2.185 rpmts.c
  --- rpm/lib/rpmts.c	13 Aug 2010 13:12:15 -0000	2.184
  +++ rpm/lib/rpmts.c	13 Aug 2010 21:38:38 -0000	2.185
  @@ -33,6 +33,7 @@
   #include "rpmte.h"
   
   #define	_RPMTS_INTERNAL
  +#define	_RPMBAG_INTERNAL
   #include "rpmts.h"
   
   #include <rpmcli.h>
  @@ -213,14 +214,30 @@
   
   int rpmtsCloseSDB(rpmts ts)
   {
  +    rpmbag bag = ts->bag;
       int rc = 0;
   
  -    if (ts->sdb != NULL) {
  -	(void) rpmswAdd(rpmtsOp(ts, RPMTS_OP_DBGET), &ts->sdb->db_getops);
  -	(void) rpmswAdd(rpmtsOp(ts, RPMTS_OP_DBPUT), &ts->sdb->db_putops);
  -	(void) rpmswAdd(rpmtsOp(ts, RPMTS_OP_DBDEL), &ts->sdb->db_delops);
  -	rc = rpmdbClose(ts->sdb);
  -	ts->sdb = NULL;
  +    if (bag != NULL) {
  +	rpmsdb * sdbp = bag->sdbp;
  +	int i = bag->nsdbp;
  +	if (sdbp)
  +	while (--i >= 0) {
  +	    rpmdb sdb;
  +	    if (sdbp[i] == NULL)
  +		continue;
  +	    sdb = sdbp[i]->_db;
  +	    if (sdb) {
  +		int xx;
  +		(void) rpmswAdd(rpmtsOp(ts, RPMTS_OP_DBGET), &sdb->db_getops);
  +		(void) rpmswAdd(rpmtsOp(ts, RPMTS_OP_DBPUT), &sdb->db_putops);
  +		(void) rpmswAdd(rpmtsOp(ts, RPMTS_OP_DBDEL), &sdb->db_delops);
  +		xx = rpmdbClose(sdb);
  +		if (xx && rc == 0)
  +		    rc = xx;
  +	    }
  +	    (void) rpmbagDel(bag, i);
  +	}
  +	ts->bag = rpmbagFree(ts->bag);
       }
       return rc;
   }
  @@ -228,9 +245,27 @@
   int rpmtsOpenSDB(rpmts ts, int dbmode)
   {
       static int has_sdbpath = -1;
  +    rpmbag bag = ts->bag;
  +    rpmsdb * sdbp = NULL;
  +    rpmdb sdb = NULL;
  +    int sdbmode = O_RDONLY;
  +    const char * s = NULL;
  +    ARGV_t av = NULL;
  +    int ac = 0;
       int rc = 0;
  +    int xx;
  +    int i;
  +
  +    if (bag == NULL) {
  +	bag = ts->bag = rpmbagNew(NULL, 0);
  +	if (bag == NULL)
  +	    goto exit;
  +    }
  +    sdbp = bag->sdbp;
  +    sdb = (sdbp[i] ? sdbp[i]->_db : NULL);
  +    sdbmode = (sdbp[i] ? sdbp[i]->dbmode : O_RDONLY);
   
  -    if (ts->sdb != NULL && ts->sdbmode == dbmode) {
  +    if (sdb != NULL && sdbmode == dbmode) {
   	rc = 0;
   	goto exit;
       }
  @@ -244,19 +279,42 @@
   	goto exit;
       }
   
  -    addMacro(NULL, "_dbpath", NULL, "%{_solve_dbpath}", RMIL_DEFAULT);
  +    s = rpmExpand("%{?_solve_dbpath}", NULL);
  +    xx = argvSplit(&av, s, ":");
  +    ac = argvCount(av);
  +
  +    for (i = 0; i < ac; i++) {
  +	const char * fn;
  +	urltype ut;
   
  -    rc = rpmdbOpen(ts->rootDir, &ts->sdb, ts->sdbmode, (mode_t)0644);
  -    if (rc) {
  -	const char * dn;
  -	dn = rpmGetPath(ts->rootDir, "%{_dbpath}", NULL);
  -	rpmlog(RPMLOG_WARNING,
  -			_("cannot open Solve database in %s\n"), dn);
  -	dn = _free(dn);
  -	/* XXX only try to open the solvedb once. */
  -	has_sdbpath = 0;
  +	if (av[i] == NULL || *av[i] == '\0')
  +	    continue;
  +
  +	fn = NULL;
  +	ut = urlPath(av[i], &fn);
  +
  +	/* XXX Lstat(fn, &sb) to ensure a directory? */
  +	addMacro(NULL, "_dbpath", NULL, fn, RMIL_DEFAULT);
  +	xx = rpmdbOpen(ts->rootDir, &sdb, dbmode, (mode_t)0644);
  +	delMacro(NULL, "_dbpath");
  +
  +	if (xx) {
  +	    const char * dn = rpmGetPath(ts->rootDir, fn, NULL);
  +	    rpmlog(RPMLOG_WARNING, _("cannot open Solve database in %s\n"), dn);
  +	    dn = _free(dn);
  +	    if (rc == 0)
  +		rc = xx;
  +
  +	    /* XXX only try to open the solvedb once. */
  +	    has_sdbpath = 0;
  +	    continue;
  +	}
  +
  +	xx = rpmbagAdd(bag, sdb, dbmode);
       }
  -    delMacro(NULL, "_dbpath");
  +
  +    av = argvFree(av);
  +    s = _free(s);
   
   exit:
   if (_rpmts_debug)
  @@ -281,6 +339,8 @@
   int rpmtsSolve(rpmts ts, rpmds ds, /*@unused@*/ const void * data)
   {
       HE_t he = memset(alloca(sizeof(*he)), 0, sizeof(*he));
  +    rpmbag bag = ts->bag;
  +    rpmsdb * sdbp = NULL;
       const char * errstr;
       const char * str = NULL;
       const char * qfmt;
  @@ -293,6 +353,7 @@
       const char * keyp;
       size_t keylen = 0;
       int rc = 1;		/* assume not found */
  +    int i = 0;
       int xx;
   
   if (_rpmts_debug)
  @@ -317,48 +378,64 @@
       if (keyp == NULL)
   	goto exit;
   
  -    if (ts->sdb == NULL) {
  -	xx = rpmtsOpenSDB(ts, ts->sdbmode);
  +    if (bag == NULL) {
  +	xx = rpmtsOpenSDB(ts, O_RDONLY);
   	if (xx)
   	    goto exit;
  +	bag = ts->bag;
  +	if (bag == NULL)
  +	    goto exit;
       }
   
  -    /* Look for a matching Provides: in suggested universe. */
  -    rpmtag = (*keyp == '/' ? RPMTAG_BASENAMES : RPMTAG_PROVIDENAME);
  -    mi = rpmmiInit(ts->sdb, rpmtag, keyp, keylen);
  -    while ((h = rpmmiNext(mi)) != NULL) {
  -	size_t hnamelen;
  -	time_t htime;
  +    sdbp = bag->sdbp;
   
  -	if (rpmtag == RPMTAG_PROVIDENAME && !rpmdsAnyMatchesDep(h, ds, 1))
  -	    continue;
  -
  -	he->tag = RPMTAG_NAME;
  -	xx = headerGet(h, he, 0);
  -	hnamelen = ((xx && he->p.str) ? strlen(he->p.str) : 0);
  -	he->p.ptr = _free(he->p.ptr);
  +    if (sdbp)
  +    for (i = 0; i < (int)bag->nsdbp; i++) {
  +	rpmdb sdb = NULL;
   
  -	/* XXX Prefer the shortest pkg N for basenames/provides resp. */
  -	if (bhnamelen > 0 && hnamelen > bhnamelen)
  +	if (sdbp[i] == NULL)
   	    continue;
  -
  -	/* XXX Prefer the newest build if given alternatives. */
  -	he->tag = RPMTAG_BUILDTIME;
  -	xx = headerGet(h, he, 0);
  -	htime = (xx && he->p.ui32p ? he->p.ui32p[0] : 0);
  -	he->p.ptr = _free(he->p.ptr);
  -
  -	if (htime <= bhtime)
  +	sdb = sdbp[i]->_db;
  +	if (sdb == NULL)
   	    continue;
   
  -	/* Save new "best" candidate. */
  -	(void)headerFree(bh);
  -	bh = NULL;
  -	bh = headerLink(h);
  -	bhtime = htime;
  -	bhnamelen = hnamelen;
  +	/* Look for a matching Provides: in suggested universe. */
  +	rpmtag = (*keyp == '/' ? RPMTAG_BASENAMES : RPMTAG_PROVIDENAME);
  +	mi = rpmmiInit(sdb, rpmtag, keyp, keylen);
  +	while ((h = rpmmiNext(mi)) != NULL) {
  +	    size_t hnamelen;
  +	    time_t htime;
  +
  +	    if (rpmtag == RPMTAG_PROVIDENAME && !rpmdsAnyMatchesDep(h, ds, 1))
  +		continue;
  +
  +	    he->tag = RPMTAG_NAME;
  +	    xx = headerGet(h, he, 0);
  +	    hnamelen = ((xx && he->p.str) ? strlen(he->p.str) : 0);
  +	    he->p.ptr = _free(he->p.ptr);
  +
  +	    /* XXX Prefer the shortest pkg N for basenames/provides resp. */
  +	    if (bhnamelen > 0 && hnamelen > bhnamelen)
  +		continue;
  +
  +	    /* XXX Prefer the newest build if given alternatives. */
  +	    he->tag = RPMTAG_BUILDTIME;
  +	    xx = headerGet(h, he, 0);
  +	    htime = (xx && he->p.ui32p ? he->p.ui32p[0] : 0);
  +	    he->p.ptr = _free(he->p.ptr);
  +
  +	    if (htime <= bhtime)
  +		continue;
  +
  +	    /* Save new "best" candidate. */
  +	    (void)headerFree(bh);
  +	    bh = NULL;
  +	    bh = headerLink(h);
  +	    bhtime = htime;
  +	    bhnamelen = hnamelen;
  +	}
  +	mi = rpmmiFree(mi);
       }
  -    mi = rpmmiFree(mi);
   
       /* Is there a suggested resolution? */
       if (bh == NULL)
  @@ -1384,8 +1461,7 @@
   
       ts->PRCO = NULL;
   
  -    ts->sdb = NULL;
  -    ts->sdbmode = O_RDONLY;
  +    ts->bag = NULL;
   
       ts->rdb = NULL;
       ts->dbmode = O_RDONLY;
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/lib/rpmts.h
  ============================================================================
  $ cvs diff -u -r2.132 -r2.133 rpmts.h
  --- rpm/lib/rpmts.h	21 May 2010 05:01:02 -0000	2.132
  +++ rpm/lib/rpmts.h	13 Aug 2010 21:38:38 -0000	2.133
  @@ -9,6 +9,7 @@
   #include "rpmps.h"
   #include "rpmsw.h"
   #include <rpmpgp.h>		/* XXX pgpVSFlags */
  +#include <rpmbag.h>
   
   /*@-exportlocal@*/
   /*@unchecked@*/
  @@ -211,8 +212,7 @@
       rpmTSType type;		/*!< default, rollback, autorollback */
   
   /*@refcounted@*/ /*@null@*/
  -    rpmdb sdb;			/*!< Solve database handle. */
  -    int sdbmode;		/*!< Solve database open mode. */
  +    rpmbag bag;			/*!< Solve store collection. */
   /*@null@*/
       int (*solve) (rpmts ts, rpmds key, const void * data)
   	/*@modifies ts @*/;	/*!< Search for NEVRA key. */
  @@ .
Received on Fri Aug 13 23:38:39 2010
Driven by Jeff Johnson and the RPM project team.
Hosted by OpenPKG and Ralf S. Engelschall.
Powered by FreeBSD and OpenPKG.