From ff7d544c8975e20f4d592d2f7988c6f99fd8067f Mon Sep 17 00:00:00 2001 From: Michael Schroeder Date: Mon, 17 Dec 2007 17:53:01 +0000 Subject: [PATCH] - removed verticals for now to make work easier - allow NULL idmap --- src/repo.h | 8 +-- src/repo_solv.c | 183 ++++++++++++----------------------------------------- tools/repo_write.c | 93 ++------------------------- 3 files changed, 49 insertions(+), 235 deletions(-) diff --git a/src/repo.h b/src/repo.h index a27b9ba..8586c54 100644 --- a/src/repo.h +++ b/src/repo.h @@ -54,11 +54,11 @@ typedef struct _Repodata { unsigned char *entryschemau8; /* schema for entry */ Id *entryschema; /* schema for entry */ - unsigned char *incoredata; /* in-core data */ - unsigned int incoredatalen; /* data len */ - unsigned int incoredatafree; /* data len */ + unsigned char *incoredata; /* in-core data (flat_attrs) */ + unsigned int incoredatalen; /* data len (attr_next_free) */ + unsigned int incoredatafree; /* free data len */ - Id *incoreoffset; /* offset for all entries */ + Id *incoreoffset; /* offset for all entries (ent2attr) */ FILE *fp; /* for paged access */ Id verticaloffset; /* offset of verticals */ diff --git a/src/repo_solv.c b/src/repo_solv.c index 53fdca0..bbc2bda 100644 --- a/src/repo_solv.c +++ b/src/repo_solv.c @@ -184,7 +184,7 @@ read_idarray(FILE *fp, Id max, Id *map, Id *store, Id *end, int relative) } 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) @@ -331,7 +331,7 @@ parse_repodata (FILE *fp, Id *keyp, Repokey *keys, Id *idmap, unsigned numid, un 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; @@ -749,7 +749,10 @@ repo_add_solv(Repo *repo, FILE *fp) /* 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; @@ -869,126 +872,6 @@ repo_add_solv(Repo *repo, FILE *fp) 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]) @@ -1000,7 +883,9 @@ repo_add_solv(Repo *repo, FILE *fp) 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) @@ -1048,32 +933,41 @@ repo_add_solv(Repo *repo, FILE *fp) { 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 { @@ -1081,6 +975,7 @@ repo_add_solv(Repo *repo, FILE *fp) ; break; } + break; } ido = idarraydatap - repo->idarraydata; idarraydatap = read_idarray(fp, numid + numrel, idmap, idarraydatap, idarraydataend, keys[key].type == TYPE_REL_IDARRAY); diff --git a/tools/repo_write.c b/tools/repo_write.c index 4c69fab..6cae428 100644 --- a/tools/repo_write.c +++ b/tools/repo_write.c @@ -371,6 +371,7 @@ addschema(struct schemata *schemata, Id *schema) return schemaid; } + /* * Repo */ @@ -421,6 +422,11 @@ repo_write(Repo *repo, FILE *fp) 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) @@ -456,12 +462,6 @@ repo_write(Repo *repo, FILE *fp) 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]) @@ -698,87 +698,6 @@ repo_write(Repo *repo, FILE *fp) 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 */ -- 2.7.4