1
// -*- mode: cpp; mode: fold -*-
3
// $Id: cache.cc,v 1.3 2002/02/26 01:36:15 mdz Exp $
4
/* ######################################################################
6
Cache - Wrapper for the cache related functions
8
##################################################################### */
10
// Include Files /*{{{*/
12
#include "apt_pkgmodule.h"
14
#include <apt-pkg/pkgcache.h>
15
#include <apt-pkg/cachefile.h>
16
#include <apt-pkg/sptr.h>
23
pkgCache::PkgIterator Iter;
24
unsigned long LastIndex;
26
PkgListStruct(pkgCache::PkgIterator const &I) : Iter(I), LastIndex(0) {}
27
PkgListStruct() {abort();}; // G++ Bug..
32
pkgCache::DepIterator Iter;
33
pkgCache::DepIterator Start;
34
unsigned long LastIndex;
37
RDepListStruct(pkgCache::DepIterator const &I) : Iter(I), Start(I),
41
pkgCache::DepIterator D = I;
42
for (; D.end() == false; D++)
45
RDepListStruct() {abort();}; // G++ Bug..
48
static PyObject *CreateProvides(PyObject *Owner,pkgCache::PrvIterator I)
50
PyObject *List = PyList_New(0);
51
for (; I.end() == false; I++)
55
Ver = CppOwnedPyObject_NEW<pkgCache::VerIterator>(Owner,&VersionType,
57
Obj = Py_BuildValue("ssN",I.ParentPkg().Name(),I.ProvideVersion(),
59
PyList_Append(List,Obj);
65
// Cache Class /*{{{*/
66
// ---------------------------------------------------------------------
67
static PyObject *CacheAttr(PyObject *Self,char *Name)
69
pkgCache *Cache = GetCpp<pkgCache *>(Self);
71
if (strcmp("Packages",Name) == 0)
72
return CppOwnedPyObject_NEW<PkgListStruct>(Self,&PkgListType,Cache->PkgBegin());
73
else if (strcmp("PackageCount",Name) == 0)
74
return Py_BuildValue("i",Cache->HeaderP->PackageCount);
75
else if (strcmp("VersionCount",Name) == 0)
76
return Py_BuildValue("i",Cache->HeaderP->VersionCount);
77
else if (strcmp("DependsCount",Name) == 0)
78
return Py_BuildValue("i",Cache->HeaderP->DependsCount);
79
else if (strcmp("PackageFileCount",Name) == 0)
80
return Py_BuildValue("i",Cache->HeaderP->PackageFileCount);
81
else if (strcmp("VerFileCount",Name) == 0)
82
return Py_BuildValue("i",Cache->HeaderP->VerFileCount);
83
else if (strcmp("ProvidesCount",Name) == 0)
84
return Py_BuildValue("i",Cache->HeaderP->ProvidesCount);
85
else if (strcmp("FileList",Name) == 0)
87
PyObject *List = PyList_New(0);
88
for (pkgCache::PkgFileIterator I = Cache->FileBegin(); I.end() == false; I++)
91
Obj = CppOwnedPyObject_NEW<pkgCache::PkgFileIterator>(Self,&PackageFileType,I);
92
PyList_Append(List,Obj);
98
PyErr_SetString(PyExc_AttributeError,Name);
102
// Map access, operator []
103
static PyObject *CacheMapOp(PyObject *Self,PyObject *Arg)
105
pkgCache *Cache = GetCpp<pkgCache *>(Self);
107
if (PyString_Check(Arg) == 0)
109
PyErr_SetNone(PyExc_TypeError);
113
// Search for the package
114
const char *Name = PyString_AsString(Arg);
115
pkgCache::PkgIterator Pkg = Cache->FindPkg(Name);
116
if (Pkg.end() == true)
118
PyErr_SetString(PyExc_KeyError,Name);
122
return CppOwnedPyObject_NEW<pkgCache::PkgIterator>(Self,&PackageType,Pkg);
125
static PyMappingMethods CacheMap = {0,CacheMapOp,0};
126
PyTypeObject PkgCacheType =
128
PyObject_HEAD_INIT(&PyType_Type)
130
"pkgCache", // tp_name
131
sizeof(CppOwnedPyObject<pkgCache *>), // tp_basicsize
134
CppOwnedDealloc<pkgCache *>, // tp_dealloc
136
CacheAttr, // tp_getattr
142
&CacheMap, // tp_as_mapping
147
// Package List Class /*{{{*/
148
// ---------------------------------------------------------------------
149
static int PkgListLen(PyObject *Self)
151
return GetCpp<PkgListStruct>(Self).Iter.Cache()->HeaderP->PackageCount;
154
static PyObject *PkgListItem(PyObject *iSelf,int Index)
156
PkgListStruct &Self = GetCpp<PkgListStruct>(iSelf);
157
if (Index < 0 || (unsigned)Index >= Self.Iter.Cache()->HeaderP->PackageCount)
159
PyErr_SetNone(PyExc_IndexError);
163
if ((unsigned)Index < Self.LastIndex)
166
Self.Iter = Self.Iter.Cache()->PkgBegin();
169
while ((unsigned)Index > Self.LastIndex)
173
if (Self.Iter.end() == true)
175
PyErr_SetNone(PyExc_IndexError);
180
return CppOwnedPyObject_NEW<pkgCache::PkgIterator>(GetOwner<PkgListStruct>(iSelf),&PackageType,
184
static PySequenceMethods PkgListSeq =
195
PyTypeObject PkgListType =
197
PyObject_HEAD_INIT(&PyType_Type)
199
"pkgCache::PkgIterator", // tp_name
200
sizeof(CppOwnedPyObject<PkgListStruct>), // tp_basicsize
203
CppOwnedDealloc<PkgListStruct>, // tp_dealloc
210
&PkgListSeq, // tp_as_sequence
216
// Package Class /*{{{*/
217
// ---------------------------------------------------------------------
218
static PyObject *PackageAttr(PyObject *Self,char *Name)
220
pkgCache::PkgIterator &Pkg = GetCpp<pkgCache::PkgIterator>(Self);
221
PyObject *Owner = GetOwner<pkgCache::PkgIterator>(Self);
223
if (strcmp("Name",Name) == 0)
224
return PyString_FromString(Pkg.Name());
225
else if (strcmp("VersionList",Name) == 0)
227
PyObject *List = PyList_New(0);
228
for (pkgCache::VerIterator I = Pkg.VersionList(); I.end() == false; I++)
231
Obj = CppOwnedPyObject_NEW<pkgCache::VerIterator>(Owner,&VersionType,I);
232
PyList_Append(List,Obj);
237
else if (strcmp("CurrentVer",Name) == 0)
239
if (Pkg->CurrentVer == 0)
245
return CppOwnedPyObject_NEW<pkgCache::VerIterator>(Owner,&VersionType,
248
else if (strcmp("Section",Name) == 0)
249
return Safe_FromString(Pkg.Section());
250
else if (strcmp("RevDependsList",Name) == 0)
251
return CppOwnedPyObject_NEW<RDepListStruct>(Owner,&RDepListType,
252
Pkg.RevDependsList());
253
else if (strcmp("ProvidesList",Name) == 0)
254
return CreateProvides(Owner,Pkg.ProvidesList());
255
else if (strcmp("SelectedState",Name) == 0)
256
return Py_BuildValue("i",Pkg->SelectedState);
257
else if (strcmp("InstState",Name) == 0)
258
return Py_BuildValue("i",Pkg->InstState);
259
else if (strcmp("CurrentState",Name) == 0)
260
return Py_BuildValue("i",Pkg->CurrentState);
261
else if (strcmp("ID",Name) == 0)
262
return Py_BuildValue("i",Pkg->ID);
263
else if (strcmp("Auto",Name) == 0)
264
return Py_BuildValue("i",(Pkg->Flags & pkgCache::Flag::Auto) != 0);
265
else if (strcmp("Essential",Name) == 0)
266
return Py_BuildValue("i",(Pkg->Flags & pkgCache::Flag::Essential) != 0);
267
else if (strcmp("Important",Name) == 0)
268
return Py_BuildValue("i",(Pkg->Flags & pkgCache::Flag::Important) != 0);
270
PyErr_SetString(PyExc_AttributeError,Name);
274
static PyObject *PackageRepr(PyObject *Self)
276
pkgCache::PkgIterator &Pkg = GetCpp<pkgCache::PkgIterator>(Self);
279
snprintf(S,sizeof(S),"<pkgCache::Package object: Name:'%s' Section: '%s'"
280
" ID:%u Flags:0x%lX>",
281
Pkg.Name(),Pkg.Section(),Pkg->ID,Pkg->Flags);
282
return PyString_FromString(S);
285
PyTypeObject PackageType =
287
PyObject_HEAD_INIT(&PyType_Type)
289
"pkgCache::Package", // tp_name
290
sizeof(CppOwnedPyObject<pkgCache::PkgIterator>), // tp_basicsize
293
CppOwnedDealloc<pkgCache::PkgIterator>, // tp_dealloc
295
PackageAttr, // tp_getattr
298
PackageRepr, // tp_repr
305
// Version Class /*{{{*/
306
// ---------------------------------------------------------------------
308
/* This is the simple depends result, the elements are split like
310
static PyObject *MakeDepends(PyObject *Owner,pkgCache::VerIterator &Ver,
313
PyObject *Dict = PyDict_New();
314
PyObject *LastDep = 0;
315
unsigned LastDepType = 0;
316
for (pkgCache::DepIterator D = Ver.DependsList(); D.end() == false; D++)
318
pkgCache::DepIterator Start;
319
pkgCache::DepIterator End;
322
// Switch/create a new dict entry
323
if (LastDepType != Start->Type || LastDep != 0)
325
PyObject *Dep = PyString_FromString(Start.DepType());
326
LastDepType = Start->Type;
327
LastDep = PyDict_GetItem(Dict,Dep);
330
LastDep = PyList_New(0);
331
PyDict_SetItem(Dict,Dep,LastDep);
337
PyObject *OrGroup = PyList_New(0);
342
Obj = CppOwnedPyObject_NEW<pkgCache::DepIterator>(Owner,&DependencyType,
346
if (Start->Version == 0)
347
Obj = Py_BuildValue("sss",
348
Start.TargetPkg().Name(),
352
Obj = Py_BuildValue("sss",
353
Start.TargetPkg().Name(),
357
PyList_Append(OrGroup,Obj);
365
PyList_Append(LastDep,OrGroup);
372
static PyObject *VersionAttr(PyObject *Self,char *Name)
374
pkgCache::VerIterator &Ver = GetCpp<pkgCache::VerIterator>(Self);
375
PyObject *Owner = GetOwner<pkgCache::VerIterator>(Self);
377
if (strcmp("VerStr",Name) == 0)
378
return PyString_FromString(Ver.VerStr());
379
else if (strcmp("Section",Name) == 0)
380
return Safe_FromString(Ver.Section());
381
else if (strcmp("Arch",Name) == 0)
382
return Safe_FromString(Ver.Arch());
383
else if (strcmp("FileList",Name) == 0)
385
/* The second value in the tuple is the index of the VF item. If the
386
user wants to request a lookup then that number will be used.
387
Maybe later it can become an object. */
388
PyObject *List = PyList_New(0);
389
for (pkgCache::VerFileIterator I = Ver.FileList(); I.end() == false; I++)
393
PkgFile = CppOwnedPyObject_NEW<pkgCache::PkgFileIterator>(Owner,&PackageFileType,I.File());
394
Obj = Py_BuildValue("Nl",PkgFile,I.Index());
395
PyList_Append(List,Obj);
400
else if (strcmp("DependsListStr",Name) == 0)
401
return MakeDepends(Owner,Ver,false);
402
else if (strcmp("DependsList",Name) == 0)
403
return MakeDepends(Owner,Ver,true);
404
else if (strcmp("ParentPkg",Name) == 0)
405
return CppOwnedPyObject_NEW<pkgCache::PkgIterator>(Owner,&PackageType,
407
else if (strcmp("ProvidesList",Name) == 0)
408
return CreateProvides(Owner,Ver.ProvidesList());
409
else if (strcmp("Size",Name) == 0)
410
return Py_BuildValue("i",Ver->Size);
411
else if (strcmp("InstalledSize",Name) == 0)
412
return Py_BuildValue("i",Ver->InstalledSize);
413
else if (strcmp("Hash",Name) == 0)
414
return Py_BuildValue("i",Ver->Hash);
415
else if (strcmp("ID",Name) == 0)
416
return Py_BuildValue("i",Ver->ID);
417
else if (strcmp("Priority",Name) == 0)
418
return Py_BuildValue("i",Ver->Priority);
419
else if (strcmp("PriorityStr",Name) == 0)
420
return PyString_FromString(Ver.PriorityType());
422
PyErr_SetString(PyExc_AttributeError,Name);
426
static PyObject *VersionRepr(PyObject *Self)
428
pkgCache::VerIterator &Ver = GetCpp<pkgCache::VerIterator>(Self);
431
snprintf(S,sizeof(S),"<pkgCache::Version object: Pkg:'%s' Ver:'%s' "
432
"Section:'%s' Arch:'%s' Size:%lu ISize:%lu Hash:%u "
433
"ID:%u Priority:%u>",
434
Ver.ParentPkg().Name(),Ver.VerStr(),Ver.Section(),Ver.Arch(),
435
(unsigned long)Ver->Size,(unsigned long)Ver->InstalledSize,
436
Ver->Hash,Ver->ID,Ver->Priority);
437
return PyString_FromString(S);
440
PyTypeObject VersionType =
442
PyObject_HEAD_INIT(&PyType_Type)
444
"pkgCache::VerIterator", // tp_name
445
sizeof(CppOwnedPyObject<pkgCache::VerIterator>), // tp_basicsize
448
CppOwnedDealloc<pkgCache::VerIterator>, // tp_dealloc
450
VersionAttr, // tp_getattr
453
VersionRepr, // tp_repr
461
// PackageFile Class /*{{{*/
462
// ---------------------------------------------------------------------
463
static PyObject *PackageFileAttr(PyObject *Self,char *Name)
465
pkgCache::PkgFileIterator &File = GetCpp<pkgCache::PkgFileIterator>(Self);
466
// PyObject *Owner = GetOwner<pkgCache::PkgFileIterator>(Self);
468
if (strcmp("FileName",Name) == 0)
469
return Safe_FromString(File.FileName());
470
else if (strcmp("Archive",Name) == 0)
471
return Safe_FromString(File.Archive());
472
else if (strcmp("Component",Name) == 0)
473
return Safe_FromString(File.Component());
474
else if (strcmp("Version",Name) == 0)
475
return Safe_FromString(File.Version());
476
else if (strcmp("Origin",Name) == 0)
477
return Safe_FromString(File.Origin());
478
else if (strcmp("Label",Name) == 0)
479
return Safe_FromString(File.Label());
480
else if (strcmp("Architecture",Name) == 0)
481
return Safe_FromString(File.Architecture());
482
else if (strcmp("Site",Name) == 0)
483
return Safe_FromString(File.Site());
484
else if (strcmp("IndexType",Name) == 0)
485
return Safe_FromString(File.IndexType());
486
else if (strcmp("Size",Name) == 0)
487
return Py_BuildValue("i",File->Size);
488
else if (strcmp("NotSource",Name) == 0)
489
return Py_BuildValue("i",(File->Flags & pkgCache::Flag::NotSource) != 0);
490
else if (strcmp("NotAutomatic",Name) == 0)
491
return Py_BuildValue("i",(File->Flags & pkgCache::Flag::NotAutomatic) != 0);
492
else if (strcmp("ID",Name) == 0)
493
return Py_BuildValue("i",File->ID);
494
/* mtime is really a cookie these days and has no meaning outside the
497
PyErr_SetString(PyExc_AttributeError,Name);
501
static PyObject *PackageFileRepr(PyObject *Self)
503
pkgCache::PkgFileIterator &File = GetCpp<pkgCache::PkgFileIterator>(Self);
506
snprintf(S,sizeof(S),"<pkgCache::PackageFile object: "
507
"File:'%s' a=%s,c=%s,v=%s,o=%s,l=%s "
508
"Arch='%s' Site='%s' IndexType='%s' Size=%lu "
509
"Flags=0x%lX ID:%u>",
510
File.FileName(),File.Archive(),File.Component(),File.Version(),
511
File.Origin(),File.Label(),File.Architecture(),File.Site(),
512
File.IndexType(),File->Size,File->Flags,File->ID);
513
return PyString_FromString(S);
516
PyTypeObject PackageFileType =
518
PyObject_HEAD_INIT(&PyType_Type)
520
"pkgCache::PkgFileIterator", // tp_name
521
sizeof(CppOwnedPyObject<pkgCache::PkgFileIterator>), // tp_basicsize
524
CppOwnedDealloc<pkgCache::PkgFileIterator>, // tp_dealloc
526
PackageFileAttr, // tp_getattr
529
PackageFileRepr, // tp_repr
537
static PyObject *DependencyRepr(PyObject *Self)
539
pkgCache::DepIterator &Dep = GetCpp<pkgCache::DepIterator>(Self);
542
snprintf(S,sizeof(S),"<pkgCache::Dependency object: "
543
"Pkg:'%s' Ver:'%s' Comp:'%s'>",
544
Dep.TargetPkg().Name(),
545
(Dep.TargetVer() == 0?"":Dep.TargetVer()),
547
return PyString_FromString(S);
550
static PyObject *DepSmartTargetPkg(PyObject *Self,PyObject *Args)
552
if (PyArg_ParseTuple(Args,"") == 0)
555
pkgCache::DepIterator &Dep = GetCpp<pkgCache::DepIterator>(Self);
556
PyObject *Owner = GetOwner<pkgCache::DepIterator>(Self);
558
pkgCache::PkgIterator P;
559
if (Dep.SmartTargetPkg(P) == false)
565
return CppOwnedPyObject_NEW<pkgCache::PkgIterator>(Owner,&PackageType,P);
568
static PyObject *DepAllTargets(PyObject *Self,PyObject *Args)
570
if (PyArg_ParseTuple(Args,"") == 0)
573
pkgCache::DepIterator &Dep = GetCpp<pkgCache::DepIterator>(Self);
574
PyObject *Owner = GetOwner<pkgCache::DepIterator>(Self);
576
SPtr<pkgCache::Version *> Vers = Dep.AllTargets();
577
PyObject *List = PyList_New(0);
578
for (pkgCache::Version **I = Vers; *I != 0; I++)
581
Obj = CppOwnedPyObject_NEW<pkgCache::VerIterator>(Owner,&VersionType,
582
pkgCache::VerIterator(*Dep.Cache(),*I));
583
PyList_Append(List,Obj);
589
static PyMethodDef DependencyMethods[] =
591
{"SmartTargetPkg",DepSmartTargetPkg,METH_VARARGS,"Returns the natural Target or None"},
592
{"AllTargets",DepAllTargets,METH_VARARGS,"Returns all possible Versions that match this dependency"},
596
// Dependency Class /*{{{*/
597
// ---------------------------------------------------------------------
599
static PyObject *DependencyAttr(PyObject *Self,char *Name)
601
pkgCache::DepIterator &Dep = GetCpp<pkgCache::DepIterator>(Self);
602
PyObject *Owner = GetOwner<pkgCache::DepIterator>(Self);
604
if (strcmp("TargetVer",Name) == 0)
606
if (Dep->Version == 0)
607
return PyString_FromString("");
608
return PyString_FromString(Dep.TargetVer());
610
else if (strcmp("TargetPkg",Name) == 0)
611
return CppOwnedPyObject_NEW<pkgCache::PkgIterator>(Owner,&PackageType,
613
else if (strcmp("ParentVer",Name) == 0)
614
return CppOwnedPyObject_NEW<pkgCache::VerIterator>(Owner,&VersionType,
616
else if (strcmp("ParentPkg",Name) == 0)
617
return CppOwnedPyObject_NEW<pkgCache::PkgIterator>(Owner,&PackageType, Dep.ParentPkg());
618
else if (strcmp("CompType",Name) == 0)
619
return PyString_FromString(Dep.CompType());
620
else if (strcmp("DepType",Name) == 0)
621
return PyString_FromString(Dep.DepType());
622
else if (strcmp("ID",Name) == 0)
623
return Py_BuildValue("i",Dep->ID);
625
return Py_FindMethod(DependencyMethods,Self,Name);
628
PyTypeObject DependencyType =
630
PyObject_HEAD_INIT(&PyType_Type)
632
"pkgCache::DepIterator", // tp_name
633
sizeof(CppOwnedPyObject<pkgCache::DepIterator>), // tp_basicsize
636
CppOwnedDealloc<pkgCache::DepIterator>, // tp_dealloc
638
DependencyAttr, // tp_getattr
641
DependencyRepr, // tp_repr
650
// Reverse Dependency List Class /*{{{*/
651
// ---------------------------------------------------------------------
652
static int RDepListLen(PyObject *Self)
654
return GetCpp<RDepListStruct>(Self).Len;
657
static PyObject *RDepListItem(PyObject *iSelf,int Index)
659
RDepListStruct &Self = GetCpp<RDepListStruct>(iSelf);
660
if (Index < 0 || (unsigned)Index >= Self.Len)
662
PyErr_SetNone(PyExc_IndexError);
666
if ((unsigned)Index < Self.LastIndex)
669
Self.Iter = Self.Start;
672
while ((unsigned)Index > Self.LastIndex)
676
if (Self.Iter.end() == true)
678
PyErr_SetNone(PyExc_IndexError);
683
return CppOwnedPyObject_NEW<pkgCache::DepIterator>(GetOwner<RDepListStruct>(iSelf),
684
&DependencyType,Self.Iter);
687
static PySequenceMethods RDepListSeq =
698
PyTypeObject RDepListType =
700
PyObject_HEAD_INIT(&PyType_Type)
702
"pkgCache::DepIterator", // tp_name
703
sizeof(CppOwnedPyObject<RDepListStruct>), // tp_basicsize
706
CppOwnedDealloc<RDepListStruct>, // tp_dealloc
713
&RDepListSeq, // tp_as_sequence
720
PyObject *TmpGetCache(PyObject *Self,PyObject *Args)
722
if (PyArg_ParseTuple(Args,"") == 0)
725
pkgCacheFile *Cache = new pkgCacheFile();
727
if (Cache->Open(Prog,false) == false)
728
return HandleErrors();
730
return CppOwnedPyObject_NEW<pkgCache *>(0,&PkgCacheType,(pkgCache *)(*Cache));