- add repodata_lookup_type() and repodata_delete(). Support REPOKEY_TYPE_DELETED...
authorMichael Schroeder <mls@suse.de>
Mon, 21 Feb 2011 16:43:52 +0000 (17:43 +0100)
committerMichael Schroeder <mls@suse.de>
Mon, 21 Feb 2011 16:43:52 +0000 (17:43 +0100)
ext/repo_susetags.c
ext/repo_write.c
src/repodata.c
src/repodata.h
src/repopack.h

index c75ad3e..1e2885c 100644 (file)
@@ -445,11 +445,15 @@ static Id
 lookup_shared_id(Repodata *data, Id p, Id keyname, Id voidid, int uninternalized)
 {
   Id r;
-  if (repodata_lookup_void(data, p, keyname))
-    return voidid;
-  r = repodata_lookup_id(data, p, keyname);
+  r = repodata_lookup_type(data, p, keyname);
   if (r)
-    return r;
+    {
+      if (r == REPOKEY_TYPE_VOID)
+       return voidid;
+      r = repodata_lookup_id(data, p, keyname);
+      if (r)
+       return r;
+    }
   if (uninternalized && data->attrs)
     {
       Id *ap = data->attrs[p - data->start];
index 303c0fd..1ae20ed 100644 (file)
@@ -1142,6 +1142,11 @@ repo_write(Repo *repo, FILE *fp, int (*keyfilter)(Repo *repo, Repokey *key, void
              cbdata.keymap[n] = cbdata.keymap[key->name];
              continue;
            }
+         if (key->type == REPOKEY_TYPE_DELETED)
+           {
+             cbdata.keymap[n] = 0;
+             continue;
+           }
          /* see if we already had this one, should use hash for fast miss */
          for (k = 0; k < cbdata.nmykeys; k++)
            {
index 39cea01..9fc0c8e 100644 (file)
@@ -542,6 +542,8 @@ find_key_data(Repodata *data, Id solvid, Id keyname, Repokey **keypp)
   if (!*kp)
     return 0;
   *keypp = key = data->keys + *kp;
+  if (key->type == REPOKEY_TYPE_DELETED)
+    return 0;
   if (key->type == REPOKEY_TYPE_VOID || key->type == REPOKEY_TYPE_CONSTANT || key->type == REPOKEY_TYPE_CONSTANTID)
     return dp; /* no need to forward... */
   dp = forward_to_key(data, *kp, keyp, dp);
@@ -550,6 +552,20 @@ find_key_data(Repodata *data, Id solvid, Id keyname, Repokey **keypp)
   return get_data(data, key, &dp, 0);
 }
 
+Id
+repodata_lookup_type(Repodata *data, Id solvid, Id keyname)
+{
+  Id schema, *keyp, *kp;
+  if (!maybe_load_repodata(data, keyname))
+    return 0;
+  if (!solvid2data(data, solvid, &schema))
+    return 0;
+  keyp = data->schemadata + data->schemata[schema];
+  for (kp = keyp; *kp; kp++)
+    if (data->keys[*kp].name == keyname)
+      return data->keys[*kp].type == REPOKEY_TYPE_DELETED ? 0 : data->keys[*kp].type;
+  return 0;
+}
 
 Id
 repodata_lookup_id(Repodata *data, Id solvid, Id keyname)
@@ -569,14 +585,6 @@ repodata_lookup_id(Repodata *data, Id solvid, Id keyname)
   return id;
 }
 
-Id
-repodata_globalize_id(Repodata *data, Id id, int create)
-{
-  if (!id || !data || !data->localpool)
-    return id;
-  return str2id(data->repo->pool, stringpool_id2str(&data->spool, id), create);
-}
-
 const char *
 repodata_lookup_str(Repodata *data, Id solvid, Id keyname)
 {
@@ -676,6 +684,15 @@ repodata_lookup_idarray(Repodata *data, Id solvid, Id keyname, Queue *q)
   return 1;
 }
 
+Id
+repodata_globalize_id(Repodata *data, Id id, int create)
+{
+  if (!id || !data || !data->localpool)
+    return id;
+  return str2id(data->repo->pool, stringpool_id2str(&data->spool, id), create);
+}
+
+
 /************************************************************************
  * data search
  */
@@ -787,6 +804,8 @@ repodata_search(Repodata *data, Id solvid, Id keyname, int flags, int (*callback
       key = data->keys + keyid;
       ddp = get_data(data, key, &dp, *keyp ? 1 : 0);
 
+      if (key->type == REPOKEY_TYPE_DELETED)
+       continue;
       if (key->type == REPOKEY_TYPE_FLEXARRAY || key->type == REPOKEY_TYPE_FIXARRAY)
        {
          struct subschema_data subd;
@@ -1301,6 +1320,8 @@ dataiterator_step(Dataiterator *di)
          di->ddp = get_data(di->data, di->key, &di->dp, di->keyp[1] && (!di->keyname || (di->flags & SEARCH_SUB) != 0) ? 1 : 0);
          if (!di->ddp)
            goto di_nextkey;
+          if (di->key->type == REPOKEY_TYPE_DELETED)
+           goto di_nextkey;
          if (di->key->type == REPOKEY_TYPE_FIXARRAY || di->key->type == REPOKEY_TYPE_FLEXARRAY)
            goto di_enterarray;
          if (di->nkeynames && di->nparents - di->rootlevel < di->nkeynames)
@@ -2303,7 +2324,19 @@ repodata_delete_uninternalized(Repodata *data, Id solvid, Id keyname)
   *pp = 0;
 }
 
-/* add all attrs from src to dest */
+/* XXX: does not work correctly, needs fix in iterators! */
+void
+repodata_delete(Repodata *data, Id solvid, Id keyname)
+{
+  Repokey key;
+  key.name = keyname;
+  key.type = REPOKEY_TYPE_DELETED;
+  key.size = 0;
+  key.storage = KEY_STORAGE_INCORE;
+  repodata_set(data, solvid, &key, 0);
+}
+
+/* add all (uninternalized) attrs from src to dest */
 void
 repodata_merge_attrs(Repodata *data, Id dest, Id src)
 {
@@ -2314,6 +2347,7 @@ repodata_merge_attrs(Repodata *data, Id dest, Id src)
     repodata_insert_keyid(data, dest, keyp[0], keyp[1], 0);
 }
 
+/* add some (uninternalized) attrs from src to dest */
 void
 repodata_merge_some_attrs(Repodata *data, Id dest, Id src, Map *keyidmap, int overwrite)
 {
@@ -2861,6 +2895,8 @@ repodata_create_stubs(Repodata *data)
               repodata_key2id(sdata, &xkey, 1);
               xkeyname = 0;
            }
+       default:
+         break;
        }
     }
   dataiterator_free(&di);
index feac731..1b7ebe0 100644 (file)
@@ -180,6 +180,7 @@ int repodata_filelistfilter_matches(Repodata *data, const char *str);
 
 
 /* lookup functions */
+Id repodata_lookup_type(Repodata *data, Id solvid, Id keyname);
 Id repodata_lookup_id(Repodata *data, Id solvid, Id keyname);
 const char *repodata_lookup_str(Repodata *data, Id solvid, Id keyname);
 int repodata_lookup_num(Repodata *data, Id solvid, Id keyname, unsigned int *value);
@@ -240,6 +241,7 @@ void repodata_add_poolstr_array(Repodata *data, Id solvid, Id keyname, const cha
 void repodata_add_fixarray(Repodata *data, Id solvid, Id keyname, Id ghandle);
 void repodata_add_flexarray(Repodata *data, Id solvid, Id keyname, Id ghandle);
 
+void repodata_delete(Repodata *data, Id solvid, Id keyname);
 void repodata_delete_uninternalized(Repodata *data, Id solvid, Id keyname);
 
 /* 
index e55072c..c97b920 100644 (file)
@@ -126,6 +126,7 @@ data_skip(unsigned char *dp, int type)
     case REPOKEY_TYPE_VOID:
     case REPOKEY_TYPE_CONSTANT:
     case REPOKEY_TYPE_CONSTANTID:
+    case REPOKEY_TYPE_DELETED:
       return dp;
     case REPOKEY_TYPE_ID:
     case REPOKEY_TYPE_NUM:
@@ -199,6 +200,7 @@ data_skip_verify(unsigned char *dp, int type, int maxid, int maxdir)
     case REPOKEY_TYPE_VOID:
     case REPOKEY_TYPE_CONSTANT:
     case REPOKEY_TYPE_CONSTANTID:
+    case REPOKEY_TYPE_DELETED:
       return dp;
     case REPOKEY_TYPE_NUM:
       while ((*dp & 0x80) != 0)