32 #include "xbps_api_impl.h"
64 if (xhp->pkgdb != NULL)
69 xbps_dbg_printf(xhp,
"[pkgdb] cannot internalize "
70 "pkgdb array: %s\n", strerror(rv));
74 xbps_dbg_printf(xhp,
"[pkgdb] initialized ok.\n");
82 prop_array_t pkgdb_storage;
87 if (cached_rv && !flush)
91 if (xhp->pkgdb && flush) {
92 pkgdb_storage = prop_array_internalize_from_zfile(plist);
93 if (pkgdb_storage == NULL ||
94 !prop_array_equals(xhp->pkgdb, pkgdb_storage)) {
96 if (!prop_array_externalize_to_file(xhp->pkgdb, plist)) {
102 prop_object_release(pkgdb_storage);
104 prop_object_release(xhp->pkgdb);
109 if ((xhp->pkgdb = prop_array_internalize_from_zfile(plist)) == NULL) {
111 xhp->pkgdb = prop_array_create();
113 cached_rv = rv = errno;
125 if (xhp->pkgdb == NULL)
128 if (prop_object_type(xhp->pkg_metad) == PROP_TYPE_DICTIONARY)
129 prop_object_release(xhp->pkg_metad);
131 prop_object_release(xhp->pkgdb);
133 xbps_dbg_printf(xhp,
"[pkgdb] released ok.\n");
138 int (*fn)(
struct xbps_handle *, prop_object_t,
void *,
bool *),
144 if ((rv = xbps_pkgdb_init(xhp)) != 0)
157 int (*fn)(
struct xbps_handle *, prop_object_t,
void *,
bool *),
160 return foreach_pkg_cb(xhp, fn, arg,
true);
165 int (*fn)(
struct xbps_handle *, prop_object_t,
void *,
bool *),
168 return foreach_pkg_cb(xhp, fn, arg,
false);
174 if (xbps_pkgdb_init(xhp) != 0)
177 return xbps_find_pkg_in_array(xhp->pkgdb, pkg);
183 if (xbps_pkgdb_init(xhp) != 0)
186 return xbps_find_virtualpkg_in_array(xhp, xhp->pkgdb, vpkg);
189 static prop_dictionary_t
190 get_pkg_metadata(
struct xbps_handle *xhp, prop_dictionary_t pkgd)
192 prop_dictionary_t pkg_metad;
196 prop_dictionary_get_cstring_nocopy(pkgd,
"pkgname", &pkgname);
198 if ((pkg_metad = prop_dictionary_get(xhp->pkg_metad, pkgname)) != NULL)
202 pkg_metad = prop_dictionary_internalize_from_zfile(plist);
205 if (pkg_metad == NULL) {
206 xbps_dbg_printf(xhp,
"[pkgdb] cannot read %s metadata: %s\n",
207 pkgname, strerror(errno));
211 if (xhp->pkg_metad == NULL)
212 xhp->pkg_metad = prop_dictionary_create();
214 prop_dictionary_set(xhp->pkg_metad, pkgname, pkg_metad);
215 prop_object_release(pkg_metad);
221 generate_full_revdeps_tree(
struct xbps_handle *xhp)
223 prop_array_t rundeps, pkg;
224 prop_dictionary_t pkgmetad;
226 prop_object_iterator_t iter;
227 const char *pkgver, *pkgdep, *vpkgname;
232 if (xhp->pkgdb_revdeps)
235 xhp->pkgdb_revdeps = prop_dictionary_create();
237 iter = prop_array_iterator(xhp->pkgdb);
240 while ((obj = prop_object_iterator_next(iter))) {
245 rundeps = prop_dictionary_get(obj,
"run_depends");
246 if (rundeps == NULL) {
247 pkgmetad = get_pkg_metadata(xhp, obj);
249 rundeps = prop_dictionary_get(pkgmetad,
"run_depends");
251 if (rundeps == NULL || !prop_array_count(rundeps))
254 for (i = 0; i < prop_array_count(rundeps); i++) {
256 prop_array_get_cstring_nocopy(rundeps, i, &pkgdep);
258 if (curpkgname == NULL)
261 vpkgname = vpkg_user_conf(xhp, curpkgname,
false);
262 if (vpkgname == NULL)
263 vpkgname = curpkgname;
265 pkg = prop_dictionary_get(xhp->pkgdb_revdeps, vpkgname);
268 pkg = prop_array_create();
270 prop_dictionary_get_cstring_nocopy(obj,
"pkgver", &pkgver);
271 prop_array_add_cstring_nocopy(pkg, pkgver);
272 prop_dictionary_set(xhp->pkgdb_revdeps, vpkgname, pkg);
275 prop_object_release(pkg);
278 prop_object_iterator_release(iter);
284 prop_dictionary_t pkgd;
290 generate_full_revdeps_tree(xhp);
291 prop_dictionary_get_cstring_nocopy(pkgd,
"pkgname", &pkgname);
293 return prop_dictionary_get(xhp->pkgdb_revdeps, pkgname);
299 prop_dictionary_t pkgd;
305 return get_pkg_metadata(xhp, pkgd);
313 if (xbps_pkgdb_init(xhp) != 0)
317 rv = xbps_remove_pkg_from_array_by_pattern(xhp->pkgdb, pkg);
319 rv = xbps_remove_pkg_from_array_by_pkgver(xhp->pkgdb, pkg);
321 rv = xbps_remove_pkg_from_array_by_name(xhp->pkgdb, pkg);
334 prop_dictionary_t pkgd,
340 if (xbps_pkgdb_init(xhp) != 0)
344 rv = xbps_array_replace_dict_by_pattern(xhp->pkgdb, pkgd, pkg);
346 rv = xbps_array_replace_dict_by_name(xhp->pkgdb, pkgd, pkg);
349 return rv != 0 ?
false :
true;