]> git.ipfire.org Git - pakfire.git/commitdiff
package: Keep a copy of the repository
authorMichael Tremer <michael.tremer@ipfire.org>
Thu, 11 Feb 2021 11:04:18 +0000 (11:04 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Thu, 11 Feb 2021 11:04:18 +0000 (11:04 +0000)
This increases performance when the repository needs to be accessed

Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/libpakfire/include/pakfire/repo.h
src/libpakfire/package.c
src/libpakfire/repo.c

index cd58ac672e07a12783180be1716a0d74d615ad24..58ede26ad1e7ecf99e33a8382b001dbbb2a28a79 100644 (file)
@@ -84,11 +84,11 @@ time_t pakfire_repo_cache_age(PakfireRepo repo, const char* path);
 
 #include <solv/repo.h>
 
+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);
 
index ac0680b26358aa1d5ab5c6190fa1c7b6aa89190b..dbbc3314928565a04a85b79b2e4f2f1b62e58280 100644 (file)
@@ -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) {
index a3d4d325e538e853f9cd095752a8a3f0d16d760f..3ee2f9604f7897c7c2c6833314d55649b190129c 100644 (file)
@@ -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);
 }