]>
git.ipfire.org Git - people/stevee/pakfire.git/blob - src/_pakfire/pool.c
1 /*#############################################################################
3 # Pakfire - The IPFire package management system #
4 # Copyright (C) 2011 Pakfire development team #
6 # This program is free software: you can redistribute it and/or modify #
7 # it under the terms of the GNU General Public License as published by #
8 # the Free Software Foundation, either version 3 of the License, or #
9 # (at your option) any later version. #
11 # This program is distributed in the hope that it will be useful, #
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of #
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
14 # GNU General Public License for more details. #
16 # You should have received a copy of the GNU General Public License #
17 # along with this program. If not, see <http://www.gnu.org/licenses/>. #
19 #############################################################################*/
23 #include <solv/poolarch.h>
24 #include <solv/solver.h>
26 #include "constants.h"
32 PyTypeObject PoolType
= {
33 PyObject_HEAD_INIT(NULL
)
34 tp_name
: "_pakfire.Pool",
35 tp_basicsize
: sizeof(PoolObject
),
36 tp_flags
: Py_TPFLAGS_DEFAULT
| Py_TPFLAGS_BASETYPE
,
38 tp_dealloc
: (destructor
) Pool_dealloc
,
39 tp_doc
: "Sat Pool objects",
43 PyObject
* Pool_new(PyTypeObject
*type
, PyObject
*args
, PyObject
*kwds
) {
47 if (!PyArg_ParseTuple(args
, "s", &arch
)) {
48 /* XXX raise exception */
52 self
= (PoolObject
*)type
->tp_alloc(type
, 0);
54 self
->_pool
= pool_create();
57 // Enable debug messages when DEBUG is defined.
58 pool_setdebuglevel(self
->_pool
, 1);
61 pool_setdisttype(self
->_pool
, DISTTYPE_RPM
);
62 pool_setarch(self
->_pool
, arch
);
63 if (self
->_pool
== NULL
) {
69 return (PyObject
*)self
;
72 PyObject
*Pool_dealloc(PoolObject
*self
) {
73 pool_free(self
->_pool
);
74 self
->ob_type
->tp_free((PyObject
*)self
);
79 PyObject
*Pool_add_repo(PoolObject
*self
, PyObject
*args
) {
81 if (!PyArg_ParseTuple(args
, "s", &name
)) {
82 /* XXX raise exception */
87 repo
= PyObject_New(RepoObject
, &RepoType
);
91 return (PyObject
*)repo
;
94 PyObject
*Pool_prepare(PoolObject
*self
) {
95 _Pool_prepare(self
->_pool
);
100 void _Pool_prepare(Pool
*pool
) {
101 pool_addfileprovides(pool
);
102 pool_createwhatprovides(pool
);
111 PyObject
*Pool_size(PoolObject
*self
) {
112 Pool
*pool
= self
->_pool
;
114 return Py_BuildValue("i", pool
->nsolvables
);
117 PyObject
*_Pool_search(Pool
*pool
, Repo
*repo
, const char *match
, int option
, const char *keyname
) {
118 // Prepare the pool, so we can search in it.
122 dataiterator_init(&d
, pool
, repo
, 0,
123 keyname
&& pool
? pool_str2id(pool
, keyname
, 0) : 0, match
, option
);
125 PyObject
*list
= PyList_New(0);
127 SolvableObject
*solvable
;
128 while (dataiterator_step(&d
)) {
129 solvable
= PyObject_New(SolvableObject
, &SolvableType
);
130 solvable
->_pool
= pool
;
131 solvable
->_id
= d
.solvid
;
133 PyList_Append(list
, (PyObject
*)solvable
);
136 dataiterator_free(&d
);
140 PyObject
*Pool_search(PoolObject
*self
, PyObject
*args
) {
141 const char *match
= NULL
;
142 int option
= SEARCH_SUBSTRING
;
143 const char *keyname
= NULL
;
145 if (!PyArg_ParseTuple(args
, "s|is", &match
, &option
, &keyname
)) {
146 /* XXX raise exception */
150 return _Pool_search(self
->_pool
, NULL
, match
, option
, keyname
);
153 PyObject
*Pool_set_installed(PoolObject
*self
, PyObject
*args
) {
156 if (!PyArg_ParseTuple(args
, "O", &repo
)) {
157 /* XXX raise exception */
160 pool_set_installed(self
->_pool
, repo
->_repo
);
165 PyObject
*Pool_providers(PoolObject
*self
, PyObject
*args
) {
169 Pool
*pool
= self
->_pool
;
173 if (!PyArg_ParseTuple(args
, "s", &name
)) {
180 Id id
= pool_str2id(pool
, name
, 0);
183 FOR_PROVIDES(p
, pp
, id
) {
184 solvable
= pool
->solvables
+ p
;
186 if (solvable
->name
== id
)
187 queue_push2(&job
, SOLVER_SOLVABLE
, p
);
191 for (p
= 1; p
< pool
->nsolvables
; p
++) {
192 solvable
= pool
->solvables
+ p
;
193 if (!solvable
->repo
|| !pool_installable(pool
, solvable
))
197 if (fnmatch(name
, pool_id2str(pool
, id
), 0) == 0) {
198 for (i
= 0; i
< job
.count
; i
+= 2) {
199 if (job
.elements
[i
] == SOLVER_SOLVABLE
&& job
.elements
[i
+ 1] == id
)
204 queue_push2(&job
, SOLVER_SOLVABLE
, p
);
208 for (id
= 1; id
< pool
->ss
.nstrings
; id
++) {
209 if (!pool
->whatprovides
[id
])
212 if (fnmatch(name
, pool_id2str(pool
, id
), 0) == 0) {
213 Id
*provides
= pool
->whatprovidesdata
+ pool
->whatprovides
[id
];
216 for (i
= 0; i
< job
.count
; i
+= 2) {
217 if (job
.elements
[i
] == SOLVER_SOLVABLE
&& job
.elements
[i
+ 1] == *provides
)
222 queue_push2(&job
, SOLVER_SOLVABLE
, *provides
);
230 PyObject
*list
= PyList_New(0);
232 for (i
= 0; i
< job
.count
; i
+= 2) {
233 switch (job
.elements
[i
]) {
234 case SOLVER_SOLVABLE
:
235 s
= PyObject_New(SolvableObject
, &SolvableType
);
237 s
->_id
= job
.elements
[i
+ 1];
239 PyList_Append(list
, (PyObject
*)s
);