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 class pkgVersioningSystem;
00083 class pkgCache                                                          /*{{{*/
00084 {
00085    public:
00086    // Cache element predeclarations
00087    struct Header;
00088    struct Group;
00089    struct Package;
00090    struct PackageFile;
00091    struct Version;
00092    struct Description;
00093    struct Provides;
00094    struct Dependency;
00095    struct StringItem;
00096    struct VerFile;
00097    struct DescFile;
00098    
00099    // Iterators
00100    template<typename Str, typename Itr> class Iterator;
00101    class GrpIterator;
00102    class PkgIterator;
00103    class VerIterator;
00104    class DescIterator;
00105    class DepIterator;
00106    class PrvIterator;
00107    class PkgFileIterator;
00108    class VerFileIterator;
00109    class DescFileIterator;
00110    
00111    class Namespace;
00112    
00113    // These are all the constants used in the cache structures
00114 
00115    // WARNING - if you change these lists you must also edit
00116    // the stringification in pkgcache.cc and also consider whether
00117    // the cache file will become incompatible.
00118    struct Dep
00119    {
00120       enum DepType {Depends=1,PreDepends=2,Suggests=3,Recommends=4,
00121          Conflicts=5,Replaces=6,Obsoletes=7,DpkgBreaks=8,Enhances=9};
00127       enum DepCompareOp {Or=0x10,NoOp=0,LessEq=0x1,GreaterEq=0x2,Less=0x3,
00128          Greater=0x4,Equals=0x5,NotEquals=0x6};
00129    };
00130    
00131    struct State
00132    {
00136       enum VerPriority {Important=1,Required=2,Standard=3,Optional=4,Extra=5};
00137       enum PkgSelectedState {Unknown=0,Install=1,Hold=2,DeInstall=3,Purge=4};
00138       enum PkgInstState {Ok=0,ReInstReq=1,HoldInst=2,HoldReInstReq=3};
00139       enum PkgCurrentState {NotInstalled=0,UnPacked=1,HalfConfigured=2,
00140            HalfInstalled=4,ConfigFiles=5,Installed=6,
00141            TriggersAwaited=7,TriggersPending=8};
00142    };
00143    
00144    struct Flag
00145    {
00146       enum PkgFlags {Auto=(1<<0),Essential=(1<<3),Important=(1<<4)};
00147       enum PkgFFlags {NotSource=(1<<0),NotAutomatic=(1<<1),ButAutomaticUpgrades=(1<<2)};
00148    };
00149    
00150    protected:
00151    
00152    // Memory mapped cache file
00153    std::string CacheFile;
00154    MMap &Map;
00155 
00156    unsigned long sHash(const std::string &S) const;
00157    unsigned long sHash(const char *S) const;
00158    
00159    public:
00160    
00161    // Pointers to the arrays of items
00162    Header *HeaderP;
00163    Group *GrpP;
00164    Package *PkgP;
00165    VerFile *VerFileP;
00166    DescFile *DescFileP;
00167    PackageFile *PkgFileP;
00168    Version *VerP;
00169    Description *DescP;
00170    Provides *ProvideP;
00171    Dependency *DepP;
00172    StringItem *StringItemP;
00173    char *StrP;
00174 
00175    virtual bool ReMap(bool const &Errorchecks = true);
00176    inline bool Sync() {return Map.Sync();};
00177    inline MMap &GetMap() {return Map;};
00178    inline void *DataEnd() {return ((unsigned char *)Map.Data()) + Map.Size();};
00179       
00180    // String hashing function (512 range)
00181    inline unsigned long Hash(const std::string &S) const {return sHash(S);};
00182    inline unsigned long Hash(const char *S) const {return sHash(S);};
00183 
00184    // Useful transformation things
00185    const char *Priority(unsigned char Priority);
00186    
00187    // Accessors
00188    GrpIterator FindGrp(const std::string &Name);
00189    PkgIterator FindPkg(const std::string &Name);
00190    PkgIterator FindPkg(const std::string &Name, const std::string &Arch);
00191 
00192    Header &Head() {return *HeaderP;};
00193    inline GrpIterator GrpBegin();
00194    inline GrpIterator GrpEnd();
00195    inline PkgIterator PkgBegin();
00196    inline PkgIterator PkgEnd();
00197    inline PkgFileIterator FileBegin();
00198    inline PkgFileIterator FileEnd();
00199 
00200    inline bool MultiArchCache() const { return MultiArchEnabled; };
00201 
00202    // Make me a function
00203    pkgVersioningSystem *VS;
00204    
00205    // Converters
00206    static const char *CompTypeDeb(unsigned char Comp);
00207    static const char *CompType(unsigned char Comp);
00208    static const char *DepType(unsigned char Dep);
00209    
00210    pkgCache(MMap *Map,bool DoMap = true);
00211    virtual ~pkgCache() {};
00212 
00213 private:
00214    bool MultiArchEnabled;
00215    PkgIterator SingleArchFindPkg(const std::string &Name);
00216    inline char const * const NativeArch() const;
00217 };
00218                                                                         /*}}}*/
00219 // Header structure                                                     /*{{{*/
00220 struct pkgCache::Header
00221 {
00227    unsigned long Signature;
00229    short MajorVersion;
00230    short MinorVersion;
00236    bool Dirty;
00237 
00245    unsigned short HeaderSz;
00246    unsigned short GroupSz;
00247    unsigned short PackageSz;
00248    unsigned short PackageFileSz;
00249    unsigned short VersionSz;
00250    unsigned short DescriptionSz;
00251    unsigned short DependencySz;
00252    unsigned short ProvidesSz;
00253    unsigned short VerFileSz;
00254    unsigned short DescFileSz;
00255 
00261    unsigned long GroupCount;
00262    unsigned long PackageCount;
00263    unsigned long VersionCount;
00264    unsigned long DescriptionCount;
00265    unsigned long DependsCount;
00266    unsigned long PackageFileCount;
00267    unsigned long VerFileCount;
00268    unsigned long DescFileCount;
00269    unsigned long ProvidesCount;
00270 
00275    map_ptrloc FileList;
00281    map_ptrloc StringList;
00283    map_ptrloc VerSysName;
00285    map_ptrloc Architecture;
00287    unsigned long MaxVerFileSize;
00289    unsigned long MaxDescFileSize;
00290 
00299    DynamicMMap::Pool Pools[9];
00300    
00312    map_ptrloc PkgHashTable[2*1048];
00313    map_ptrloc GrpHashTable[2*1048];
00314 
00316    unsigned long  CacheFileSize;
00317 
00318    bool CheckSizes(Header &Against) const;
00319    Header();
00320 };
00321                                                                         /*}}}*/
00322 // Group structure                                                      /*{{{*/
00329 struct pkgCache::Group
00330 {
00332    map_ptrloc Name;             // StringItem
00333 
00334    // Linked List
00336    map_ptrloc FirstPackage;     // Package
00338    map_ptrloc LastPackage;      // Package
00340    map_ptrloc Next;             // Group
00342    unsigned int ID;
00343 
00344 };
00345                                                                         /*}}}*/
00346 // Package structure                                                    /*{{{*/
00358 struct pkgCache::Package
00359 {
00361    map_ptrloc Name;              // StringItem
00363    map_ptrloc Arch;              // StringItem
00373    map_ptrloc VersionList;       // Version
00375    map_ptrloc CurrentVer;        // Version
00380    map_ptrloc Section;           // StringItem
00382    map_ptrloc Group;             // Group the Package belongs to
00383 
00384    // Linked list
00386    map_ptrloc NextPackage;       // Package
00388    map_ptrloc RevDepends;        // Dependency
00390    map_ptrloc ProvidesList;      // Provides
00391 
00392    // Install/Remove/Purge etc
00394    unsigned char SelectedState;     // What
00400    unsigned char InstState;         // Flags
00402    unsigned char CurrentState;      // State
00403 
00410    unsigned int ID;
00412    unsigned long Flags;
00413 };
00414                                                                         /*}}}*/
00415 // Package File structure                                               /*{{{*/
00421 struct pkgCache::PackageFile
00422 {
00424    map_ptrloc FileName;        // StringItem
00429    map_ptrloc Archive;         // StringItem
00430    map_ptrloc Codename;        // StringItem
00431    map_ptrloc Component;       // StringItem
00432    map_ptrloc Version;         // StringItem
00433    map_ptrloc Origin;          // StringItem
00434    map_ptrloc Label;           // StringItem
00435    map_ptrloc Architecture;    // StringItem
00437    map_ptrloc Site;            // StringItem
00441    map_ptrloc IndexType;       // StringItem
00447    unsigned long Size;
00449    time_t mtime;
00450 
00451    /* @TODO document PackageFile::Flags */
00452    unsigned long Flags;
00453 
00454    // Linked list
00456    map_ptrloc NextFile;        // PackageFile
00458    unsigned int ID;
00459 };
00460                                                                         /*}}}*/
00461 // VerFile structure                                                    /*{{{*/
00466 struct pkgCache::VerFile
00467 {
00469    map_ptrloc File;           // PackageFile
00471    map_ptrloc NextFile;       // PkgVerFile
00473    map_ptrloc Offset;         // File offset
00474    /* @TODO document pkgCache::VerFile::Size */
00475    unsigned long Size;
00476 };
00477                                                                         /*}}}*/
00478 // DescFile structure                                                   /*{{{*/
00480 struct pkgCache::DescFile
00481 {
00483    map_ptrloc File;           // PackageFile
00485    map_ptrloc NextFile;       // PkgVerFile
00487    map_ptrloc Offset;         // File offset
00488    /* @TODO document pkgCache::DescFile::Size */
00489    unsigned long Size;
00490 };
00491                                                                         /*}}}*/
00492 // Version structure                                                    /*{{{*/
00498 struct pkgCache::Version
00499 {
00501    map_ptrloc VerStr;            // StringItem
00503    map_ptrloc Section;           // StringItem
00504 
00506    enum VerMultiArch { None = 0, 
00507                        All = (1<<0), 
00508                        Foreign = (1<<1), 
00509                        Same = (1<<2), 
00510                        Allowed = (1<<3), 
00511                        AllForeign = All | Foreign,
00512                        AllAllowed = All | Allowed };
00517    unsigned char MultiArch;
00518 
00525    map_ptrloc FileList;          // VerFile
00527    map_ptrloc NextVer;           // Version
00529    map_ptrloc DescriptionList;   // Description
00531    map_ptrloc DependsList;       // Dependency
00535    map_ptrloc ParentPkg;         // Package
00537    map_ptrloc ProvidesList;      // Provides
00538 
00542    unsigned long long Size;      // These are the .deb size
00544    unsigned long long InstalledSize;
00549    unsigned short Hash;
00551    unsigned int ID;
00553    unsigned char Priority;
00554 };
00555                                                                         /*}}}*/
00556 // Description structure                                                /*{{{*/
00558 struct pkgCache::Description
00559 {
00564    map_ptrloc language_code;     // StringItem
00569    map_ptrloc md5sum;            // StringItem
00570 
00571    /* @TODO document pkgCache::Description::FileList */
00572    map_ptrloc FileList;          // DescFile
00574    map_ptrloc NextDesc;          // Description
00576    map_ptrloc ParentPkg;         // Package
00577 
00579    unsigned int ID;
00580 };
00581                                                                         /*}}}*/
00582 // Dependency structure                                                 /*{{{*/
00589 struct pkgCache::Dependency
00590 {
00592    map_ptrloc Version;         // StringItem
00597    map_ptrloc Package;         // Package
00599    map_ptrloc NextDepends;     // Dependency
00601    map_ptrloc NextRevDepends;  // Dependency
00603    map_ptrloc ParentVer;       // Version
00604 
00606    map_ptrloc ID;
00608    unsigned char Type;
00612    unsigned char CompareOp;
00613 };
00614                                                                         /*}}}*/
00615 // Provides structure                                                   /*{{{*/
00624 struct pkgCache::Provides
00625 {
00627    map_ptrloc ParentPkg;        // Package
00629    map_ptrloc Version;          // Version
00635    map_ptrloc ProvideVersion;   // StringItem
00637    map_ptrloc NextProvides;     // Provides
00639    map_ptrloc NextPkgProv;      // Provides
00640 };
00641                                                                         /*}}}*/
00642 // StringItem structure                                                 /*{{{*/
00651 struct pkgCache::StringItem
00652 {
00654    map_ptrloc String;        // StringItem
00656    map_ptrloc NextItem;      // StringItem
00657 };
00658                                                                         /*}}}*/
00659 
00660 
00661 inline char const * const pkgCache::NativeArch() const
00662         { return StrP + HeaderP->Architecture; };
00663 
00664 #include <apt-pkg/cacheiterators.h>
00665 
00666 inline pkgCache::GrpIterator pkgCache::GrpBegin() 
00667        {return GrpIterator(*this);};
00668 inline pkgCache::GrpIterator pkgCache::GrpEnd() 
00669        {return GrpIterator(*this,GrpP);};
00670 inline pkgCache::PkgIterator pkgCache::PkgBegin() 
00671        {return PkgIterator(*this);};
00672 inline pkgCache::PkgIterator pkgCache::PkgEnd() 
00673        {return PkgIterator(*this,PkgP);};
00674 inline pkgCache::PkgFileIterator pkgCache::FileBegin()
00675        {return PkgFileIterator(*this,PkgFileP + HeaderP->FileList);};
00676 inline pkgCache::PkgFileIterator pkgCache::FileEnd()
00677        {return PkgFileIterator(*this,PkgFileP);};
00678 
00679 // Oh I wish for Real Name Space Support
00680 class pkgCache::Namespace                                               /*{{{*/
00681 {   
00682    public:
00683    typedef pkgCache::GrpIterator GrpIterator;
00684    typedef pkgCache::PkgIterator PkgIterator;
00685    typedef pkgCache::VerIterator VerIterator;
00686    typedef pkgCache::DescIterator DescIterator;
00687    typedef pkgCache::DepIterator DepIterator;
00688    typedef pkgCache::PrvIterator PrvIterator;
00689    typedef pkgCache::PkgFileIterator PkgFileIterator;
00690    typedef pkgCache::VerFileIterator VerFileIterator;   
00691    typedef pkgCache::Version Version;
00692    typedef pkgCache::Description Description;
00693    typedef pkgCache::Package Package;
00694    typedef pkgCache::Header Header;
00695    typedef pkgCache::Dep Dep;
00696    typedef pkgCache::Flag Flag;
00697 };
00698                                                                         /*}}}*/
00699 #endif