From: Michael Tremer Date: Thu, 11 Feb 2021 11:04:18 +0000 (+0000) Subject: package: Keep a copy of the repository X-Git-Tag: 0.9.28~1285^2~770 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e9d9eadc292a6d5d7bbc6d84bddc305dfea4e46d;p=pakfire.git package: Keep a copy of the repository This increases performance when the repository needs to be accessed Signed-off-by: Michael Tremer --- diff --git a/src/libpakfire/include/pakfire/repo.h b/src/libpakfire/include/pakfire/repo.h index cd58ac672..58ede26ad 100644 --- a/src/libpakfire/include/pakfire/repo.h +++ b/src/libpakfire/include/pakfire/repo.h @@ -84,11 +84,11 @@ time_t pakfire_repo_cache_age(PakfireRepo repo, const char* path); #include +Id pakfire_repo_add_solvable(PakfireRepo repo); + PakfireRepo pakfire_repo_create_from_repo(Pakfire pakfire, Repo* r); void pakfire_repo_free_all(Pakfire pakfire); -PakfirePackage pakfire_repo_add_package(PakfireRepo repo); - Repo* pakfire_repo_get_repo(PakfireRepo repo); Repodata* pakfire_repo_get_repodata(PakfireRepo repo); diff --git a/src/libpakfire/package.c b/src/libpakfire/package.c index ac0680b26..dbbc33149 100644 --- a/src/libpakfire/package.c +++ b/src/libpakfire/package.c @@ -47,6 +47,8 @@ struct _PakfirePackage { Pakfire pakfire; Id id; int nrefs; + + PakfireRepo repo; }; static Pool* pakfire_package_get_solv_pool(PakfirePackage pkg) { @@ -61,26 +63,37 @@ static void pakfire_package_add_self_provides(Pakfire pakfire, PakfirePackage pk PAKFIRE_EXPORT PakfirePackage pakfire_package_create_from_solvable(Pakfire pakfire, Id id) { PakfirePackage pkg = calloc(1, sizeof(*pkg)); - if (pkg) { - DEBUG(pakfire, "Allocated Package at %p\n", pkg); + if (!pkg) + return NULL; - pkg->pakfire = pakfire_ref(pakfire); - pkg->id = id; + DEBUG(pakfire, "Allocated Package at %p\n", pkg); - // Initialize reference counter - pkg->nrefs = 1; - } + pkg->pakfire = pakfire_ref(pakfire); + pkg->id = id; + + // Initialize reference counter + pkg->nrefs = 1; return pkg; } PAKFIRE_EXPORT PakfirePackage pakfire_package_create2(Pakfire pakfire, PakfireRepo repo, const char* name, const char* evr, const char* arch) { - PakfirePackage pkg = pakfire_repo_add_package(repo); + Id id = pakfire_repo_add_solvable(repo); + if (!id) + return NULL; + + PakfirePackage pkg = pakfire_package_create_from_solvable(pakfire, id); + if (!pkg) + return NULL; + pkg->repo = pakfire_repo_ref(repo); + + // Set the given attributes pakfire_package_set_name(pkg, name); pakfire_package_set_evr(pkg, evr); pakfire_package_set_arch(pkg, arch); + // Add self-provides pakfire_package_add_self_provides(pakfire, pkg, name, evr); return pkg; @@ -89,6 +102,9 @@ PAKFIRE_EXPORT PakfirePackage pakfire_package_create2(Pakfire pakfire, PakfireRe static void pakfire_package_free(PakfirePackage pkg) { DEBUG(pkg->pakfire, "Releasing Package at %p\n", pkg); + if (pkg->repo) + pakfire_repo_unref(pkg->repo); + pakfire_unref(pkg->pakfire); free(pkg); } @@ -642,15 +658,24 @@ PAKFIRE_EXPORT void pakfire_package_add_suggests(PakfirePackage pkg, PakfireRela } PAKFIRE_EXPORT PakfireRepo pakfire_package_get_repo(PakfirePackage pkg) { - Solvable* s = get_solvable(pkg); + if (!pkg->repo) { + Solvable* s = get_solvable(pkg); + + pkg->repo = pakfire_repo_create_from_repo(pkg->pakfire, s->repo); + } - return pakfire_repo_create_from_repo(pkg->pakfire, s->repo); + return pakfire_repo_ref(pkg->repo); } PAKFIRE_EXPORT void pakfire_package_set_repo(PakfirePackage pkg, PakfireRepo repo) { - Solvable* s = get_solvable(pkg); + // Free old repository + if (pkg->repo) + pakfire_repo_unref(pkg->repo); + Solvable* s = get_solvable(pkg); s->repo = pakfire_repo_get_repo(repo); + + pkg->repo = pakfire_repo_ref(repo); } PAKFIRE_EXPORT char* pakfire_package_get_location(PakfirePackage pkg) { diff --git a/src/libpakfire/repo.c b/src/libpakfire/repo.c index a3d4d325e..3ee2f9604 100644 --- a/src/libpakfire/repo.c +++ b/src/libpakfire/repo.c @@ -60,6 +60,10 @@ struct _PakfireRepo { int nrefs; }; +Id pakfire_repo_add_solvable(PakfireRepo repo) { + return repo_add_solvable(repo->repo); +} + static void free_repo_appdata(struct pakfire_repo_appdata* appdata) { // repodata is being destroyed with the repository @@ -557,12 +561,6 @@ PAKFIRE_EXPORT int pakfire_repo_write_solv_fp(PakfireRepo repo, FILE *f, int fla return repo_write(repo->repo, f); } -PAKFIRE_EXPORT PakfirePackage pakfire_repo_add_package(PakfireRepo repo) { - Id id = repo_add_solvable(repo->repo); - - return pakfire_package_create_from_solvable(repo->pakfire, id); -} - PAKFIRE_EXPORT PakfirePackage pakfire_repo_add_archive(PakfireRepo repo, PakfireArchive archive) { return pakfire_archive_make_package(archive, repo); }