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 #############################################################################*/
28 PyTypeObject SolvableType
= {
29 PyObject_HEAD_INIT(NULL
)
30 tp_name
: "_pakfire.Solvable",
31 tp_basicsize
: sizeof(SolvableObject
),
32 tp_flags
: Py_TPFLAGS_DEFAULT
| Py_TPFLAGS_BASETYPE
,
33 tp_new
: Solvable_new
,
34 tp_dealloc
: (destructor
) Solvable_dealloc
,
35 tp_doc
: "Sat Solvable objects",
36 tp_str
: (reprfunc
)Solvable_string
,
40 PyObject
* Solvable_new(PyTypeObject
*type
, PyObject
*args
, PyObject
*kwds
) {
46 const char *arch
= "noarch";
48 if (!PyArg_ParseTuple(args
, "Oss|s", &repo
, &name
, &evr
, &arch
)) {
49 /* XXX raise exception */
53 self
= (SolvableObject
*)type
->tp_alloc(type
, 0);
55 self
->_id
= repo_add_solvable(repo
->_repo
);
56 self
->_pool
= repo
->_repo
->pool
;
58 /* Fill solvable with data. */
59 Solvable
*solv
= pool_id2solvable(self
->_pool
, self
->_id
);
61 solv
->name
= pool_str2id(self
->_pool
, name
, 1);
62 solv
->evr
= pool_str2id(self
->_pool
, evr
, 1);
63 solv
->arch
= pool_str2id(self
->_pool
, arch
, 1);
65 /* add self-provides */
66 Id rel
= pool_rel2id(self
->_pool
, solv
->name
, solv
->evr
, REL_EQ
, 1);
67 solv
->provides
= repo_addid_dep(repo
->_repo
, solv
->provides
, rel
, 0);
70 return (PyObject
*)self
;
73 PyObject
*Solvable_dealloc(SolvableObject
*self
) {
74 self
->ob_type
->tp_free((PyObject
*)self
);
79 PyObject
*Solvable_string(SolvableObject
*self
) {
80 Solvable
*solvable
= pool_id2solvable(self
->_pool
, self
->_id
);
82 const char *str
= pool_solvable2str(self
->_pool
, solvable
);
84 return Py_BuildValue("s", str
);
87 PyObject
*Solvable_get_name(SolvableObject
*self
) {
88 Solvable
*solvable
= pool_id2solvable(self
->_pool
, self
->_id
);
90 const char *name
= pool_id2str(solvable
->repo
->pool
, solvable
->name
);
92 return Py_BuildValue("s", name
);
95 PyObject
*Solvable_get_evr(SolvableObject
*self
) {
96 Solvable
*solvable
= pool_id2solvable(self
->_pool
, self
->_id
);
98 const char *evr
= pool_id2str(solvable
->repo
->pool
, solvable
->evr
);
100 return Py_BuildValue("s", evr
);
103 PyObject
*Solvable_get_arch(SolvableObject
*self
) {
104 Solvable
*solvable
= pool_id2solvable(self
->_pool
, self
->_id
);
106 const char *arch
= pool_id2str(solvable
->repo
->pool
, solvable
->arch
);
108 return Py_BuildValue("s", arch
);
111 PyObject
*Solvable_get_vendor(SolvableObject
*self
) {
112 Solvable
*solvable
= pool_id2solvable(self
->_pool
, self
->_id
);
114 const char *vendor
= pool_id2str(solvable
->repo
->pool
, solvable
->vendor
);
116 return Py_BuildValue("s", vendor
);
119 PyObject
*Solvable_set_vendor(SolvableObject
*self
, PyObject
*args
) {
120 Solvable
*solvable
= pool_id2solvable(self
->_pool
, self
->_id
);
123 if (!PyArg_ParseTuple(args
, "s", &vendor
)) {
124 /* XXX raise exception */
128 solvable
->vendor
= pool_str2id(self
->_pool
, vendor
, 1);
133 PyObject
*Solvable_get_repo_name(SolvableObject
*self
) {
134 Solvable
*solvable
= pool_id2solvable(self
->_pool
, self
->_id
);
136 return Py_BuildValue("s", solvable
->repo
->name
);
139 PyObject
*Solvable_add_provides(SolvableObject
*self
, PyObject
*args
) {
140 Solvable
*solv
= pool_id2solvable(self
->_pool
, self
->_id
);
143 if (!PyArg_ParseTuple(args
, "O", &rel
)) {
144 /* XXX raise exception */
148 solv
->provides
= repo_addid_dep(solv
->repo
, solv
->provides
, rel
->_id
, 0);
153 PyObject
*_Solvable_get_dependencies(Solvable
*solv
, Offset deps
) {
154 Repo
*repo
= solv
->repo
;
155 Pool
*pool
= repo
->pool
;
160 PyObject
*list
= PyList_New(0);
162 ids
= repo
->idarraydata
+ deps
;
163 while((id
= *ids
++) != 0) {
164 dep_str
= pool_dep2str(pool
, id
);
166 // Do not include the filelist.
167 if (strcmp(dep_str
, "solvable:filemarker") == 0)
170 PyList_Append(list
, Py_BuildValue("s", dep_str
));
177 PyObject
*Solvable_get_provides(SolvableObject
*self
) {
178 Solvable
*solv
= pool_id2solvable(self
->_pool
, self
->_id
);
180 return _Solvable_get_dependencies(solv
, solv
->provides
);
183 PyObject
*Solvable_add_requires(SolvableObject
*self
, PyObject
*args
) {
184 Solvable
*solv
= pool_id2solvable(self
->_pool
, self
->_id
);
187 if (!PyArg_ParseTuple(args
, "O", &rel
)) {
188 /* XXX raise exception */
192 solv
->requires
= repo_addid_dep(solv
->repo
, solv
->requires
, rel
->_id
, 0);
197 PyObject
*Solvable_get_requires(SolvableObject
*self
) {
198 Solvable
*solv
= pool_id2solvable(self
->_pool
, self
->_id
);
200 return _Solvable_get_dependencies(solv
, solv
->requires
);
203 PyObject
*Solvable_add_obsoletes(SolvableObject
*self
, PyObject
*args
) {
204 Solvable
*solv
= pool_id2solvable(self
->_pool
, self
->_id
);
207 if (!PyArg_ParseTuple(args
, "O", &rel
)) {
208 /* XXX raise exception */
212 solv
->obsoletes
= repo_addid_dep(solv
->repo
, solv
->obsoletes
, rel
->_id
, 0);
217 PyObject
*Solvable_get_obsoletes(SolvableObject
*self
) {
218 Solvable
*solv
= pool_id2solvable(self
->_pool
, self
->_id
);
220 return _Solvable_get_dependencies(solv
, solv
->obsoletes
);
223 PyObject
*Solvable_add_conflicts(SolvableObject
*self
, PyObject
*args
) {
224 Solvable
*solv
= pool_id2solvable(self
->_pool
, self
->_id
);
227 if (!PyArg_ParseTuple(args
, "O", &rel
)) {
228 /* XXX raise exception */
232 solv
->conflicts
= repo_addid_dep(solv
->repo
, solv
->conflicts
, rel
->_id
, 0);
237 PyObject
*Solvable_get_conflicts(SolvableObject
*self
) {
238 Solvable
*solv
= pool_id2solvable(self
->_pool
, self
->_id
);
240 return _Solvable_get_dependencies(solv
, solv
->conflicts
);
243 PyObject
*Solvable_set_uuid(SolvableObject
*self
, PyObject
*args
) {
244 Solvable
*solv
= pool_id2solvable(self
->_pool
, self
->_id
);
248 if (!PyArg_ParseTuple(args
, "s", &uuid
)) {
249 /* XXX raise exception */
253 repo_set_str(solv
->repo
, self
->_id
, SOLVABLE_PKGID
, uuid
);
258 PyObject
*Solvable_get_uuid(SolvableObject
*self
) {
259 Solvable
*solv
= pool_id2solvable(self
->_pool
, self
->_id
);
261 const char *uuid
= repo_lookup_str(solv
->repo
, self
->_id
, SOLVABLE_PKGID
);
263 return Py_BuildValue("s", uuid
);
266 PyObject
*Solvable_set_hash1(SolvableObject
*self
, PyObject
*args
) {
267 Solvable
*solv
= pool_id2solvable(self
->_pool
, self
->_id
);
271 if (!PyArg_ParseTuple(args
, "s", &hash1
)) {
272 /* XXX raise exception */
276 repo_set_str(solv
->repo
, self
->_id
, SOLVABLE_CHECKSUM
, hash1
);
281 PyObject
*Solvable_get_hash1(SolvableObject
*self
) {
282 Solvable
*solv
= pool_id2solvable(self
->_pool
, self
->_id
);
284 const char *hash1
= repo_lookup_str(solv
->repo
, self
->_id
, SOLVABLE_CHECKSUM
);
286 return Py_BuildValue("s", hash1
);
289 PyObject
*Solvable_set_summary(SolvableObject
*self
, PyObject
*args
) {
290 Solvable
*solv
= pool_id2solvable(self
->_pool
, self
->_id
);
294 if (!PyArg_ParseTuple(args
, "s", &summary
)) {
295 /* XXX raise exception */
299 repo_set_str(solv
->repo
, self
->_id
, SOLVABLE_SUMMARY
, summary
);
304 PyObject
*Solvable_get_summary(SolvableObject
*self
) {
305 Solvable
*solv
= pool_id2solvable(self
->_pool
, self
->_id
);
307 const char *summary
= repo_lookup_str(solv
->repo
, self
->_id
, SOLVABLE_SUMMARY
);
309 return Py_BuildValue("s", summary
);
312 PyObject
*Solvable_set_description(SolvableObject
*self
, PyObject
*args
) {
313 Solvable
*solv
= pool_id2solvable(self
->_pool
, self
->_id
);
317 if (!PyArg_ParseTuple(args
, "s", &desc
)) {
318 /* XXX raise exception */
322 repo_set_str(solv
->repo
, self
->_id
, SOLVABLE_DESCRIPTION
, desc
);
327 PyObject
*Solvable_get_description(SolvableObject
*self
) {
328 Solvable
*solv
= pool_id2solvable(self
->_pool
, self
->_id
);
330 const char *desc
= repo_lookup_str(solv
->repo
, self
->_id
,
331 SOLVABLE_DESCRIPTION
);
333 return Py_BuildValue("s", desc
);
336 PyObject
*Solvable_set_url(SolvableObject
*self
, PyObject
*args
) {
337 Solvable
*solv
= pool_id2solvable(self
->_pool
, self
->_id
);
341 if (!PyArg_ParseTuple(args
, "s", &url
)) {
342 /* XXX raise exception */
346 repo_set_str(solv
->repo
, self
->_id
, SOLVABLE_URL
, url
);
351 PyObject
*Solvable_get_url(SolvableObject
*self
) {
352 Solvable
*solv
= pool_id2solvable(self
->_pool
, self
->_id
);
354 const char *url
= repo_lookup_str(solv
->repo
, self
->_id
, SOLVABLE_URL
);
356 return Py_BuildValue("s", url
);
359 PyObject
*Solvable_set_groups(SolvableObject
*self
, PyObject
*args
) {
360 Solvable
*solv
= pool_id2solvable(self
->_pool
, self
->_id
);
364 if (!PyArg_ParseTuple(args
, "s", &groups
)) {
365 /* XXX raise exception */
369 repo_set_str(solv
->repo
, self
->_id
, SOLVABLE_GROUP
, groups
);
374 PyObject
*Solvable_get_groups(SolvableObject
*self
) {
375 Solvable
*solv
= pool_id2solvable(self
->_pool
, self
->_id
);
377 const char *groups
= repo_lookup_str(solv
->repo
, self
->_id
, SOLVABLE_GROUP
);
379 return Py_BuildValue("s", groups
);
382 PyObject
*Solvable_set_filename(SolvableObject
*self
, PyObject
*args
) {
383 Solvable
*solv
= pool_id2solvable(self
->_pool
, self
->_id
);
385 const char *filename
;
387 if (!PyArg_ParseTuple(args
, "s", &filename
)) {
388 /* XXX raise exception */
392 repo_set_str(solv
->repo
, self
->_id
, SOLVABLE_MEDIAFILE
, filename
);
397 PyObject
*Solvable_get_filename(SolvableObject
*self
) {
398 Solvable
*solv
= pool_id2solvable(self
->_pool
, self
->_id
);
400 const char *filename
= repo_lookup_str(solv
->repo
, self
->_id
,
403 return Py_BuildValue("s", filename
);
406 PyObject
*Solvable_set_license(SolvableObject
*self
, PyObject
*args
) {
407 Solvable
*solv
= pool_id2solvable(self
->_pool
, self
->_id
);
411 if (!PyArg_ParseTuple(args
, "s", &license
)) {
412 /* XXX raise exception */
416 repo_set_str(solv
->repo
, self
->_id
, SOLVABLE_LICENSE
, license
);
421 PyObject
*Solvable_get_license(SolvableObject
*self
) {
422 Solvable
*solv
= pool_id2solvable(self
->_pool
, self
->_id
);
424 const char *license
= repo_lookup_str(solv
->repo
, self
->_id
,
427 return Py_BuildValue("s", license
);
430 PyObject
*Solvable_set_buildhost(SolvableObject
*self
, PyObject
*args
) {
431 Solvable
*solv
= pool_id2solvable(self
->_pool
, self
->_id
);
433 const char *buildhost
;
435 if (!PyArg_ParseTuple(args
, "s", &buildhost
)) {
436 /* XXX raise exception */
440 repo_set_str(solv
->repo
, self
->_id
, SOLVABLE_BUILDHOST
, buildhost
);
445 PyObject
*Solvable_get_buildhost(SolvableObject
*self
) {
446 Solvable
*solv
= pool_id2solvable(self
->_pool
, self
->_id
);
448 const char *buildhost
= repo_lookup_str(solv
->repo
, self
->_id
,
451 return Py_BuildValue("s", buildhost
);
454 PyObject
*Solvable_set_maintainer(SolvableObject
*self
, PyObject
*args
) {
455 Solvable
*solv
= pool_id2solvable(self
->_pool
, self
->_id
);
457 const char *maintainer
;
459 if (!PyArg_ParseTuple(args
, "s", &maintainer
)) {
460 /* XXX raise exception */
464 repo_set_str(solv
->repo
, self
->_id
, SOLVABLE_PACKAGER
, maintainer
);
469 PyObject
*Solvable_get_maintainer(SolvableObject
*self
) {
470 Solvable
*solv
= pool_id2solvable(self
->_pool
, self
->_id
);
472 const char *maintainer
= repo_lookup_str(solv
->repo
, self
->_id
,
475 return Py_BuildValue("s", maintainer
);
478 PyObject
*Solvable_set_downloadsize(SolvableObject
*self
, PyObject
*args
) {
479 Solvable
*solv
= pool_id2solvable(self
->_pool
, self
->_id
);
481 unsigned int downloadsize
;
483 if (!PyArg_ParseTuple(args
, "i", &downloadsize
)) {
484 /* XXX raise exception */
488 repo_set_num(solv
->repo
, self
->_id
, SOLVABLE_DOWNLOADSIZE
, downloadsize
);
493 PyObject
*Solvable_get_downloadsize(SolvableObject
*self
) {
494 Solvable
*solv
= pool_id2solvable(self
->_pool
, self
->_id
);
496 unsigned int downloadsize
= repo_lookup_num(solv
->repo
, self
->_id
,
497 SOLVABLE_DOWNLOADSIZE
, 0);
499 return Py_BuildValue("i", downloadsize
);
502 PyObject
*Solvable_set_installsize(SolvableObject
*self
, PyObject
*args
) {
503 Solvable
*solv
= pool_id2solvable(self
->_pool
, self
->_id
);
505 unsigned int installedsize
;
507 if (!PyArg_ParseTuple(args
, "i", &installedsize
)) {
508 /* XXX raise exception */
512 repo_set_num(solv
->repo
, self
->_id
, SOLVABLE_INSTALLSIZE
, installedsize
);
517 PyObject
*Solvable_get_installsize(SolvableObject
*self
) {
518 Solvable
*solv
= pool_id2solvable(self
->_pool
, self
->_id
);
520 unsigned int installedsize
= repo_lookup_num(solv
->repo
, self
->_id
,
521 SOLVABLE_INSTALLSIZE
, 0);
523 return Py_BuildValue("i", installedsize
);
526 PyObject
*Solvable_set_buildtime(SolvableObject
*self
, PyObject
*args
) {
527 Solvable
*solv
= pool_id2solvable(self
->_pool
, self
->_id
);
529 unsigned int buildtime
;
531 if (!PyArg_ParseTuple(args
, "i", &buildtime
)) {
532 /* XXX raise exception */
536 repo_set_num(solv
->repo
, self
->_id
, SOLVABLE_BUILDTIME
, buildtime
);
541 PyObject
*Solvable_get_buildtime(SolvableObject
*self
) {
542 Solvable
*solv
= pool_id2solvable(self
->_pool
, self
->_id
);
544 unsigned int buildtime
= repo_lookup_num(solv
->repo
, self
->_id
,
545 SOLVABLE_BUILDTIME
, 0);
550 return Py_BuildValue("i", buildtime
);