/*
+ * Copyright (c) 2007, Novell Inc.
+ *
+ * This program is licensed under the BSD license, read LICENSE.BSD
+ * for further information
+ */
+
+/*
* pool.c
*
* The pool contains information about solvables
"solvable:name",
"solvable:arch",
"solvable:evr",
+ "solvable:vendor",
"solvable:provides",
"solvable:obsoletes",
"solvable:conflicts",
"solvable:filemarker",
"namespace:installed",
"namespace:modalias",
+ "system:system",
"src",
"nosrc",
"noarch"
{
int count, totalsize = 0;
Pool *pool;
+ Solvable *s;
pool = (Pool *)xcalloc(1, sizeof(*pool));
pool->nrels = 1;
// pre-alloc space for a Solvable
- pool->solvables = (Solvable *)xcalloc(1, sizeof(Solvable));
- pool->nsolvables = 1;
-
+ pool->solvables = (Solvable *)xcalloc(2, sizeof(Solvable));
+ pool->nsolvables = 2;
+ queue_init(&pool->vendormap);
+ s = pool->solvables + SYSTEMSOLVABLE;
+ s->name = SYSTEM_SYSTEM;
+ s->arch = ARCH_NOARCH;
+ s->evr = ID_EMPTY;
return pool;
}
pool_free(Pool *pool)
{
int i;
- Source *source;
pool_freewhatprovides(pool);
pool_freeidhashes(pool);
- for (i = 0; i < pool->nsources; i++)
- {
- source = pool->sources[i];
- xfree(source->idarraydata);
- xfree(source->rpmdbid);
- xfree(source);
- }
+ pool_freeallrepos(pool, 1);
+ xfree(pool->id2arch);
xfree(pool->solvables);
- xfree(pool->sources);
xfree(pool->stringspace);
xfree(pool->strings);
xfree(pool->rels);
+ queue_free(&pool->vendormap);
+ for (i = 0; i < DEP2STRBUF; i++)
+ xfree(pool->dep2strbuf[i]);
xfree(pool);
}
pool_prepare(Pool *pool)
{
int i, num, np, extra;
- unsigned int n;
Offset off;
Solvable *s;
Id id;
- Offset *idp;
+ Offset *idp, n;
Offset *whatprovides;
Id *whatprovidesdata, *d;
{
Id *pp;
s = pool->solvables + i;
- pp = s->provides;
- if (!pp) /* solvable does not provide anything */
+ if (!s->provides)
continue;
if (!pool_installable(pool, s))
continue;
+ pp = s->repo->idarraydata + s->provides;
while ((id = *pp++) != ID_NULL)
{
if (ISRELDEP(id))
{
Id *pp;
s = pool->solvables + i;
- pp = s->provides;
- if (!pp) /* solvable does not provide anything */
+ if (!s->provides)
continue;
if (!pool_installable(pool, s))
continue;
/* for all provides of this solvable */
+ pp = s->repo->idarraydata + s->provides;
while ((id = *pp++) != 0)
{
if (ISRELDEP(id))
pool_shrink_whatprovides(pool);
}
+
/******************************************************************************/
/*
}
+/******************************************************************************/
+
/*
- * addrangedep
+ * addrelproviders
*
- * add RangeDep to whatprovides
+ * add packages fulfilling the relation to whatprovides array
* no exact providers, do range match
*
*/
Id p, *pp, *pp2, *pp3;
d = GETRELID(pool, d);
- queueinit_buffer(&plist, buf, sizeof(buf)/sizeof(*buf));
+ queue_init_buffer(&plist, buf, sizeof(buf)/sizeof(*buf));
switch (flags)
{
case REL_AND:
for (pp3 = pp2; *pp3;)
if (*pp3++ == p)
{
- queuepush(&plist, p);
+ queue_push(&plist, p);
break;
}
}
case REL_OR:
pp = GET_PROVIDESP(name, p);
while ((p = *pp++) != 0)
- queuepush(&plist, p);
+ queue_push(&plist, p);
pp = GET_PROVIDESP(evr, p);
while ((p = *pp++) != 0)
- queuepushunique(&plist, p);
+ queue_pushunique(&plist, p);
break;
case REL_NAMESPACE:
-#if 0
- /* unknown namespace, just pass through */
- pp = GET_PROVIDESP(evr, p);
- while ((p = *pp++) != 0)
- queuepush(&plist, p);
-#endif
+ if (pool->nscallback)
+ {
+ p = pool->nscallback(pool, pool->nscallbackdata, name, evr);
+ if (p > 1)
+ {
+ queue_free(&plist);
+ pool->whatprovides[d] = p;
+ return pool->whatprovidesdata + p;
+ }
+ if (p == 1)
+ queue_push(&plist, SYSTEMSOLVABLE);
+ }
break;
default:
break;
printf("addrelproviders: checking package %s\n", id2str(pool, pool->p[p].name));
#endif
/* solvable p provides name in some rels */
- for (pidp = pool->solvables[p].provides; (pid = *pidp++) != 0; )
+ pidp = pool->solvables[p].repo->idarraydata + pool->solvables[p].provides;
+ while ((pid = *pidp++) != 0)
{
int pflags;
Id pevr;
}
if (!pid)
continue; /* no rel match */
- queuepush(&plist, p);
+ queue_push(&plist, p);
}
+ /* make our system solvable provide all unknown rpmlib() stuff */
+ if (plist.count == 0 && !strncmp(id2str(pool, name), "rpmlib(", 7))
+ queue_push(&plist, SYSTEMSOLVABLE);
}
/* add providers to whatprovides */
#if 0
if (pool->verbose) printf("addrelproviders: adding %d packages to %d\n", plist.count, d);
#endif
pool->whatprovides[d] = pool_queuetowhatprovides(pool, &plist);
- queuefree(&plist);
+ queue_free(&plist);
return pool->whatprovidesdata + pool->whatprovides[d];
}