From a610bc80c2b798d83737aaaa759f1799b24f3a57 Mon Sep 17 00:00:00 2001
From: Jaroslav Mracek <jmracek@redhat.com>
Date: Fri, 1 Feb 2019 14:37:35 +0100
Subject: [PATCH] Add setter of ModuleContainer for PySack
---
libdnf/dnf-sack-private.hpp | 3 ++-
libdnf/dnf-sack.cpp | 19 +++++++++++++++++++
python/hawkey/sack-py.cpp | 48 +++++++++++++++++++++++++++++++++++++++++++++++-
3 files changed, 68 insertions(+), 2 deletions(-)
diff --git a/libdnf/dnf-sack-private.hpp b/libdnf/dnf-sack-private.hpp
index b058126..45241c4 100644
--- a/libdnf/dnf-sack-private.hpp
+++ b/libdnf/dnf-sack-private.hpp
@@ -57,7 +57,8 @@ int dnf_sack_get_pool_nsolvables(DnfSack *sack);
* @return Map*
*/
libdnf::PackageSet *dnf_sack_get_pkg_solvables(DnfSack *sack);
-
+ModulePackageContainer * dnf_sack_set_module_container(
+ DnfSack *sack, ModulePackageContainer * newConteiner);
ModulePackageContainer * dnf_sack_get_module_container(DnfSack *sack);
void dnf_sack_make_provides_ready (DnfSack *sack);
Id dnf_sack_running_kernel (DnfSack *sack);
diff --git a/libdnf/dnf-sack.cpp b/libdnf/dnf-sack.cpp
index fb56937..43bb977 100644
--- a/libdnf/dnf-sack.cpp
+++ b/libdnf/dnf-sack.cpp
@@ -2006,6 +2006,25 @@ dnf_sack_get_pool(DnfSack *sack)
}
/**
+ * dnf_sack_set_module_container: (skip)
+ * @sack: a #DnfSack instance.
+ *
+ * Setss the internal ModulePackageContainer.
+ *
+ * Returns: The old ModulePackageContainer, that has to be freed manually.
+ *
+ * Since: 0.25.0
+ */
+ModulePackageContainer *
+dnf_sack_set_module_container(DnfSack *sack, ModulePackageContainer * newConteiner)
+{
+ DnfSackPrivate *priv = GET_PRIVATE(sack);
+ auto oldConteiner = priv->moduleContainer;
+ priv->moduleContainer = newConteiner;
+ return oldConteiner;
+}
+
+/**
* dnf_sack_get_module_container: (skip)
* @sack: a #DnfSack instance.
*
diff --git a/python/hawkey/sack-py.cpp b/python/hawkey/sack-py.cpp
index e925346..7f97075 100644
--- a/python/hawkey/sack-py.cpp
+++ b/python/hawkey/sack-py.cpp
@@ -27,6 +27,7 @@
#include "hy-util.h"
#include "dnf-version.h"
#include "dnf-sack-private.hpp"
+#include "libdnf/module/ModulePackageContainer.hpp"
// pyhawkey
#include "exception-py.hpp"
@@ -47,6 +48,7 @@ typedef struct {
DnfSack *sack;
PyObject *custom_package_class;
PyObject *custom_package_val;
+ PyObject * ModulePackageContainerPy;
FILE *log_out;
} _SackObject;
@@ -119,8 +121,13 @@ sack_dealloc(_SackObject *o)
{
Py_XDECREF(o->custom_package_class);
Py_XDECREF(o->custom_package_val);
- if (o->sack)
+ if (o->sack) {
+ if (auto moduleContainer = o->ModulePackageContainerPy) {
+ dnf_sack_set_module_container(o->sack, NULL);
+ Py_DECREF(moduleContainer);
+ }
g_object_unref(o->sack);
+ }
if (o->log_out)
fclose(o->log_out);
Py_TYPE(o)->tp_free(o);
@@ -135,6 +142,7 @@ sack_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
self->sack = NULL;
self->custom_package_class = NULL;
self->custom_package_val = NULL;
+ self->ModulePackageContainerPy = NULL;
}
return (PyObject *)self;
}
@@ -324,10 +332,48 @@ set_installonly_limit(_SackObject *self, PyObject *obj, void *unused)
return 0;
}
+static int
+set_module_container(_SackObject *self, PyObject *obj, void *unused)
+{
+ auto swigContainer = reinterpret_cast< ModulePackageContainerPyObject * >(
+ PyObject_GetAttrString(obj, "this"));
+ if (swigContainer == nullptr) {
+ PyErr_SetString(PyExc_SystemError, "Unable to parse ModuleContainer object");
+ return -1;
+ }
+ auto moduleContainer = swigContainer->ptr;
+ auto sack = self->sack;
+ if (auto oldConteynerPy = self->ModulePackageContainerPy) {
+ Py_XDECREF(oldConteynerPy);
+ auto oldContainer = dnf_sack_set_module_container(sack, moduleContainer);
+ } else {
+ auto oldContainer = dnf_sack_set_module_container(sack, moduleContainer);
+ if (oldContainer) {
+ delete oldContainer;
+ }
+ }
+ self->ModulePackageContainerPy = obj;
+ Py_INCREF(obj);
+
+ return 0;
+}
+
+static PyObject *
+get_module_container(_SackObject *self, void *unused)
+{
+ if (auto moduleConteinerPy = self->ModulePackageContainerPy) {
+ Py_INCREF(moduleConteinerPy);
+ return moduleConteinerPy;
+ }
+ Py_RETURN_NONE;
+}
+
static PyGetSetDef sack_getsetters[] = {
{(char*)"cache_dir", (getter)get_cache_dir, NULL, NULL, NULL},
{(char*)"installonly", NULL, (setter)set_installonly, NULL, NULL},
{(char*)"installonly_limit", NULL, (setter)set_installonly_limit, NULL, NULL},
+ {(char*)"_moduleContainer", (getter)get_module_container, (setter)set_module_container,
+ NULL, NULL},
{NULL} /* sentinel */
};
--
libgit2 0.27.7