pool_free_solvable_block(pool, 2, pool->nsolvables - 2, reuseids);
}
+
+#define REPO_SIDEDATA_BLOCK 63
+
+void *
+repo_sidedata_create(Repo *repo, size_t size)
+{
+ return sat_calloc_block(repo->end - repo->start, size, REPO_SIDEDATA_BLOCK);
+}
+
+void *
+repo_sidedata_extend(Repo *repo, void *b, size_t size, Id p, int count)
+{
+ int n = repo->end - repo->start;
+ if (p < repo->start)
+ {
+ int d = repo->start - p;
+ b = sat_extend(b, n, d, size, REPO_SIDEDATA_BLOCK);
+ memmove(b + d * size, b, n * size);
+ memset(b, 0, d * size);
+ n += d;
+ }
+ if (p + count > repo->end)
+ {
+ int d = p + count - repo->end;
+ b = sat_extend(b, n, d, size, REPO_SIDEDATA_BLOCK);
+ memset(b + n * size, 0, d * size);
+ }
+ return b;
+}
+
Offset
repo_fix_supplements(Repo *repo, Offset provides, Offset supplements, Offset freshens)
{
extern Repo *repo_create(Pool *pool, const char *name);
extern void repo_free(Repo *repo, int reuseids);
extern void repo_freeallrepos(Pool *pool, int reuseids);
+extern void *repo_sidedata_create(Repo *repo, size_t size);
+extern void *repo_sidedata_extend(Repo *repo, void *b, size_t size, Id p, int count);
extern Offset repo_addid(Repo *repo, Offset olddeps, Id id);
extern Offset repo_addid_dep(Repo *repo, Offset olddeps, Id id, Id marker);
}
else
{
+ if (repo->rpmdbid)
+ repo->rpmdbid = repo_sidedata_extend(repo, repo->rpmdbid, sizeof(Id), p, 1);
if (p < repo->start)
repo->start = p;
if (p + 1 > repo->end)
}
else
{
+ if (repo->rpmdbid)
+ repo->rpmdbid = repo_sidedata_extend(repo, repo->rpmdbid, sizeof(Id), p, count);
if (p < repo->start)
repo->start = p;
if (p + count > repo->end)
if (id == RPM_RPMDBID)
{
if (!repo->rpmdbid)
- repo->rpmdbid = sat_calloc(numsolv, sizeof(Id));
+ repo->rpmdbid = repo_sidedata_create(repo, sizeof(Id));
repo->rpmdbid[i] = h;
}
else if (keys[key].storage == KEY_STORAGE_INCORE)
solvable_identical(Pool *pool, Solvable *s1, Solvable *s2)
{
unsigned int bt1, bt2;
-#if 0
Id rq1, rq2;
Id *reqp;
-#endif
if (s1->name != s2->name)
return 0;
if (s1->vendor != s2->vendor)
return 0;
- /* disabled for now because some testcases have requires where the
- duplicates are removed */
-#if 0
- /* first tests passed, try requires */
- rq1 = rq2 = 0;
- if (s1->requires)
- for (reqp = s1->repo->idarraydata + s1->requires; *reqp; reqp++)
- rq1 ^= *reqp++;
- if (s2->requires)
- for (reqp = s2->repo->idarraydata + s2->requires; *reqp; reqp++)
- rq2 ^= *reqp++;
- if (rq1 != rq2)
- return 0;
-#endif
-
/* looking good, try some fancier stuff */
+ /* might also look up the package checksum here */
bt1 = solvable_lookup_num(s1, SOLVABLE_BUILDTIME, 0);
bt2 = solvable_lookup_num(s2, SOLVABLE_BUILDTIME, 0);
- if (bt1 && bt2 && bt1 != bt2)
- return 0;
-
- /* might also look up the package checksum here */
+ if (bt1 && bt2)
+ {
+ if (bt1 != bt2)
+ return 0;
+ }
+ else
+ {
+ /* look at requires in a last attempt to find recompiled packages */
+ rq1 = rq2 = 0;
+ if (s1->requires)
+ for (reqp = s1->repo->idarraydata + s1->requires; *reqp; reqp++)
+ rq1 ^= *reqp++;
+ if (s2->requires)
+ for (reqp = s2->repo->idarraydata + s2->requires; *reqp; reqp++)
+ rq2 ^= *reqp++;
+ if (rq1 != rq2)
+ return 0;
+ }
return 1;
}
Solvable *s;
Id id, *refhash;
unsigned int refmask, h;
- int asolv;
char dbpath[PATH_MAX];
DB_ENV *dbenv = 0;
DBT dbkey;
memset(&dbkey, 0, sizeof(dbkey));
memset(&dbdata, 0, sizeof(dbdata));
- if (repo->start != repo->end)
- abort(); /* FIXME: rpmdbid */
-
if (!rootdir)
rootdir = "";
exit(1);
}
dbidp = (unsigned char *)&dbid;
- repo->rpmdbid = sat_calloc(256, sizeof(Id));
- asolv = 256;
rpmheadsize = 0;
rpmhead = 0;
i = 0;
{
if (!s)
s = pool_id2solvable(pool, repo_add_solvable(repo));
- if (i >= asolv)
- {
- repo->rpmdbid = sat_realloc(repo->rpmdbid, (asolv + 256) * sizeof(Id));
- memset(repo->rpmdbid + asolv, 0, 256 * sizeof(unsigned int));
- asolv += 256;
- }
+ if (!repo->rpmdbid)
+ repo->rpmdbid = repo_sidedata_create(repo, sizeof(Id));
if (dbkey.size != 4)
{
fprintf(stderr, "corrupt Packages database (key size)\n");
}
memcpy(rpmhead->data, (unsigned char *)dbdata.data + 8, rpmhead->cnt * 16 + rpmhead->dcnt);
rpmhead->dp = rpmhead->data + rpmhead->cnt * 16;
- repo->rpmdbid[i] = dbid;
+ repo->rpmdbid[(s - pool->solvables) - repo->start] = dbid;
if (rpm2solv(pool, repo, repodata, s, rpmhead))
{
i++;
/* create hash from dbid to ref */
refmask = mkmask(ref->nsolvables);
refhash = sat_calloc(refmask + 1, sizeof(Id));
- for (i = 0; i < ref->nsolvables; i++)
+ for (i = 0; i < ref->end - ref->start; i++)
{
+ if (!ref->rpmdbid[i])
+ continue;
h = ref->rpmdbid[i] & refmask;
while (refhash[h])
h = (h + 317) & refmask;
refhash[h] = i + 1; /* make it non-zero */
}
- repo->rpmdbid = sat_calloc(nrpmids, sizeof(unsigned int));
s = pool_id2solvable(pool, repo_add_solvable_block(repo, nrpmids));
+ if (!repo->rpmdbid)
+ repo->rpmdbid = repo_sidedata_create(repo, sizeof(Id));
for (i = 0; i < nrpmids; i++, rp++, s++)
{
dbid = rp->dbid;
- repo->rpmdbid[i] = dbid;
+ repo->rpmdbid[(s - pool->solvables) - repo->start] = dbid;
if (refhash)
{
h = dbid & refmask;
if (id)
{
Solvable *r = ref->pool->solvables + ref->start + (id - 1);
- solvable_copy(s, r, repodata, dircache);
- continue;
+ if (r->repo == ref)
+ {
+ solvable_copy(s, r, repodata, dircache);
+ continue;
+ }
}
}
if (!db)