const char *solvable_lookup_str_lang(Solvable *s, Id keyname);
int solvable_lookup_bool(Solvable *s, Id keyname);
char * solvable_get_location(Solvable *s, unsigned int *medianrp);
+const unsigned char *solvable_lookup_bin_checksum(Solvable *s, Id keyname, Id *typep);
+const char *solvable_lookup_checksum(Solvable *s, Id keyname, Id *typep);
+
return 1;
}
+const unsigned char *
+repodata_lookup_bin_checksum(Repodata *data, Id entry, Id keyid, Id *typep)
+{
+ Id schema;
+ Id *keyp;
+ Repokey *key;
+ unsigned char *dp;
+
+ if (!maybe_load_repodata(data, &keyid))
+ return 0;
+ dp = data->incoredata + data->incoreoffset[entry];
+ dp = data_read_id(dp, &schema);
+ for (keyp = data->schemadata + data->schemata[schema]; *keyp != keyid; keyp++)
+ if (!*keyp)
+ return 0;
+ dp = forward_to_key(data, keyid, schema, dp);
+ key = data->keys + keyid;
+ *typep = key->type;
+ return get_data(data, key, &dp);
+}
+
void
repodata_search(Repodata *data, Id entry, Id keyname, int (*callback)(void *cbdata, Solvable *s, Repodata *data, Repokey *key, KeyValue *kv), void *cbdata)
{
}
const char *
-repodata_chk2str(Repodata *data, Id type, const char *buf)
+repodata_chk2str(Repodata *data, Id type, const unsigned char *buf)
{
int i, l;
char *str, *s;
*/
int repodata_lookup_num(Repodata *data, Id entry, Id keyid, unsigned *value);
int repodata_lookup_void(Repodata *data, Id entry, Id keyid);
+const unsigned char *repodata_lookup_bin_checksum(Repodata *data, Id entry, Id keyid, Id *typep);
void repodata_init(Repodata *data, struct _Repo *repo, int localpool);
void repodata_extend(Repodata *data, Id p);
Id repodata_str2dir(Repodata *data, const char *dir, int create);
const char *repodata_dir2str(Repodata *data, Id did, const char *suf);
-const char *repodata_chk2str(Repodata *data, Id type, const char *buf);
+const char *repodata_chk2str(Repodata *data, Id type, const unsigned char *buf);
unsigned int repodata_compress_page(unsigned char *, unsigned int, unsigned char *, unsigned int);
void repodata_read_or_setup_pages(Repodata *data, unsigned int pagesz, unsigned int blobsz);
return 0;
}
+const unsigned char *
+solvable_lookup_bin_checksum(Solvable *s, Id keyname, Id *typep)
+{
+ Repo *repo = s->repo;
+ Pool *pool;
+ Repodata *data;
+ int i, j, n;
+
+ if (!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;
+ for (j = 1; j < data->nkeys; j++)
+ {
+ if (data->keys[j].name == keyname
+ && (data->keys[j].type == REPOKEY_TYPE_MD5
+ || data->keys[j].type == REPOKEY_TYPE_SHA1
+ || data->keys[j].type == REPOKEY_TYPE_SHA256))
+ {
+ const unsigned char *chk = repodata_lookup_bin_checksum(data, n - data->start, j, typep);
+ if (chk)
+ return chk;
+ }
+ }
+ }
+ return 0;
+}
+
+const char *
+solvable_lookup_checksum(Solvable *s, Id keyname, Id *typep)
+{
+ const unsigned char *chk = solvable_lookup_bin_checksum(s, keyname, typep);
+ /* we need the repodata just as a reference for a pool */
+ return chk ? repodata_chk2str(s->repo->repodata, *typep, chk) : 0;
+}
+
char *
solvable_get_location(Solvable *s, unsigned int *medianrp)
{