1 // -*- mode: cpp; mode: fold -*-
4 \brief pkgCache - Structure definitions for the cache file
6 The goal of the cache file is two fold:
7 Firstly to speed loading and processing of the package file array and
8 secondly to reduce memory consumption of the package file array.
10 The implementation is aimed at an environment with many primary package
11 files, for instance someone that has a Package file for their CD-ROM, a
12 Package file for the latest version of the distribution on the CD-ROM and a
13 package file for the development version. Always present is the information
14 contained in the status file which might be considered a separate package
17 Please understand, this is designed as a <b>Cache file</b> it is not meant to be
18 used on any system other than the one it was created for. It is not meant to
19 be authoritative either, i.e. if a system crash or software failure occurs it
20 must be perfectly acceptable for the cache file to be in an inconsistent
21 state. Furthermore at any time the cache file may be erased without losing
24 Also the structures and storage layout is optimized for use by the APT
25 and may not be suitable for all purposes. However it should be possible
26 to extend it with associate cache files that contain other information.
28 To keep memory use down the cache file only contains often used fields and
29 fields that are inexpensive to store, the Package file has a full list of
30 fields. Also the client may assume that all items are perfectly valid and
31 need not perform checks against their correctness. Removal of information
32 from the cache is possible, but blanks will be left in the file, and
33 unused strings will also be present. The recommended implementation is to
34 simply rebuild the cache each time any of the data files change. It is
35 possible to add a new package file to the cache without any negative side
38 <b>Note on Pointer access</b>
39 Clients should always use the CacheIterators classes for access to the
40 cache and the data in it. They also provide a simple STL-like method for
41 traversing the links of the datastructure.
43 Every item in every structure is stored as the index to that structure.
44 What this means is that once the files is mmaped every data access has to
45 go through a fix up stage to get a real memory pointer. This is done
46 by taking the index, multiplying it by the type size and then adding
47 it to the start address of the memory block. This sounds complex, but
48 in C it is a single array dereference. Because all items are aligned to
49 their size and indexes are stored as multiples of the size of the structure
50 the format is immediately portable to all possible architectures - BUT the
51 generated files are -NOT-.
53 This scheme allows code like this to be written:
55 void *Map = mmap(...);
56 Package *PkgList = (Package *)Map;
57 Header *Head = (Header *)Map;
58 char *Strings = (char *)Map;
59 cout << (Strings + PkgList[Head->HashTable[0]]->Name) << endl;
61 Notice the lack of casting or multiplication. The net result is to return
62 the name of the first package in the first hash bucket, without error
65 The generator uses allocation pools to group similarly sized structures in
66 large blocks to eliminate any alignment overhead. The generator also
67 assures that no structures overlap and all indexes are unique. Although
68 at first glance it may seem like there is the potential for two structures
69 to exist at the same point the generator never allows this to happen.
70 (See the discussion of free space pools)
72 See \ref pkgcachegen.h for more information about generating cache structures. */
74 #ifndef PKGLIB_PKGCACHE_H
75 #define PKGLIB_PKGCACHE_H
77 #include <apt-pkg/mmap.h>
78 #include <apt-pkg/macros.h>
84 #ifndef APT_8_CLEANER_HEADERS
88 #if APT_PKG_ABI >= 413
89 // storing file sizes of indexes, which are way below 4 GB for now
90 typedef uint32_t map_filesize_t
;
91 typedef map_filesize_t should_be_map_filesize_t
;
93 typedef unsigned long map_filesize_t
;
94 typedef unsigned int should_be_map_filesize_t
;
96 #if APT_PKG_ABI >= 413
97 // each package/group/dependency gets an id
98 typedef uint32_t map_id_t
;
99 typedef map_id_t should_be_map_id_t
;
101 typedef unsigned long map_id_t
;
102 typedef unsigned int should_be_map_id_t
;
104 #if APT_PKG_ABI >= 413
105 // some files get an id, too, but in far less absolute numbers
106 typedef uint16_t map_fileid_t
;
107 typedef map_fileid_t should_be_map_fileid_t
;
109 typedef unsigned long map_fileid_t
;
110 typedef unsigned int should_be_map_fileid_t
;
112 #if APT_PKG_ABI >= 413
113 // relative pointer from cache start
114 typedef uint32_t map_pointer_t
;
116 typedef unsigned int map_pointer_t
;
118 // same as the previous, but documented to be to a string item
119 typedef map_pointer_t map_stringitem_t
;
120 #if APT_PKG_ABI >= 413
121 typedef uint64_t should_be_uint64_t
;
122 typedef uint64_t should_be_uint64_small_t
;
124 typedef unsigned long long should_be_uint64_t
;
125 typedef unsigned long should_be_uint64_small_t
;
128 class pkgVersioningSystem
;
129 class pkgCache
/*{{{*/
132 // Cache element predeclarations
147 template<typename Str
, typename Itr
> class Iterator
;
154 class RlsFileIterator
;
155 class PkgFileIterator
;
156 class VerFileIterator
;
157 class DescFileIterator
;
161 // These are all the constants used in the cache structures
163 // WARNING - if you change these lists you must also edit
164 // the stringification in pkgcache.cc and also consider whether
165 // the cache file will become incompatible.
168 enum DepType
{Depends
=1,PreDepends
=2,Suggests
=3,Recommends
=4,
169 Conflicts
=5,Replaces
=6,Obsoletes
=7,DpkgBreaks
=8,Enhances
=9};
170 /** \brief available compare operators
172 The lower 4 bits are used to indicate what operator is being specified and
173 the upper 4 bits are flags. OR indicates that the next package is
174 or'd with the current package. */
175 enum DepCompareOp
{Or
=0x10,NoOp
=0,LessEq
=0x1,GreaterEq
=0x2,Less
=0x3,
176 Greater
=0x4,Equals
=0x5,NotEquals
=0x6};
181 /** \brief priority of a package version
183 Zero is used for unparsable or absent Priority fields. */
184 enum VerPriority
{Required
=1,Important
=2,Standard
=3,Optional
=4,Extra
=5};
185 enum PkgSelectedState
{Unknown
=0,Install
=1,Hold
=2,DeInstall
=3,Purge
=4};
186 enum PkgInstState
{Ok
=0,ReInstReq
=1,HoldInst
=2,HoldReInstReq
=3};
187 enum PkgCurrentState
{NotInstalled
=0,UnPacked
=1,HalfConfigured
=2,
188 HalfInstalled
=4,ConfigFiles
=5,Installed
=6,
189 TriggersAwaited
=7,TriggersPending
=8};
194 enum PkgFlags
{Auto
=(1<<0),Essential
=(1<<3),Important
=(1<<4)};
196 NotSource
=(1<<0), /*!< packages can't be fetched from here, e.g. dpkg/status file */
197 LocalSource
=(1<<1), /*!< local sources can't and will not be verified by hashes */
199 enum ReleaseFileFlags
{
200 NotAutomatic
=(1<<0), /*!< archive has a default pin of 1 */
201 ButAutomaticUpgrades
=(1<<1), /*!< (together with the previous) archive has a default pin of 100 */
207 // Memory mapped cache file
208 std::string CacheFile
;
211 map_id_t
sHash(const std::string
&S
) const APT_PURE
;
212 map_id_t
sHash(const char *S
) const APT_PURE
;
216 // Pointers to the arrays of items
222 ReleaseFile
*RlsFileP
;
223 PackageFile
*PkgFileP
;
228 APT_DEPRECATED StringItem
*StringItemP
;
231 virtual bool ReMap(bool const &Errorchecks
= true);
232 inline bool Sync() {return Map
.Sync();}
233 inline MMap
&GetMap() {return Map
;}
234 inline void *DataEnd() {return ((unsigned char *)Map
.Data()) + Map
.Size();}
236 // String hashing function (512 range)
237 inline map_id_t
Hash(const std::string
&S
) const {return sHash(S
);}
238 inline map_id_t
Hash(const char *S
) const {return sHash(S
);}
240 // Useful transformation things
241 const char *Priority(unsigned char Priority
);
244 GrpIterator
FindGrp(const std::string
&Name
);
245 PkgIterator
FindPkg(const std::string
&Name
);
246 PkgIterator
FindPkg(const std::string
&Name
, const std::string
&Arch
);
248 Header
&Head() {return *HeaderP
;}
249 inline GrpIterator
GrpBegin();
250 inline GrpIterator
GrpEnd();
251 inline PkgIterator
PkgBegin();
252 inline PkgIterator
PkgEnd();
253 inline PkgFileIterator
FileBegin();
254 inline PkgFileIterator
FileEnd();
255 inline RlsFileIterator
RlsFileBegin();
256 inline RlsFileIterator
RlsFileEnd();
258 inline bool MultiArchCache() const { return MultiArchEnabled
; }
259 inline char const * NativeArch();
261 // Make me a function
262 pkgVersioningSystem
*VS
;
265 static const char *CompTypeDeb(unsigned char Comp
) APT_CONST
;
266 static const char *CompType(unsigned char Comp
) APT_CONST
;
267 static const char *DepType(unsigned char Dep
);
269 pkgCache(MMap
*Map
,bool DoMap
= true);
270 virtual ~pkgCache() {}
273 bool MultiArchEnabled
;
274 APT_HIDDEN PkgIterator
SingleArchFindPkg(const std::string
&Name
);
277 // Header structure /*{{{*/
278 struct pkgCache::Header
280 /** \brief Signature information
282 This must contain the hex value 0x98FE76DC which is designed to
283 verify that the system loading the image has the same byte order
284 and byte size as the system saving the image */
285 unsigned long Signature
;
286 /** These contain the version of the cache file */
289 /** \brief indicates if the cache should be erased
291 Dirty is true if the cache file was opened for reading, the client
292 expects to have written things to it and have not fully synced it.
293 The file should be erased and rebuilt if it is true. */
296 /** \brief Size of structure values
298 All *Sz variables contains the sizeof() that particular structure.
299 It is used as an extra consistency check on the structure of the file.
301 If any of the size values do not exactly match what the client expects
302 then the client should refuse the load the file. */
303 unsigned short HeaderSz
;
304 unsigned short GroupSz
;
305 unsigned short PackageSz
;
306 unsigned short ReleaseFileSz
;
307 unsigned short PackageFileSz
;
308 unsigned short VersionSz
;
309 unsigned short DescriptionSz
;
310 unsigned short DependencySz
;
311 unsigned short ProvidesSz
;
312 unsigned short VerFileSz
;
313 unsigned short DescFileSz
;
315 /** \brief Structure counts
317 These indicate the number of each structure contained in the cache.
318 PackageCount is especially useful for generating user state structures.
319 See Package::Id for more info. */
321 map_id_t PackageCount
;
322 map_id_t VersionCount
;
323 map_id_t DescriptionCount
;
324 map_id_t DependsCount
;
325 map_fileid_t ReleaseFileCount
;
326 map_fileid_t PackageFileCount
;
327 map_fileid_t VerFileCount
;
328 map_fileid_t DescFileCount
;
329 map_id_t ProvidesCount
;
331 /** \brief index of the first PackageFile structure
333 The PackageFile structures are singly linked lists that represent
334 all package files that have been merged into the cache. */
335 map_pointer_t FileList
;
336 /** \brief index of the first ReleaseFile structure */
337 map_pointer_t RlsFileList
;
339 #if APT_PKG_ABI < 413
340 APT_DEPRECATED map_pointer_t StringList
;
342 /** \brief String representing the version system used */
343 map_pointer_t VerSysName
;
344 /** \brief native architecture the cache was built against */
345 map_pointer_t Architecture
;
346 #if APT_PKG_ABI >= 413
347 /** \brief all architectures the cache was built against */
348 map_pointer_t Architectures
;
350 /** \brief The maximum size of a raw entry from the original Package file */
351 map_filesize_t MaxVerFileSize
;
352 /** \brief The maximum size of a raw entry from the original Translation file */
353 map_filesize_t MaxDescFileSize
;
355 /** \brief The Pool structures manage the allocation pools that the generator uses
357 Start indicates the first byte of the pool, Count is the number of objects
358 remaining in the pool and ItemSize is the structure size (alignment factor)
359 of the pool. An ItemSize of 0 indicates the pool is empty. There should be
360 the same number of pools as there are structure types. The generator
361 stores this information so future additions can make use of any unused pool
363 DynamicMMap::Pool Pools
[9];
365 /** \brief hash tables providing rapid group/package name lookup
367 Each group/package name is inserted into a hash table using pkgCache::Hash(const &string)
368 By iterating over each entry in the hash table it is possible to iterate over
369 the entire list of packages. Hash Collisions are handled with a singly linked
370 list of packages based at the hash item. The linked list contains only
371 packages that match the hashing function.
372 In the PkgHashTable is it possible that multiple packages have the same name -
373 these packages are stored as a sequence in the list.
374 The size of both tables is the same. */
375 #if APT_PKG_ABI >= 413
376 unsigned int HashTableSize
;
377 unsigned int GetHashTableSize() const { return HashTableSize
; }
378 void SetHashTableSize(unsigned int const sz
) { HashTableSize
= sz
; }
379 map_pointer_t
GetArchitectures() const { return Architectures
; }
380 void SetArchitectures(map_pointer_t
const idx
) { Architectures
= idx
; }
382 // BEWARE: these tables are pretty much empty and just here for abi compat
383 map_ptrloc PkgHashTable
[2*1048];
384 map_ptrloc GrpHashTable
[2*1048];
385 unsigned int GetHashTableSize() const { return PkgHashTable
[0]; }
386 void SetHashTableSize(unsigned int const sz
) { PkgHashTable
[0] = sz
; }
387 map_pointer_t
GetArchitectures() const { return PkgHashTable
[1]; }
388 void SetArchitectures(map_pointer_t
const idx
) { PkgHashTable
[1] = idx
; }
390 map_pointer_t
* PkgHashTableP() const { return (map_pointer_t
*) (this + 1); }
391 map_pointer_t
* GrpHashTableP() const { return PkgHashTableP() + GetHashTableSize(); }
393 /** \brief Size of the complete cache file */
394 should_be_uint64_small_t CacheFileSize
;
396 bool CheckSizes(Header
&Against
) const APT_PURE
;
400 // Group structure /*{{{*/
401 /** \brief groups architecture depending packages together
403 On or more packages with the same name form a group, so we have
404 a simple way to access a package built for different architectures
405 Group exists in a singly linked list of group records starting at
406 the hash index of the name in the pkgCache::Header::GrpHashTable */
407 struct pkgCache::Group
409 /** \brief Name of the group */
410 map_stringitem_t Name
;
413 /** \brief Link to the first package which belongs to the group */
414 map_pointer_t FirstPackage
; // Package
415 /** \brief Link to the last package which belongs to the group */
416 map_pointer_t LastPackage
; // Package
417 /** \brief Link to the next Group */
418 map_pointer_t Next
; // Group
419 /** \brief unique sequel ID */
420 should_be_map_id_t ID
;
424 // Package structure /*{{{*/
425 /** \brief contains information for a single unique package
427 There can be any number of versions of a given package.
428 Package exists in a singly linked list of package records starting at
429 the hash index of the name in the pkgCache::Header::PkgHashTable
431 A package can be created for every architecture so package names are
432 not unique, but it is guaranteed that packages with the same name
433 are sequencel ordered in the list. Packages with the same name can be
434 accessed with the Group.
436 struct pkgCache::Package
438 /** \brief Name of the package
439 * Note that the access method Name() will remain. It is just this data member
440 * deprecated as this information is already stored and available via the
441 * associated Group – so it is wasting precious binary cache space */
442 APT_DEPRECATED map_stringitem_t Name
;
443 /** \brief Architecture of the package */
444 map_stringitem_t Arch
;
445 /** \brief Base of a singly linked list of versions
447 Each structure represents a unique version of the package.
448 The version structures contain links into PackageFile and the
449 original text file as well as detailed information about the size
450 and dependencies of the specific package. In this way multiple
451 versions of a package can be cleanly handled by the system.
452 Furthermore, this linked list is guaranteed to be sorted
453 from Highest version to lowest version with no duplicate entries. */
454 map_pointer_t VersionList
; // Version
455 /** \brief index to the installed version */
456 map_pointer_t CurrentVer
; // Version
457 /** \brief indicates nothing (consistently)
458 This field used to contain ONE section the package belongs to,
459 if those differs between versions it is a RANDOM one.
460 The Section() method tries to reproduce it, but the only sane
461 thing to do is use the Section field from the version! */
462 APT_DEPRECATED map_ptrloc Section
; // StringItem
463 /** \brief index of the group this package belongs to */
464 map_pointer_t Group
; // Group the Package belongs to
467 /** \brief Link to the next package in the same bucket */
468 map_pointer_t NextPackage
; // Package
469 /** \brief List of all dependencies on this package */
470 map_pointer_t RevDepends
; // Dependency
471 /** \brief List of all "packages" this package provide */
472 map_pointer_t ProvidesList
; // Provides
474 // Install/Remove/Purge etc
475 /** \brief state that the user wishes the package to be in */
476 unsigned char SelectedState
; // What
477 /** \brief installation state of the package
479 This should be "ok" but in case the installation failed
480 it will be different.
482 unsigned char InstState
; // Flags
483 /** \brief indicates if the package is installed */
484 unsigned char CurrentState
; // State
486 /** \brief unique sequel ID
488 ID is a unique value from 0 to Header->PackageCount assigned by the generator.
489 This allows clients to create an array of size PackageCount and use it to store
490 state information for the package map. For instance the status file emitter uses
491 this to track which packages have been emitted already. */
492 should_be_map_id_t ID
;
493 /** \brief some useful indicators of the package's state */
497 // Release File structure /*{{{*/
498 /** \brief stores information about the release files used to generate the cache
500 PackageFiles reference ReleaseFiles as we need to keep record of which
501 version belongs to which release e.g. for pinning. */
502 struct pkgCache::ReleaseFile
504 /** \brief physical disk file that this ReleaseFile represents */
505 map_stringitem_t FileName
;
506 /** \brief the release information
508 Please see the files document for a description of what the
509 release information means. */
510 map_stringitem_t Archive
;
511 map_stringitem_t Codename
;
512 map_stringitem_t Version
;
513 map_stringitem_t Origin
;
514 map_stringitem_t Label
;
515 /** \brief The site the index file was fetched from */
516 map_stringitem_t Site
;
518 /** \brief Size of the file
520 Used together with the modification time as a
521 simple check to ensure that the Packages
522 file has not been altered since Cache generation. */
524 /** \brief Modification time for the file */
527 /** @TODO document PackageFile::Flags */
531 /** \brief Link to the next ReleaseFile in the Cache */
532 map_pointer_t NextFile
;
533 /** \brief unique sequel ID */
534 should_be_map_fileid_t ID
;
537 // Package File structure /*{{{*/
538 /** \brief stores information about the files used to generate the cache
540 Package files are referenced by Version structures to be able to know
541 after the generation still from which Packages file includes this Version
542 as we need this information later on e.g. for pinning. */
543 struct pkgCache::PackageFile
545 /** \brief physical disk file that this PackageFile represents */
546 map_stringitem_t FileName
;
547 /** \brief the release information */
548 map_pointer_t Release
;
550 map_stringitem_t Component
;
551 map_stringitem_t Architecture
;
553 /** \brief indicates what sort of index file this is
555 @TODO enumerate at least the possible indexes */
556 map_stringitem_t IndexType
;
557 /** \brief Size of the file
559 Used together with the modification time as a
560 simple check to ensure that the Packages
561 file has not been altered since Cache generation. */
563 /** \brief Modification time for the file */
566 /** @TODO document PackageFile::Flags */
570 /** \brief Link to the next PackageFile in the Cache */
571 map_pointer_t NextFile
; // PackageFile
572 /** \brief unique sequel ID */
573 should_be_map_fileid_t ID
;
576 // VerFile structure /*{{{*/
577 /** \brief associates a version with a PackageFile
579 This allows a full description of all Versions in all files
580 (and hence all sources) under consideration. */
581 struct pkgCache::VerFile
583 /** \brief index of the package file that this version was found in */
584 map_pointer_t File
; // PackageFile
585 /** \brief next step in the linked list */
586 map_pointer_t NextFile
; // PkgVerFile
587 /** \brief position in the package file */
588 should_be_map_filesize_t Offset
; // File offset
589 /** @TODO document pkgCache::VerFile::Size */
593 // DescFile structure /*{{{*/
594 /** \brief associates a description with a Translation file */
595 struct pkgCache::DescFile
597 /** \brief index of the file that this description was found in */
598 map_pointer_t File
; // PackageFile
599 /** \brief next step in the linked list */
600 map_pointer_t NextFile
; // PkgVerFile
601 /** \brief position in the file */
602 should_be_map_filesize_t Offset
; // File offset
603 /** @TODO document pkgCache::DescFile::Size */
607 // Version structure /*{{{*/
608 /** \brief information for a single version of a package
610 The version list is always sorted from highest version to lowest
611 version by the generator. Equal version numbers are either merged
612 or handled as separate versions based on the Hash value. */
613 struct pkgCache::Version
615 /** \brief complete version string */
616 map_stringitem_t VerStr
;
617 /** \brief section this version is filled in */
618 map_stringitem_t Section
;
619 #if APT_PKG_ABI >= 413
620 /** \brief source package name this version comes from
621 Always contains the name, even if it is the same as the binary name */
622 map_stringitem_t SourcePkgName
;
623 /** \brief source version this version comes from
624 Always contains the version string, even if it is the same as the binary version */
625 map_stringitem_t SourceVerStr
;
628 /** \brief Multi-Arch capabilities of a package version */
629 enum VerMultiArch
{ None
= 0, /*!< is the default and doesn't trigger special behaviour */
630 All
= (1<<0), /*!< will cause that Ver.Arch() will report "all" */
631 Foreign
= (1<<1), /*!< can satisfy dependencies in another architecture */
632 Same
= (1<<2), /*!< can be co-installed with itself from other architectures */
633 Allowed
= (1<<3), /*!< other packages are allowed to depend on thispkg:any */
634 AllForeign
= All
| Foreign
,
635 AllAllowed
= All
| Allowed
};
636 /** \brief stores the MultiArch capabilities of this version
638 Flags used are defined in pkgCache::Version::VerMultiArch
640 unsigned char MultiArch
;
642 /** \brief references all the PackageFile's that this version came from
644 FileList can be used to determine what distribution(s) the Version
645 applies to. If FileList is 0 then this is a blank version.
646 The structure should also have a 0 in all other fields excluding
647 pkgCache::Version::VerStr and Possibly pkgCache::Version::NextVer. */
648 map_pointer_t FileList
; // VerFile
649 /** \brief next (lower or equal) version in the linked list */
650 map_pointer_t NextVer
; // Version
651 /** \brief next description in the linked list */
652 map_pointer_t DescriptionList
; // Description
653 /** \brief base of the dependency list */
654 map_pointer_t DependsList
; // Dependency
655 /** \brief links to the owning package
657 This allows reverse dependencies to determine the package */
658 map_pointer_t ParentPkg
; // Package
659 /** \brief list of pkgCache::Provides */
660 map_pointer_t ProvidesList
; // Provides
662 /** \brief archive size for this version
664 For Debian this is the size of the .deb file. */
665 should_be_uint64_t Size
; // These are the .deb size
666 /** \brief uncompressed size for this version */
667 should_be_uint64_t InstalledSize
;
668 /** \brief characteristic value representing this version
670 No two packages in existence should have the same VerStr
671 and Hash with different contents. */
673 /** \brief unique sequel ID */
674 should_be_map_id_t ID
;
675 /** \brief parsed priority value */
676 unsigned char Priority
;
679 // Description structure /*{{{*/
680 /** \brief datamember of a linked list of available description for a version */
681 struct pkgCache::Description
683 /** \brief Language code of this description (translation)
685 If the value has a 0 length then this is read using the Package
686 file else the Translation-CODE file is used. */
687 map_stringitem_t language_code
;
688 /** \brief MD5sum of the original description
690 Used to map Translations of a description to a version
691 and to check that the Translation is up-to-date. */
692 map_stringitem_t md5sum
;
694 /** @TODO document pkgCache::Description::FileList */
695 map_pointer_t FileList
; // DescFile
696 /** \brief next translation for this description */
697 map_pointer_t NextDesc
; // Description
698 /** \brief the text is a description of this package */
699 map_pointer_t ParentPkg
; // Package
701 /** \brief unique sequel ID */
702 should_be_map_id_t ID
;
705 // Dependency structure /*{{{*/
706 /** \brief information for a single dependency record
708 The records are split up like this to ease processing by the client.
709 The base of the linked list is pkgCache::Version::DependsList.
710 All forms of dependencies are recorded here including Depends,
711 Recommends, Suggests, Enhances, Conflicts, Replaces and Breaks. */
712 struct pkgCache::Dependency
714 /** \brief string of the version the dependency is applied against */
715 map_stringitem_t Version
;
716 /** \brief index of the package this depends applies to
718 The generator will - if the package does not already exist -
719 create a blank (no version records) package. */
720 map_pointer_t Package
; // Package
721 /** \brief next dependency of this version */
722 map_pointer_t NextDepends
; // Dependency
723 /** \brief next reverse dependency of this package */
724 map_pointer_t NextRevDepends
; // Dependency
725 /** \brief version of the package which has the reverse depends */
726 map_pointer_t ParentVer
; // Version
728 /** \brief unique sequel ID */
729 should_be_map_id_t ID
;
730 /** \brief Dependency type - Depends, Recommends, Conflicts, etc */
732 /** \brief comparison operator specified on the depends line
734 If the high bit is set then it is a logical OR with the previous record. */
735 unsigned char CompareOp
;
738 // Provides structure /*{{{*/
739 /** \brief handles virtual packages
741 When a Provides: line is encountered a new provides record is added
742 associating the package with a virtual package name.
743 The provides structures are linked off the package structures.
744 This simplifies the analysis of dependencies and other aspects A provides
745 refers to a specific version of a specific package, not all versions need to
746 provide that provides.*/
747 struct pkgCache::Provides
749 /** \brief index of the package providing this */
750 map_pointer_t ParentPkg
; // Package
751 /** \brief index of the version this provide line applies to */
752 map_pointer_t Version
; // Version
753 /** \brief version in the provides line (if any)
755 This version allows dependencies to depend on specific versions of a
756 Provides, as well as allowing Provides to override existing packages.
757 This is experimental. Note that Debian doesn't allow versioned provides */
758 map_stringitem_t ProvideVersion
;
759 /** \brief next provides (based of package) */
760 map_pointer_t NextProvides
; // Provides
761 /** \brief next provides (based of version) */
762 map_pointer_t NextPkgProv
; // Provides
765 // UNUSED StringItem structure /*{{{*/
766 struct APT_DEPRECATED
pkgCache::StringItem
768 /** \brief string this refers to */
769 map_ptrloc String
; // StringItem
770 /** \brief Next link in the chain */
771 map_ptrloc NextItem
; // StringItem
775 inline char const * pkgCache::NativeArch()
776 { return StrP
+ HeaderP
->Architecture
; }
778 #include <apt-pkg/cacheiterators.h>
780 inline pkgCache::GrpIterator
pkgCache::GrpBegin()
781 {return GrpIterator(*this);}
782 inline pkgCache::GrpIterator
pkgCache::GrpEnd()
783 {return GrpIterator(*this,GrpP
);}
784 inline pkgCache::PkgIterator
pkgCache::PkgBegin()
785 {return PkgIterator(*this);}
786 inline pkgCache::PkgIterator
pkgCache::PkgEnd()
787 {return PkgIterator(*this,PkgP
);}
788 inline pkgCache::PkgFileIterator
pkgCache::FileBegin()
789 {return PkgFileIterator(*this,PkgFileP
+ HeaderP
->FileList
);}
790 inline pkgCache::PkgFileIterator
pkgCache::FileEnd()
791 {return PkgFileIterator(*this,PkgFileP
);}
792 inline pkgCache::RlsFileIterator
pkgCache::RlsFileBegin()
793 {return RlsFileIterator(*this,RlsFileP
+ HeaderP
->RlsFileList
);}
794 inline pkgCache::RlsFileIterator
pkgCache::RlsFileEnd()
795 {return RlsFileIterator(*this,RlsFileP
);}
798 // Oh I wish for Real Name Space Support
799 class pkgCache::Namespace
/*{{{*/
802 typedef pkgCache::GrpIterator GrpIterator
;
803 typedef pkgCache::PkgIterator PkgIterator
;
804 typedef pkgCache::VerIterator VerIterator
;
805 typedef pkgCache::DescIterator DescIterator
;
806 typedef pkgCache::DepIterator DepIterator
;
807 typedef pkgCache::PrvIterator PrvIterator
;
808 typedef pkgCache::RlsFileIterator RlsFileIterator
;
809 typedef pkgCache::PkgFileIterator PkgFileIterator
;
810 typedef pkgCache::VerFileIterator VerFileIterator
;
811 typedef pkgCache::Version Version
;
812 typedef pkgCache::Description Description
;
813 typedef pkgCache::Package Package
;
814 typedef pkgCache::Header Header
;
815 typedef pkgCache::Dep Dep
;
816 typedef pkgCache::Flag Flag
;