/** * dnf_package_get_delta_from_evr: * @pkg: a #DnfPackage instance. * @from_evr: the EVR string of what's installed * * Gets the package delta for the package given an existing EVR. * * Returns: a #DnfPackageDelta, or %NULL * * Since: 0.7.0 */ DnfPackageDelta * dnf_package_get_delta_from_evr(DnfPackage *pkg, const char *from_evr) { Pool *pool = dnf_package_get_pool(pkg); Solvable *s = get_solvable(pkg); DnfPackageDelta *delta = NULL; Dataiterator di; const char *name = dnf_package_get_name(pkg); dataiterator_init(&di, pool, s->repo, SOLVID_META, DELTA_PACKAGE_NAME, name, SEARCH_STRING); dataiterator_prepend_keyname(&di, REPOSITORY_DELTAINFO); while (dataiterator_step(&di)) { dataiterator_setpos_parent(&di); if (pool_lookup_id(pool, SOLVID_POS, DELTA_PACKAGE_EVR) != s->evr || pool_lookup_id(pool, SOLVID_POS, DELTA_PACKAGE_ARCH) != s->arch) continue; const char * base_evr = pool_id2str(pool, pool_lookup_id(pool, SOLVID_POS, DELTA_BASE_EVR)); if (strcmp(base_evr, from_evr)) continue; // we have the right delta info, set up DnfPackageDelta *and break out: delta = dnf_packagedelta_new(pool); break; } dataiterator_free(&di); return delta; }
/** * dnf_package_get_advisories: * @pkg: a #DnfPackage instance. * * Gets the list of advisories for the package. * * Returns: (transfer container) (element-type DnfAdvisory): a list * * Since: 0.7.0 */ GPtrArray * dnf_package_get_advisories(DnfPackage *pkg, int cmp_type) { Dataiterator di; Id evr; int cmp; DnfAdvisory *advisory; Pool *pool = dnf_package_get_pool(pkg); DnfSack *sack = dnf_package_get_sack(pkg); GPtrArray *advisorylist = g_ptr_array_new(); Solvable *s = get_solvable(pkg); dataiterator_init(&di, pool, 0, 0, UPDATE_COLLECTION_NAME, pool_id2str(pool, s->name), SEARCH_STRING); dataiterator_prepend_keyname(&di, UPDATE_COLLECTION); while (dataiterator_step(&di)) { dataiterator_setpos_parent(&di); if (pool_lookup_id(pool, SOLVID_POS, UPDATE_COLLECTION_ARCH) != s->arch) continue; evr = pool_lookup_id(pool, SOLVID_POS, UPDATE_COLLECTION_EVR); if (!evr) continue; cmp = pool_evrcmp(pool, evr, s->evr, EVRCMP_COMPARE); if ((cmp > 0 && (cmp_type & HY_GT)) || (cmp < 0 && (cmp_type & HY_LT)) || (cmp == 0 && (cmp_type & HY_EQ))) { advisory = dnf_advisory_new(sack, di.solvid); g_ptr_array_add(advisorylist, advisory); dataiterator_skip_solvable(&di); } } dataiterator_free(&di); return advisorylist; }
HyAdvisoryList hy_package_get_advisories(HyPackage pkg, int cmp_type) { Dataiterator di; Id evr; int cmp; HyAdvisory advisory; Pool *pool = package_pool(pkg); HyAdvisoryList advisorylist = advisorylist_create(pool); Solvable *s = get_solvable(pkg); dataiterator_init(&di, pool, 0, 0, UPDATE_COLLECTION_NAME, pool_id2str(pool, s->name), SEARCH_STRING); dataiterator_prepend_keyname(&di, UPDATE_COLLECTION); while (dataiterator_step(&di)) { dataiterator_setpos_parent(&di); if (pool_lookup_id(pool, SOLVID_POS, UPDATE_COLLECTION_ARCH) != s->arch) continue; evr = pool_lookup_id(pool, SOLVID_POS, UPDATE_COLLECTION_EVR); if (!evr) continue; cmp = pool_evrcmp(pool, evr, s->evr, EVRCMP_COMPARE); if ((cmp > 0 && (cmp_type & HY_GT)) || (cmp < 0 && (cmp_type & HY_LT)) || (cmp == 0 && (cmp_type & HY_EQ))) { advisory = advisory_create(pool, di.solvid); advisorylist_add(advisorylist, advisory); hy_advisory_free(advisory); dataiterator_skip_solvable(&di); } } dataiterator_free(&di); return advisorylist; }
static void susetags_add_ext(Repo *repo, Repodata *data) { Pool *pool = repo->pool; Dataiterator di; char ext[3]; Id handle, filechksumtype; const unsigned char *filechksum; dataiterator_init(&di, pool, repo, SOLVID_META, SUSETAGS_FILE_NAME, 0, 0); dataiterator_prepend_keyname(&di, SUSETAGS_FILE); while (dataiterator_step(&di)) { if (strncmp(di.kv.str, "packages.", 9) != 0) continue; if (!strcmp(di.kv.str + 9, "gz")) continue; if (!di.kv.str[9] || !di.kv.str[10] || (di.kv.str[11] && di.kv.str[11] != '.')) continue; ext[0] = di.kv.str[9]; ext[1] = di.kv.str[10]; ext[2] = 0; if (!strcmp(ext, "en")) continue; if (!susetags_find(repo, di.kv.str, &filechksum, &filechksumtype)) continue; handle = repodata_new_handle(data); repodata_set_str(data, handle, SUSETAGS_FILE_NAME, di.kv.str); if (filechksumtype) repodata_set_bin_checksum(data, handle, SUSETAGS_FILE_CHECKSUM, filechksumtype, filechksum); add_ext_keys(data, handle, ext); repodata_add_flexarray(data, SOLVID_META, REPOSITORY_EXTERNAL, handle); } dataiterator_free(&di); }
static const char * susetags_find(Repo *repo, const char *what, const unsigned char **chksump, Id *chksumtypep) { Pool *pool = repo->pool; Dataiterator di; const char *filename; filename = 0; *chksump = 0; *chksumtypep = 0; dataiterator_init(&di, pool, repo, SOLVID_META, SUSETAGS_FILE_NAME, what, SEARCH_STRING); dataiterator_prepend_keyname(&di, SUSETAGS_FILE); if (dataiterator_step(&di)) { dataiterator_setpos_parent(&di); *chksump = pool_lookup_bin_checksum(pool, SOLVID_POS, SUSETAGS_FILE_CHECKSUM, chksumtypep); filename = what; } dataiterator_free(&di); if (filename && !*chksumtypep) { printf("no %s file checksum!\n", what); filename = 0; } return filename; }
static void doquery(Pool *pool, Repo *repo, const char *query) { Id id, type = 0; char qbuf[256]; const char *qp; Dataiterator di; qp = strchr(query, ':'); if (qp) { type = strn2id(pool, query, qp - query, 0); if (!type) exit(0); qp++; } else qp = query; snprintf(qbuf, sizeof(qbuf), "repository:repomd:%s", qp); id = str2id(pool, qbuf, 0); if (!id) exit(0); dataiterator_init(&di, pool, repo, SOLVID_META, id, 0, 0); dataiterator_prepend_keyname(&di, REPOSITORY_REPOMD); while (dataiterator_step(&di)) { if (type) { dataiterator_setpos_parent(&di); if (pool_lookup_id(pool, SOLVID_POS, REPOSITORY_REPOMD_TYPE) != type) continue; } switch (di.key->type) { case REPOKEY_TYPE_ID: case REPOKEY_TYPE_CONSTANTID: printf("%s\n", id2str(pool, di.kv.id)); break; case REPOKEY_TYPE_STR: printf("%s\n", di.kv.str); break; case REPOKEY_TYPE_NUM: printf("%d\n", di.kv.num); break; case REPOKEY_TYPE_SHA1: printf("sha1:%s\n", repodata_chk2str(di.data, di.key->type, (unsigned char *)di.kv.str)); break; case REPOKEY_TYPE_SHA256: printf("sha256:%s\n", repodata_chk2str(di.data, di.key->type, (unsigned char *)di.kv.str)); break; default: break; } } dataiterator_free(&di); }
HyPackageDelta hy_package_get_delta_from_evr(HyPackage pkg, const char *from_evr) { Pool *pool = package_pool(pkg); Solvable *s = get_solvable(pkg); HyPackageDelta delta = NULL; Dataiterator di; Id checksum_type; const unsigned char *checksum; const char *name = hy_package_get_name(pkg); dataiterator_init(&di, pool, s->repo, SOLVID_META, DELTA_PACKAGE_NAME, name, SEARCH_STRING); dataiterator_prepend_keyname(&di, REPOSITORY_DELTAINFO); while (dataiterator_step(&di)) { dataiterator_setpos_parent(&di); if (pool_lookup_id(pool, SOLVID_POS, DELTA_PACKAGE_EVR) != s->evr || pool_lookup_id(pool, SOLVID_POS, DELTA_PACKAGE_ARCH) != s->arch) continue; const char * base_evr = pool_id2str(pool, pool_lookup_id(pool, SOLVID_POS, DELTA_BASE_EVR)); if (strcmp(base_evr, from_evr)) continue; // we have the right delta info, set up HyPackageDelta and break out: delta = delta_create(); delta->location = solv_strdup(pool_lookup_deltalocation(pool, SOLVID_POS, 0)); delta->baseurl = solv_strdup(pool_lookup_str(pool, SOLVID_POS, DELTA_LOCATION_BASE)); delta->downloadsize = pool_lookup_num(pool, SOLVID_POS, DELTA_DOWNLOADSIZE, 0); checksum = pool_lookup_bin_checksum(pool, SOLVID_POS, DELTA_CHECKSUM, &checksum_type); if (checksum) { delta->checksum_type = checksumt_l2h(checksum_type); delta->checksum = solv_memdup((void*)checksum, checksum_type2length(delta->checksum_type)); } break; } dataiterator_free(&di); return delta; }
END_TEST static void check_prestoinfo(Pool *pool) { Dataiterator di; dataiterator_init(&di, pool, NULL, SOLVID_META, DELTA_PACKAGE_NAME, "tour", SEARCH_STRING); dataiterator_prepend_keyname(&di, REPOSITORY_DELTAINFO); fail_unless(dataiterator_step(&di)); dataiterator_setpos_parent(&di); const char *attr; attr = pool_lookup_str(pool, SOLVID_POS, DELTA_SEQ_NAME); ck_assert_str_eq(attr, "tour"); attr = pool_lookup_str(pool, SOLVID_POS, DELTA_SEQ_EVR); ck_assert_str_eq(attr, "4-5"); attr = pool_lookup_str(pool, SOLVID_POS, DELTA_LOCATION_DIR); ck_assert_str_eq(attr, "drpms"); dataiterator_free(&di); return; }