@@ -933,86 +933,121 @@ repodata_translate_dir_slow(Repodata *data, Repodata *fromdata, Id dir, int crea
933933 return compid ;
934934}
935935
936- /* uninternalized lookups */
936+ /************************************************************************
937+ * uninternalized lookup / search
938+ */
937939
938- Id
939- repodata_lookup_id_uninternalized (Repodata * data , Id solvid , Id keyname , Id voidid )
940+ static void
941+ data_fetch_uninternalized (Repodata * data , Repokey * key , Id value , KeyValue * kv )
942+ {
943+ Id * array ;
944+ kv -> eof = 1 ;
945+ switch (key -> type )
946+ {
947+ case REPOKEY_TYPE_STR :
948+ kv -> str = (const char * )data -> attrdata + value ;
949+ return ;
950+ case REPOKEY_TYPE_CONSTANT :
951+ kv -> num2 = 0 ;
952+ kv -> num = key -> size ;
953+ return ;
954+ case REPOKEY_TYPE_CONSTANTID :
955+ kv -> id = key -> size ;
956+ return ;
957+ case REPOKEY_TYPE_NUM :
958+ kv -> num2 = 0 ;
959+ kv -> num = value ;
960+ if (value & 0x80000000 )
961+ {
962+ kv -> num = (unsigned int )data -> attrnum64data [value ^ 0x80000000 ];
963+ kv -> num2 = (unsigned int )(data -> attrnum64data [value ^ 0x80000000 ] >> 32 );
964+ }
965+ return ;
966+ case_CHKSUM_TYPES :
967+ kv -> num = 0 ; /* not stringified */
968+ kv -> str = (const char * )data -> attrdata + value ;
969+ return ;
970+ case REPOKEY_TYPE_IDARRAY :
971+ array = data -> attriddata + (value + kv -> entry );
972+ kv -> id = array [0 ];
973+ kv -> eof = array [1 ] ? 0 : 1 ;
974+ return ;
975+ case REPOKEY_TYPE_DIRSTRARRAY :
976+ kv -> num = 0 ; /* not stringified */
977+ array = data -> attriddata + (value + kv -> entry * 2 );
978+ kv -> id = array [0 ];
979+ kv -> str = (const char * )data -> attrdata + array [1 ];
980+ kv -> eof = array [2 ] ? 0 : 1 ;
981+ return ;
982+ case REPOKEY_TYPE_DIRNUMNUMARRAY :
983+ array = data -> attriddata + (value + kv -> entry * 3 );
984+ kv -> id = array [0 ];
985+ kv -> num = array [1 ];
986+ kv -> num2 = array [2 ];
987+ kv -> eof = array [3 ] ? 0 : 1 ;
988+ return ;
989+ case REPOKEY_TYPE_FIXARRAY :
990+ case REPOKEY_TYPE_FLEXARRAY :
991+ array = data -> attriddata + (value + kv -> entry );
992+ kv -> id = array [0 ]; /* the handle */
993+ kv -> eof = array [1 ] ? 0 : 1 ;
994+ return ;
995+ default :
996+ kv -> id = value ;
997+ return ;
998+ }
999+ }
1000+
1001+ Repokey *
1002+ repodata_lookup_kv_uninternalized (Repodata * data , Id solvid , Id keyname , KeyValue * kv )
9401003{
9411004 Id * ap ;
942- if (!data -> attrs )
1005+ if (!data -> attrs || solvid < data -> start || solvid >= data -> end )
9431006 return 0 ;
9441007 ap = data -> attrs [solvid - data -> start ];
9451008 if (!ap )
9461009 return 0 ;
9471010 for (; * ap ; ap += 2 )
9481011 {
949- if (data -> keys [* ap ].name != keyname )
1012+ Repokey * key = data -> keys + * ap ;
1013+ if (key -> name != keyname )
9501014 continue ;
951- if (data -> keys [* ap ].type == REPOKEY_TYPE_VOID )
952- return voidid ;
953- if (data -> keys [* ap ].type == REPOKEY_TYPE_ID )
954- return ap [1 ];
955- return 0 ;
1015+ data_fetch_uninternalized (data , key , ap [1 ], kv );
1016+ return key ;
9561017 }
9571018 return 0 ;
9581019}
9591020
960- /* returns the basename, stores the dir id in didp */
961- const char *
962- repodata_lookup_dirstrarray_uninternalized (Repodata * data , Id solvid , Id keyname , Id * didp , Id * iterp )
963- {
964- Id * ap , did ;
965- Id iter = * iterp ;
966- if (iter == 0 ) /* find key data */
967- {
968- if (!data -> attrs )
969- return 0 ;
970- ap = data -> attrs [solvid - data -> start ];
971- if (!ap )
972- return 0 ;
973- for (; * ap ; ap += 2 )
974- if (data -> keys [* ap ].name == keyname && data -> keys [* ap ].type == REPOKEY_TYPE_DIRSTRARRAY )
975- break ;
976- if (!* ap )
977- return 0 ;
978- iter = ap [1 ];
979- }
980- did = * didp ;
981- for (ap = data -> attriddata + iter ; * ap ; ap += 2 )
982- {
983- if (did && ap [0 ] != did )
984- continue ;
985- * didp = ap [0 ];
986- * iterp = ap - data -> attriddata + 2 ;
987- return (const char * )data -> attrdata + ap [1 ];
988- }
989- * iterp = 0 ;
990- return 0 ;
991- }
992-
993- const unsigned char *
994- repodata_lookup_bin_checksum_uninternalized (Repodata * data , Id solvid , Id keyname , Id * typep )
1021+ void
1022+ repodata_search_uninternalized (Repodata * data , Id solvid , Id keyname , int flags , int (* callback )(void * cbdata , Solvable * s , Repodata * data , Repokey * key , KeyValue * kv ), void * cbdata )
9951023{
9961024 Id * ap ;
997- if (!data -> attrs )
998- return 0 ;
1025+ int stop ;
1026+ Solvable * s ;
1027+ KeyValue kv ;
1028+
1029+ if (!data -> attrs || solvid < data -> start || solvid >= data -> end )
1030+ return ;
9991031 ap = data -> attrs [solvid - data -> start ];
10001032 if (!ap )
1001- return 0 ;
1033+ return ;
10021034 for (; * ap ; ap += 2 )
10031035 {
1004- if (data -> keys [* ap ].name != keyname )
1036+ Repokey * key = data -> keys + * ap ;
1037+ if (keyname && key -> name != keyname )
10051038 continue ;
1006- switch (data -> keys [* ap ].type )
1039+ s = solvid > 0 ? data -> repo -> pool -> solvables + solvid : 0 ;
1040+ kv .entry = 0 ;
1041+ do
10071042 {
1008- case_CHKSUM_TYPES :
1009- * typep = data -> keys [* ap ].type ;
1010- return (const unsigned char * )data -> attrdata + ap [1 ];
1011- default :
1012- break ;
1043+ data_fetch_uninternalized (data , key , ap [1 ], & kv );
1044+ stop = callback (cbdata , s , data , key , & kv );
1045+ kv .entry ++ ;
10131046 }
1047+ while (!kv .eof && !stop );
1048+ if (keyname || stop > SEARCH_NEXT_KEY )
1049+ return ;
10141050 }
1015- return 0 ;
10161051}
10171052
10181053/************************************************************************
0 commit comments