static void dump_repodata(Repo *repo) { unsigned int i; Repodata *data; if (repo->nrepodata == 0) return; printf("repo contains %d repodata sections:\n", repo->nrepodata - 1); FOR_REPODATAS(repo, i, data) { unsigned int j; printf("\nrepodata %d has %d keys, %d schemata\n", i, data->nkeys - 1, data->nschemata - 1); for (j = 1; j < data->nkeys; j++) printf(" %s (type %s size %d storage %d)\n", pool_id2str(repo->pool, data->keys[j].name), pool_id2str(repo->pool, data->keys[j].type), data->keys[j].size, data->keys[j].storage); if (data->localpool) printf(" localpool has %d strings, size is %d\n", data->spool.nstrings, data->spool.sstrings); if (data->dirpool.ndirs) printf(" localpool has %d directories\n", data->dirpool.ndirs); printf("\n"); repodata_search(data, SOLVID_META, 0, SEARCH_ARRAYSENTINEL|SEARCH_SUB, dump_repodata_cb, 0); }
static void repo_search_md(Repo *repo, Id p, Id keyname, struct matchdata *md) { KeyValue kv; Pool *pool = repo->pool; Repodata *data; int i, j, flags; Solvable *s; kv.parent = 0; md->stop = 0; if (!p) { for (p = repo->start, s = repo->pool->solvables + p; p < repo->end; p++, s++) { if (s->repo == repo) repo_search_md(repo, p, keyname, md); if (md->stop > SEARCH_NEXT_SOLVABLE) break; } return; } else if (p < 0) /* The callback only supports solvables, so we can't iterate over the extra things. */ return; flags = md->flags; if (!(flags & SEARCH_NO_STORAGE_SOLVABLE)) { s = pool->solvables + p; switch(keyname) { case 0: case SOLVABLE_NAME: if (s->name) { kv.id = s->name; repo_matchvalue(md, s, 0, solvablekeys + 0, &kv); } if (keyname || md->stop > SEARCH_NEXT_KEY) return; case SOLVABLE_ARCH: if (s->arch) { kv.id = s->arch; repo_matchvalue(md, s, 0, solvablekeys + 1, &kv); } if (keyname || md->stop > SEARCH_NEXT_KEY) return; case SOLVABLE_EVR: if (s->evr) { kv.id = s->evr; repo_matchvalue(md, s, 0, solvablekeys + 2, &kv); } if (keyname || md->stop > SEARCH_NEXT_KEY) return; case SOLVABLE_VENDOR: if (s->vendor) { kv.id = s->vendor; repo_matchvalue(md, s, 0, solvablekeys + 3, &kv); } if (keyname || md->stop > SEARCH_NEXT_KEY) return; case SOLVABLE_PROVIDES: if (s->provides) domatch_idarray(s, SOLVABLE_PROVIDES, md, repo->idarraydata + s->provides); if (keyname || md->stop > SEARCH_NEXT_KEY) return; case SOLVABLE_OBSOLETES: if (s->obsoletes) domatch_idarray(s, SOLVABLE_OBSOLETES, md, repo->idarraydata + s->obsoletes); if (keyname || md->stop > SEARCH_NEXT_KEY) return; case SOLVABLE_CONFLICTS: if (s->conflicts) domatch_idarray(s, SOLVABLE_CONFLICTS, md, repo->idarraydata + s->conflicts); if (keyname || md->stop > SEARCH_NEXT_KEY) return; case SOLVABLE_REQUIRES: if (s->requires) domatch_idarray(s, SOLVABLE_REQUIRES, md, repo->idarraydata + s->requires); if (keyname || md->stop > SEARCH_NEXT_KEY) return; case SOLVABLE_RECOMMENDS: if (s->recommends) domatch_idarray(s, SOLVABLE_RECOMMENDS, md, repo->idarraydata + s->recommends); if (keyname || md->stop > SEARCH_NEXT_KEY) return; case SOLVABLE_SUPPLEMENTS: if (s->supplements) domatch_idarray(s, SOLVABLE_SUPPLEMENTS, md, repo->idarraydata + s->supplements); if (keyname || md->stop > SEARCH_NEXT_KEY) return; case SOLVABLE_SUGGESTS: if (s->suggests) domatch_idarray(s, SOLVABLE_SUGGESTS, md, repo->idarraydata + s->suggests); if (keyname || md->stop > SEARCH_NEXT_KEY) return; case SOLVABLE_ENHANCES: if (s->enhances) domatch_idarray(s, SOLVABLE_ENHANCES, md, repo->idarraydata + s->enhances); if (keyname || md->stop > SEARCH_NEXT_KEY) return; case RPM_RPMDBID: if (repo->rpmdbid) { kv.num = repo->rpmdbid[p - repo->start]; repo_matchvalue(md, s, 0, solvablekeys + (RPM_RPMDBID - SOLVABLE_NAME), &kv); } if (keyname || md->stop > SEARCH_NEXT_KEY) return; break; default: break; } } FOR_REPODATAS(repo, i, data) { if (p < data->start || p >= data->end) continue; if (keyname && !repodata_precheck_keyname(data, keyname)) continue; if (keyname == SOLVABLE_FILELIST && !(md->flags & SEARCH_COMPLETE_FILELIST)) { /* do not search filelist extensions */ if (data->state != REPODATA_AVAILABLE) continue; for (j = 1; j < data->nkeys; j++) if (data->keys[j].name != REPOSITORY_SOLVABLES && data->keys[j].name != SOLVABLE_FILELIST) break; if (j == data->nkeys) continue; } if (data->state == REPODATA_STUB) { if (keyname) { for (j = 1; j < data->nkeys; j++) if (keyname == data->keys[j].name) break; if (j == data->nkeys) continue; } /* load it */ if (data->loadcallback) data->loadcallback(data); else data->state = REPODATA_ERROR; } if (data->state == REPODATA_ERROR) continue; repodata_search(data, p, keyname, md->flags, repo_matchvalue, md); if (md->stop > SEARCH_NEXT_KEY) break; } }