uint32_t TDNFQueryTermsHelper( HyPackageList hAccumPkgList, HyQuery hQuery, int nKeyId, const char* pszMatch ) { HyPackageList hPkgList = NULL; HyPackage hPkg = NULL; uint32_t unError = 0; int nIndex = 0; if(!hAccumPkgList || !hQuery || !pszMatch) { unError = ERROR_TDNF_INVALID_PARAMETER; goto error; } unError = hy_query_filter( hQuery, nKeyId, HY_GLOB | HY_ICASE, pszMatch); BAIL_ON_TDNF_HAWKEY_ERROR(unError); hPkgList = hy_query_run(hQuery); if(!hPkgList) { unError = HY_E_IO; BAIL_ON_TDNF_HAWKEY_ERROR(unError); } FOR_PACKAGELIST(hPkg, hPkgList, nIndex) { if (!hy_packagelist_has(hAccumPkgList, hPkg)) { hy_packagelist_push(hAccumPkgList, hy_package_link(hPkg)); } } cleanup: if (hPkgList != NULL) { hy_packagelist_free(hPkgList); } if (hQuery != NULL) { hy_query_clear(hQuery); } return unError; error: goto cleanup; }
/** * hif_goal_get_packages: */ GPtrArray * hif_goal_get_packages (HyGoal goal, ...) { GPtrArray *array; HyPackage pkg; gint info_tmp; guint i; guint j; va_list args; /* process the valist */ va_start (args, goal); array = g_ptr_array_new_with_free_func ((GDestroyNotify) hy_package_free); for (j = 0;; j++) { HyPackageList pkglist = NULL; info_tmp = va_arg (args, gint); if (info_tmp == -1) break; switch (info_tmp) { case HIF_PACKAGE_INFO_REMOVE: pkglist = hy_goal_list_erasures (goal); FOR_PACKAGELIST(pkg, pkglist, i) { hif_package_set_action (pkg, HIF_STATE_ACTION_REMOVE); g_ptr_array_add (array, hy_package_link (pkg)); } break; case HIF_PACKAGE_INFO_INSTALL: pkglist = hy_goal_list_installs (goal); FOR_PACKAGELIST(pkg, pkglist, i) { hif_package_set_action (pkg, HIF_STATE_ACTION_INSTALL); g_ptr_array_add (array, hy_package_link (pkg)); } break; case HIF_PACKAGE_INFO_OBSOLETE: pkglist = hy_goal_list_obsoleted (goal); FOR_PACKAGELIST(pkg, pkglist, i) { hif_package_set_action (pkg, HIF_STATE_ACTION_OBSOLETE); g_ptr_array_add (array, hy_package_link (pkg)); }
static int solution_cb(HyGoal goal, void *data) { struct Solutions *solutions = (struct Solutions*)data; solutions->solutions++; HyPackageList new_installs = hy_goal_list_installs(goal); HyPackage pkg; int i; FOR_PACKAGELIST(pkg, new_installs, i) if (!hy_packagelist_has(solutions->installs, pkg)) hy_packagelist_push(solutions->installs, hy_package_link(pkg)); hy_packagelist_free(new_installs); return 0; }
/** * Returns the package at position 'index'. * * Gives caller a new reference to the package that can survive the * packagelist. The returned package has to be freed via hy_package_free(). */ HyPackage hy_packagelist_get_clone(HyPackageList plist, int index) { return hy_package_link(hy_packagelist_get(plist, index)); }