From: Michael Schroeder Date: Mon, 3 Jun 2019 13:21:28 +0000 (+0200) Subject: Make repo_lookup_type return the correct type for data stored in the solvable X-Git-Tag: 0.7.5~12 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=bcf78457021fdbc4b98ba8ce5cd25b159676b4ae;p=thirdparty%2Flibsolv.git Make repo_lookup_type return the correct type for data stored in the solvable Also clean up and speed up the code a bit. --- diff --git a/src/repo.c b/src/repo.c index 25fb01ba..f2c0601f 100644 --- a/src/repo.c +++ b/src/repo.c @@ -1250,7 +1250,10 @@ Id repo_lookup_type(Repo *repo, Id entry, Id keyname) { Id type; - Repodata *data = repo_lookup_repodata_opt(repo, entry, keyname); + Repodata *data; + if (keyname >= SOLVABLE_NAME && keyname <= RPM_RPMDBID) + return repo_solvablekeys[keyname - SOLVABLE_NAME].type; + data = repo_lookup_repodata_opt(repo, entry, keyname); if (data && (type = repodata_lookup_type(data, entry, keyname)) != 0 && type != REPOKEY_TYPE_DELETED) return type; return 0; diff --git a/src/solvable.c b/src/solvable.c index bc03ac02..5bbc4b95 100644 --- a/src/solvable.c +++ b/src/solvable.c @@ -253,14 +253,14 @@ solvable_lookup_str_poollang(Solvable *s, Id keyname) const char * solvable_lookup_str_lang(Solvable *s, Id keyname, const char *lang, int usebase) { - if (s->repo) - { - Id id = pool_id2langid(s->repo->pool, keyname, lang, 0); - if (id) - return solvable_lookup_str_base(s, id, keyname, usebase); - if (!usebase) - return 0; - } + Id id; + if (!s->repo) + return 0; + id = pool_id2langid(s->repo->pool, keyname, lang, 0); + if (id) + return solvable_lookup_str_base(s, id, keyname, usebase); + if (!usebase) + return 0; return solvable_lookup_str(s, keyname); } @@ -293,25 +293,27 @@ solvable_lookup_void(Solvable *s, Id keyname) int solvable_lookup_bool(Solvable *s, Id keyname) { + Id type; if (!s->repo) return 0; /* historic nonsense: there are two ways of storing a bool, as num == 1 or void. test both. */ - if (repo_lookup_type(s->repo, s - s->repo->pool->solvables, keyname) == REPOKEY_TYPE_VOID) + type = repo_lookup_type(s->repo, s - s->repo->pool->solvables, keyname); + if (type == REPOKEY_TYPE_VOID) return 1; - return repo_lookup_num(s->repo, s - s->repo->pool->solvables, keyname, 0) == 1; + if (type == REPOKEY_TYPE_NUM || REPOKEY_TYPE_CONSTANT) + return repo_lookup_num(s->repo, s - s->repo->pool->solvables, keyname, 0) == 1; + return 0; } const unsigned char * solvable_lookup_bin_checksum(Solvable *s, Id keyname, Id *typep) { - Repo *repo = s->repo; - - if (!repo) + if (!s->repo) { *typep = 0; return 0; } - return repo_lookup_bin_checksum(repo, s - repo->pool->solvables, keyname, typep); + return repo_lookup_bin_checksum(s->repo, s - s->repo->pool->solvables, keyname, typep); } const char *