- fix constantid handling for localpool case: we must treat constantid the same as...
authorMichael Schroeder <mls@suse.de>
Mon, 4 Apr 2011 14:26:56 +0000 (16:26 +0200)
committerMichael Schroeder <mls@suse.de>
Mon, 4 Apr 2011 14:26:56 +0000 (16:26 +0200)
ext/repo_write.c
src/repo_solv.c
src/repodata.c

index 374ebbb..c22b220 100644 (file)
@@ -1104,12 +1104,21 @@ repo_write(Repo *repo, FILE *fp, int (*keyfilter)(Repo *repo, Repokey *key, void
              cbdata.keymap[n] = 0;
              continue;
            }
-         id = repodata_key2id(&target, key, 0);
+         if (key->type == REPOKEY_TYPE_CONSTANTID && data->localpool)
+           {
+             Repokey keyd = *key;
+             keyd.size = repodata_globalize_id(data, key->size, 1);
+             id = repodata_key2id(&target, &keyd, 0);
+           }
+         else
+           id = repodata_key2id(&target, key, 0);
          if (!id)
            {
              Repokey keyd = *key;
              keyd.storage = KEY_STORAGE_INCORE;
-             if (keyd.type != REPOKEY_TYPE_CONSTANT && keyd.type != REPOKEY_TYPE_CONSTANTID)
+             if (keyd.type == REPOKEY_TYPE_CONSTANTID)
+               keyd.size = repodata_globalize_id(data, key->size, 1);
+             else if (keyd.type != REPOKEY_TYPE_CONSTANT)
                keyd.size = 0;
              if (keyfilter)
                {
@@ -1230,16 +1239,35 @@ for (i = 1; i < target.nkeys; i++)
   fprintf(stderr, "  %2d: %s[%d] %d %d %d\n", i, id2str(pool, target.keys[i].name), target.keys[i].name, target.keys[i].type, target.keys[i].size, target.keys[i].storage);
 #endif
 
+  /* copy keys if requested */
+  if (keyarrayp)
+    {
+      *keyarrayp = sat_calloc(2 * target.nkeys + 1, sizeof(Id));
+      for (i = 1; i < target.nkeys; i++)
+       {
+          (*keyarrayp)[2 * i - 2] = target.keys[i].name;
+          (*keyarrayp)[2 * i - 1] = target.keys[i].type;
+       }
+    }
+
   if (poolusage > 1)
     {
       /* put all the keys we need in our string pool */
+      /* put mapped ids right into target.keys */
       for (i = 1, key = target.keys + i; i < target.nkeys; i++, key++)
        {
-         stringpool_str2id(spool, id2str(pool, key->name), 1);
-         stringpool_str2id(spool, id2str(pool, key->type), 1);
+         key->name = stringpool_str2id(spool, id2str(pool, key->name), 1);
          if (key->type == REPOKEY_TYPE_CONSTANTID)
-           stringpool_str2id(spool, id2str(pool, key->size), 1);
+           {
+             key->type = stringpool_str2id(spool, id2str(pool, key->type), 1);
+             type_constantid = key->type;
+             key->size = stringpool_str2id(spool, id2str(pool, key->size), 1);
+           }
+         else
+           key->type = stringpool_str2id(spool, id2str(pool, key->type), 1);
        }
+      if (poolusage == 2)
+       stringpool_freehash(spool);     /* free some mem */
     }
 
 
@@ -1413,10 +1441,24 @@ for (i = 1; i < target.nkeys; i++)
        continue;
       keyused[i] = n;
       if (i != n)
-       target.keys[n] = target.keys[i];
+       {
+         target.keys[n] = target.keys[i];
+         if (keyarrayp)
+           {
+             *keyarrayp[2 * n - 2] = *keyarrayp[2 * i - 2];
+             *keyarrayp[2 * n - 1] = *keyarrayp[2 * i - 1];
+           }
+       }
       n++;
     }
   target.nkeys = n;
+  if (keyarrayp)
+    {
+      /* terminate array */
+      *keyarrayp[2 * n - 2] = 0;
+      *keyarrayp[2 * n - 1] = 0;
+    }
+
   /* update schema data to the new key ids */
   for (i = 1; i < target.schemadatalen; i++)
     target.schemadata[i] = keyused[target.schemadata[i]];
@@ -1425,33 +1467,12 @@ for (i = 1; i < target.nkeys; i++)
     cbdata.keymap[i] = keyused[cbdata.keymap[i]];
   keyused = sat_free(keyused);
 
-  /* copy keys if requested */
-  if (keyarrayp)
-    {
-      *keyarrayp = sat_calloc(2 * target.nkeys + 1, sizeof(Id));
-      for (i = 1; i < target.nkeys; i++)
-       {
-          (*keyarrayp)[2 * i - 2] = target.keys[i].name;
-          (*keyarrayp)[2 * i - 1] = target.keys[i].type;
-       }
-    }
-
-  /* convert ids to local ids and increment their needid */
+  /* increment needid of the used keys, they are already mapped to
+   * the correct string pool  */
   for (i = 1; i < target.nkeys; i++)
     {
-      if (target.keys[i].type == REPOKEY_TYPE_CONSTANTID)
-       {
-         if (!type_constantid)
-           type_constantid = poolusage > 1 ? stringpool_str2id(spool, id2str(pool, target.keys[i].type), 1) : REPOKEY_TYPE_CONSTANTID;
-         if (poolusage > 1)
-           target.keys[i].size = stringpool_str2id(spool, id2str(pool, target.keys[i].size), 1);
-         needid[target.keys[i].size].need++;
-       }
-      if (poolusage > 1)
-       {
-         target.keys[i].name = stringpool_str2id(spool, id2str(pool, target.keys[i].name), 1);
-         target.keys[i].type = stringpool_str2id(spool, id2str(pool, target.keys[i].type), 1);
-       }
+      if (type_constantid && target.keys[i].type == type_constantid)
+       needid[target.keys[i].size].need++;
       needid[target.keys[i].name].need++;
       needid[target.keys[i].type].need++;
     }
@@ -1811,7 +1832,7 @@ fprintf(stderr, "dir %d used %d\n", i, cbdata.dirused ? cbdata.dirused[i] : 1);
       write_id(fp, needid[target.keys[i].type].need);
       if (target.keys[i].storage != KEY_STORAGE_VERTICAL_OFFSET)
        {
-         if (target.keys[i].type == type_constantid)
+         if (type_constantid && target.keys[i].type == type_constantid)
             write_id(fp, needid[target.keys[i].size].need);
          else
             write_id(fp, target.keys[i].size);
index bfe22db..eba1d48 100644 (file)
@@ -866,13 +866,8 @@ repo_add_solv_flags(Repo *repo, FILE *fp, int flags)
          pool_debug(pool, SAT_ERROR, "type REL_IDARRAY only supported for STORAGE_SOLVABLE\n");
          data.error = SOLV_ERROR_UNSUPPORTED;
        }
-      if (keys[i].type == REPOKEY_TYPE_CONSTANTID)
-       {
-         if (idmap)
-           keys[i].size = idmap[keys[i].size];
-         else if ((flags & REPO_LOCALPOOL) != 0)
-           keys[i].size = str2id(pool, stringpool_id2str(spool, keys[i].size), 1);
-       }
+      if (keys[i].type == REPOKEY_TYPE_CONSTANTID && idmap)
+       keys[i].size = idmap[keys[i].size];
 #if 0
       fprintf(stderr, "key %d %s %s %d %d\n", i, id2str(pool,id), id2str(pool, keys[i].type),
                keys[i].size, keys[i].storage);
index 4246ee3..7231c03 100644 (file)
@@ -611,13 +611,13 @@ repodata_lookup_str(Repodata *data, Id solvid, Id keyname)
   if (key->type == REPOKEY_TYPE_STR)
     return (const char *)dp;
   if (key->type == REPOKEY_TYPE_CONSTANTID)
-    return id2str(data->repo->pool, key->size);
-  if (key->type == REPOKEY_TYPE_ID)
+    id = key->size;
+  else if (key->type == REPOKEY_TYPE_ID)
     dp = data_read_id(dp, &id);
   else
     return 0;
   if (data->localpool)
-    return data->spool.stringspace + data->spool.strings[id];
+    return stringpool_id2str(&data->spool, id);
   return id2str(data->repo->pool, id);
 }