- delete type checks. instead, just call the repodata function and use repodata_looku...
authorMichael Schroeder <mls@suse.de>
Wed, 23 Feb 2011 18:10:49 +0000 (19:10 +0100)
committerMichael Schroeder <mls@suse.de>
Wed, 23 Feb 2011 18:10:49 +0000 (19:10 +0100)
src/repo.c
src/repo.h
src/solvable.c

index facacb9..d0a245d 100644 (file)
@@ -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;
 }
index 0011371..e73ad35 100644 (file)
@@ -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);
index c5a1691..56c3942 100644 (file)
@@ -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 *