Skip to content

Commit 819bbc2

Browse files
committed
Add repo_lookup_count and solvable_lookup_count functions
Also refactor the way we access the dependencies in the solvable a bit by adding a solvable_offsetptr helper function.
1 parent 0f74322 commit 819bbc2

4 files changed

Lines changed: 84 additions & 62 deletions

File tree

src/repo.c

Lines changed: 76 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -737,6 +737,32 @@ domatch_idarray(Solvable *s, Id keyname, struct matchdata *md, Id *ida)
737737
}
738738
}
739739

740+
static Offset *
741+
solvable_offsetptr(Solvable *s, Id keyname)
742+
{
743+
switch(keyname)
744+
{
745+
case SOLVABLE_PROVIDES:
746+
return &s->provides;
747+
case SOLVABLE_OBSOLETES:
748+
return &s->obsoletes;
749+
case SOLVABLE_CONFLICTS:
750+
return &s->conflicts;
751+
case SOLVABLE_REQUIRES:
752+
return &s->requires;
753+
case SOLVABLE_RECOMMENDS:
754+
return &s->recommends;
755+
case SOLVABLE_SUGGESTS:
756+
return &s->suggests;
757+
case SOLVABLE_SUPPLEMENTS:
758+
return &s->supplements;
759+
case SOLVABLE_ENHANCES:
760+
return &s->enhances;
761+
default:
762+
return 0;
763+
}
764+
}
765+
740766
static void
741767
repo_search_md(Repo *repo, Id p, Id keyname, struct matchdata *md)
742768
{
@@ -1131,43 +1157,32 @@ repo_lookup_id(Repo *repo, Id entry, Id keyname)
11311157
return 0;
11321158
}
11331159

1134-
static int
1135-
lookup_idarray_solvable(Repo *repo, Offset off, Queue *q)
1136-
{
1137-
Id *p;
1138-
1139-
queue_empty(q);
1140-
if (off)
1141-
for (p = repo->idarraydata + off; *p; p++)
1142-
queue_push(q, *p);
1143-
return 1;
1144-
}
1145-
11461160
int
11471161
repo_lookup_idarray(Repo *repo, Id entry, Id keyname, Queue *q)
11481162
{
11491163
Repodata *data;
11501164
int i;
11511165
if (entry >= 0)
11521166
{
1167+
Offset *offp;
11531168
switch (keyname)
11541169
{
11551170
case SOLVABLE_PROVIDES:
1156-
return lookup_idarray_solvable(repo, repo->pool->solvables[entry].provides, q);
11571171
case SOLVABLE_OBSOLETES:
1158-
return lookup_idarray_solvable(repo, repo->pool->solvables[entry].obsoletes, q);
11591172
case SOLVABLE_CONFLICTS:
1160-
return lookup_idarray_solvable(repo, repo->pool->solvables[entry].conflicts, q);
11611173
case SOLVABLE_REQUIRES:
1162-
return lookup_idarray_solvable(repo, repo->pool->solvables[entry].requires, q);
11631174
case SOLVABLE_RECOMMENDS:
1164-
return lookup_idarray_solvable(repo, repo->pool->solvables[entry].recommends, q);
11651175
case SOLVABLE_SUGGESTS:
1166-
return lookup_idarray_solvable(repo, repo->pool->solvables[entry].suggests, q);
11671176
case SOLVABLE_SUPPLEMENTS:
1168-
return lookup_idarray_solvable(repo, repo->pool->solvables[entry].supplements, q);
11691177
case SOLVABLE_ENHANCES:
1170-
return lookup_idarray_solvable(repo, repo->pool->solvables[entry].enhances, q);
1178+
offp = solvable_offsetptr(repo->pool->solvables + entry, keyname);
1179+
if (*offp)
1180+
{
1181+
Id *p;
1182+
for (p = repo->idarraydata + *offp; *p; p++)
1183+
queue_push(q, *p);
1184+
}
1185+
return 1;
11711186
}
11721187
}
11731188
data = repo_lookup_repodata_opt(repo, entry, keyname);
@@ -1270,6 +1285,37 @@ repo_lookup_binary(Repo *repo, Id entry, Id keyname, int *lenp)
12701285
return 0;
12711286
}
12721287

1288+
unsigned int
1289+
repo_lookup_count(Repo *repo, Id entry, Id keyname)
1290+
{
1291+
Repodata *data;
1292+
if (keyname >= SOLVABLE_NAME && keyname <= RPM_RPMDBID)
1293+
if (entry >= 0 && keyname >= SOLVABLE_NAME && keyname <= RPM_RPMDBID)
1294+
{
1295+
Id *p;
1296+
Offset *offp;
1297+
unsigned int cnt;
1298+
switch (keyname)
1299+
{
1300+
case SOLVABLE_PROVIDES:
1301+
case SOLVABLE_OBSOLETES:
1302+
case SOLVABLE_CONFLICTS:
1303+
case SOLVABLE_REQUIRES:
1304+
case SOLVABLE_RECOMMENDS:
1305+
case SOLVABLE_SUGGESTS:
1306+
case SOLVABLE_SUPPLEMENTS:
1307+
case SOLVABLE_ENHANCES:
1308+
offp = solvable_offsetptr(repo->pool->solvables + entry, keyname);
1309+
for (cnt = 0, p = repo->idarraydata + *offp; *p; p++)
1310+
cnt++;
1311+
return cnt;
1312+
}
1313+
return 1;
1314+
}
1315+
data = repo_lookup_repodata_opt(repo, entry, keyname);
1316+
return data ? repodata_lookup_count(data, entry, keyname) : 0;
1317+
}
1318+
12731319
/***********************************************************************/
12741320

12751321
Repodata *
@@ -1429,32 +1475,19 @@ repo_add_deparray(Repo *repo, Id p, Id keyname, Id dep, Id marker)
14291475
marker = solv_depmarker(keyname, marker);
14301476
if (p >= 0)
14311477
{
1432-
Solvable *s = repo->pool->solvables + p;
1478+
Offset *offp;
14331479
switch (keyname)
14341480
{
14351481
case SOLVABLE_PROVIDES:
1436-
s->provides = repo_addid_dep(repo, s->provides, dep, marker);
1437-
return;
14381482
case SOLVABLE_OBSOLETES:
1439-
s->obsoletes = repo_addid_dep(repo, s->obsoletes, dep, marker);
1440-
return;
14411483
case SOLVABLE_CONFLICTS:
1442-
s->conflicts = repo_addid_dep(repo, s->conflicts, dep, marker);
1443-
return;
14441484
case SOLVABLE_REQUIRES:
1445-
s->requires = repo_addid_dep(repo, s->requires, dep, marker);
1446-
return;
14471485
case SOLVABLE_RECOMMENDS:
1448-
s->recommends = repo_addid_dep(repo, s->recommends, dep, marker);
1449-
return;
14501486
case SOLVABLE_SUGGESTS:
1451-
s->suggests = repo_addid_dep(repo, s->suggests, dep, marker);
1452-
return;
14531487
case SOLVABLE_SUPPLEMENTS:
1454-
s->supplements = repo_addid_dep(repo, s->supplements, dep, marker);
1455-
return;
14561488
case SOLVABLE_ENHANCES:
1457-
s->enhances = repo_addid_dep(repo, s->enhances, dep, marker);
1489+
offp = solvable_offsetptr(repo->pool->solvables + p, keyname);
1490+
*offp = repo_addid_dep(repo, *offp, dep, marker);
14581491
return;
14591492
}
14601493
}
@@ -1468,16 +1501,6 @@ repo_add_idarray(Repo *repo, Id p, Id keyname, Id id)
14681501
repo_add_deparray(repo, p, keyname, id, 0);
14691502
}
14701503

1471-
static Offset
1472-
repo_set_idarray_solvable(Repo *repo, Queue *q)
1473-
{
1474-
Offset o = 0;
1475-
int i;
1476-
for (i = 0; i < q->count; i++)
1477-
repo_addid_dep(repo, o, q->elements[i], 0);
1478-
return o;
1479-
}
1480-
14811504
void
14821505
repo_set_deparray(Repo *repo, Id p, Id keyname, Queue *q, Id marker)
14831506
{
@@ -1512,32 +1535,23 @@ repo_set_deparray(Repo *repo, Id p, Id keyname, Queue *q, Id marker)
15121535
}
15131536
if (p >= 0)
15141537
{
1515-
Solvable *s = repo->pool->solvables + p;
1538+
Offset off, *offp;
1539+
int i;
15161540
switch (keyname)
15171541
{
15181542
case SOLVABLE_PROVIDES:
1519-
s->provides = repo_set_idarray_solvable(repo, q);
1520-
return;
15211543
case SOLVABLE_OBSOLETES:
1522-
s->obsoletes = repo_set_idarray_solvable(repo, q);
1523-
return;
15241544
case SOLVABLE_CONFLICTS:
1525-
s->conflicts = repo_set_idarray_solvable(repo, q);
1526-
return;
15271545
case SOLVABLE_REQUIRES:
1528-
s->requires = repo_set_idarray_solvable(repo, q);
1529-
return;
15301546
case SOLVABLE_RECOMMENDS:
1531-
s->recommends = repo_set_idarray_solvable(repo, q);
1532-
return;
15331547
case SOLVABLE_SUGGESTS:
1534-
s->suggests = repo_set_idarray_solvable(repo, q);
1535-
return;
15361548
case SOLVABLE_SUPPLEMENTS:
1537-
s->supplements = repo_set_idarray_solvable(repo, q);
1538-
return;
15391549
case SOLVABLE_ENHANCES:
1540-
s->enhances = repo_set_idarray_solvable(repo, q);
1550+
off = 0;
1551+
for (i = 0; i < q->count; i++)
1552+
off = repo_addid_dep(repo, off, q->elements[i], 0);
1553+
offp = solvable_offsetptr(repo->pool->solvables + p, keyname);
1554+
*offp = off;
15411555
return;
15421556
}
15431557
}

src/repo.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,7 @@ int repo_lookup_void(Repo *repo, Id entry, Id keyname);
189189
const char *repo_lookup_checksum(Repo *repo, Id entry, Id keyname, Id *typep);
190190
const unsigned char *repo_lookup_bin_checksum(Repo *repo, Id entry, Id keyname, Id *typep);
191191
const void *repo_lookup_binary(Repo *repo, Id entry, Id keyname, int *lenp);
192+
unsigned int repo_lookup_count(Repo *repo, Id entry, Id keyname); /* internal */
192193
Id solv_depmarker(Id keyname, Id marker);
193194

194195
void repo_set_id(Repo *repo, Id p, Id keyname, Id id);

src/solvable.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -323,6 +323,12 @@ solvable_lookup_checksum(Solvable *s, Id keyname, Id *typep)
323323
return chk ? pool_bin2hex(s->repo->pool, chk, solv_chksum_len(*typep)) : 0;
324324
}
325325

326+
unsigned int
327+
solvable_lookup_count(Solvable *s, Id keyname)
328+
{
329+
return s->repo ? repo_lookup_count(s->repo, s - s->repo->pool->solvables, keyname) : 0;
330+
}
331+
326332
static inline const char *
327333
evrid2vrstr(Pool *pool, Id evrid)
328334
{

src/solvable.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ const unsigned char *solvable_lookup_bin_checksum(Solvable *s, Id keyname, Id *t
6464
const char *solvable_lookup_checksum(Solvable *s, Id keyname, Id *typep);
6565
int solvable_lookup_idarray(Solvable *s, Id keyname, Queue *q);
6666
int solvable_lookup_deparray(Solvable *s, Id keyname, Queue *q, Id marker);
67+
unsigned int solvable_lookup_count(Solvable *s, Id keyname); /* internal */
6768

6869
/* setter functions */
6970
void solvable_set_id(Solvable *s, Id keyname, Id id);

0 commit comments

Comments
 (0)