}
static void
-read_str (FILE *fp, char **inbuf, unsigned *len)
+read_str(FILE *fp, char **inbuf, unsigned *len)
{
unsigned char *buf = (unsigned char*)*inbuf;
if (!buf)
pool_debug (mypool, SAT_FATAL, "invalid attribute data\n");
exit (1);
}
- data->keys[i].name = idmap[*ide++];
+ data->keys[i].name = idmap ? idmap[*ide++] : *ide++;
data->keys[i].type = *ide++;
data->keys[i].size = 0;
data->keys[i].storage = 0;
/* keys start at 1 */
for (i = 1; i < numkeys; i++)
{
- keys[i].name = id = idmap[read_id(fp, numid)];
+ id = read_id(fp, numid);
+ if (idmap)
+ id = idmap[id];
+ keys[i].name = id;
keys[i].type = read_id(fp, 0);
keys[i].size = read_id(fp, 0);
keys[i].storage = KEY_STORAGE_DROPPED;
data.start = s - pool->solvables;
data.end = data.start + numsolv;
- if ((solvflags & SOLV_FLAG_VERTICAL) != 0)
- {
- Id *solvschema = xcalloc(numsolv, sizeof(Id));
- unsigned char *used = xmalloc(numschemata);
- Solvable *sstart = s;
- Id type;
-
-/* XXX BROKEN CODE */
-
- for (i = 0; i < numsolv; i++)
- solvschema[i] = read_id(fp, numschemata);
- for (key = 1; key < numkeys; key++)
- {
- id = keys[key].name;
- type = keys[key].type;
- memset(used, 0, numschemata);
- for (i = 0; i < numschemata; i++)
- {
- Id *keyp = schemadata + schemata[i];
- while (*keyp)
- if (*keyp++ == key)
- {
- used[i] = 1;
- break;
- }
- }
- for (i = 0, s = sstart; i < numsolv; i++, s++)
- {
- if (!used[solvschema[i]])
- continue;
- switch (type)
- {
- case TYPE_ID:
- did = idmap[read_id(fp, numid + numrel)];
- if (id == SOLVABLE_NAME)
- s->name = did;
- else if (id == SOLVABLE_ARCH)
- s->arch = did;
- else if (id == SOLVABLE_EVR)
- s->evr = did;
- else if (id == SOLVABLE_VENDOR)
- s->vendor = did;
- else
- incore_add_id(&data, did);
- break;
- case TYPE_U32:
- h = read_u32(fp);
- if (id == RPM_RPMDBID)
- {
- if (!repo->rpmdbid)
- repo->rpmdbid = (Id *)xcalloc(numsolv, sizeof(Id));
- repo->rpmdbid[i] = h;
- }
- else
- {
- incore_add_u32(&data, h);
- }
- break;
- case TYPE_STR:
- while(read_u8(fp) != 0)
- ;
- break;
- case TYPE_IDARRAY:
- case TYPE_REL_IDARRAY:
- if (id < INTERESTED_START || id > INTERESTED_END)
- {
- /* not interested in array */
- while ((read_u8(fp) & 0xc0) != 0)
- ;
- break;
- }
- ido = idarraydatap - repo->idarraydata;
- idarraydatap = read_idarray(fp, numid + numrel, idmap, idarraydatap, idarraydataend, type == TYPE_REL_IDARRAY);
- if (id == SOLVABLE_PROVIDES)
- s->provides = ido;
- else if (id == SOLVABLE_OBSOLETES)
- s->obsoletes = ido;
- else if (id == SOLVABLE_CONFLICTS)
- s->conflicts = ido;
- else if (id == SOLVABLE_REQUIRES)
- s->requires = ido;
- else if (id == SOLVABLE_RECOMMENDS)
- s->recommends= ido;
- else if (id == SOLVABLE_SUPPLEMENTS)
- s->supplements = ido;
- else if (id == SOLVABLE_SUGGESTS)
- s->suggests = ido;
- else if (id == SOLVABLE_ENHANCES)
- s->enhances = ido;
- else if (id == SOLVABLE_FRESHENS)
- s->freshens = ido;
- break;
- case TYPE_VOID:
- break;
-#if 0
- case TYPE_ATTR_INT:
- case TYPE_ATTR_CHUNK:
- case TYPE_ATTR_STRING:
- case TYPE_ATTR_INTLIST:
- case TYPE_ATTR_LOCALIDS:
- if (!embedded_store)
- embedded_store = new_store (pool);
- add_attr_from_file (embedded_store, i, id, type, idmap, numid, fp);
- break;
-#endif
- default:
- abort();
- }
- }
- }
- xfree(used);
- xfree(solvschema);
- xfree(idmap);
- xfree(schemata);
- xfree(schemadata);
- xfree(keys);
- mypool = 0;
- return;
- }
-
for (i = 0; i < numsolv; i++, s++)
{
if (exists && !exists[i])
switch (keys[key].type)
{
case TYPE_ID:
- did = idmap[read_id(fp, numid + numrel)];
+ did = read_id(fp, numid + numrel);
+ if (idmap)
+ did = idmap[did];
if (id == SOLVABLE_NAME)
s->name = did;
else if (id == SOLVABLE_ARCH)
{
if (keys[key].storage == KEY_STORAGE_INCORE)
{
- Id old = 0, rel = keys[key].type == TYPE_REL_IDARRAY ? SOLVABLE_PREREQMARKER : 0;
- do
+ if (idmap)
{
- did = read_id(fp, 0);
- h = did & 0x40;
- did = (did & 0x3f) | ((did >> 1) & ~0x3f);
- if (rel)
+ Id old = 0, rel = keys[key].type == TYPE_REL_IDARRAY ? SOLVABLE_PREREQMARKER : 0;
+ do
{
- if (did == 0)
+ did = read_id(fp, 0);
+ h = did & 0x40;
+ did = (did & 0x3f) | ((did >> 1) & ~0x3f);
+ if (rel)
{
- did = rel;
- old = 0;
- }
- else
- {
- did += old;
- old = did;
+ if (did == 0)
+ {
+ did = rel;
+ old = 0;
+ }
+ else
+ {
+ did += old;
+ old = did;
+ }
}
+ if (did >= numid + numrel)
+ abort();
+ did = idmap[did];
+ did = ((did & ~0x3f) << 1) | h;
+ incore_add_id(&data, did);
}
- if (did >= numid + numrel)
- abort();
- did = idmap[did];
- did = ((did & ~0x3f) << 1) | h;
- incore_add_id(&data, did);
+ while (h);
+ }
+ else
+ {
+ while (((h = read_u8(fp)) & 0xc0) != 0)
+ incore_add_u8(&data, h);
+ break;
}
- while (h);
}
else
{
;
break;
}
+ break;
}
ido = idarraydatap - repo->idarraydata;
idarraydatap = read_idarray(fp, numid + numrel, idmap, idarraydatap, idarraydataend, keys[key].type == TYPE_REL_IDARRAY);
return schemaid;
}
+
/*
* Repo
*/
idsizes[REPODATA_KEYS] += 2 * repo->repodata[i].nkeys;
}
+ idsizes[SOLVABLE_NAME] = 1;
+ idsizes[SOLVABLE_ARCH] = 1;
+ idsizes[SOLVABLE_EVR] = 1;
+ if (repo->rpmdbid)
+ idsizes[RPM_RPMDBID] = 1;
for (i = repo->start, s = pool->solvables + i; i < repo->end; i++, s++)
{
if (s->repo != repo)
if (nsolvables != repo->nsolvables)
abort();
- idsizes[SOLVABLE_NAME] = 1;
- idsizes[SOLVABLE_ARCH] = 1;
- idsizes[SOLVABLE_EVR] = 1;
- if (repo->rpmdbid)
- idsizes[RPM_RPMDBID] = 1;
-
for (i = SOLVABLE_NAME; i < ID_NUM_INTERNAL; i++)
{
if (idsizes[i])
write_str(fp, repo->repodata[i].location);
}
-#if 0
- if (1)
- {
- Id id, key;
-
- for (i = 0; i < nsolvables; i++)
- write_id(fp, solvschema[i]);
- unsigned char *used = xmalloc(schemata.nschemata);
- for (id = SOLVABLE_NAME; id <= RPM_RPMDBID; id++)
- {
- key = id2key[id];
- memset(used, 0, nschemata);
- for (sp = schemata.schemadata + 1, i = 0; sp < schemata.schemadatap; sp++)
- {
- if (*sp == 0)
- i++;
- else if (*sp == key)
- used[i] = 1;
- }
- for (i = repo->start, s = pool->solvables + i, n = 0; i < repo->end; i++, s++)
- {
- if (s->repo != repo)
- continue;
- if (!used[solvschema[n++]])
- continue;
- switch(id)
- {
- case SOLVABLE_NAME:
- write_id(fp, needid[s->name].need);
- break;
- case SOLVABLE_ARCH:
- write_id(fp, needid[s->arch].need);
- break;
- case SOLVABLE_EVR:
- write_id(fp, needid[s->evr].need);
- break;
- case SOLVABLE_VENDOR:
- write_id(fp, needid[s->vendor].need);
- break;
- case RPM_RPMDBID:
- write_u32(fp, repo->rpmdbid[i - repo->start]);
- break;
- case SOLVABLE_PROVIDES:
- write_idarray(fp, pool, needid, idarraydata + s->provides);
- break;
- case SOLVABLE_OBSOLETES:
- write_idarray(fp, pool, needid, idarraydata + s->obsoletes);
- break;
- case SOLVABLE_CONFLICTS:
- write_idarray(fp, pool, needid, idarraydata + s->conflicts);
- break;
- case SOLVABLE_REQUIRES:
- write_idarray(fp, pool, needid, idarraydata + s->requires);
- break;
- case SOLVABLE_RECOMMENDS:
- write_idarray(fp, pool, needid, idarraydata + s->recommends);
- break;
- case SOLVABLE_SUPPLEMENTS:
- write_idarray(fp, pool, needid, idarraydata + s->supplements);
- break;
- case SOLVABLE_SUGGESTS:
- write_idarray(fp, pool, needid, idarraydata + s->suggests);
- break;
- case SOLVABLE_ENHANCES:
- write_idarray(fp, pool, needid, idarraydata + s->enhances);
- break;
- case SOLVABLE_FRESHENS:
- write_idarray(fp, pool, needid, idarraydata + s->freshens);
- break;
- }
- }
- }
- xfree(used);
- xfree(needid);
- xfree(solvschema);
- xfree(schemata.schemadata);
- return;
- }
-
-#endif
-
/*
* write Solvables
*/