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
));
176 PyObject
*Solvable_get_provides(SolvableObject
*self
) {
177 Solvable
*solv
= pool_id2solvable(self
->_pool
, self
->_id
);
179 return _Solvable_get_dependencies(solv
, solv
->provides
);
182 PyObject
*Solvable_add_requires(SolvableObject
*self
, PyObject
*args
) {
183 Solvable
*solv
= pool_id2solvable(self
->_pool
, self
->_id
);
186 if (!PyArg_ParseTuple(args
, "O", &rel
)) {
187 /* XXX raise exception */
191 solv
->requires
= repo_addid_dep(solv
->repo
, solv
->requires
, rel
->_id
, 0);
196 PyObject
*Solvable_get_requires(SolvableObject
*self
) {
197 Solvable
*solv
= pool_id2solvable(self
->_pool
, self
->_id
);
199 return _Solvable_get_dependencies(solv
, solv
->requires
);
202 PyObject
*Solvable_add_obsoletes(SolvableObject
*self
, PyObject
*args
) {
203 Solvable
*solv
= pool_id2solvable(self
->_pool
, self
->_id
);
206 if (!PyArg_ParseTuple(args
, "O", &rel
)) {
207 /* XXX raise exception */
211 solv
->obsoletes
= repo_addid_dep(solv
->repo
, solv
->obsoletes
, rel
->_id
, 0);
216 PyObject
*Solvable_get_obsoletes(SolvableObject
*self
) {
217 Solvable
*solv
= pool_id2solvable(self
->_pool
, self
->_id
);
219 return _Solvable_get_dependencies(solv
, solv
->obsoletes
);
222 PyObject
*Solvable_add_conflicts(SolvableObject
*self
, PyObject
*args
) {
223 Solvable
*solv
= pool_id2solvable(self
->_pool
, self
->_id
);
226 if (!PyArg_ParseTuple(args
, "O", &rel
)) {
227 /* XXX raise exception */
231 solv
->conflicts
= repo_addid_dep(solv
->repo
, solv
->conflicts
, rel
->_id
, 0);
236 PyObject
*Solvable_get_conflicts(SolvableObject
*self
) {
237 Solvable
*solv
= pool_id2solvable(self
->_pool
, self
->_id
);
239 return _Solvable_get_dependencies(solv
, solv
->conflicts
);
242 PyObject
*Solvable_add_recommends(SolvableObject
*self
, PyObject
*args
) {
243 Solvable
*solv
= pool_id2solvable(self
->_pool
, self
->_id
);
246 if (!PyArg_ParseTuple(args
, "O", &rel
)) {
250 solv
->recommends
= repo_addid_dep(solv
->repo
, solv
->recommends
, rel
->_id
, 0);
254 PyObject
*Solvable_get_recommends(SolvableObject
*self
) {
255 Solvable
*solv
= pool_id2solvable(self
->_pool
, self
->_id
);
257 return _Solvable_get_dependencies(solv
, solv
->recommends
);
260 PyObject
*Solvable_add_suggests(SolvableObject
*self
, PyObject
*args
) {
261 Solvable
*solv
= pool_id2solvable(self
->_pool
, self
->_id
);
264 if (!PyArg_ParseTuple(args
, "O", &rel
)) {
268 solv
->suggests
= repo_addid_dep(solv
->repo
, solv
->suggests
, rel
->_id
, 0);
272 PyObject
*Solvable_get_suggests(SolvableObject
*self
) {
273 Solvable
*solv
= pool_id2solvable(self
->_pool
, self
->_id
);
275 return _Solvable_get_dependencies(solv
, solv
->suggests
);
278 PyObject
*Solvable_set_uuid(SolvableObject
*self
, PyObject
*args
) {
279 Solvable
*solv
= pool_id2solvable(self
->_pool
, self
->_id
);
283 if (!PyArg_ParseTuple(args
, "s", &uuid
)) {
284 /* XXX raise exception */
288 repo_set_str(solv
->repo
, self
->_id
, SOLVABLE_PKGID
, uuid
);
293 PyObject
*Solvable_get_uuid(SolvableObject
*self
) {
294 Solvable
*solv
= pool_id2solvable(self
->_pool
, self
->_id
);
296 const char *uuid
= repo_lookup_str(solv
->repo
, self
->_id
, SOLVABLE_PKGID
);
298 return Py_BuildValue("s", uuid
);
301 PyObject
*Solvable_set_hash1(SolvableObject
*self
, PyObject
*args
) {
302 Solvable
*solv
= pool_id2solvable(self
->_pool
, self
->_id
);
306 if (!PyArg_ParseTuple(args
, "s", &hash1
)) {
307 /* XXX raise exception */
311 repo_set_str(solv
->repo
, self
->_id
, SOLVABLE_CHECKSUM
, hash1
);
316 PyObject
*Solvable_get_hash1(SolvableObject
*self
) {
317 Solvable
*solv
= pool_id2solvable(self
->_pool
, self
->_id
);
319 const char *hash1
= repo_lookup_str(solv
->repo
, self
->_id
, SOLVABLE_CHECKSUM
);
321 return Py_BuildValue("s", hash1
);
324 PyObject
*Solvable_set_summary(SolvableObject
*self
, PyObject
*args
) {
325 Solvable
*solv
= pool_id2solvable(self
->_pool
, self
->_id
);
329 if (!PyArg_ParseTuple(args
, "s", &summary
)) {
330 /* XXX raise exception */
334 repo_set_str(solv
->repo
, self
->_id
, SOLVABLE_SUMMARY
, summary
);
339 PyObject
*Solvable_get_summary(SolvableObject
*self
) {
340 Solvable
*solv
= pool_id2solvable(self
->_pool
, self
->_id
);
342 const char *summary
= repo_lookup_str(solv
->repo
, self
->_id
, SOLVABLE_SUMMARY
);
344 return Py_BuildValue("s", summary
);
347 PyObject
*Solvable_set_description(SolvableObject
*self
, PyObject
*args
) {
348 Solvable
*solv
= pool_id2solvable(self
->_pool
, self
->_id
);
352 if (!PyArg_ParseTuple(args
, "s", &desc
)) {
353 /* XXX raise exception */
357 repo_set_str(solv
->repo
, self
->_id
, SOLVABLE_DESCRIPTION
, desc
);
362 PyObject
*Solvable_get_description(SolvableObject
*self
) {
363 Solvable
*solv
= pool_id2solvable(self
->_pool
, self
->_id
);
365 const char *desc
= repo_lookup_str(solv
->repo
, self
->_id
,
366 SOLVABLE_DESCRIPTION
);
368 return Py_BuildValue("s", desc
);
371 PyObject
*Solvable_set_url(SolvableObject
*self
, PyObject
*args
) {
372 Solvable
*solv
= pool_id2solvable(self
->_pool
, self
->_id
);
376 if (!PyArg_ParseTuple(args
, "s", &url
)) {
377 /* XXX raise exception */
381 repo_set_str(solv
->repo
, self
->_id
, SOLVABLE_URL
, url
);
386 PyObject
*Solvable_get_url(SolvableObject
*self
) {
387 Solvable
*solv
= pool_id2solvable(self
->_pool
, self
->_id
);
389 const char *url
= repo_lookup_str(solv
->repo
, self
->_id
, SOLVABLE_URL
);
391 return Py_BuildValue("s", url
);
394 PyObject
*Solvable_set_groups(SolvableObject
*self
, PyObject
*args
) {
395 Solvable
*solv
= pool_id2solvable(self
->_pool
, self
->_id
);
399 if (!PyArg_ParseTuple(args
, "s", &groups
)) {
400 /* XXX raise exception */
404 repo_set_str(solv
->repo
, self
->_id
, SOLVABLE_GROUP
, groups
);
409 PyObject
*Solvable_get_groups(SolvableObject
*self
) {
410 Solvable
*solv
= pool_id2solvable(self
->_pool
, self
->_id
);
412 const char *groups
= repo_lookup_str(solv
->repo
, self
->_id
, SOLVABLE_GROUP
);
414 return Py_BuildValue("s", groups
);
417 PyObject
*Solvable_set_filename(SolvableObject
*self
, PyObject
*args
) {
418 Solvable
*solv
= pool_id2solvable(self
->_pool
, self
->_id
);
420 const char *filename
;
422 if (!PyArg_ParseTuple(args
, "s", &filename
)) {
423 /* XXX raise exception */
427 repo_set_str(solv
->repo
, self
->_id
, SOLVABLE_MEDIAFILE
, filename
);
432 PyObject
*Solvable_get_filename(SolvableObject
*self
) {
433 Solvable
*solv
= pool_id2solvable(self
->_pool
, self
->_id
);
435 const char *filename
= repo_lookup_str(solv
->repo
, self
->_id
,
438 return Py_BuildValue("s", filename
);
441 PyObject
*Solvable_set_license(SolvableObject
*self
, PyObject
*args
) {
442 Solvable
*solv
= pool_id2solvable(self
->_pool
, self
->_id
);
446 if (!PyArg_ParseTuple(args
, "s", &license
)) {
447 /* XXX raise exception */
451 repo_set_str(solv
->repo
, self
->_id
, SOLVABLE_LICENSE
, license
);
456 PyObject
*Solvable_get_license(SolvableObject
*self
) {
457 Solvable
*solv
= pool_id2solvable(self
->_pool
, self
->_id
);
459 const char *license
= repo_lookup_str(solv
->repo
, self
->_id
,
462 return Py_BuildValue("s", license
);
465 PyObject
*Solvable_set_buildhost(SolvableObject
*self
, PyObject
*args
) {
466 Solvable
*solv
= pool_id2solvable(self
->_pool
, self
->_id
);
468 const char *buildhost
;
470 if (!PyArg_ParseTuple(args
, "s", &buildhost
)) {
471 /* XXX raise exception */
475 repo_set_str(solv
->repo
, self
->_id
, SOLVABLE_BUILDHOST
, buildhost
);
480 PyObject
*Solvable_get_buildhost(SolvableObject
*self
) {
481 Solvable
*solv
= pool_id2solvable(self
->_pool
, self
->_id
);
483 const char *buildhost
= repo_lookup_str(solv
->repo
, self
->_id
,
486 return Py_BuildValue("s", buildhost
);
489 PyObject
*Solvable_set_maintainer(SolvableObject
*self
, PyObject
*args
) {
490 Solvable
*solv
= pool_id2solvable(self
->_pool
, self
->_id
);
492 const char *maintainer
;
494 if (!PyArg_ParseTuple(args
, "s", &maintainer
)) {
495 /* XXX raise exception */
499 repo_set_str(solv
->repo
, self
->_id
, SOLVABLE_PACKAGER
, maintainer
);
504 PyObject
*Solvable_get_maintainer(SolvableObject
*self
) {
505 Solvable
*solv
= pool_id2solvable(self
->_pool
, self
->_id
);
507 const char *maintainer
= repo_lookup_str(solv
->repo
, self
->_id
,
510 return Py_BuildValue("s", maintainer
);
513 PyObject
*Solvable_set_downloadsize(SolvableObject
*self
, PyObject
*args
) {
514 Solvable
*solv
= pool_id2solvable(self
->_pool
, self
->_id
);
516 unsigned long long downloadsize
;
518 if (!PyArg_ParseTuple(args
, "K", &downloadsize
)) {
522 repo_set_num(solv
->repo
, self
->_id
, SOLVABLE_DOWNLOADSIZE
, downloadsize
);
527 PyObject
*Solvable_get_downloadsize(SolvableObject
*self
) {
528 Solvable
*solv
= pool_id2solvable(self
->_pool
, self
->_id
);
530 unsigned long long downloadsize
= repo_lookup_num(solv
->repo
, self
->_id
,
531 SOLVABLE_DOWNLOADSIZE
, 0);
533 return Py_BuildValue("K", downloadsize
);
536 PyObject
*Solvable_set_installsize(SolvableObject
*self
, PyObject
*args
) {
537 Solvable
*solv
= pool_id2solvable(self
->_pool
, self
->_id
);
539 unsigned int installedsize
;
541 if (!PyArg_ParseTuple(args
, "i", &installedsize
)) {
542 /* XXX raise exception */
546 repo_set_num(solv
->repo
, self
->_id
, SOLVABLE_INSTALLSIZE
, installedsize
);
551 PyObject
*Solvable_get_installsize(SolvableObject
*self
) {
552 Solvable
*solv
= pool_id2solvable(self
->_pool
, self
->_id
);
554 unsigned int installedsize
= repo_lookup_num(solv
->repo
, self
->_id
,
555 SOLVABLE_INSTALLSIZE
, 0);
557 return Py_BuildValue("i", installedsize
);
560 PyObject
*Solvable_set_buildtime(SolvableObject
*self
, PyObject
*args
) {
561 Solvable
*solv
= pool_id2solvable(self
->_pool
, self
->_id
);
563 unsigned int buildtime
;
565 if (!PyArg_ParseTuple(args
, "i", &buildtime
)) {
566 /* XXX raise exception */
570 repo_set_num(solv
->repo
, self
->_id
, SOLVABLE_BUILDTIME
, buildtime
);
575 PyObject
*Solvable_get_buildtime(SolvableObject
*self
) {
576 Solvable
*solv
= pool_id2solvable(self
->_pool
, self
->_id
);
578 unsigned int buildtime
= repo_lookup_num(solv
->repo
, self
->_id
,
579 SOLVABLE_BUILDTIME
, 0);
584 return Py_BuildValue("i", buildtime
);