- add checksum lookup functions
authorMichael Schroeder <mls@suse.de>
Thu, 20 Mar 2008 14:55:46 +0000 (14:55 +0000)
committerMichael Schroeder <mls@suse.de>
Thu, 20 Mar 2008 14:55:46 +0000 (14:55 +0000)
src/pool.h
src/repodata.c
src/repodata.h
src/solvable.c

index 3331c33..c149e39 100644 (file)
@@ -171,6 +171,9 @@ const char *solvable_lookup_str(Solvable *s, Id keyname);
 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);
+
 
 
 
index bb6efa1..d248ade 100644 (file)
@@ -450,6 +450,27 @@ repodata_lookup_void(Repodata *data, Id entry, Id keyid)
   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)
 {
@@ -1160,7 +1181,7 @@ repodata_set_checksum(Repodata *data, Id entry, Id keyname, Id type,
 }
 
 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;
index 8c3c338..d3fa84b 100644 (file)
@@ -124,6 +124,7 @@ const char *repodata_lookup_str(Repodata *data, Id entry, Id keyid);
  */
 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);
@@ -153,7 +154,7 @@ void repodata_disable_paging(Repodata *data);
 
 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);
index 9217c9b..6cb2fca 100644 (file)
@@ -197,6 +197,46 @@ solvable_lookup_void(Solvable *s, Id keyname)
   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)
 {