support RPM_ADD_WITH_CHANGELOG in repo_add_rpmdb
authorMichael Schroeder <mls@suse.de>
Mon, 25 Feb 2013 14:02:24 +0000 (15:02 +0100)
committerMichael Schroeder <mls@suse.de>
Mon, 25 Feb 2013 14:02:24 +0000 (15:02 +0100)
For people who want to make their solv file really big...

ext/repo_rpmdb.c
ext/repo_rpmdb.h
ext/repo_rpmmd.c
src/knownid.h
src/repo_write.c
tools/common_write.c

index 57f7f43..8efaa16 100644 (file)
@@ -86,6 +86,9 @@
 #define TAG_TRIGGERNAME                1066
 #define TAG_TRIGGERVERSION     1067
 #define TAG_TRIGGERFLAGS       1068
+#define TAG_CHANGELOGTIME      1080
+#define TAG_CHANGELOGNAME      1081
+#define TAG_CHANGELOGTEXT      1082
 #define TAG_OBSOLETENAME       1090
 #define TAG_FILEDEVICES                1095
 #define TAG_FILEINODES         1096
@@ -834,6 +837,46 @@ addfileprovides(Pool *pool, Repo *repo, Repodata *data, Solvable *s, RpmHead *rp
   return olddeps;
 }
 
+static void
+addchangelog(Repodata *data, Id handle, RpmHead *rpmhead)
+{
+  char **cn;
+  char **cx;
+  unsigned int *ct;
+  int i, cnc, cxc, ctc;
+  Queue hq;
+
+  ct = headint32array(rpmhead, TAG_CHANGELOGTIME, &ctc);
+  cx = headstringarray(rpmhead, TAG_CHANGELOGTEXT, &cxc);
+  cn = headstringarray(rpmhead, TAG_CHANGELOGNAME, &cnc);
+  if (!ct || !cx || !cn || !ctc || ctc != cxc || ctc != cnc)
+    {
+      solv_free(ct);
+      solv_free(cx);
+      solv_free(cn);
+      return;
+    }
+  queue_init(&hq);
+  for (i = 0; i < ctc; i++)
+    {
+      Id h = repodata_new_handle(data);
+      if (ct[i])
+        repodata_set_num(data, h, SOLVABLE_CHANGELOG_TIME, ct[i]);
+      if (cn[i])
+        repodata_set_str(data, h, SOLVABLE_CHANGELOG_AUTHOR, cn[i]);
+      if (cx[i])
+        repodata_set_str(data, h, SOLVABLE_CHANGELOG_TEXT, cx[i]);
+      queue_push(&hq, h);
+    }
+  for (i = 0; i < hq.count; i++)
+    repodata_add_flexarray(data, handle, SOLVABLE_CHANGELOG, hq.elements[i]);
+  queue_free(&hq);
+  solv_free(ct);
+  solv_free(cx);
+  solv_free(cn);
+}
+
+
 static int
 rpm2solv(Pool *pool, Repo *repo, Repodata *data, Solvable *s, RpmHead *rpmhead, int flags)
 {
@@ -1005,6 +1048,8 @@ rpm2solv(Pool *pool, Repo *repo, Repodata *data, Solvable *s, RpmHead *rpmhead,
              lastid = id;
            }
        }
+      if ((flags & RPM_ADD_WITH_CHANGELOG) != 0)
+       addchangelog(data, handle, rpmhead);
     }
   solv_free(evr);
   return 1;
@@ -1095,6 +1140,7 @@ copydir_complex(Pool *pool, Repodata *data, Stringpool *fromspool, Repodata *fro
 struct solvable_copy_cbdata {
   Repodata *data;
   Id handle;
+  Id subhandle;
   Id *dircache;
 };
 
@@ -1156,6 +1202,22 @@ solvable_copy_cb(void *vcbdata, Solvable *r, Repodata *fromdata, Repokey *key, K
       id = copydir(pool, data, fromspool, fromdata, id, cbdata->dircache);
       repodata_add_dirstr(data, handle, keyname, id, kv->str);
       break;
+    case REPOKEY_TYPE_FLEXARRAY:
+      if (kv->eof == 2)
+       {
+         assert(cbdata->subhandle);
+         cbdata->handle = cbdata->subhandle;
+         cbdata->subhandle = 0;
+         break;
+       }
+      if (!kv->entry)
+        {
+         assert(!cbdata->subhandle);
+         cbdata->subhandle = cbdata->handle;
+       }
+      cbdata->handle = repodata_new_handle(data);
+      repodata_add_flexarray(data, cbdata->subhandle, keyname, cbdata->handle);
+      break;
     default:
       break;
     }
@@ -1203,8 +1265,9 @@ solvable_copy(Solvable *s, Solvable *r, Repodata *data, Id *dircache)
     return;
   cbdata.data = data;
   cbdata.handle = s - pool->solvables;
+  cbdata.subhandle = 0;
   cbdata.dircache = dircache;
-  repo_search(fromrepo, (r - fromrepo->pool->solvables), 0, 0, SEARCH_NO_STORAGE_SOLVABLE, solvable_copy_cb, &cbdata);
+  repo_search(fromrepo, (r - fromrepo->pool->solvables), 0, 0, SEARCH_NO_STORAGE_SOLVABLE | SEARCH_SUB | SEARCH_ARRAYSENTINEL, solvable_copy_cb, &cbdata);
 }
 
 /* used to sort entries returned in some database order */
index 1e12de7..fdc6120 100644 (file)
@@ -24,6 +24,7 @@ extern Id repo_add_pubkey(Repo *repo, const char *key, int flags);
 #define RPM_ADD_TRIGGERS       (1 << 14)
 #define RPM_ADD_WITH_HDRID     (1 << 15)
 #define RPM_ADD_WITH_LEADSIGID (1 << 16)
+#define RPM_ADD_WITH_CHANGELOG  (1 << 17)
 
 #define RPM_ITERATE_FILELIST_ONLYDIRS  (1 << 0)
 #define RPM_ITERATE_FILELIST_WITHMD5   (1 << 1)
index 50e5a99..603b27b 100644 (file)
@@ -1053,7 +1053,7 @@ endElement(void *userData, const char *name)
         repodata_set_str(pd->data, pd->handle, SOLVABLE_ORDER, pd->content);
       break;
     case STATE_CHANGELOG:
-      repodata_set_str(pd->data, pd->changelog_handle, SOLVABLE_CHANGELOG_DESCRIPTION, pd->content);
+      repodata_set_str(pd->data, pd->changelog_handle, SOLVABLE_CHANGELOG_TEXT, pd->content);
       repodata_add_flexarray(pd->data, pd->handle, SOLVABLE_CHANGELOG, pd->changelog_handle);
       pd->changelog_handle = 0;
       break;
index 1b680ba..9c8e064 100644 (file)
@@ -248,7 +248,7 @@ KNOWNID(REPOSITORY_REPOMD_SIZE,             "repository:repomd:size"),
 KNOWNID(SOLVABLE_CHANGELOG,            "solvable:changelog"),
 KNOWNID(SOLVABLE_CHANGELOG_AUTHOR,     "solvable:changelog:author"),
 KNOWNID(SOLVABLE_CHANGELOG_TIME,       "solvable:changelog:time"),
-KNOWNID(SOLVABLE_CHANGELOG_DESCRIPTION,        "solvable:changelog:description"),
+KNOWNID(SOLVABLE_CHANGELOG_TEXT,       "solvable:changelog:text"),
 
 KNOWNID(ID_NUM_INTERNAL,               0)
 
index f6e9fd6..fd8ff40 100644 (file)
@@ -976,6 +976,8 @@ static Id verticals[] = {
   SOLVABLE_PKGID,
   SOLVABLE_HDRID,
   SOLVABLE_LEADSIGID,
+  SOLVABLE_CHANGELOG_AUTHOR,
+  SOLVABLE_CHANGELOG_TEXT,
   0
 };
 
index 75c75b5..6de8a69 100644 (file)
@@ -27,6 +27,8 @@ static Id verticals[] = {
   SOLVABLE_EULA,
   SOLVABLE_DISKUSAGE,
   SOLVABLE_FILELIST,
+  SOLVABLE_CHANGELOG_AUTHOR,
+  SOLVABLE_CHANGELOG_TEXT,
   0
 };