/** * as_pool_load: * @pool: An instance of #AsPool. * @error: A #GError or %NULL. * * Builds an index of all found components in the watched locations. * The function will try to get as much data into the pool as possible, so even if * the update completes with %FALSE, it might still have added components to the pool. * * The function will load from all possible data sources, preferring caches if they * are up to date. * * Returns: %TRUE if update completed without error. **/ gboolean as_pool_load (AsPool *pool, GCancellable *cancellable, GError **error) { gboolean ret; gboolean ret2; AsPoolPrivate *priv = GET_PRIVATE (pool); /* load means to reload, so we get rid of all the old data */ if (g_hash_table_size (priv->cpt_table) > 0) { g_hash_table_unref (priv->cpt_table); priv->cpt_table = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, (GDestroyNotify) g_object_unref); } if (!as_pool_metadata_changed (pool)) { g_autofree gchar *fname = NULL; g_debug ("Caches are up to date."); if (as_flags_contains (priv->cache_flags, AS_CACHE_FLAG_USE_SYSTEM)) { g_debug ("Using cached data."); fname = g_strdup_printf ("%s/%s.gvz", priv->sys_cache_path, priv->locale); if (g_file_test (fname, G_FILE_TEST_EXISTS)) { return as_pool_load_cache_file (pool, fname, error); } else { g_debug ("Missing cache for language '%s', attempting to load fresh data.", priv->locale); } } else { g_debug ("Not using system cache."); } } /* read all AppStream metadata that we can find */ ret = as_pool_load_metadata (pool); /* automatically refine the metadata we have in the pool */ ret2 = as_pool_refine_data (pool); return ret && ret2; }
/** * as_pool_load: * @pool: An instance of #AsPool. * @error: A #GError or %NULL. * * Builds an index of all found components in the watched locations. * The function will try to get as much data into the pool as possible, so even if * the update completes with %FALSE, it might still have added components to the pool. * * The function will load from all possible data sources, preferring caches if they * are up to date. * * Returns: %TRUE if update completed without error. **/ gboolean as_pool_load (AsPool *pool, GCancellable *cancellable, GError **error) { AsPoolPrivate *priv = GET_PRIVATE (pool); gboolean ret = TRUE; /* load means to reload, so we get rid of all the old data */ as_pool_clear (pool); /* read all AppStream metadata that we can find */ if (as_flags_contains (priv->flags, AS_POOL_FLAG_READ_COLLECTION)) ret = as_pool_load_appstream (pool, error); /* read all .desktop file data that we can find */ if (as_flags_contains (priv->flags, AS_POOL_FLAG_READ_DESKTOP_FILES)) as_pool_load_desktop_entries (pool); /* automatically refine the metadata we have in the pool */ ret = as_pool_refine_data (pool) && ret; return ret; }
/** * as_pool_refresh_cache: * @pool: An instance of #AsPool. * @force: Enforce refresh, even if source data has not changed. * * Update the AppStream cache. There is normally no need to call this function manually, because cache updates are handled * transparently in the background. * * Returns: %TRUE if the cache was updated, %FALSE on error or if the cache update was not necessary and has been skipped. */ gboolean as_pool_refresh_cache (AsPool *pool, gboolean force, GError **error) { AsPoolPrivate *priv = GET_PRIVATE (pool); gboolean ret = FALSE; gboolean ret_poolupdate; g_autofree gchar *cache_fname = NULL; g_autoptr(GError) tmp_error = NULL; /* try to create cache directory, in case it doesn't exist */ g_mkdir_with_parents (priv->sys_cache_path, 0755); if (!as_utils_is_writable (priv->sys_cache_path)) { g_set_error (error, AS_POOL_ERROR, AS_POOL_ERROR_TARGET_NOT_WRITABLE, _("Cache location '%s' is not writable."), priv->sys_cache_path); return FALSE; } /* collect metadata */ #ifdef HAVE_APT_SUPPORT /* currently, we only do something here if we are running with explicit APT support compiled in */ as_pool_scan_apt (pool, force, &tmp_error); if (tmp_error != NULL) { /* the exact error is not forwarded here, since we might be able to partially update the cache */ g_warning ("Error while collecting metadata: %s", tmp_error->message); g_error_free (tmp_error); tmp_error = NULL; } #endif /* create the filename of our cache */ cache_fname = g_strdup_printf ("%s/%s.gvz", priv->sys_cache_path, priv->locale); /* check if we need to refresh the cache * (which is only necessary if the AppStream data has changed) */ if (!as_pool_metadata_changed (pool)) { g_debug ("Data did not change, no cache refresh needed."); if (force) { g_debug ("Forcing refresh anyway."); } else { return FALSE; } } g_debug ("Refreshing AppStream cache"); /* ensure we start with an empty pool */ as_pool_clear (pool); /* NOTE: we will only cache AppStream metadata, no .desktop file metadata etc. */ /* find them wherever they are */ ret = as_pool_load_appstream (pool, &tmp_error); ret_poolupdate = as_pool_refine_data (pool) && ret; if (tmp_error != NULL) { /* the exact error is not forwarded here, since we might be able to partially update the cache */ g_warning ("Error while updating the in-memory data pool: %s", tmp_error->message); g_error_free (tmp_error); tmp_error = NULL; } /* save the cache object */ as_pool_save_cache_file (pool, cache_fname, &tmp_error); if (tmp_error != NULL) { /* the exact error is not forwarded here, since we might be able to partially update the cache */ g_warning ("Error while updating the cache: %s", tmp_error->message); g_error_free (tmp_error); tmp_error = NULL; ret = FALSE; } else { ret = TRUE; } if (ret) { if (!ret_poolupdate) { g_set_error (error, AS_POOL_ERROR, AS_POOL_ERROR_INCOMPLETE, _("AppStream data pool was loaded, but some metadata was ignored due to errors.")); } /* update the cache mtime, to not needlessly rebuild it again */ as_touch_location (cache_fname); as_pool_check_cache_ctime (pool); } else { g_set_error (error, AS_POOL_ERROR, AS_POOL_ERROR_FAILED, _("AppStream cache update failed.")); } return TRUE; }