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)};
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 };
00219                                                                         /*}}}*/
00220 // Header structure                                                     /*{{{*/
00221 struct pkgCache::Header
00222 {
00228    unsigned long Signature;
00230    short MajorVersion;
00231    short MinorVersion;
00237    bool Dirty;
00238 
00246    unsigned short HeaderSz;
00247    unsigned short GroupSz;
00248    unsigned short PackageSz;
00249    unsigned short PackageFileSz;
00250    unsigned short VersionSz;
00251    unsigned short DescriptionSz;
00252    unsigned short DependencySz;
00253    unsigned short ProvidesSz;
00254    unsigned short VerFileSz;
00255    unsigned short DescFileSz;
00256 
00262    unsigned long GroupCount;
00263    unsigned long PackageCount;
00264    unsigned long VersionCount;
00265    unsigned long DescriptionCount;
00266    unsigned long DependsCount;
00267    unsigned long PackageFileCount;
00268    unsigned long VerFileCount;
00269    unsigned long DescFileCount;
00270    unsigned long ProvidesCount;
00271 
00276    map_ptrloc FileList;
00282    map_ptrloc StringList;
00284    map_ptrloc VerSysName;
00286    map_ptrloc Architecture;
00288    unsigned long MaxVerFileSize;
00290    unsigned long MaxDescFileSize;
00291 
00300    DynamicMMap::Pool Pools[9];
00301    
00313    map_ptrloc PkgHashTable[2*1048];
00314    map_ptrloc GrpHashTable[2*1048];
00315 
00316    bool CheckSizes(Header &Against) const;
00317    Header();
00318 };
00319                                                                         /*}}}*/
00320 // Group structure                                                      /*{{{*/
00327 struct pkgCache::Group
00328 {
00330    map_ptrloc Name;             // StringItem
00331 
00332    // Linked List
00334    map_ptrloc FirstPackage;     // Package
00336    map_ptrloc LastPackage;      // Package
00338    map_ptrloc Next;             // Group
00340    unsigned int ID;
00341 
00342 };
00343                                                                         /*}}}*/
00344 // Package structure                                                    /*{{{*/
00356 struct pkgCache::Package
00357 {
00359    map_ptrloc Name;              // StringItem
00361    map_ptrloc Arch;              // StringItem
00371    map_ptrloc VersionList;       // Version
00373    map_ptrloc CurrentVer;        // Version
00378    map_ptrloc Section;           // StringItem
00380    map_ptrloc Group;             // Group the Package belongs to
00381 
00382    // Linked list
00384    map_ptrloc NextPackage;       // Package
00386    map_ptrloc RevDepends;        // Dependency
00388    map_ptrloc ProvidesList;      // Provides
00389 
00390    // Install/Remove/Purge etc
00392    unsigned char SelectedState;     // What
00398    unsigned char InstState;         // Flags
00400    unsigned char CurrentState;      // State
00401 
00408    unsigned int ID;
00410    unsigned long Flags;
00411 };
00412                                                                         /*}}}*/
00413 // Package File structure                                               /*{{{*/
00419 struct pkgCache::PackageFile
00420 {
00422    map_ptrloc FileName;        // StringItem
00427    map_ptrloc Archive;         // StringItem
00428    map_ptrloc Codename;        // StringItem
00429    map_ptrloc Component;       // StringItem
00430    map_ptrloc Version;         // StringItem
00431    map_ptrloc Origin;          // StringItem
00432    map_ptrloc Label;           // StringItem
00433    map_ptrloc Architecture;    // StringItem
00435    map_ptrloc Site;            // StringItem
00439    map_ptrloc IndexType;       // StringItem
00445    unsigned long Size;
00447    time_t mtime;
00448 
00449    /* @TODO document PackageFile::Flags */
00450    unsigned long Flags;
00451 
00452    // Linked list
00454    map_ptrloc NextFile;        // PackageFile
00456    unsigned int ID;
00457 };
00458                                                                         /*}}}*/
00459 // VerFile structure                                                    /*{{{*/
00464 struct pkgCache::VerFile
00465 {
00467    map_ptrloc File;           // PackageFile
00469    map_ptrloc NextFile;       // PkgVerFile
00471    map_ptrloc Offset;         // File offset
00472    /* @TODO document pkgCache::VerFile::Size */
00473    unsigned long Size;
00474 };
00475                                                                         /*}}}*/
00476 // DescFile structure                                                   /*{{{*/
00478 struct pkgCache::DescFile
00479 {
00481    map_ptrloc File;           // PackageFile
00483    map_ptrloc NextFile;       // PkgVerFile
00485    map_ptrloc Offset;         // File offset
00486    /* @TODO document pkgCache::DescFile::Size */
00487    unsigned long Size;
00488 };
00489                                                                         /*}}}*/
00490 // Version structure                                                    /*{{{*/
00496 struct pkgCache::Version
00497 {
00499    map_ptrloc VerStr;            // StringItem
00501    map_ptrloc Section;           // StringItem
00510    enum {None, All, Foreign, Same, Allowed} MultiArch;
00511 
00518    map_ptrloc FileList;          // VerFile
00520    map_ptrloc NextVer;           // Version
00522    map_ptrloc DescriptionList;   // Description
00524    map_ptrloc DependsList;       // Dependency
00528    map_ptrloc ParentPkg;         // Package
00530    map_ptrloc ProvidesList;      // Provides
00531 
00535    unsigned long long Size;      // These are the .deb size
00537    unsigned long long InstalledSize;
00542    unsigned short Hash;
00544    unsigned int ID;
00546    unsigned char Priority;
00547 };
00548                                                                         /*}}}*/
00549 // Description structure                                                /*{{{*/
00551 struct pkgCache::Description
00552 {
00557    map_ptrloc language_code;     // StringItem
00562    map_ptrloc md5sum;            // StringItem
00563 
00564    /* @TODO document pkgCache::Description::FileList */
00565    map_ptrloc FileList;          // DescFile
00567    map_ptrloc NextDesc;          // Description
00569    map_ptrloc ParentPkg;         // Package
00570 
00572    unsigned int ID;
00573 };
00574                                                                         /*}}}*/
00575 // Dependency structure                                                 /*{{{*/
00582 struct pkgCache::Dependency
00583 {
00585    map_ptrloc Version;         // StringItem
00590    map_ptrloc Package;         // Package
00592    map_ptrloc NextDepends;     // Dependency
00594    map_ptrloc NextRevDepends;  // Dependency
00596    map_ptrloc ParentVer;       // Version
00597 
00599    map_ptrloc ID;
00601    unsigned char Type;
00605    unsigned char CompareOp;
00606 };
00607                                                                         /*}}}*/
00608 // Provides structure                                                   /*{{{*/
00617 struct pkgCache::Provides
00618 {
00620    map_ptrloc ParentPkg;        // Package
00622    map_ptrloc Version;          // Version
00628    map_ptrloc ProvideVersion;   // StringItem
00630    map_ptrloc NextProvides;     // Provides
00632    map_ptrloc NextPkgProv;      // Provides
00633 };
00634                                                                         /*}}}*/
00635 // StringItem structure                                                 /*{{{*/
00644 struct pkgCache::StringItem
00645 {
00647    map_ptrloc String;        // StringItem
00649    map_ptrloc NextItem;      // StringItem
00650 };
00651                                                                         /*}}}*/
00652 #include <apt-pkg/cacheiterators.h>
00653 
00654 inline pkgCache::GrpIterator pkgCache::GrpBegin() 
00655        {return GrpIterator(*this);};
00656 inline pkgCache::GrpIterator pkgCache::GrpEnd() 
00657        {return GrpIterator(*this,GrpP);};
00658 inline pkgCache::PkgIterator pkgCache::PkgBegin() 
00659        {return PkgIterator(*this);};
00660 inline pkgCache::PkgIterator pkgCache::PkgEnd() 
00661        {return PkgIterator(*this,PkgP);};
00662 inline pkgCache::PkgFileIterator pkgCache::FileBegin()
00663        {return PkgFileIterator(*this,PkgFileP + HeaderP->FileList);};
00664 inline pkgCache::PkgFileIterator pkgCache::FileEnd()
00665        {return PkgFileIterator(*this,PkgFileP);};
00666 
00667 // Oh I wish for Real Name Space Support
00668 class pkgCache::Namespace                                               /*{{{*/
00669 {   
00670    public:
00671    typedef pkgCache::GrpIterator GrpIterator;
00672    typedef pkgCache::PkgIterator PkgIterator;
00673    typedef pkgCache::VerIterator VerIterator;
00674    typedef pkgCache::DescIterator DescIterator;
00675    typedef pkgCache::DepIterator DepIterator;
00676    typedef pkgCache::PrvIterator PrvIterator;
00677    typedef pkgCache::PkgFileIterator PkgFileIterator;
00678    typedef pkgCache::VerFileIterator VerFileIterator;   
00679    typedef pkgCache::Version Version;
00680    typedef pkgCache::Description Description;
00681    typedef pkgCache::Package Package;
00682    typedef pkgCache::Header Header;
00683    typedef pkgCache::Dep Dep;
00684    typedef pkgCache::Flag Flag;
00685 };
00686                                                                         /*}}}*/
00687 #endif