add pool_lookup_idarray for completeness
authorMichael Schroeder <mls@suse.de>
Mon, 27 May 2013 14:25:38 +0000 (16:25 +0200)
committerMichael Schroeder <mls@suse.de>
Mon, 27 May 2013 14:25:38 +0000 (16:25 +0200)
src/libsolv.ver
src/pool.c
src/pool.h
src/repo.c

index f1fcbc8..7982dbb 100644 (file)
@@ -80,6 +80,7 @@ SOLV_1.0 {
                pool_lookup_checksum;
                pool_lookup_deltalocation;
                pool_lookup_id;
+               pool_lookup_idarray;
                pool_lookup_num;
                pool_lookup_str;
                pool_lookup_void;
index 5d3e61a..eef7344 100644 (file)
@@ -2137,6 +2137,16 @@ pool_lookup_checksum(Pool *pool, Id entry, Id keyname, Id *typep)
   return solvable_lookup_checksum(pool->solvables + entry, keyname, typep);
 }
 
+int
+pool_lookup_idarray(Pool *pool, Id entry, Id keyname, Queue *q)
+{
+  if (entry == SOLVID_POS && pool->pos.repo)
+    return repo_lookup_idarray(pool->pos.repo, pool->pos.repodataid ? entry : pool->pos.solvid, keyname, q);
+  if (entry <= 0)
+    return 0;
+  return solvable_lookup_idarray(pool->solvables + entry, keyname, q);
+}
+
 const char *
 pool_lookup_deltalocation(Pool *pool, Id entry, unsigned int *medianrp)
 {
index 7dcf916..6ac552a 100644 (file)
@@ -343,6 +343,7 @@ Id pool_lookup_id(Pool *pool, Id entry, Id keyname);
 unsigned long long pool_lookup_num(Pool *pool, Id entry, Id keyname, unsigned long long notfound);
 int pool_lookup_void(Pool *pool, Id entry, Id keyname);
 const unsigned char *pool_lookup_bin_checksum(Pool *pool, Id entry, Id keyname, Id *typep);
+int pool_lookup_idarray(Pool *pool, Id entry, Id keyname, Queue *q);
 const char *pool_lookup_checksum(Pool *pool, Id entry, Id keyname, Id *typep);
 const char *pool_lookup_deltalocation(Pool *pool, Id entry, unsigned int *medianrp);
 
index abb2b3b..3b8ef62 100644 (file)
@@ -1249,6 +1249,7 @@ lookup_idarray_solvable(Repo *repo, Offset off, Queue *q)
 int
 repo_lookup_idarray(Repo *repo, Id entry, Id keyname, Queue *q)
 {
+  Pool *pool = repo->pool;
   Repodata *data;
   int i;
   if (entry >= 0)
@@ -1273,6 +1274,19 @@ repo_lookup_idarray(Repo *repo, Id entry, Id keyname, Queue *q)
          return lookup_idarray_solvable(repo, repo->pool->solvables[entry].enhances, q);
         }
     }
+  else if (entry == SOLVID_POS && pool->pos.repo == repo && pool->pos.repodataid)
+    {
+      Repodata *data = pool->pos.repo->repodata + pool->pos.repodataid;
+      if (repodata_lookup_idarray(data, entry, keyname, q))
+       {
+         if (data->localpool)
+           {
+             for (i = 0; i < q->count; i++)
+               q->elements[i] = repodata_globalize_id(data, q->elements[i], 1);
+           }
+         return 1;
+       }
+    }
   FOR_REPODATAS(repo, i, data)
     {
       if (entry != SOLVID_META && (entry < data->start || entry >= data->end))