From a01bfc1069ca1886f9541def229f4fff1c0efe4c Mon Sep 17 00:00:00 2001 From: Michael Schroeder Date: Wed, 23 Feb 2011 19:10:49 +0100 Subject: [PATCH] - delete type checks. instead, just call the repodata function and use repodata_lookup_type as existance check --- src/repo.c | 103 ++++++++++++++++++++++++++----------------------- src/repo.h | 3 +- src/solvable.c | 35 +++-------------- 3 files changed, 61 insertions(+), 80 deletions(-) diff --git a/src/repo.c b/src/repo.c index facacb95..d0a245d9 100644 --- a/src/repo.c +++ b/src/repo.c @@ -865,7 +865,8 @@ repo_lookup_str(Repo *repo, Id entry, Id keyname) { Pool *pool = repo->pool; Repodata *data; - int i, j; + int i; + const char *str; switch(keyname) { @@ -884,11 +885,11 @@ repo_lookup_str(Repo *repo, Id entry, Id keyname) continue; if (!repodata_precheck_keyname(data, keyname)) continue; - for (j = 1; j < data->nkeys; j++) - { - if (data->keys[j].name == keyname && (data->keys[j].type == REPOKEY_TYPE_ID || data->keys[j].type == REPOKEY_TYPE_CONSTANTID || data->keys[j].type == REPOKEY_TYPE_STR)) - return repodata_lookup_str(data, entry, keyname); - } + str = repodata_lookup_str(data, entry, keyname); + if (str) + return str; + if (repodata_lookup_type(data, entry, keyname)) + return 0; } return 0; } @@ -898,7 +899,8 @@ unsigned int repo_lookup_num(Repo *repo, Id entry, Id keyname, unsigned int notfound) { Repodata *data; - int i, j; + int i; + unsigned int value; if (keyname == RPM_RPMDBID) { @@ -912,18 +914,10 @@ repo_lookup_num(Repo *repo, Id entry, Id keyname, unsigned int notfound) continue; if (!repodata_precheck_keyname(data, keyname)) continue; - for (j = 1; j < data->nkeys; j++) - { - if (data->keys[j].name == keyname - && (data->keys[j].type == REPOKEY_TYPE_U32 - || data->keys[j].type == REPOKEY_TYPE_NUM - || data->keys[j].type == REPOKEY_TYPE_CONSTANT)) - { - unsigned value; - if (repodata_lookup_num(data, entry, keyname, &value)) - return value; - } - } + if (repodata_lookup_num(data, entry, keyname, &value)) + return value; + if (repodata_lookup_type(data, entry, keyname)) + return notfound; } return notfound; } @@ -932,7 +926,8 @@ Id repo_lookup_id(Repo *repo, Id entry, Id keyname) { Repodata *data; - int i, j; + int i; + Id id; switch(keyname) { @@ -951,15 +946,11 @@ repo_lookup_id(Repo *repo, Id entry, Id keyname) continue; if (!repodata_precheck_keyname(data, keyname)) continue; - for (j = 1; j < data->nkeys; j++) - { - if (data->keys[j].name == keyname && (data->keys[j].type == REPOKEY_TYPE_ID || data->keys[j].type == REPOKEY_TYPE_CONSTANTID)) - { - Id id = repodata_lookup_id(data, entry, keyname); - if (id) - return data->localpool ? repodata_globalize_id(data, id, 1) : id; - } - } + id = repodata_lookup_id(data, entry, keyname); + if (id) + return data->localpool ? repodata_globalize_id(data, id, 1) : id; + if (repodata_lookup_type(data, entry, keyname)) + return 0; } return 0; } @@ -968,22 +959,20 @@ const unsigned char * repo_lookup_bin_checksum(Repo *repo, Id entry, Id keyname, Id *typep) { Repodata *data; - int i, j; + int i; + const unsigned char *chk; + for (i = 0, data = repo->repodata; i < repo->nrepodata; i++, data++) { if (entry != SOLVID_META && (entry < data->start || entry >= data->end)) continue; if (!repodata_precheck_keyname(data, keyname)) continue; - for (j = 1; j < data->nkeys; j++) - { - if (data->keys[j].name == keyname) - { - const unsigned char *chk = repodata_lookup_bin_checksum(data, entry, keyname, typep); - if (chk) - return chk; - } - } + chk = repodata_lookup_bin_checksum(data, entry, keyname, typep); + if (chk) + return chk; + if (repodata_lookup_type(data, entry, keyname)) + return 0; } *typep = 0; return 0; @@ -993,22 +982,38 @@ int repo_lookup_void(Repo *repo, Id entry, Id keyname) { Repodata *data; - int i, j; + int i; + Id type; + for (i = 0, data = repo->repodata; i < repo->nrepodata; i++, data++) { if (entry != SOLVID_META && (entry < data->start || entry >= data->end)) continue; if (!repodata_precheck_keyname(data, keyname)) continue; - for (j = 1; j < data->nkeys; j++) - { - if (data->keys[j].name == keyname - && (data->keys[j].type == REPOKEY_TYPE_VOID)) - { - if (repodata_lookup_void(data, entry, keyname)) - return 1; - } - } + type = repodata_lookup_type(data, entry, keyname); + if (type) + return type == REPOKEY_TYPE_VOID; + } + return 0; +} + +Id +repo_lookup_type(Repo *repo, Id entry, Id keyname) +{ + Repodata *data; + int i; + Id type; + + for (i = 0, data = repo->repodata; i < repo->nrepodata; i++, data++) + { + if (entry != SOLVID_META && (entry < data->start || entry >= data->end)) + continue; + if (!repodata_precheck_keyname(data, keyname)) + continue; + type = repodata_lookup_type(data, entry, keyname); + if (type) + return type == REPOKEY_TYPE_DELETED ? 0 : type; } return 0; } diff --git a/src/repo.h b/src/repo.h index 0011371e..e73ad35f 100644 --- a/src/repo.h +++ b/src/repo.h @@ -196,8 +196,9 @@ Repodata *repo_last_repodata(Repo *repo); void repo_search(Repo *repo, Id p, Id key, const char *match, int flags, int (*callback)(void *cbdata, Solvable *s, Repodata *data, Repokey *key, KeyValue *kv), void *cbdata); /* returns the string value of the attribute, or NULL if not found */ +Id repo_lookup_type(Repo *repo, Id entry, Id key); const char *repo_lookup_str(Repo *repo, Id entry, Id key); -/* returns the integer value of the attribute, or 0 if not found */ +/* returns the integer value of the attribute, or notfound if not found */ unsigned int repo_lookup_num(Repo *repo, Id entry, Id key, unsigned int notfound); Id repo_lookup_id(Repo *repo, Id entry, Id keyid); int repo_lookup_void(Repo *repo, Id entry, Id keyid); diff --git a/src/solvable.c b/src/solvable.c index c5a16914..56c39423 100644 --- a/src/solvable.c +++ b/src/solvable.c @@ -195,37 +195,12 @@ solvable_lookup_void(Solvable *s, Id keyname) int solvable_lookup_bool(Solvable *s, Id keyname) { - Repo *repo = s->repo; - Pool *pool; - Repodata *data; - int i, j, n; - - if (!repo) + if (!s->repo) return 0; - pool = repo->pool; - n = s - pool->solvables; - for (i = 0, data = repo->repodata; i < repo->nrepodata; i++, data++) - { - if (n < data->start || n >= data->end) - continue; - /* there are two ways of storing a bool, as num == 1 or void */ - for (j = 1; j < data->nkeys; j++) - { - if (data->keys[j].name == keyname - && (data->keys[j].type == REPOKEY_TYPE_U32 - || data->keys[j].type == REPOKEY_TYPE_NUM - || data->keys[j].type == REPOKEY_TYPE_CONSTANT - || data->keys[j].type == REPOKEY_TYPE_VOID)) - { - unsigned int value; - if (repodata_lookup_num(data, n, keyname, &value)) - return value == 1; - if (repodata_lookup_void(data, n, keyname)) - return 1; - } - } - } - 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) + return 1; + return repo_lookup_num(s->repo, s - s->repo->pool->solvables, keyname, 0) == 1; } const unsigned char * -- 2.47.3