diff options
| author | Arch Librarian <arch@canonical.com> | 2004-11-24 10:00:17 +0000 |
|---|---|---|
| committer | Arch Librarian <arch@canonical.com> | 2004-11-24 10:00:17 +0000 |
| commit | 507d25595a7e989139b9c425b39f02ee48fa033e (patch) | |
| tree | b6d9a27db1078d62df8efe68a853165f324bfb60 /python/cache.cc | |
| download | python-apt-507d25595a7e989139b9c425b39f02ee48fa033e.tar.gz | |
Initial revision
Author: jgg
Date: 2001-02-20 06:32:01 GMT
Initial revision
Diffstat (limited to 'python/cache.cc')
| -rw-r--r-- | python/cache.cc | 731 |
1 files changed, 731 insertions, 0 deletions
diff --git a/python/cache.cc b/python/cache.cc new file mode 100644 index 00000000..794b4f57 --- /dev/null +++ b/python/cache.cc @@ -0,0 +1,731 @@ +// -*- mode: cpp; mode: fold -*- +// Description /*{{{*/ +// $Id: cache.cc,v 1.1 2001/02/20 06:32:01 jgg Exp $ +/* ###################################################################### + + Cache - Wrapper for the cache related functions + + ##################################################################### */ + /*}}}*/ +// Include Files /*{{{*/ +#include "generic.h" +#include "apt_pkgmodule.h" + +#include <apt-pkg/pkgcache.h> +#include <apt-pkg/cachefile.h> +#include <apt-pkg/sptr.h> + +#include <python/Python.h> + /*}}}*/ + +struct PkgListStruct +{ + pkgCache::PkgIterator Iter; + unsigned long LastIndex; + + PkgListStruct(pkgCache::PkgIterator const &I) : Iter(I), LastIndex(0) {} + PkgListStruct() {abort();}; // G++ Bug.. +}; + +struct RDepListStruct +{ + pkgCache::DepIterator Iter; + pkgCache::DepIterator Start; + unsigned long LastIndex; + unsigned long Len; + + RDepListStruct(pkgCache::DepIterator const &I) : Iter(I), Start(I), + LastIndex(0) + { + Len = 0; + pkgCache::DepIterator D = I; + for (; D.end() == false; D++) + Len++; + } + RDepListStruct() {abort();}; // G++ Bug.. +}; + +static PyObject *CreateProvides(PyObject *Owner,pkgCache::PrvIterator I) +{ + PyObject *List = PyList_New(0); + for (; I.end() == false; I++) + { + PyObject *Obj; + PyObject *Ver; + Ver = CppOwnedPyObject_NEW<pkgCache::VerIterator>(Owner,&VersionType, + I.OwnerVer()); + Obj = Py_BuildValue("ssN",I.ParentPkg().Name(),I.ProvideVersion(), + Ver); + PyList_Append(List,Obj); + Py_DECREF(Obj); + } + return List; +} + +// Cache Class /*{{{*/ +// --------------------------------------------------------------------- +static PyObject *CacheAttr(PyObject *Self,char *Name) +{ + pkgCache *Cache = GetCpp<pkgCache *>(Self); + + if (strcmp("Packages",Name) == 0) + return CppOwnedPyObject_NEW<PkgListStruct>(Self,&PkgListType,Cache->PkgBegin()); + else if (strcmp("PackageCount",Name) == 0) + return Py_BuildValue("i",Cache->HeaderP->PackageCount); + else if (strcmp("VersionCount",Name) == 0) + return Py_BuildValue("i",Cache->HeaderP->VersionCount); + else if (strcmp("DependsCount",Name) == 0) + return Py_BuildValue("i",Cache->HeaderP->DependsCount); + else if (strcmp("PackageFileCount",Name) == 0) + return Py_BuildValue("i",Cache->HeaderP->PackageFileCount); + else if (strcmp("VerFileCount",Name) == 0) + return Py_BuildValue("i",Cache->HeaderP->VerFileCount); + else if (strcmp("ProvidesCount",Name) == 0) + return Py_BuildValue("i",Cache->HeaderP->ProvidesCount); + else if (strcmp("FileList",Name) == 0) + { + PyObject *List = PyList_New(0); + for (pkgCache::PkgFileIterator I = Cache->FileBegin(); I.end() == false; I++) + { + PyObject *Obj; + Obj = CppOwnedPyObject_NEW<pkgCache::PkgFileIterator>(Self,&PackageFileType,I); + PyList_Append(List,Obj); + Py_DECREF(Obj); + } + return List; + } + + PyErr_SetString(PyExc_AttributeError,Name); + return 0; +} + +// Map access, operator [] +static PyObject *CacheMapOp(PyObject *Self,PyObject *Arg) +{ + pkgCache *Cache = GetCpp<pkgCache *>(Self); + + if (PyString_Check(Arg) == 0) + { + PyErr_SetNone(PyExc_TypeError); + return 0; + } + + // Search for the package + const char *Name = PyString_AsString(Arg); + pkgCache::PkgIterator Pkg = Cache->FindPkg(Name); + if (Pkg.end() == true) + { + PyErr_SetString(PyExc_KeyError,Name); + return 0; + } + + return CppOwnedPyObject_NEW<pkgCache::PkgIterator>(Self,&PackageType,Pkg); +} + +static PyMappingMethods CacheMap = {0,CacheMapOp,0}; +PyTypeObject PkgCacheType = +{ + PyObject_HEAD_INIT(&PyType_Type) + 0, // ob_size + "pkgCache", // tp_name + sizeof(CppOwnedPyObject<pkgCache *>), // tp_basicsize + 0, // tp_itemsize + // Methods + CppOwnedDealloc<pkgCache *>, // tp_dealloc + 0, // tp_print + CacheAttr, // tp_getattr + 0, // tp_setattr + 0, // tp_compare + 0, // tp_repr + 0, // tp_as_number + 0, // tp_as_sequence + &CacheMap, // tp_as_mapping + 0, // tp_hash +}; + + /*}}}*/ +// Package List Class /*{{{*/ +// --------------------------------------------------------------------- +static int PkgListLen(PyObject *Self) +{ + return GetCpp<PkgListStruct>(Self).Iter.Cache()->HeaderP->PackageCount; +} + +static PyObject *PkgListItem(PyObject *iSelf,int Index) +{ + PkgListStruct &Self = GetCpp<PkgListStruct>(iSelf); + if (Index < 0 || (unsigned)Index >= Self.Iter.Cache()->HeaderP->PackageCount) + { + PyErr_SetNone(PyExc_IndexError); + return 0; + } + + if ((unsigned)Index < Self.LastIndex) + { + Self.LastIndex = 0; + Self.Iter = Self.Iter.Cache()->PkgBegin(); + } + + while ((unsigned)Index > Self.LastIndex) + { + Self.LastIndex++; + Self.Iter++; + if (Self.Iter.end() == true) + { + PyErr_SetNone(PyExc_IndexError); + return 0; + } + } + + return CppOwnedPyObject_NEW<pkgCache::PkgIterator>(GetOwner<PkgListStruct>(iSelf),&PackageType, + Self.Iter); +} + +static PySequenceMethods PkgListSeq = +{ + PkgListLen, + 0, // concat + 0, // repeat + PkgListItem, + 0, // slice + 0, // assign item + 0 // assign slice +}; + +PyTypeObject PkgListType = +{ + PyObject_HEAD_INIT(&PyType_Type) + 0, // ob_size + "pkgCache::PkgIterator", // tp_name + sizeof(CppOwnedPyObject<PkgListStruct>), // tp_basicsize + 0, // tp_itemsize + // Methods + CppOwnedDealloc<PkgListStruct>, // tp_dealloc + 0, // tp_print + 0, // tp_getattr + 0, // tp_setattr + 0, // tp_compare + 0, // tp_repr + 0, // tp_as_number + &PkgListSeq, // tp_as_sequence + 0, // tp_as_mapping + 0, // tp_hash +}; + + /*}}}*/ +// Package Class /*{{{*/ +// --------------------------------------------------------------------- +static PyObject *PackageAttr(PyObject *Self,char *Name) +{ + pkgCache::PkgIterator &Pkg = GetCpp<pkgCache::PkgIterator>(Self); + PyObject *Owner = GetOwner<pkgCache::PkgIterator>(Self); + + if (strcmp("Name",Name) == 0) + return PyString_FromString(Pkg.Name()); + else if (strcmp("VersionList",Name) == 0) + { + PyObject *List = PyList_New(0); + for (pkgCache::VerIterator I = Pkg.VersionList(); I.end() == false; I++) + { + PyObject *Obj; + Obj = CppOwnedPyObject_NEW<pkgCache::VerIterator>(Owner,&VersionType,I); + PyList_Append(List,Obj); + Py_DECREF(Obj); + } + return List; + } + else if (strcmp("CurrentVer",Name) == 0) + { + if (Pkg->CurrentVer == 0) + { + Py_INCREF(Py_None); + return Py_None; + } + + return CppOwnedPyObject_NEW<pkgCache::VerIterator>(Owner,&VersionType, + Pkg.CurrentVer()); + } + else if (strcmp("Section",Name) == 0) + return Safe_FromString(Pkg.Section()); + else if (strcmp("RevDependsList",Name) == 0) + return CppOwnedPyObject_NEW<RDepListStruct>(Owner,&RDepListType, + Pkg.RevDependsList()); + else if (strcmp("ProvidesList",Name) == 0) + return CreateProvides(Owner,Pkg.ProvidesList()); + else if (strcmp("SelectedState",Name) == 0) + return Py_BuildValue("i",Pkg->SelectedState); + else if (strcmp("InstState",Name) == 0) + return Py_BuildValue("i",Pkg->InstState); + else if (strcmp("CurrentState",Name) == 0) + return Py_BuildValue("i",Pkg->CurrentState); + else if (strcmp("ID",Name) == 0) + return Py_BuildValue("i",Pkg->ID); + else if (strcmp("Auto",Name) == 0) + return Py_BuildValue("i",(Pkg->Flags & pkgCache::Flag::Auto) != 0); + else if (strcmp("Essential",Name) == 0) + return Py_BuildValue("i",(Pkg->Flags & pkgCache::Flag::Essential) != 0); + else if (strcmp("Important",Name) == 0) + return Py_BuildValue("i",(Pkg->Flags & pkgCache::Flag::Important) != 0); + + PyErr_SetString(PyExc_AttributeError,Name); + return 0; +} + +static PyObject *PackageRepr(PyObject *Self) +{ + pkgCache::PkgIterator &Pkg = GetCpp<pkgCache::PkgIterator>(Self); + + char S[300]; + snprintf(S,sizeof(S),"<pkgCache::Package object: Name:'%s' Section: '%s'" + " ID:%u Flags:0x%lX>", + Pkg.Name(),Pkg.Section(),Pkg->ID,Pkg->Flags); + return PyString_FromString(S); +} + +PyTypeObject PackageType = +{ + PyObject_HEAD_INIT(&PyType_Type) + 0, // ob_size + "pkgCache::Package", // tp_name + sizeof(CppOwnedPyObject<pkgCache::PkgIterator>), // tp_basicsize + 0, // tp_itemsize + // Methods + CppOwnedDealloc<pkgCache::PkgIterator>, // tp_dealloc + 0, // tp_print + PackageAttr, // tp_getattr + 0, // tp_setattr + 0, // tp_compare + PackageRepr, // tp_repr + 0, // tp_as_number + 0, // tp_as_sequence + 0, // tp_as_mapping + 0, // tp_hash +}; + /*}}}*/ +// Version Class /*{{{*/ +// --------------------------------------------------------------------- + +/* This is the simple depends result, the elements are split like + ParseDepends does */ +static PyObject *MakeDepends(PyObject *Owner,pkgCache::VerIterator &Ver, + bool AsObj) +{ + PyObject *Dict = PyDict_New(); + PyObject *LastDep = 0; + unsigned LastDepType = 0; + for (pkgCache::DepIterator D = Ver.DependsList(); D.end() == false; D++) + { + pkgCache::DepIterator Start; + pkgCache::DepIterator End; + D.GlobOr(Start,End); + + // Switch/create a new dict entry + if (LastDepType != Start->Type || LastDep != 0) + { + PyObject *Dep = PyString_FromString(Start.DepType()); + LastDepType = Start->Type; + LastDep = PyDict_GetItem(Dict,Dep); + if (LastDep == 0) + { + LastDep = PyList_New(0); + PyDict_SetItem(Dict,Dep,LastDep); + Py_DECREF(LastDep); + } + Py_DECREF(Dep); + } + + PyObject *OrGroup = PyList_New(0); + while (1) + { + PyObject *Obj; + if (AsObj == true) + Obj = CppOwnedPyObject_NEW<pkgCache::DepIterator>(Owner,&DependencyType, + Start); + else + { + if (Start->Version == 0) + Obj = Py_BuildValue("sss", + Start.TargetPkg().Name(), + "", + Start.CompType()); + else + Obj = Py_BuildValue("sss", + Start.TargetPkg().Name(), + Start.TargetVer(), + Start.CompType()); + } + PyList_Append(OrGroup,Obj); + Py_DECREF(Obj); + + if (Start == End) + break; + Start++; + } + + PyList_Append(LastDep,OrGroup); + Py_DECREF(OrGroup); + } + + return Dict; +} + +static PyObject *VersionAttr(PyObject *Self,char *Name) +{ + pkgCache::VerIterator &Ver = GetCpp<pkgCache::VerIterator>(Self); + PyObject *Owner = GetOwner<pkgCache::VerIterator>(Self); + + if (strcmp("VerStr",Name) == 0) + return PyString_FromString(Ver.VerStr()); + else if (strcmp("Section",Name) == 0) + return Safe_FromString(Ver.Section()); + else if (strcmp("Arch",Name) == 0) + return Safe_FromString(Ver.Arch()); + else if (strcmp("FileList",Name) == 0) + { + /* The second value in the tuple is the index of the VF item. If the + user wants to request a lookup then that number will be used. + Maybe later it can become an object. */ + PyObject *List = PyList_New(0); + for (pkgCache::VerFileIterator I = Ver.FileList(); I.end() == false; I++) + { + PyObject *PkgFile; + PyObject *Obj; + PkgFile = CppOwnedPyObject_NEW<pkgCache::PkgFileIterator>(Owner,&PackageFileType,I.File()); + Obj = Py_BuildValue("Nl",PkgFile,I.Index()); + PyList_Append(List,Obj); + Py_DECREF(Obj); + } + return List; + } + else if (strcmp("DependsListStr",Name) == 0) + return MakeDepends(Owner,Ver,false); + else if (strcmp("DependsList",Name) == 0) + return MakeDepends(Owner,Ver,true); + else if (strcmp("ParentPkg",Name) == 0) + return CppOwnedPyObject_NEW<pkgCache::PkgIterator>(Owner,&PackageType, + Ver.ParentPkg()); + else if (strcmp("ProvidesList",Name) == 0) + return CreateProvides(Owner,Ver.ProvidesList()); + else if (strcmp("Size",Name) == 0) + return Py_BuildValue("i",Ver->Size); + else if (strcmp("InstalledSize",Name) == 0) + return Py_BuildValue("i",Ver->InstalledSize); + else if (strcmp("Hash",Name) == 0) + return Py_BuildValue("i",Ver->Hash); + else if (strcmp("ID",Name) == 0) + return Py_BuildValue("i",Ver->ID); + else if (strcmp("Priority",Name) == 0) + return Py_BuildValue("i",Ver->Priority); + else if (strcmp("PriorityStr",Name) == 0) + return PyString_FromString(Ver.PriorityType()); + + PyErr_SetString(PyExc_AttributeError,Name); + return 0; +} + +static PyObject *VersionRepr(PyObject *Self) +{ + pkgCache::VerIterator &Ver = GetCpp<pkgCache::VerIterator>(Self); + + char S[300]; + snprintf(S,sizeof(S),"<pkgCache::Version object: Pkg:'%s' Ver:'%s' " + "Section:'%s' Arch:'%s' Size:%lu ISize:%lu Hash:%u " + "ID:%u Priority:%u>", + Ver.ParentPkg().Name(),Ver.VerStr(),Ver.Section(),Ver.Arch(), + (unsigned long)Ver->Size,(unsigned long)Ver->InstalledSize, + Ver->Hash,Ver->ID,Ver->Priority); + return PyString_FromString(S); +} + +PyTypeObject VersionType = +{ + PyObject_HEAD_INIT(&PyType_Type) + 0, // ob_size + "pkgCache::VerIterator", // tp_name + sizeof(CppOwnedPyObject<pkgCache::VerIterator>), // tp_basicsize + 0, // tp_itemsize + // Methods + CppOwnedDealloc<pkgCache::VerIterator>, // tp_dealloc + 0, // tp_print + VersionAttr, // tp_getattr + 0, // tp_setattr + 0, // tp_compare + VersionRepr, // tp_repr + 0, // tp_as_number + 0, // tp_as_sequence + 0, // tp_as_mapping + 0, // tp_hash +}; + + /*}}}*/ +// PackageFile Class /*{{{*/ +// --------------------------------------------------------------------- +static PyObject *PackageFileAttr(PyObject *Self,char *Name) +{ + pkgCache::PkgFileIterator &File = GetCpp<pkgCache::PkgFileIterator>(Self); +// PyObject *Owner = GetOwner<pkgCache::PkgFileIterator>(Self); + + if (strcmp("FileName",Name) == 0) + return Safe_FromString(File.FileName()); + else if (strcmp("Archive",Name) == 0) + return Safe_FromString(File.Archive()); + else if (strcmp("Component",Name) == 0) + return Safe_FromString(File.Component()); + else if (strcmp("Version",Name) == 0) + return Safe_FromString(File.Version()); + else if (strcmp("Origin",Name) == 0) + return Safe_FromString(File.Origin()); + else if (strcmp("Label",Name) == 0) + return Safe_FromString(File.Label()); + else if (strcmp("Architecture",Name) == 0) + return Safe_FromString(File.Architecture()); + else if (strcmp("Site",Name) == 0) + return Safe_FromString(File.Site()); + else if (strcmp("IndexType",Name) == 0) + return Safe_FromString(File.IndexType()); + else if (strcmp("Size",Name) == 0) + return Py_BuildValue("i",File->Size); + else if (strcmp("NotSource",Name) == 0) + return Py_BuildValue("i",(File->Flags & pkgCache::Flag::NotSource) != 0); + else if (strcmp("NotAutomatic",Name) == 0) + return Py_BuildValue("i",(File->Flags & pkgCache::Flag::NotAutomatic) != 0); + else if (strcmp("ID",Name) == 0) + return Py_BuildValue("i",File->ID); + /* mtime is really a cookie these days and has no meaning outside the + list handlers */ + + PyErr_SetString(PyExc_AttributeError,Name); + return 0; +} + +static PyObject *PackageFileRepr(PyObject *Self) +{ + pkgCache::PkgFileIterator &File = GetCpp<pkgCache::PkgFileIterator>(Self); + + char S[300]; + snprintf(S,sizeof(S),"<pkgCache::PackageFile object: " + "File:'%s' a=%s,c=%s,v=%s,o=%s,l=%s " + "Arch='%s' Site='%s' IndexType='%s' Size=%lu " + "Flags=0x%lX ID:%u>", + File.FileName(),File.Archive(),File.Component(),File.Version(), + File.Origin(),File.Label(),File.Architecture(),File.Site(), + File.IndexType(),File->Size,File->Flags,File->ID); + return PyString_FromString(S); +} + +PyTypeObject PackageFileType = +{ + PyObject_HEAD_INIT(&PyType_Type) + 0, // ob_size + "pkgCache::PkgFileIterator", // tp_name + sizeof(CppOwnedPyObject<pkgCache::PkgFileIterator>), // tp_basicsize + 0, // tp_itemsize + // Methods + CppOwnedDealloc<pkgCache::PkgFileIterator>, // tp_dealloc + 0, // tp_print + PackageFileAttr, // tp_getattr + 0, // tp_setattr + 0, // tp_compare + PackageFileRepr, // tp_repr + 0, // tp_as_number + 0, // tp_as_sequence + 0, // tp_as_mapping + 0, // tp_hash +}; + + /*}}}*/ +// Dependency Class /*{{{*/ +// --------------------------------------------------------------------- +static PyMethodDef DependencyMethods[]; + +static PyObject *DependencyAttr(PyObject *Self,char *Name) +{ + pkgCache::DepIterator &Dep = GetCpp<pkgCache::DepIterator>(Self); + PyObject *Owner = GetOwner<pkgCache::DepIterator>(Self); + + if (strcmp("TargetVer",Name) == 0) + { + if (Dep->Version == 0) + return PyString_FromString(""); + return PyString_FromString(Dep.TargetVer()); + } + else if (strcmp("TargetPkg",Name) == 0) + return CppOwnedPyObject_NEW<pkgCache::PkgIterator>(Owner,&PackageType, + Dep.TargetPkg()); + else if (strcmp("ParentVer",Name) == 0) + return CppOwnedPyObject_NEW<pkgCache::VerIterator>(Owner,&VersionType, + Dep.ParentVer()); + else if (strcmp("ParentPkg",Name) == 0) + return CppOwnedPyObject_NEW<pkgCache::PkgIterator>(Owner,&PackageType, Dep.ParentPkg()); + else if (strcmp("CompType",Name) == 0) + return PyString_FromString(Dep.CompType()); + else if (strcmp("DepType",Name) == 0) + return PyString_FromString(Dep.DepType()); + else if (strcmp("ID",Name) == 0) + return Py_BuildValue("i",Dep->ID); + + return Py_FindMethod(DependencyMethods,Self,Name); +} + +static PyObject *DependencyRepr(PyObject *Self) +{ + pkgCache::DepIterator &Dep = GetCpp<pkgCache::DepIterator>(Self); + + char S[300]; + snprintf(S,sizeof(S),"<pkgCache::Dependency object: " + "Pkg:'%s' Ver:'%s' Comp:'%s'>", + Dep.TargetPkg().Name(), + (Dep.TargetVer() == 0?"":Dep.TargetVer()), + Dep.CompType()); + return PyString_FromString(S); +} + +static PyObject *DepSmartTargetPkg(PyObject *Self,PyObject *Args) +{ + if (PyArg_ParseTuple(Args,"") == 0) + return 0; + + pkgCache::DepIterator &Dep = GetCpp<pkgCache::DepIterator>(Self); + PyObject *Owner = GetOwner<pkgCache::DepIterator>(Self); + + pkgCache::PkgIterator P; + if (Dep.SmartTargetPkg(P) == false) + { + Py_INCREF(Py_None); + return Py_None; + } + + return CppOwnedPyObject_NEW<pkgCache::PkgIterator>(Owner,&PackageType,P); +} + +static PyObject *DepAllTargets(PyObject *Self,PyObject *Args) +{ + if (PyArg_ParseTuple(Args,"") == 0) + return 0; + + pkgCache::DepIterator &Dep = GetCpp<pkgCache::DepIterator>(Self); + PyObject *Owner = GetOwner<pkgCache::DepIterator>(Self); + + SPtr<pkgCache::Version *> Vers = Dep.AllTargets(); + PyObject *List = PyList_New(0); + for (pkgCache::Version **I = Vers; *I != 0; I++) + { + PyObject *Obj; + Obj = CppOwnedPyObject_NEW<pkgCache::VerIterator>(Owner,&VersionType, + pkgCache::VerIterator(*Dep.Cache(),*I)); + PyList_Append(List,Obj); + Py_DECREF(Obj); + } + return List; +} + +static PyMethodDef DependencyMethods[] = +{ + {"SmartTargetPkg",DepSmartTargetPkg,METH_VARARGS,"Returns the natural Target or None"}, + {"AllTargets",DepAllTargets,METH_VARARGS,"Returns all possible Versions that match this dependency"}, + {} +}; + +PyTypeObject DependencyType = +{ + PyObject_HEAD_INIT(&PyType_Type) + 0, // ob_size + "pkgCache::DepIterator", // tp_name + sizeof(CppOwnedPyObject<pkgCache::DepIterator>), // tp_basicsize + 0, // tp_itemsize + // Methods + CppOwnedDealloc<pkgCache::DepIterator>, // tp_dealloc + 0, // tp_print + DependencyAttr, // tp_getattr + 0, // tp_setattr + 0, // tp_compare + DependencyRepr, // tp_repr + 0, // tp_as_number + 0, // tp_as_sequence + 0, // tp_as_mapping + 0, // tp_hash +}; + + /*}}}*/ +// Reverse Dependency List Class /*{{{*/ +// --------------------------------------------------------------------- +static int RDepListLen(PyObject *Self) +{ + return GetCpp<RDepListStruct>(Self).Len; +} + +static PyObject *RDepListItem(PyObject *iSelf,int Index) +{ + RDepListStruct &Self = GetCpp<RDepListStruct>(iSelf); + if (Index < 0 || (unsigned)Index >= Self.Len) + { + PyErr_SetNone(PyExc_IndexError); + return 0; + } + + if ((unsigned)Index < Self.LastIndex) + { + Self.LastIndex = 0; + Self.Iter = Self.Start; + } + + while ((unsigned)Index > Self.LastIndex) + { + Self.LastIndex++; + Self.Iter++; + if (Self.Iter.end() == true) + { + PyErr_SetNone(PyExc_IndexError); + return 0; + } + } + + return CppOwnedPyObject_NEW<pkgCache::DepIterator>(GetOwner<RDepListStruct>(iSelf), + &DependencyType,Self.Iter); +} + +static PySequenceMethods RDepListSeq = +{ + RDepListLen, + 0, // concat + 0, // repeat + RDepListItem, + 0, // slice + 0, // assign item + 0 // assign slice +}; + +PyTypeObject RDepListType = +{ + PyObject_HEAD_INIT(&PyType_Type) + 0, // ob_size + "pkgCache::DepIterator", // tp_name + sizeof(CppOwnedPyObject<RDepListStruct>), // tp_basicsize + 0, // tp_itemsize + // Methods + CppOwnedDealloc<RDepListStruct>, // tp_dealloc + 0, // tp_print + 0, // tp_getattr + 0, // tp_setattr + 0, // tp_compare + 0, // tp_repr + 0, // tp_as_number + &RDepListSeq, // tp_as_sequence + 0, // tp_as_mapping + 0, // tp_hash +}; + + /*}}}*/ + +PyObject *TmpGetCache(PyObject *Self,PyObject *Args) +{ + if (PyArg_ParseTuple(Args,"") == 0) + return 0; + + pkgCacheFile *Cache = new pkgCacheFile(); + OpTextProgress Prog; + if (Cache->Open(Prog,false) == false) + return HandleErrors(); + + return CppOwnedPyObject_NEW<pkgCache *>(0,&PkgCacheType,(pkgCache *)(*Cache)); +} |
