apt @VERSION@

pkgcache.h

Go to the documentation of this file.
00001 // -*- mode: cpp; mode: fold -*-
00002 // Description                                                          /*{{{*/
00073                                                                         /*}}}*/
00074 #ifndef PKGLIB_PKGCACHE_H
00075 #define PKGLIB_PKGCACHE_H
00076 
00077 
00078 #include <string>
00079 #include <time.h>
00080 #include <apt-pkg/mmap.h>
00081 
00082 using std::string;
00083     
00084 class pkgVersioningSystem;
00085 class pkgCache                                                          /*{{{*/
00086 {
00087    public:
00088    // Cache element predeclarations
00089    struct Header;
00090    struct Group;
00091    struct Package;
00092    struct PackageFile;
00093    struct Version;
00094    struct Description;
00095    struct Provides;
00096    struct Dependency;
00097    struct StringItem;
00098    struct VerFile;
00099    struct DescFile;
00100    
00101    // Iterators
00102    template<typename Str, typename Itr> class Iterator;
00103    class GrpIterator;
00104    class PkgIterator;
00105    class VerIterator;
00106    class DescIterator;
00107    class DepIterator;
00108    class PrvIterator;
00109    class PkgFileIterator;
00110    class VerFileIterator;
00111    class DescFileIterator;
00112    
00113    class Namespace;
00114    
00115    // These are all the constants used in the cache structures
00116 
00117    // WARNING - if you change these lists you must also edit
00118    // the stringification in pkgcache.cc and also consider whether
00119    // the cache file will become incompatible.
00120    struct Dep
00121    {
00122       enum DepType {Depends=1,PreDepends=2,Suggests=3,Recommends=4,
00123          Conflicts=5,Replaces=6,Obsoletes=7,DpkgBreaks=8,Enhances=9};
00129       enum DepCompareOp {Or=0x10,NoOp=0,LessEq=0x1,GreaterEq=0x2,Less=0x3,
00130          Greater=0x4,Equals=0x5,NotEquals=0x6};
00131    };
00132    
00133    struct State
00134    {
00138       enum VerPriority {Important=1,Required=2,Standard=3,Optional=4,Extra=5};
00139       enum PkgSelectedState {Unknown=0,Install=1,Hold=2,DeInstall=3,Purge=4};
00140       enum PkgInstState {Ok=0,ReInstReq=1,HoldInst=2,HoldReInstReq=3};
00141       enum PkgCurrentState {NotInstalled=0,UnPacked=1,HalfConfigured=2,
00142            HalfInstalled=4,ConfigFiles=5,Installed=6,
00143            TriggersAwaited=7,TriggersPending=8};
00144    };
00145    
00146    struct Flag
00147    {
00148       enum PkgFlags {Auto=(1<<0),Essential=(1<<3),Important=(1<<4)};
00149       enum PkgFFlags {NotSource=(1<<0),NotAutomatic=(1<<1),ButAutomaticUpgrades=(1<<2)};
00150    };
00151    
00152    protected:
00153    
00154    // Memory mapped cache file
00155    string CacheFile;
00156    MMap &Map;
00157 
00158    unsigned long sHash(const string &S) const;
00159    unsigned long sHash(const char *S) const;
00160    
00161    public:
00162    
00163    // Pointers to the arrays of items
00164    Header *HeaderP;
00165    Group *GrpP;
00166    Package *PkgP;
00167    VerFile *VerFileP;
00168    DescFile *DescFileP;
00169    PackageFile *PkgFileP;
00170    Version *VerP;
00171    Description *DescP;
00172    Provides *ProvideP;
00173    Dependency *DepP;
00174    StringItem *StringItemP;
00175    char *StrP;
00176 
00177    virtual bool ReMap(bool const &Errorchecks = true);
00178    inline bool Sync() {return Map.Sync();};
00179    inline MMap &GetMap() {return Map;};
00180    inline void *DataEnd() {return ((unsigned char *)Map.Data()) + Map.Size();};
00181       
00182    // String hashing function (512 range)
00183    inline unsigned long Hash(const string &S) const {return sHash(S);};
00184    inline unsigned long Hash(const char *S) const {return sHash(S);};
00185 
00186    // Useful transformation things
00187    const char *Priority(unsigned char Priority);
00188    
00189    // Accessors
00190    GrpIterator FindGrp(const string &Name);
00191    PkgIterator FindPkg(const string &Name);
00192    PkgIterator FindPkg(const string &Name, const string &Arch);
00193 
00194    Header &Head() {return *HeaderP;};
00195    inline GrpIterator GrpBegin();
00196    inline GrpIterator GrpEnd();
00197    inline PkgIterator PkgBegin();
00198    inline PkgIterator PkgEnd();
00199    inline PkgFileIterator FileBegin();
00200    inline PkgFileIterator FileEnd();
00201 
00202    inline bool MultiArchCache() const { return MultiArchEnabled; };
00203 
00204    // Make me a function
00205    pkgVersioningSystem *VS;
00206    
00207    // Converters
00208    static const char *CompTypeDeb(unsigned char Comp);
00209    static const char *CompType(unsigned char Comp);
00210    static const char *DepType(unsigned char Dep);
00211    
00212    pkgCache(MMap *Map,bool DoMap = true);
00213    virtual ~pkgCache() {};
00214 
00215 private:
00216    bool MultiArchEnabled;
00217    PkgIterator SingleArchFindPkg(const string &Name);
00218    inline char const * const NativeArch() const;
00219 };
00220                                                                         /*}}}*/
00221 // Header structure                                                     /*{{{*/
00222 struct pkgCache::Header
00223 {
00229    unsigned long Signature;
00231    short MajorVersion;
00232    short MinorVersion;
00238    bool Dirty;
00239 
00247    unsigned short HeaderSz;
00248    unsigned short GroupSz;
00249    unsigned short PackageSz;
00250    unsigned short PackageFileSz;
00251    unsigned short VersionSz;
00252    unsigned short DescriptionSz;
00253    unsigned short DependencySz;
00254    unsigned short ProvidesSz;
00255    unsigned short VerFileSz;
00256    unsigned short DescFileSz;
00257 
00263    unsigned long GroupCount;
00264    unsigned long PackageCount;
00265    unsigned long VersionCount;
00266    unsigned long DescriptionCount;
00267    unsigned long DependsCount;
00268    unsigned long PackageFileCount;
00269    unsigned long VerFileCount;
00270    unsigned long DescFileCount;
00271    unsigned long ProvidesCount;
00272 
00277    map_ptrloc FileList;
00283    map_ptrloc StringList;
00285    map_ptrloc VerSysName;
00287    map_ptrloc Architecture;
00289    unsigned long MaxVerFileSize;
00291    unsigned long MaxDescFileSize;
00292 
00301    DynamicMMap::Pool Pools[9];
00302    
00314    map_ptrloc PkgHashTable[2*1048];
00315    map_ptrloc GrpHashTable[2*1048];
00316 
00317    bool CheckSizes(Header &Against) const;
00318    Header();
00319 };
00320                                                                         /*}}}*/
00321 // Group structure                                                      /*{{{*/
00328 struct pkgCache::Group
00329 {
00331    map_ptrloc Name;             // StringItem
00332 
00333    // Linked List
00335    map_ptrloc FirstPackage;     // Package
00337    map_ptrloc LastPackage;      // Package
00339    map_ptrloc Next;             // Group
00341    unsigned int ID;
00342 
00343 };
00344                                                                         /*}}}*/
00345 // Package structure                                                    /*{{{*/
00357 struct pkgCache::Package
00358 {
00360    map_ptrloc Name;              // StringItem
00362    map_ptrloc Arch;              // StringItem
00372    map_ptrloc VersionList;       // Version
00374    map_ptrloc CurrentVer;        // Version
00379    map_ptrloc Section;           // StringItem
00381    map_ptrloc Group;             // Group the Package belongs to
00382 
00383    // Linked list
00385    map_ptrloc NextPackage;       // Package
00387    map_ptrloc RevDepends;        // Dependency
00389    map_ptrloc ProvidesList;      // Provides
00390 
00391    // Install/Remove/Purge etc
00393    unsigned char SelectedState;     // What
00399    unsigned char InstState;         // Flags
00401    unsigned char CurrentState;      // State
00402 
00409    unsigned int ID;
00411    unsigned long Flags;
00412 };
00413                                                                         /*}}}*/
00414 // Package File structure                                               /*{{{*/
00420 struct pkgCache::PackageFile
00421 {
00423    map_ptrloc FileName;        // StringItem
00428    map_ptrloc Archive;         // StringItem
00429    map_ptrloc Codename;        // StringItem
00430    map_ptrloc Component;       // StringItem
00431    map_ptrloc Version;         // StringItem
00432    map_ptrloc Origin;          // StringItem
00433    map_ptrloc Label;           // StringItem
00434    map_ptrloc Architecture;    // StringItem
00436    map_ptrloc Site;            // StringItem
00440    map_ptrloc IndexType;       // StringItem
00446    unsigned long Size;
00448    time_t mtime;
00449 
00450    /* @TODO document PackageFile::Flags */
00451    unsigned long Flags;
00452 
00453    // Linked list
00455    map_ptrloc NextFile;        // PackageFile
00457    unsigned int ID;
00458 };
00459                                                                         /*}}}*/
00460 // VerFile structure                                                    /*{{{*/
00465 struct pkgCache::VerFile
00466 {
00468    map_ptrloc File;           // PackageFile
00470    map_ptrloc NextFile;       // PkgVerFile
00472    map_ptrloc Offset;         // File offset
00473    /* @TODO document pkgCache::VerFile::Size */
00474    unsigned long Size;
00475 };
00476                                                                         /*}}}*/
00477 // DescFile structure                                                   /*{{{*/
00479 struct pkgCache::DescFile
00480 {
00482    map_ptrloc File;           // PackageFile
00484    map_ptrloc NextFile;       // PkgVerFile
00486    map_ptrloc Offset;         // File offset
00487    /* @TODO document pkgCache::DescFile::Size */
00488    unsigned long Size;
00489 };
00490                                                                         /*}}}*/
00491 // Version structure                                                    /*{{{*/
00497 struct pkgCache::Version
00498 {
00500    map_ptrloc VerStr;            // StringItem
00502    map_ptrloc Section;           // StringItem
00510    /* FIXME: A bitflag would be better with the next abibreak… */
00511    enum {None, All, Foreign, Same, Allowed, AllForeign, AllAllowed} MultiArch;
00512 
00519    map_ptrloc FileList;          // VerFile
00521    map_ptrloc NextVer;           // Version
00523    map_ptrloc DescriptionList;   // Description
00525    map_ptrloc DependsList;       // Dependency
00529    map_ptrloc ParentPkg;         // Package
00531    map_ptrloc ProvidesList;      // Provides
00532 
00536    unsigned long long Size;      // These are the .deb size
00538    unsigned long long InstalledSize;
00543    unsigned short Hash;
00545    unsigned int ID;
00547    unsigned char Priority;
00548 };
00549                                                                         /*}}}*/
00550 // Description structure                                                /*{{{*/
00552 struct pkgCache::Description
00553 {
00558    map_ptrloc language_code;     // StringItem
00563    map_ptrloc md5sum;            // StringItem
00564 
00565    /* @TODO document pkgCache::Description::FileList */
00566    map_ptrloc FileList;          // DescFile
00568    map_ptrloc NextDesc;          // Description
00570    map_ptrloc ParentPkg;         // Package
00571 
00573    unsigned int ID;
00574 };
00575                                                                         /*}}}*/
00576 // Dependency structure                                                 /*{{{*/
00583 struct pkgCache::Dependency
00584 {
00586    map_ptrloc Version;         // StringItem
00591    map_ptrloc Package;         // Package
00593    map_ptrloc NextDepends;     // Dependency
00595    map_ptrloc NextRevDepends;  // Dependency
00597    map_ptrloc ParentVer;       // Version
00598 
00600    map_ptrloc ID;
00602    unsigned char Type;
00606    unsigned char CompareOp;
00607 };
00608                                                                         /*}}}*/
00609 // Provides structure                                                   /*{{{*/
00618 struct pkgCache::Provides
00619 {
00621    map_ptrloc ParentPkg;        // Package
00623    map_ptrloc Version;          // Version
00629    map_ptrloc ProvideVersion;   // StringItem
00631    map_ptrloc NextProvides;     // Provides
00633    map_ptrloc NextPkgProv;      // Provides
00634 };
00635                                                                         /*}}}*/
00636 // StringItem structure                                                 /*{{{*/
00645 struct pkgCache::StringItem
00646 {
00648    map_ptrloc String;        // StringItem
00650    map_ptrloc NextItem;      // StringItem
00651 };
00652                                                                         /*}}}*/
00653 
00654 
00655 inline char const * const pkgCache::NativeArch() const
00656         { return StrP + HeaderP->Architecture; };
00657 
00658 #include <apt-pkg/cacheiterators.h>
00659 
00660 inline pkgCache::GrpIterator pkgCache::GrpBegin() 
00661        {return GrpIterator(*this);};
00662 inline pkgCache::GrpIterator pkgCache::GrpEnd() 
00663        {return GrpIterator(*this,GrpP);};
00664 inline pkgCache::PkgIterator pkgCache::PkgBegin() 
00665        {return PkgIterator(*this);};
00666 inline pkgCache::PkgIterator pkgCache::PkgEnd() 
00667        {return PkgIterator(*this,PkgP);};
00668 inline pkgCache::PkgFileIterator pkgCache::FileBegin()
00669        {return PkgFileIterator(*this,PkgFileP + HeaderP->FileList);};
00670 inline pkgCache::PkgFileIterator pkgCache::FileEnd()
00671        {return PkgFileIterator(*this,PkgFileP);};
00672 
00673 // Oh I wish for Real Name Space Support
00674 class pkgCache::Namespace                                               /*{{{*/
00675 {   
00676    public:
00677    typedef pkgCache::GrpIterator GrpIterator;
00678    typedef pkgCache::PkgIterator PkgIterator;
00679    typedef pkgCache::VerIterator VerIterator;
00680    typedef pkgCache::DescIterator DescIterator;
00681    typedef pkgCache::DepIterator DepIterator;
00682    typedef pkgCache::PrvIterator PrvIterator;
00683    typedef pkgCache::PkgFileIterator PkgFileIterator;
00684    typedef pkgCache::VerFileIterator VerFileIterator;   
00685    typedef pkgCache::Version Version;
00686    typedef pkgCache::Description Description;
00687    typedef pkgCache::Package Package;
00688    typedef pkgCache::Header Header;
00689    typedef pkgCache::Dep Dep;
00690    typedef pkgCache::Flag Flag;
00691 };
00692                                                                         /*}}}*/
00693 #endif