From 6029ca33b43be2d397c04c2b7191c883a5e96877 Mon Sep 17 00:00:00 2001 From: Michael Tremer Date: Sat, 20 Jan 2018 14:43:48 +0100 Subject: [PATCH] python: Drop reference to Pakfire in Repo Signed-off-by: Michael Tremer --- src/_pakfire/package.c | 12 ++++++------ src/_pakfire/package.h | 4 ++-- src/_pakfire/relation.c | 2 +- src/_pakfire/repo.c | 18 ++++++++++-------- src/_pakfire/repo.h | 1 - src/libpakfire/include/pakfire/repo.h | 1 + src/libpakfire/libpakfire.sym | 1 + src/libpakfire/repo.c | 4 ++++ 8 files changed, 25 insertions(+), 18 deletions(-) diff --git a/src/_pakfire/package.c b/src/_pakfire/package.c index f3003c5d8..c53a732d1 100644 --- a/src/_pakfire/package.c +++ b/src/_pakfire/package.c @@ -31,13 +31,13 @@ #include "relation.h" #include "repo.h" -PyObject* new_package(PakfireObject* pakfire, Id id) { - PyObject* args = Py_BuildValue("Oi", (PyObject *)pakfire, id); - PyObject* repo = PyObject_CallObject((PyObject *)&PackageType, args); - - Py_DECREF(args); +PyObject* new_package(PyTypeObject* type, PakfirePackage pkg) { + PackageObject* self = (PackageObject *)type->tp_alloc(type, 0); + if (self) { + self->package = pakfire_package_ref(pkg); + } - return repo; + return (PyObject *)self; } static PyObject* Package_new(PyTypeObject* type, PyObject* args, PyObject* kwds) { diff --git a/src/_pakfire/package.h b/src/_pakfire/package.h index 48b29a845..dc2933da7 100644 --- a/src/_pakfire/package.h +++ b/src/_pakfire/package.h @@ -23,7 +23,7 @@ #include -#include +#include #include #include "pakfire.h" @@ -36,6 +36,6 @@ typedef struct { extern PyTypeObject PackageType; -PyObject* new_package(PakfireObject* pakfire, Id id); +PyObject* new_package(PyTypeObject* type, PakfirePackage pkg); #endif /* PYTHON_PAKFIRE_PACKAGE_H */ diff --git a/src/_pakfire/relation.c b/src/_pakfire/relation.c index 2459471db..8ec3603ca 100644 --- a/src/_pakfire/relation.c +++ b/src/_pakfire/relation.c @@ -115,7 +115,7 @@ static PyObject* Relation_get_providers(RelationObject* self) { for (unsigned int i = 0; i < pakfire_packagelist_count(packagelist); i++) { PakfirePackage package = pakfire_packagelist_get(packagelist, i); - PyObject* obj = new_package(self->pakfire, pakfire_package_id(package)); + PyObject* obj = new_package(&PackageType, package); PyList_Append(list, obj); pakfire_package_unref(package); diff --git a/src/_pakfire/repo.c b/src/_pakfire/repo.c index 00a1b9fb1..1c65b47ee 100644 --- a/src/_pakfire/repo.c +++ b/src/_pakfire/repo.c @@ -40,7 +40,6 @@ PyObject* new_repo(PyTypeObject* type, PakfireRepo repo) { static PyObject* Repo_new(PyTypeObject* type, PyObject* args, PyObject* kwds) { RepoObject* self = (RepoObject *)type->tp_alloc(type, 0); if (self) { - self->pakfire = NULL; self->repo = NULL; } @@ -50,7 +49,6 @@ static PyObject* Repo_new(PyTypeObject* type, PyObject* args, PyObject* kwds) { static void Repo_dealloc(RepoObject* self) { pakfire_repo_unref(self->repo); - Py_XDECREF(self->pakfire); Py_TYPE(self)->tp_free((PyObject *)self); } @@ -61,10 +59,8 @@ static int Repo_init(RepoObject* self, PyObject* args, PyObject* kwds) { if (!PyArg_ParseTuple(args, "O!s", &PakfireType, &pakfire, &name)) return -1; - self->pakfire = pakfire; - Py_INCREF(self->pakfire); - - self->repo = pakfire_repo_create(self->pakfire->pakfire, name); + // Create a new repository + self->repo = pakfire_repo_create(pakfire->pakfire, name); return 0; } @@ -219,9 +215,15 @@ static PyObject* Repo__add_package(RepoObject* self, PyObject* args) { if (!PyArg_ParseTuple(args, "sss", &name, &evr, &arch)) return NULL; - PakfirePackage pkg = pakfire_package_create2(self->pakfire->pakfire, self->repo, name, evr, arch); + Pakfire pakfire = pakfire_repo_get_pakfire(self->repo); + PakfirePackage pkg = pakfire_package_create2(pakfire, self->repo, name, evr, arch); + + PyObject* obj = new_package(&PackageType, pkg); - return new_package(self->pakfire, pakfire_package_id(pkg)); + pakfire_package_unref(pkg); + pakfire_unref(pakfire); + + return obj; } static PyObject* Repo_cache_age(RepoObject* self, PyObject* args) { diff --git a/src/_pakfire/repo.h b/src/_pakfire/repo.h index 3a25f0eca..d160b8926 100644 --- a/src/_pakfire/repo.h +++ b/src/_pakfire/repo.h @@ -29,7 +29,6 @@ typedef struct { PyObject_HEAD - PakfireObject* pakfire; PakfireRepo repo; } RepoObject; diff --git a/src/libpakfire/include/pakfire/repo.h b/src/libpakfire/include/pakfire/repo.h index 9f0384582..f8085e150 100644 --- a/src/libpakfire/include/pakfire/repo.h +++ b/src/libpakfire/include/pakfire/repo.h @@ -30,6 +30,7 @@ PakfireRepo pakfire_repo_create(Pakfire pakfire, const char* name); PakfireRepo pakfire_repo_ref(PakfireRepo repo); PakfireRepo pakfire_repo_unref(PakfireRepo repo); +Pakfire pakfire_repo_get_pakfire(PakfireRepo repo); int pakfire_repo_identical(PakfireRepo repo1, PakfireRepo repo2); int pakfire_repo_cmp(PakfireRepo repo1, PakfireRepo repo2); diff --git a/src/libpakfire/libpakfire.sym b/src/libpakfire/libpakfire.sym index 2cf01072b..0c158ce65 100644 --- a/src/libpakfire/libpakfire.sym +++ b/src/libpakfire/libpakfire.sym @@ -227,6 +227,7 @@ global: pakfire_repo_get_cache; pakfire_repo_get_name; pakfire_repo_get_enabled; + pakfire_repo_get_pakfire; pakfire_repo_get_pool; pakfire_repo_get_priority; pakfire_repo_identical; diff --git a/src/libpakfire/repo.c b/src/libpakfire/repo.c index b721e40d2..09a3db924 100644 --- a/src/libpakfire/repo.c +++ b/src/libpakfire/repo.c @@ -133,6 +133,10 @@ PAKFIRE_EXPORT PakfireRepo pakfire_repo_unref(PakfireRepo repo) { return NULL; } +PAKFIRE_EXPORT Pakfire pakfire_repo_get_pakfire(PakfireRepo repo) { + return pakfire_ref(repo->pakfire); +} + Repo* pakfire_repo_get_repo(PakfireRepo repo) { return repo->repo; } -- 2.39.5