- bring side data handling into better shape
authorMichael Schroeder <mls@suse.de>
Wed, 10 Sep 2008 13:05:02 +0000 (13:05 +0000)
committerMichael Schroeder <mls@suse.de>
Wed, 10 Sep 2008 13:05:02 +0000 (13:05 +0000)
- reactivate solvable_identical requires check if we can't compare
  the build time

src/repo.c
src/repo.h
src/repo_solv.c
src/solvable.c
tools/repo_rpmdb.c

index 16be78e..df9a414 100644 (file)
@@ -315,6 +315,36 @@ repo_freeallrepos(Pool *pool, int reuseids)
   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)
 {
index b282153..931ad8f 100644 (file)
@@ -57,6 +57,8 @@ typedef struct _Repo {
 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);
@@ -80,6 +82,8 @@ static inline Id repo_add_solvable(Repo *repo)
     }
   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)
@@ -105,6 +109,8 @@ static inline Id repo_add_solvable_block(Repo *repo, int count)
     }
   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)
index 99a3f21..ccc2b23 100644 (file)
@@ -1402,7 +1402,7 @@ repo_add_solv_parent(Repo *repo, FILE *fp, Repodata *parent)
              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)
index 212fd0a..2ca310c 100644 (file)
@@ -608,10 +608,8 @@ int
 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;
@@ -622,27 +620,27 @@ solvable_identical(Pool *pool, Solvable *s1, Solvable *s2)
   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;
 }
index 0efc8b3..9ca6b23 100644 (file)
@@ -1202,7 +1202,6 @@ repo_add_rpmdb(Repo *repo, Repodata *repodata, Repo *ref, const char *rootdir)
   Solvable *s;
   Id id, *refhash;
   unsigned int refmask, h;
-  int asolv;
   char dbpath[PATH_MAX];
   DB_ENV *dbenv = 0;
   DBT dbkey;
@@ -1213,9 +1212,6 @@ repo_add_rpmdb(Repo *repo, Repodata *repodata, Repo *ref, const char *rootdir)
   memset(&dbkey, 0, sizeof(dbkey));
   memset(&dbdata, 0, sizeof(dbdata));
 
-  if (repo->start != repo->end)
-    abort();           /* FIXME: rpmdbid */
-  
   if (!rootdir)
     rootdir = "";
 
@@ -1273,8 +1269,6 @@ repo_add_rpmdb(Repo *repo, Repodata *repodata, Repo *ref, const char *rootdir)
          exit(1);
        }
       dbidp = (unsigned char *)&dbid;
-      repo->rpmdbid = sat_calloc(256, sizeof(Id));
-      asolv = 256;
       rpmheadsize = 0;
       rpmhead = 0;
       i = 0;
@@ -1283,12 +1277,8 @@ repo_add_rpmdb(Repo *repo, Repodata *repodata, Repo *ref, const char *rootdir)
        {
          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");
@@ -1323,7 +1313,7 @@ repo_add_rpmdb(Repo *repo, Repodata *repodata, Repo *ref, const char *rootdir)
            }
          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++;
@@ -1432,21 +1422,24 @@ repo_add_rpmdb(Repo *repo, Repodata *repodata, Repo *ref, const char *rootdir)
       /* 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;
@@ -1459,8 +1452,11 @@ repo_add_rpmdb(Repo *repo, Repodata *repodata, Repo *ref, const char *rootdir)
              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)