{
Pool *pool = repo->pool;
Repodata *data;
- int i, j;
+ int i;
+ const char *str;
switch(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;
}
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)
{
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;
}
repo_lookup_id(Repo *repo, Id entry, Id keyname)
{
Repodata *data;
- int i, j;
+ int i;
+ Id id;
switch(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;
}
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;
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;
}
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);
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 *