@@ -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+
740766static void
741767repo_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-
11461160int
11471161repo_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
12751321Repodata *
@@ -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-
14811504void
14821505repo_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 }
0 commit comments