/** * dnf_db_remove_all: * @db: a #DnfDb instance. * @package: A package to use as a reference * @error: A #GError, or %NULL * * Removes a all data value from the yumdb 'database' for a given package. * * Returns: %TRUE for success, %FALSE otherwise * * Since: 0.1.0 **/ gboolean dnf_db_remove_all(DnfDb *db, DnfPackage *package, GError **error) { DnfDbPrivate *priv = GET_PRIVATE(db); const gchar *filename; g_autoptr(GDir) dir = NULL; g_autofree gchar *index_dir = NULL; g_autoptr(GFile) file_directory = NULL; g_return_val_if_fail(DNF_IS_DB(db), FALSE); g_return_val_if_fail(package != NULL, FALSE); g_return_val_if_fail(error == NULL || *error == NULL, FALSE); if (!priv->enabled) return TRUE; /* get the folder */ index_dir = dnf_db_get_dir_for_package(db, package); if (index_dir == NULL) { g_set_error(error, DNF_ERROR, DNF_ERROR_FAILED, "cannot create index for %s", dnf_package_get_package_id(package)); return FALSE; } if (!g_file_test(index_dir, G_FILE_TEST_IS_DIR)) { g_debug("Nothing to delete in %s", index_dir); return TRUE; } /* open */ dir = g_dir_open(index_dir, 0, error); if (dir == NULL) return FALSE; /* delete each one */ filename = g_dir_read_name(dir); while (filename != NULL) { g_autofree gchar *index_file = NULL; g_autoptr(GFile) file_tmp = NULL; index_file = g_build_filename(index_dir, filename, NULL); file_tmp = g_file_new_for_path(index_file); /* delete, ignoring error */ g_debug("deleting %s from %s", filename, index_dir); if (!g_file_delete(file_tmp, NULL, NULL)) g_debug("failed to delete %s", filename); filename = g_dir_read_name(dir); } /* now delete the directory */ file_directory = g_file_new_for_path(index_dir); return g_file_delete(file_directory, NULL, error); }
/** * dnf_package_get_cost: * @pkg: a #DnfPackage *instance. * * Returns the cost of the repo that provided the package. * * Returns: the cost, where higher is more expensive, default 1000 * * Since: 0.1.0 **/ guint dnf_package_get_cost(DnfPackage *pkg) { DnfPackagePrivate *priv; priv = dnf_package_get_priv(pkg); if (priv->repo == NULL) { g_warning("no repo for %s", dnf_package_get_package_id(pkg)); return G_MAXUINT; } return dnf_repo_get_cost(priv->repo); }
/** * dnf_emit_package: */ void dnf_emit_package (PkBackendJob *job, PkInfoEnum info, DnfPackage *pkg) { /* detect */ if (info == PK_INFO_ENUM_UNKNOWN) info = dnf_package_get_info (pkg); if (info == PK_INFO_ENUM_UNKNOWN) info = dnf_package_installed (pkg) ? PK_INFO_ENUM_INSTALLED : PK_INFO_ENUM_AVAILABLE; pk_backend_job_package (job, info, dnf_package_get_package_id (pkg), dnf_package_get_summary (pkg)); }
/** * dnf_db_get_string: * @db: a #DnfDb instance. * @package: A package to use as a reference * @key: A key name to retrieve, e.g. "releasever" * @error: A #GError, or %NULL * * Gets a string value from the yumdb 'database'. * * Returns: An allocated value, or %NULL * * Since: 0.1.0 **/ gchar * dnf_db_get_string(DnfDb *db, DnfPackage *package, const gchar *key, GError **error) { gchar *value = NULL; g_autofree gchar *filename = NULL; g_autofree gchar *index_dir = NULL; g_return_val_if_fail(DNF_IS_DB(db), NULL); g_return_val_if_fail(package != NULL, NULL); g_return_val_if_fail(key != NULL, NULL); g_return_val_if_fail(error == NULL || *error == NULL, NULL); /* get file contents */ index_dir = dnf_db_get_dir_for_package(db, package); if (index_dir == NULL) { g_set_error(error, DNF_ERROR, DNF_ERROR_FAILED, "cannot read index for %s", dnf_package_get_package_id(package)); return NULL; } filename = g_build_filename(index_dir, key, NULL); /* check it exists */ if (!g_file_test(filename, G_FILE_TEST_EXISTS)) { g_set_error(error, DNF_ERROR, DNF_ERROR_FAILED, "%s key not found", filename); return NULL; } /* get value */ if (!g_file_get_contents(filename, &value, NULL, error)) return NULL; return value; }
/** * dnf_db_ensure_origin_pkg: * @db: a #DnfDb instance. * @pkg: A package to set * * Sets the repo origin on a package if not already set. * * Since: 0.1.0 */ void dnf_db_ensure_origin_pkg(DnfDb *db, DnfPackage *pkg) { g_autoptr(GError) error = NULL; g_autofree gchar *tmp = NULL; /* already set */ if (dnf_package_get_origin(pkg) != NULL) return; if (!dnf_package_installed(pkg)) return; /* set from the database if available */ tmp = dnf_db_get_string(db, pkg, "from_repo", &error); if (tmp == NULL) { g_debug("no origin for %s: %s", dnf_package_get_package_id(pkg), error->message); } else { dnf_package_set_origin(pkg, tmp); } }
/** * dnf_db_set_string: * @db: a #DnfDb instance. * @package: A package to use as a reference * @key: Key name to save, e.g. "reason" * @value: Key data to save, e.g. "dep" * @error: A #GError, or %NULL * * Writes a data value to the yumdb 'database'. * * Returns: Returns: %TRUE for success, %FALSE otherwise * * Since: 0.1.0 **/ gboolean dnf_db_set_string(DnfDb *db, DnfPackage *package, const gchar *key, const gchar *value, GError **error) { DnfDbPrivate *priv = GET_PRIVATE(db); g_autofree gchar *index_dir = NULL; g_autofree gchar *index_file = NULL; g_return_val_if_fail(DNF_IS_DB(db), FALSE); g_return_val_if_fail(package != NULL, FALSE); g_return_val_if_fail(key != NULL, FALSE); g_return_val_if_fail(value != NULL, FALSE); g_return_val_if_fail(error == NULL || *error == NULL, FALSE); if (!priv->enabled) return TRUE; /* create the index directory */ index_dir = dnf_db_get_dir_for_package(db, package); if (index_dir == NULL) { g_set_error(error, DNF_ERROR, DNF_ERROR_FAILED, "cannot create index for %s", dnf_package_get_package_id(package)); return FALSE; } if (!dnf_db_create_dir(index_dir, error)) return FALSE; /* write the value */ index_file = g_build_filename(index_dir, key, NULL); g_debug("writing %s to %s", value, index_file); return g_file_set_contents(index_file, value, -1, error); }
/** * dnf_db_remove: * @db: a #DnfDb instance. * @package: A package to use as a reference * @key: Key name to delete, e.g. "reason" * @error: A #GError, or %NULL * * Removes a data value from the yumdb 'database' for a given package. * * Returns: %TRUE for success, %FALSE otherwise * * Since: 0.1.0 **/ gboolean dnf_db_remove(DnfDb *db, DnfPackage *package, const gchar *key, GError **error) { DnfDbPrivate *priv = GET_PRIVATE(db); g_autofree gchar *index_dir = NULL; g_autofree gchar *index_file = NULL; g_autoptr(GFile) file = NULL; g_return_val_if_fail(DNF_IS_DB(db), FALSE); g_return_val_if_fail(package != NULL, FALSE); g_return_val_if_fail(key != NULL, FALSE); g_return_val_if_fail(error == NULL || *error == NULL, FALSE); if (!priv->enabled) return TRUE; /* create the index directory */ index_dir = dnf_db_get_dir_for_package(db, package); if (index_dir == NULL) { g_set_error(error, DNF_ERROR, DNF_ERROR_FAILED, "cannot create index for %s", dnf_package_get_package_id(package)); return FALSE; } /* delete the value */ g_debug("deleting %s from %s", key, index_dir); index_file = g_build_filename(index_dir, key, NULL); file = g_file_new_for_path(index_file); return g_file_delete(file, NULL, error); }