]> git.ipfire.org Git - thirdparty/libsolv.git/commitdiff
Add rpm_query_idarray query function
authorMichael Schroeder <mls@suse.de>
Mon, 16 Sep 2024 13:43:45 +0000 (15:43 +0200)
committerMichael Schroeder <mls@suse.de>
Mon, 16 Sep 2024 13:43:45 +0000 (15:43 +0200)
This is added to query the OrderWithRequires dependencies from
downloaded rpms.

Also refactor query code a bit.

ext/libsolvext.ver
ext/repo_rpmdb.c
ext/repo_rpmdb.h

index 4102301851f8ff393b36fa2ad2355bced492f457..a2e8628b2b0385617d1d32afe06de263d20f5ef9 100644 (file)
@@ -51,6 +51,7 @@ SOLV_1.0 {
                rpm_installedrpmdbids;
                rpm_iterate_filelist;
                rpm_query;
+               rpm_query_idarray;
                rpm_query_num;
                rpm_stat_database;
                rpm_state_create;
index c2556086e7fd3dbc2b8d61bc158b833830e100f2..c2803fc74aa5626e507454d4c26e9ff6fba46a7f 100644 (file)
@@ -524,6 +524,30 @@ static char *headtoevr(RpmHead *h)
   return evr;
 }
 
+static const char *headtoarch_nodup(RpmHead *h)
+{
+  const char *arch;
+  if (!headstring(h, TAG_SOURCERPM) && (headexists(h, TAG_SOURCEPACKAGE) || headissourceheuristic(h)))
+    return headexists(h, TAG_NOSOURCE) || headexists(h, TAG_NOPATCH) ? "nosrc" : "src";
+  arch = headstring(h, TAG_ARCH);
+  return arch ? arch : "noarch";
+}
+
+static char *headtocanon(RpmHead *h)
+{
+  const char *name, *arch;
+  char *evr, *r;
+
+  name = headstring(h, TAG_NAME);
+  if (!name)
+    name = "";
+  arch = headtoarch_nodup(h);
+  evr = headtoevr(h);
+  r = solv_malloc(strlen(name) + 1 + strlen(evr ? evr : "") + 1 + strlen(arch) + 1);
+  sprintf(r, "%s-%s.%s", name, evr ? evr : "", arch);
+  solv_free(evr);
+  return r;
+}
 
 static void
 setutf8string(Repodata *repodata, Id handle, Id tag, const char *str)
@@ -604,7 +628,7 @@ makedeps(Pool *pool, Repo *repo, RpmHead *rpmhead, int tagn, int tagv, int tagf,
   f = headint32array(rpmhead, tagf, &fc);
   if (!v || !f || nc != vc || nc != fc)
     {
-      char *pkgname = rpm_query(rpmhead, 0);
+      char *pkgname = headtocanon(rpmhead);
       pool_error(pool, 0, "bad dependency entries for %s: %d %d %d", pkgname ? pkgname : "<NULL>", nc, vc, fc);
       solv_free(pkgname);
       solv_free(n);
@@ -2356,53 +2380,28 @@ rpm_iterate_filelist(void *rpmhandle, int flags, void (*cb)(void *, const char *
 char *
 rpm_query(void *rpmhandle, Id what)
 {
-  const char *name, *arch, *sourcerpm;
-  char *evr, *r;
-  int l;
-
   RpmHead *rpmhead = rpmhandle;
-  r = 0;
+  int tag = 0;
+
   switch (what)
     {
     case 0:    /* return canonical name of rpm */
-      name = headstring(rpmhead, TAG_NAME);
-      if (!name)
-       name = "";
-      sourcerpm = headstring(rpmhead, TAG_SOURCERPM);
-      if (sourcerpm || !(headexists(rpmhead, TAG_SOURCEPACKAGE) || headissourceheuristic(rpmhead)))
-       arch = headstring(rpmhead, TAG_ARCH);
-      else
-       {
-         if (headexists(rpmhead, TAG_NOSOURCE) || headexists(rpmhead, TAG_NOPATCH))
-           arch = "nosrc";
-         else
-           arch = "src";
-       }
-      if (!arch)
-       arch = "noarch";
-      evr = headtoevr(rpmhead);
-      l = strlen(name) + 1 + strlen(evr ? evr : "") + 1 + strlen(arch) + 1;
-      r = solv_malloc(l);
-      sprintf(r, "%s-%s.%s", name, evr ? evr : "", arch);
-      solv_free(evr);
-      break;
+      return headtocanon(rpmhead);
     case SOLVABLE_NAME:
-      name = headstring(rpmhead, TAG_NAME);
-      r = solv_strdup(name);
+      tag = TAG_NAME;
       break;
+    case SOLVABLE_ARCH:
+      return solv_strdup(headtoarch_nodup(rpmhead));
+    case SOLVABLE_EVR:
+      return headtoevr(rpmhead);
     case SOLVABLE_SUMMARY:
-      name = headstring(rpmhead, TAG_SUMMARY);
-      r = solv_strdup(name);
+      tag = TAG_SUMMARY;
       break;
     case SOLVABLE_DESCRIPTION:
-      name = headstring(rpmhead, TAG_DESCRIPTION);
-      r = solv_strdup(name);
-      break;
-    case SOLVABLE_EVR:
-      r = headtoevr(rpmhead);
+      tag = TAG_DESCRIPTION;
       break;
     }
-  return r;
+  return tag ? solv_strdup(headstring(rpmhead, tag)) : 0;
 }
 
 unsigned long long
@@ -2430,6 +2429,29 @@ rpm_query_num(void *rpmhandle, Id what, unsigned long long notfound)
   return notfound;
 }
 
+void
+rpm_query_idarray(void *rpmhandle, Id what, Pool *pool, Queue *q, int flags)
+{
+  RpmHead *rpmhead = rpmhandle;
+  queue_empty(q);
+  switch(what)
+    {
+    case SOLVABLE_PROVIDES:
+      makedeps(pool, NULL, rpmhead, TAG_PROVIDENAME, TAG_PROVIDEVERSION, TAG_PROVIDEFLAGS, flags, q);
+      return;
+    case SOLVABLE_REQUIRES:
+      makedeps(pool, NULL, rpmhead, TAG_REQUIRENAME, TAG_REQUIREVERSION, TAG_REQUIREFLAGS, flags, q);
+      return;
+    case SOLVABLE_CONFLICTS:
+      makedeps(pool, NULL, rpmhead, TAG_CONFLICTNAME, TAG_CONFLICTVERSION, TAG_CONFLICTFLAGS, flags, q);
+      return;
+    case SOLVABLE_ORDERWITHREQUIRES:
+      makedeps(pool, NULL, rpmhead, TAG_ORDERNAME, TAG_ORDERVERSION, TAG_ORDERFLAGS, flags, q);
+      return;
+    }
+}
+
+
 #ifdef ENABLE_RPMDB
 
 int
index 08f8319568dade4e2f9a983629ae1dd05d46bf53..894502fe5fbff124ad1519beac105c5c205ed9db 100644 (file)
@@ -64,5 +64,6 @@ struct filelistinfo {
 
 extern char *rpm_query(void *rpmhandle, Id what);
 extern unsigned long long rpm_query_num(void *rpmhandle, Id what, unsigned long long notfound);
+extern void rpm_query_idarray(void *rpmhandle, Id what, Pool *pool, Queue *q, int flags);
 extern void rpm_iterate_filelist(void *rpmhandle, int flags, void (*cb)(void *, const char *, struct filelistinfo *), void *cbdata);
 extern Id   repo_add_rpm_handle(Repo *repo, void *rpmhandle, int flags);