Skip to content

Commit

Permalink
Add rpm_query_idarray query function
Browse files Browse the repository at this point in the history
This is added to query the OrderWithRequires dependencies from
downloaded rpms.

Also refactor query code a bit.
  • Loading branch information
mlschroe committed Sep 16, 2024
1 parent c295980 commit e64cecf
Show file tree
Hide file tree
Showing 3 changed files with 61 additions and 37 deletions.
1 change: 1 addition & 0 deletions ext/libsolvext.ver
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
96 changes: 59 additions & 37 deletions ext/repo_rpmdb.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down
1 change: 1 addition & 0 deletions ext/repo_rpmdb.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);

0 comments on commit e64cecf

Please sign in to comment.