From: Michael Schroeder Date: Wed, 18 Nov 2015 14:25:10 +0000 (+0100) Subject: Add repodata_lookup_dirstrarray_uninternalized() X-Git-Tag: 0.6.15~24 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=24e0c4f8acae65006dda641aba82a7916e17c03a;p=thirdparty%2Flibsolv.git Add repodata_lookup_dirstrarray_uninternalized() Search the filelist of not yet internalized solvables. Needed for the following commits. --- diff --git a/src/libsolv.ver b/src/libsolv.ver index 5d372aab..65082881 100644 --- a/src/libsolv.ver +++ b/src/libsolv.ver @@ -202,6 +202,7 @@ SOLV_1.0 { repodata_localize_id; repodata_lookup_bin_checksum; repodata_lookup_binary; + repodata_lookup_dirstrarray_uninternalized; repodata_lookup_id; repodata_lookup_id_uninternalized; repodata_lookup_idarray; diff --git a/src/repodata.c b/src/repodata.c index c8542629..15e9706c 100644 --- a/src/repodata.c +++ b/src/repodata.c @@ -849,6 +849,37 @@ repodata_lookup_id_uninternalized(Repodata *data, Id solvid, Id keyname, Id void return 0; } +const char * +repodata_lookup_dirstrarray_uninternalized(Repodata *data, Id solvid, Id keyname, Id *didp, Id *iterp) +{ + Id *ap, did; + Id iter = *iterp; + if (iter == 0) /* find key data */ + { + if (!data->attrs) + return 0; + ap = data->attrs[solvid - data->start]; + if (!ap) + return 0; + for (; *ap; ap += 2) + if (data->keys[*ap].name == keyname && data->keys[*ap].type == REPOKEY_TYPE_DIRSTRARRAY) + break; + if (!*ap) + return 0; + iter = ap[1]; + } + did = *didp; + for (ap = data->attriddata + iter; *ap; ap += 2) + { + if (did && ap[0] != did) + continue; + *didp = ap[0]; + *iterp = ap - data->attriddata + 2; + return (const char *)data->attrdata + ap[1]; + } + *iterp = 0; + return 0; +} /************************************************************************ * data search diff --git a/src/repodata.h b/src/repodata.h index ad05525c..c18c688f 100644 --- a/src/repodata.h +++ b/src/repodata.h @@ -301,6 +301,7 @@ void repodata_set_location(Repodata *data, Id solvid, int medianr, const char *d void repodata_set_deltalocation(Repodata *data, Id handle, int medianr, const char *dir, const char *file); void repodata_set_sourcepkg(Repodata *data, Id solvid, const char *sourcepkg); Id repodata_lookup_id_uninternalized(Repodata *data, Id solvid, Id keyname, Id voidid); +const char *repodata_lookup_dirstrarray_uninternalized(Repodata *data, Id solvid, Id keyname, Id *didp, Id *iterp); /* stats */ unsigned int repodata_memused(Repodata *data);