@@ -1176,7 +1176,6 @@ repowriter_write(Repowriter *writer, FILE *fp)
11761176 struct extdata * xd ;
11771177
11781178 Id type_constantid = 0 ;
1179- Id type_dirstrarray = 0 ;
11801179
11811180
11821181 memset (& cbdata , 0 , sizeof (cbdata ));
@@ -1212,11 +1211,11 @@ repowriter_write(Repowriter *writer, FILE *fp)
12121211 if (i < SOLVABLE_PROVIDES )
12131212 keyd .type = REPOKEY_TYPE_ID ;
12141213 else if (i < RPM_RPMDBID )
1215- #ifdef USE_REL_IDARRAY
1214+ #ifdef USE_REL_IDARRAY
12161215 keyd .type = REPOKEY_TYPE_REL_IDARRAY ;
1217- #else
1216+ #else
12181217 keyd .type = REPOKEY_TYPE_IDARRAY ;
1219- #endif
1218+ #endif
12201219 else
12211220 keyd .type = REPOKEY_TYPE_NUM ;
12221221 keyd .size = 0 ;
@@ -1432,41 +1431,6 @@ for (i = 1; i < target.nkeys; i++)
14321431 fprintf (stderr , " %2d: %s[%d] %d %d %d\n" , i , pool_id2str (pool , target .keys [i ].name ), target .keys [i ].name , target .keys [i ].type , target .keys [i ].size , target .keys [i ].storage );
14331432#endif
14341433
1435- /* copy keys if requested */
1436- if (writer -> keyq )
1437- {
1438- queue_empty (writer -> keyq );
1439- for (i = 1 ; i < target .nkeys ; i ++ )
1440- queue_push2 (writer -> keyq , target .keys [i ].name , target .keys [i ].type );
1441- }
1442-
1443- if (poolusage > 1 )
1444- {
1445- /* put all the keys we need in our string pool */
1446- /* put mapped ids right into target.keys */
1447- for (i = 1 , key = target .keys + i ; i < target .nkeys ; i ++ , key ++ )
1448- {
1449- key -> name = stringpool_str2id (spool , pool_id2str (pool , key -> name ), 1 );
1450- id = stringpool_str2id (spool , pool_id2str (pool , key -> type ), 1 );
1451- if (key -> type == REPOKEY_TYPE_CONSTANTID )
1452- {
1453- type_constantid = id ;
1454- key -> size = stringpool_str2id (spool , pool_id2str (pool , key -> size ), 1 );
1455- }
1456- if (key -> type == REPOKEY_TYPE_DIRSTRARRAY )
1457- type_dirstrarray = id ;
1458- key -> type = id ;
1459- }
1460- if (poolusage == 2 )
1461- stringpool_freehash (spool ); /* free some mem */
1462- }
1463- else
1464- {
1465- type_constantid = REPOKEY_TYPE_CONSTANTID ;
1466- type_dirstrarray = REPOKEY_TYPE_DIRSTRARRAY ;
1467- }
1468-
1469-
14701434/********************************************************************/
14711435
14721436 searchflags = SEARCH_SUB |SEARCH_ARRAYSENTINEL ;
@@ -1481,6 +1445,12 @@ for (i = 1; i < target.nkeys; i++)
14811445 reloff = spool -> nstrings ;
14821446 if (cbdata .ownspool )
14831447 reloff = (reloff + NEEDID_BLOCK ) & ~NEEDID_BLOCK ;
1448+ else if (poolusage == 2 )
1449+ {
1450+ /* we'll need to put the key data into the spool,
1451+ * so leave some room. 3 * nkeys is an upper bound */
1452+ reloff += 3 * target .nkeys ;
1453+ }
14841454
14851455 needid = calloc (reloff + pool -> nrels , sizeof (* needid ));
14861456 needid [0 ].map = reloff ; /* remember size in case we need to grow */
@@ -1571,21 +1541,11 @@ for (i = 1; i < target.nkeys; i++)
15711541 {
15721542 if (!keyused [i ])
15731543 continue ;
1574- keyused [i ] = n ;
15751544 if (i != n )
1576- {
1577- target .keys [n ] = target .keys [i ];
1578- if (writer -> keyq )
1579- {
1580- writer -> keyq -> elements [2 * n - 2 ] = writer -> keyq -> elements [2 * i - 2 ];
1581- writer -> keyq -> elements [2 * n - 1 ] = writer -> keyq -> elements [2 * i - 1 ];
1582- }
1583- }
1584- n ++ ;
1545+ target .keys [n ] = target .keys [i ];
1546+ keyused [i ] = n ++ ;
15851547 }
15861548 target .nkeys = n ;
1587- if (writer -> keyq )
1588- queue_truncate (writer -> keyq , 2 * n - 2 );
15891549
15901550 /* update schema data to the new key ids */
15911551 for (i = 1 ; i < (int )target .schemadatalen ; i ++ )
@@ -1595,9 +1555,59 @@ for (i = 1; i < target.nkeys; i++)
15951555 keymap [i ] = keyused [keymap [i ]];
15961556 keyused = solv_free (keyused );
15971557
1558+ /* copy keys if requested */
1559+ if (writer -> keyq )
1560+ {
1561+ queue_empty (writer -> keyq );
1562+ for (i = 1 ; i < target .nkeys ; i ++ )
1563+ queue_push2 (writer -> keyq , target .keys [i ].name , target .keys [i ].type );
1564+ }
1565+
1566+ /********************************************************************/
1567+
1568+ /* check if we can do the special filelist memory optimization */
1569+ /* we do the check before the keys are mapped */
1570+ if (anysolvableused && anyrepodataused )
1571+ {
1572+ for (i = 1 ; i < target .nkeys ; i ++ )
1573+ if (target .keys [i ].storage == KEY_STORAGE_VERTICAL_OFFSET )
1574+ cbdata .filelistmode |= cbdata .filelistmode == 0 && target .keys [i ].type == REPOKEY_TYPE_DIRSTRARRAY ? 1 : 2 ;
1575+ else if (target .keys [i ].type == REPOKEY_TYPE_DIRSTRARRAY )
1576+ cbdata .filelistmode = 2 ;
1577+ if (cbdata .filelistmode != 1 )
1578+ cbdata .filelistmode = 0 ;
1579+ }
1580+
1581+ /********************************************************************/
1582+
1583+ if (poolusage > 1 )
1584+ {
1585+ /* put all the keys in our string pool */
1586+ /* put mapped ids right into target.keys */
1587+ for (i = 1 , key = target .keys + i ; i < target .nkeys ; i ++ , key ++ )
1588+ {
1589+ key -> name = stringpool_str2id (spool , pool_id2str (pool , key -> name ), 1 );
1590+ id = stringpool_str2id (spool , pool_id2str (pool , key -> type ), 1 );
1591+ if (key -> type == REPOKEY_TYPE_CONSTANTID )
1592+ {
1593+ type_constantid = id ;
1594+ key -> size = stringpool_str2id (spool , pool_id2str (pool , key -> size ), 1 );
1595+ }
1596+ key -> type = id ;
1597+ }
1598+ if (poolusage == 2 )
1599+ stringpool_freehash (spool ); /* free some mem */
1600+ if (cbdata .ownspool && spool -> nstrings > needid [0 ].map )
1601+ {
1602+ grow_needid (& cbdata , spool -> nstrings - 1 );
1603+ needid = cbdata .needid ; /* we relocated */
1604+ reloff = needid [0 ].map ; /* we have a new offset */
1605+ }
1606+ }
1607+ else
1608+ type_constantid = REPOKEY_TYPE_CONSTANTID ;
15981609
1599- /* increment needid of the keys, they are already mapped to
1600- * the correct string pool */
1610+ /* increment needid of the keys */
16011611 for (i = 1 ; i < target .nkeys ; i ++ )
16021612 {
16031613 if (target .keys [i ].type == type_constantid )
@@ -1737,13 +1747,9 @@ for (i = 1; i < target.nkeys; i++)
17371747 for (i = 1 ; i < reloff + pool -> nrels ; i ++ )
17381748 needid [i ].map = i ;
17391749
1740- #if 0
1741- solv_sort (needid + 1 , spool -> nstrings - 1 , sizeof (* needid ), needid_cmp_need_s , spool );
1742- #else
17431750 /* make first entry '' */
17441751 needid [1 ].need = 1 ;
17451752 solv_sort (needid + 2 , spool -> nstrings - 2 , sizeof (* needid ), needid_cmp_need_s , spool );
1746- #endif
17471753 solv_sort (needid + reloff , pool -> nrels , sizeof (* needid ), needid_cmp_need , 0 );
17481754 /* now needid is in new order, needid[newid].map -> oldid */
17491755
@@ -1854,18 +1860,6 @@ for (i = 1; i < target.nkeys; i++)
18541860 data_addid (xd , nsolvables ); /* FLEXARRAY nentries */
18551861 cbdata .doingsolvables = 1 ;
18561862
1857- /* check if we can do the special filelist memory optimization */
1858- if (anyrepodataused )
1859- {
1860- for (i = 1 ; i < target .nkeys ; i ++ )
1861- if (target .keys [i ].storage == KEY_STORAGE_VERTICAL_OFFSET )
1862- cbdata .filelistmode |= cbdata .filelistmode == 0 && target .keys [i ].type == type_dirstrarray ? 1 : 2 ;
1863- else if (target .keys [i ].type == type_dirstrarray )
1864- cbdata .filelistmode = 2 ;
1865- if (cbdata .filelistmode != 1 )
1866- cbdata .filelistmode = 0 ;
1867- }
1868-
18691863 for (i = solvablestart , s = pool -> solvables + i , n = 0 ; i < solvableend ; i ++ , s ++ )
18701864 {
18711865 if (s -> repo != repo )
0 commit comments