]> git.saurik.com Git - apt.git/blame - apt-pkg/pkgcache.h
store Release files data in the Cache
[apt.git] / apt-pkg / pkgcache.h
CommitLineData
578bfd0a
AL
1// -*- mode: cpp; mode: fold -*-
2// Description /*{{{*/
94449d7c
DK
3/**\file pkgcache.h
4 \brief pkgCache - Structure definitions for the cache file
5
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.
9
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
15 file.
16
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
22 any information.
23
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.
27
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
36 effects.
37
38 <b>Note on Pointer access</b>
578bfd0a 39 Clients should always use the CacheIterators classes for access to the
94449d7c
DK
40 cache and the data in it. They also provide a simple STL-like method for
41 traversing the links of the datastructure.
42
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-.
52
53 This scheme allows code like this to be written:
54 <example>
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;
60 </example>
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
63 checks.
64
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)
71
72 See \ref pkgcachegen.h for more information about generating cache structures. */
578bfd0a 73 /*}}}*/
578bfd0a
AL
74#ifndef PKGLIB_PKGCACHE_H
75#define PKGLIB_PKGCACHE_H
76
a02db58f
DK
77#include <apt-pkg/mmap.h>
78#include <apt-pkg/macros.h>
79
578bfd0a
AL
80#include <string>
81#include <time.h>
4ad8619b 82#include <stdint.h>
0a843901 83
a4f6bdc8
DK
84#ifndef APT_8_CLEANER_HEADERS
85using std::string;
86#endif
87
32ab4bd0 88#if APT_PKG_ABI >= 413
4ad8619b
DK
89// storing file sizes of indexes, which are way below 4 GB for now
90typedef uint32_t map_filesize_t;
32ab4bd0
DK
91typedef map_filesize_t should_be_map_filesize_t;
92#else
93typedef unsigned long map_filesize_t;
94typedef unsigned int should_be_map_filesize_t;
95#endif
96#if APT_PKG_ABI >= 413
4ad8619b
DK
97// each package/group/dependency gets an id
98typedef uint32_t map_id_t;
32ab4bd0
DK
99typedef map_id_t should_be_map_id_t;
100#else
101typedef unsigned long map_id_t;
102typedef unsigned int should_be_map_id_t;
103#endif
104#if APT_PKG_ABI >= 413
4ad8619b
DK
105// some files get an id, too, but in far less absolute numbers
106typedef uint16_t map_fileid_t;
32ab4bd0
DK
107typedef map_fileid_t should_be_map_fileid_t;
108#else
109typedef unsigned long map_fileid_t;
110typedef unsigned int should_be_map_fileid_t;
111#endif
112#if APT_PKG_ABI >= 413
4ad8619b
DK
113// relative pointer from cache start
114typedef uint32_t map_pointer_t;
32ab4bd0
DK
115#else
116typedef unsigned int map_pointer_t;
117#endif
4ad8619b
DK
118// same as the previous, but documented to be to a string item
119typedef map_pointer_t map_stringitem_t;
32ab4bd0
DK
120#if APT_PKG_ABI >= 413
121typedef uint64_t should_be_uint64_t;
122typedef uint64_t should_be_uint64_small_t;
123#else
124typedef unsigned long long should_be_uint64_t;
125typedef unsigned long should_be_uint64_small_t;
126#endif
4ad8619b 127
b2e465d6 128class pkgVersioningSystem;
92fcbfc1 129class pkgCache /*{{{*/
578bfd0a
AL
130{
131 public:
132 // Cache element predeclarations
133 struct Header;
5bf15716 134 struct Group;
578bfd0a 135 struct Package;
b07aeb1a 136 struct ReleaseFile;
578bfd0a
AL
137 struct PackageFile;
138 struct Version;
a52f938b 139 struct Description;
578bfd0a
AL
140 struct Provides;
141 struct Dependency;
32ab4bd0 142 struct StringItem;
dcb79bae 143 struct VerFile;
a52f938b 144 struct DescFile;
578bfd0a
AL
145
146 // Iterators
773e2c1f 147 template<typename Str, typename Itr> class Iterator;
5bf15716 148 class GrpIterator;
578bfd0a
AL
149 class PkgIterator;
150 class VerIterator;
a52f938b 151 class DescIterator;
578bfd0a
AL
152 class DepIterator;
153 class PrvIterator;
b07aeb1a 154 class RlsFileIterator;
578bfd0a 155 class PkgFileIterator;
dcb79bae 156 class VerFileIterator;
a52f938b 157 class DescFileIterator;
b2e465d6
AL
158
159 class Namespace;
dcb79bae 160
f55a958f 161 // These are all the constants used in the cache structures
308c7d30
IJ
162
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.
6c139d6e
AL
166 struct Dep
167 {
168 enum DepType {Depends=1,PreDepends=2,Suggests=3,Recommends=4,
f8ae7e8b 169 Conflicts=5,Replaces=6,Obsoletes=7,DpkgBreaks=8,Enhances=9};
94449d7c
DK
170 /** \brief available compare operators
171
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. */
6c139d6e
AL
175 enum DepCompareOp {Or=0x10,NoOp=0,LessEq=0x1,GreaterEq=0x2,Less=0x3,
176 Greater=0x4,Equals=0x5,NotEquals=0x6};
177 };
178
179 struct State
180 {
94449d7c
DK
181 /** \brief priority of a package version
182
183 Zero is used for unparsable or absent Priority fields. */
9005f08e 184 enum VerPriority {Required=1,Important=2,Standard=3,Optional=4,Extra=5};
6c139d6e
AL
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,
9d06bc80
MV
188 HalfInstalled=4,ConfigFiles=5,Installed=6,
189 TriggersAwaited=7,TriggersPending=8};
6c139d6e
AL
190 };
191
192 struct Flag
193 {
138d4b3d 194 enum PkgFlags {Auto=(1<<0),Essential=(1<<3),Important=(1<<4)};
448c38bd
DK
195 enum PkgFFlags {
196 NotSource=(1<<0), /*!< packages can't be fetched from here, e.g. dpkg/status file */
b07aeb1a
DK
197 LocalSource=(1<<1), /*!< local sources can't and will not be verified by hashes */
198 };
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 */
448c38bd 202 };
6c139d6e 203 };
578bfd0a
AL
204
205 protected:
206
207 // Memory mapped cache file
8f3ba4e8 208 std::string CacheFile;
578bfd0a
AL
209 MMap &Map;
210
4ad8619b
DK
211 map_id_t sHash(const std::string &S) const APT_PURE;
212 map_id_t sHash(const char *S) const APT_PURE;
578bfd0a
AL
213
214 public:
215
216 // Pointers to the arrays of items
217 Header *HeaderP;
5bf15716 218 Group *GrpP;
578bfd0a 219 Package *PkgP;
dcb79bae 220 VerFile *VerFileP;
a52f938b 221 DescFile *DescFileP;
b07aeb1a 222 ReleaseFile *RlsFileP;
578bfd0a
AL
223 PackageFile *PkgFileP;
224 Version *VerP;
a52f938b 225 Description *DescP;
578bfd0a
AL
226 Provides *ProvideP;
227 Dependency *DepP;
32ab4bd0 228 APT_DEPRECATED StringItem *StringItemP;
578bfd0a 229 char *StrP;
dcb79bae 230
a9fe5928 231 virtual bool ReMap(bool const &Errorchecks = true);
d3e8fbb3
DK
232 inline bool Sync() {return Map.Sync();}
233 inline MMap &GetMap() {return Map;}
234 inline void *DataEnd() {return ((unsigned char *)Map.Data()) + Map.Size();}
b2e465d6 235
578bfd0a 236 // String hashing function (512 range)
4ad8619b
DK
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);}
578bfd0a 239
94449d7c 240 // Useful transformation things
0149949b
AL
241 const char *Priority(unsigned char Priority);
242
578bfd0a 243 // Accessors
8f3ba4e8
DK
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);
5bf15716 247
d3e8fbb3 248 Header &Head() {return *HeaderP;}
25396fb0
DK
249 inline GrpIterator GrpBegin();
250 inline GrpIterator GrpEnd();
578bfd0a
AL
251 inline PkgIterator PkgBegin();
252 inline PkgIterator PkgEnd();
ad00ae81
AL
253 inline PkgFileIterator FileBegin();
254 inline PkgFileIterator FileEnd();
b07aeb1a
DK
255 inline RlsFileIterator RlsFileBegin();
256 inline RlsFileIterator RlsFileEnd();
b2e465d6 257
d3e8fbb3 258 inline bool MultiArchCache() const { return MultiArchEnabled; }
d64e130a 259 inline char const * NativeArch();
8d4c859d 260
b2e465d6
AL
261 // Make me a function
262 pkgVersioningSystem *VS;
263
264 // Converters
a02db58f
DK
265 static const char *CompTypeDeb(unsigned char Comp) APT_CONST;
266 static const char *CompType(unsigned char Comp) APT_CONST;
b2e465d6 267 static const char *DepType(unsigned char Dep);
ad00ae81 268
b2e465d6 269 pkgCache(MMap *Map,bool DoMap = true);
d3e8fbb3 270 virtual ~pkgCache() {}
8d4c859d
DK
271
272private:
273 bool MultiArchEnabled;
3809194b 274 APT_HIDDEN PkgIterator SingleArchFindPkg(const std::string &Name);
578bfd0a 275};
92fcbfc1
DK
276 /*}}}*/
277// Header structure /*{{{*/
578bfd0a
AL
278struct pkgCache::Header
279{
94449d7c
DK
280 /** \brief Signature information
281
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 */
578bfd0a 285 unsigned long Signature;
94449d7c 286 /** These contain the version of the cache file */
578bfd0a
AL
287 short MajorVersion;
288 short MinorVersion;
94449d7c
DK
289 /** \brief indicates if the cache should be erased
290
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. */
578bfd0a 294 bool Dirty;
94449d7c
DK
295
296 /** \brief Size of structure values
297
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.
300
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. */
578bfd0a 303 unsigned short HeaderSz;
52c41485 304 unsigned short GroupSz;
578bfd0a 305 unsigned short PackageSz;
b07aeb1a 306 unsigned short ReleaseFileSz;
578bfd0a
AL
307 unsigned short PackageFileSz;
308 unsigned short VersionSz;
a52f938b 309 unsigned short DescriptionSz;
578bfd0a
AL
310 unsigned short DependencySz;
311 unsigned short ProvidesSz;
dcb79bae 312 unsigned short VerFileSz;
a52f938b 313 unsigned short DescFileSz;
94449d7c
DK
314
315 /** \brief Structure counts
316
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. */
4ad8619b
DK
320 map_id_t GroupCount;
321 map_id_t PackageCount;
322 map_id_t VersionCount;
323 map_id_t DescriptionCount;
324 map_id_t DependsCount;
b07aeb1a 325 map_fileid_t ReleaseFileCount;
4ad8619b
DK
326 map_fileid_t PackageFileCount;
327 map_fileid_t VerFileCount;
328 map_fileid_t DescFileCount;
329 map_id_t ProvidesCount;
94449d7c
DK
330
331 /** \brief index of the first PackageFile structure
332
333 The PackageFile structures are singly linked lists that represent
334 all package files that have been merged into the cache. */
4ad8619b 335 map_pointer_t FileList;
b07aeb1a
DK
336 /** \brief index of the first ReleaseFile structure */
337 map_pointer_t RlsFileList;
338
32ab4bd0
DK
339#if APT_PKG_ABI < 413
340 APT_DEPRECATED map_pointer_t StringList;
341#endif
94449d7c 342 /** \brief String representing the version system used */
4ad8619b 343 map_pointer_t VerSysName;
7a223b93 344 /** \brief native architecture the cache was built against */
4ad8619b 345 map_pointer_t Architecture;
32ab4bd0 346#if APT_PKG_ABI >= 413
7a223b93 347 /** \brief all architectures the cache was built against */
4ad8619b 348 map_pointer_t Architectures;
32ab4bd0 349#endif
94449d7c 350 /** \brief The maximum size of a raw entry from the original Package file */
4ad8619b 351 map_filesize_t MaxVerFileSize;
94449d7c 352 /** \brief The maximum size of a raw entry from the original Translation file */
4ad8619b 353 map_filesize_t MaxDescFileSize;
578bfd0a 354
94449d7c
DK
355 /** \brief The Pool structures manage the allocation pools that the generator uses
356
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
362 blocks. */
5bf15716 363 DynamicMMap::Pool Pools[9];
e8a7b0b2 364
94449d7c
DK
365 /** \brief hash tables providing rapid group/package name lookup
366
e8a7b0b2 367 Each group/package name is inserted into a hash table using pkgCache::Hash(const &string)
94449d7c
DK
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.
e8a7b0b2 374 The size of both tables is the same. */
32ab4bd0 375#if APT_PKG_ABI >= 413
e8a7b0b2 376 unsigned int HashTableSize;
32ab4bd0
DK
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; }
381#else
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; }
389#endif
390 map_pointer_t * PkgHashTableP() const { return (map_pointer_t*) (this + 1); }
391 map_pointer_t * GrpHashTableP() const { return PkgHashTableP() + GetHashTableSize(); }
578bfd0a 392
0688ccd8 393 /** \brief Size of the complete cache file */
32ab4bd0 394 should_be_uint64_small_t CacheFileSize;
0688ccd8 395
a02db58f 396 bool CheckSizes(Header &Against) const APT_PURE;
578bfd0a
AL
397 Header();
398};
92fcbfc1 399 /*}}}*/
94449d7c
DK
400// Group structure /*{{{*/
401/** \brief groups architecture depending packages together
5bf15716 402
94449d7c
DK
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 */
407struct pkgCache::Group
408{
409 /** \brief Name of the group */
4ad8619b 410 map_stringitem_t Name;
94449d7c
DK
411
412 // Linked List
52c41485 413 /** \brief Link to the first package which belongs to the group */
4ad8619b 414 map_pointer_t FirstPackage; // Package
52c41485 415 /** \brief Link to the last package which belongs to the group */
4ad8619b 416 map_pointer_t LastPackage; // Package
52c41485 417 /** \brief Link to the next Group */
4ad8619b 418 map_pointer_t Next; // Group
52c41485 419 /** \brief unique sequel ID */
32ab4bd0 420 should_be_map_id_t ID;
52c41485 421
5bf15716
DK
422};
423 /*}}}*/
94449d7c
DK
424// Package structure /*{{{*/
425/** \brief contains information for a single unique package
426
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
430
431 A package can be created for every architecture so package names are
1e3f4083 432 not unique, but it is guaranteed that packages with the same name
94449d7c
DK
433 are sequencel ordered in the list. Packages with the same name can be
434 accessed with the Group.
435*/
436struct pkgCache::Package
578bfd0a 437{
fe86debb
DK
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;
94449d7c 443 /** \brief Architecture of the package */
4ad8619b 444 map_stringitem_t Arch;
94449d7c
DK
445 /** \brief Base of a singly linked list of versions
446
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. */
4ad8619b 454 map_pointer_t VersionList; // Version
94449d7c 455 /** \brief index to the installed version */
4ad8619b 456 map_pointer_t CurrentVer; // Version
32ab4bd0
DK
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
94449d7c 463 /** \brief index of the group this package belongs to */
4ad8619b 464 map_pointer_t Group; // Group the Package belongs to
94449d7c
DK
465
466 // Linked list
467 /** \brief Link to the next package in the same bucket */
32ab4bd0 468 map_pointer_t NextPackage; // Package
94449d7c 469 /** \brief List of all dependencies on this package */
4ad8619b 470 map_pointer_t RevDepends; // Dependency
94449d7c 471 /** \brief List of all "packages" this package provide */
4ad8619b 472 map_pointer_t ProvidesList; // Provides
a52f938b 473
578bfd0a 474 // Install/Remove/Purge etc
94449d7c 475 /** \brief state that the user wishes the package to be in */
578bfd0a 476 unsigned char SelectedState; // What
94449d7c
DK
477 /** \brief installation state of the package
478
479 This should be "ok" but in case the installation failed
480 it will be different.
481 */
578bfd0a 482 unsigned char InstState; // Flags
94449d7c 483 /** \brief indicates if the package is installed */
578bfd0a 484 unsigned char CurrentState; // State
94449d7c
DK
485
486 /** \brief unique sequel ID
487
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. */
32ab4bd0 492 should_be_map_id_t ID;
94449d7c 493 /** \brief some useful indicators of the package's state */
f55a958f 494 unsigned long Flags;
578bfd0a 495};
92fcbfc1 496 /*}}}*/
b07aeb1a
DK
497// Release File structure /*{{{*/
498/** \brief stores information about the release files used to generate the cache
94449d7c 499
b07aeb1a
DK
500 PackageFiles reference ReleaseFiles as we need to keep record of which
501 version belongs to which release e.g. for pinning. */
502struct pkgCache::ReleaseFile
578bfd0a 503{
b07aeb1a 504 /** \brief physical disk file that this ReleaseFile represents */
78a5476f 505 map_stringitem_t FileName;
94449d7c
DK
506 /** \brief the release information
507
508 Please see the files document for a description of what the
509 release information means. */
4ad8619b
DK
510 map_stringitem_t Archive;
511 map_stringitem_t Codename;
4ad8619b
DK
512 map_stringitem_t Version;
513 map_stringitem_t Origin;
514 map_stringitem_t Label;
94449d7c 515 /** \brief The site the index file was fetched from */
4ad8619b 516 map_stringitem_t Site;
b07aeb1a
DK
517
518 /** \brief Size of the file
519
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. */
523 map_filesize_t Size;
524 /** \brief Modification time for the file */
525 time_t mtime;
526
527 /** @TODO document PackageFile::Flags */
528 unsigned long Flags;
529
530 // Linked list
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;
535};
536 /*}}}*/
537// Package File structure /*{{{*/
538/** \brief stores information about the files used to generate the cache
539
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. */
543struct pkgCache::PackageFile
544{
545 /** \brief physical disk file that this PackageFile represents */
546 map_stringitem_t FileName;
547 /** \brief the release information */
548 map_pointer_t Release;
549
550 map_stringitem_t Component;
551 map_stringitem_t Architecture;
552
94449d7c
DK
553 /** \brief indicates what sort of index file this is
554
555 @TODO enumerate at least the possible indexes */
4ad8619b 556 map_stringitem_t IndexType;
94449d7c
DK
557 /** \brief Size of the file
558
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. */
4ad8619b 562 map_filesize_t Size;
94449d7c
DK
563 /** \brief Modification time for the file */
564 time_t mtime;
565
255c9e4b 566 /** @TODO document PackageFile::Flags */
3c124dde 567 unsigned long Flags;
94449d7c 568
578bfd0a 569 // Linked list
94449d7c 570 /** \brief Link to the next PackageFile in the Cache */
4ad8619b 571 map_pointer_t NextFile; // PackageFile
94449d7c 572 /** \brief unique sequel ID */
32ab4bd0 573 should_be_map_fileid_t ID;
578bfd0a 574};
92fcbfc1 575 /*}}}*/
94449d7c
DK
576// VerFile structure /*{{{*/
577/** \brief associates a version with a PackageFile
578
579 This allows a full description of all Versions in all files
580 (and hence all sources) under consideration. */
581struct pkgCache::VerFile
dcb79bae 582{
94449d7c 583 /** \brief index of the package file that this version was found in */
4ad8619b 584 map_pointer_t File; // PackageFile
94449d7c 585 /** \brief next step in the linked list */
4ad8619b 586 map_pointer_t NextFile; // PkgVerFile
94449d7c 587 /** \brief position in the package file */
32ab4bd0 588 should_be_map_filesize_t Offset; // File offset
255c9e4b 589 /** @TODO document pkgCache::VerFile::Size */
4ad8619b 590 map_filesize_t Size;
dcb79bae 591};
92fcbfc1 592 /*}}}*/
94449d7c
DK
593// DescFile structure /*{{{*/
594/** \brief associates a description with a Translation file */
595struct pkgCache::DescFile
a52f938b 596{
94449d7c 597 /** \brief index of the file that this description was found in */
4ad8619b 598 map_pointer_t File; // PackageFile
94449d7c 599 /** \brief next step in the linked list */
4ad8619b 600 map_pointer_t NextFile; // PkgVerFile
94449d7c 601 /** \brief position in the file */
32ab4bd0 602 should_be_map_filesize_t Offset; // File offset
255c9e4b 603 /** @TODO document pkgCache::DescFile::Size */
4ad8619b 604 map_filesize_t Size;
a52f938b 605};
92fcbfc1 606 /*}}}*/
94449d7c
DK
607// Version structure /*{{{*/
608/** \brief information for a single version of a package
609
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. */
613struct pkgCache::Version
578bfd0a 614{
94449d7c 615 /** \brief complete version string */
4ad8619b 616 map_stringitem_t VerStr;
94449d7c 617 /** \brief section this version is filled in */
4ad8619b 618 map_stringitem_t Section;
765190e4 619#if APT_PKG_ABI >= 413
a221efc3
DK
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;
765190e4 626#endif
894d672e
DK
627
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 */
00b6a181
DK
633 Allowed = (1<<3), /*!< other packages are allowed to depend on thispkg:any */
634 AllForeign = All | Foreign,
635 AllAllowed = All | Allowed };
94449d7c
DK
636 /** \brief stores the MultiArch capabilities of this version
637
894d672e
DK
638 Flags used are defined in pkgCache::Version::VerMultiArch
639 */
640 unsigned char MultiArch;
25396fb0 641
94449d7c
DK
642 /** \brief references all the PackageFile's that this version came from
643
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. */
4ad8619b 648 map_pointer_t FileList; // VerFile
94449d7c 649 /** \brief next (lower or equal) version in the linked list */
4ad8619b 650 map_pointer_t NextVer; // Version
94449d7c 651 /** \brief next description in the linked list */
4ad8619b 652 map_pointer_t DescriptionList; // Description
94449d7c 653 /** \brief base of the dependency list */
4ad8619b 654 map_pointer_t DependsList; // Dependency
94449d7c
DK
655 /** \brief links to the owning package
656
657 This allows reverse dependencies to determine the package */
4ad8619b 658 map_pointer_t ParentPkg; // Package
94449d7c 659 /** \brief list of pkgCache::Provides */
4ad8619b 660 map_pointer_t ProvidesList; // Provides
94449d7c
DK
661
662 /** \brief archive size for this version
663
664 For Debian this is the size of the .deb file. */
32ab4bd0 665 should_be_uint64_t Size; // These are the .deb size
94449d7c 666 /** \brief uncompressed size for this version */
32ab4bd0 667 should_be_uint64_t InstalledSize;
94449d7c
DK
668 /** \brief characteristic value representing this version
669
670 No two packages in existence should have the same VerStr
671 and Hash with different contents. */
204fbdcc 672 unsigned short Hash;
94449d7c 673 /** \brief unique sequel ID */
32ab4bd0 674 should_be_map_id_t ID;
94449d7c 675 /** \brief parsed priority value */
578bfd0a
AL
676 unsigned char Priority;
677};
92fcbfc1 678 /*}}}*/
94449d7c
DK
679// Description structure /*{{{*/
680/** \brief datamember of a linked list of available description for a version */
681struct pkgCache::Description
a52f938b 682{
94449d7c
DK
683 /** \brief Language code of this description (translation)
684
685 If the value has a 0 length then this is read using the Package
686 file else the Translation-CODE file is used. */
4ad8619b 687 map_stringitem_t language_code;
94449d7c
DK
688 /** \brief MD5sum of the original description
689
690 Used to map Translations of a description to a version
691 and to check that the Translation is up-to-date. */
4ad8619b 692 map_stringitem_t md5sum;
a52f938b 693
255c9e4b 694 /** @TODO document pkgCache::Description::FileList */
4ad8619b 695 map_pointer_t FileList; // DescFile
94449d7c 696 /** \brief next translation for this description */
4ad8619b 697 map_pointer_t NextDesc; // Description
94449d7c 698 /** \brief the text is a description of this package */
4ad8619b 699 map_pointer_t ParentPkg; // Package
a52f938b 700
94449d7c 701 /** \brief unique sequel ID */
32ab4bd0 702 should_be_map_id_t ID;
a52f938b 703};
92fcbfc1 704 /*}}}*/
94449d7c
DK
705// Dependency structure /*{{{*/
706/** \brief information for a single dependency record
707
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. */
712struct pkgCache::Dependency
578bfd0a 713{
94449d7c 714 /** \brief string of the version the dependency is applied against */
78a5476f 715 map_stringitem_t Version;
94449d7c
DK
716 /** \brief index of the package this depends applies to
717
718 The generator will - if the package does not already exist -
719 create a blank (no version records) package. */
4ad8619b 720 map_pointer_t Package; // Package
94449d7c 721 /** \brief next dependency of this version */
4ad8619b 722 map_pointer_t NextDepends; // Dependency
94449d7c 723 /** \brief next reverse dependency of this package */
4ad8619b 724 map_pointer_t NextRevDepends; // Dependency
94449d7c 725 /** \brief version of the package which has the reverse depends */
4ad8619b 726 map_pointer_t ParentVer; // Version
94449d7c
DK
727
728 /** \brief unique sequel ID */
32ab4bd0 729 should_be_map_id_t ID;
94449d7c 730 /** \brief Dependency type - Depends, Recommends, Conflicts, etc */
578bfd0a 731 unsigned char Type;
94449d7c
DK
732 /** \brief comparison operator specified on the depends line
733
734 If the high bit is set then it is a logical OR with the previous record. */
578bfd0a 735 unsigned char CompareOp;
578bfd0a 736};
92fcbfc1 737 /*}}}*/
94449d7c
DK
738// Provides structure /*{{{*/
739/** \brief handles virtual packages
740
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.*/
747struct pkgCache::Provides
578bfd0a 748{
94449d7c 749 /** \brief index of the package providing this */
4ad8619b 750 map_pointer_t ParentPkg; // Package
94449d7c 751 /** \brief index of the version this provide line applies to */
4ad8619b 752 map_pointer_t Version; // Version
94449d7c
DK
753 /** \brief version in the provides line (if any)
754
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 */
4ad8619b 758 map_stringitem_t ProvideVersion;
94449d7c 759 /** \brief next provides (based of package) */
4ad8619b 760 map_pointer_t NextProvides; // Provides
94449d7c 761 /** \brief next provides (based of version) */
4ad8619b 762 map_pointer_t NextPkgProv; // Provides
578bfd0a 763};
92fcbfc1 764 /*}}}*/
32ab4bd0
DK
765// UNUSED StringItem structure /*{{{*/
766struct APT_DEPRECATED pkgCache::StringItem
767{
768 /** \brief string this refers to */
769 map_ptrloc String; // StringItem
770 /** \brief Next link in the chain */
771 map_ptrloc NextItem; // StringItem
772};
773 /*}}}*/
959470da 774
d64e130a 775inline char const * pkgCache::NativeArch()
d3e8fbb3 776 { return StrP + HeaderP->Architecture; }
959470da 777
094a497d 778#include <apt-pkg/cacheiterators.h>
578bfd0a 779
d3e8fbb3
DK
780inline pkgCache::GrpIterator pkgCache::GrpBegin()
781 {return GrpIterator(*this);}
782inline pkgCache::GrpIterator pkgCache::GrpEnd()
783 {return GrpIterator(*this,GrpP);}
784inline pkgCache::PkgIterator pkgCache::PkgBegin()
785 {return PkgIterator(*this);}
786inline pkgCache::PkgIterator pkgCache::PkgEnd()
787 {return PkgIterator(*this,PkgP);}
ad00ae81 788inline pkgCache::PkgFileIterator pkgCache::FileBegin()
d3e8fbb3 789 {return PkgFileIterator(*this,PkgFileP + HeaderP->FileList);}
ad00ae81 790inline pkgCache::PkgFileIterator pkgCache::FileEnd()
d3e8fbb3 791 {return PkgFileIterator(*this,PkgFileP);}
b07aeb1a
DK
792inline pkgCache::RlsFileIterator pkgCache::RlsFileBegin()
793 {return RlsFileIterator(*this,RlsFileP + HeaderP->RlsFileList);}
794inline pkgCache::RlsFileIterator pkgCache::RlsFileEnd()
795 {return RlsFileIterator(*this,RlsFileP);}
796
578bfd0a 797
b2e465d6 798// Oh I wish for Real Name Space Support
92fcbfc1 799class pkgCache::Namespace /*{{{*/
d3e8fbb3 800{
b2e465d6 801 public:
803ea2a8 802 typedef pkgCache::GrpIterator GrpIterator;
b2e465d6
AL
803 typedef pkgCache::PkgIterator PkgIterator;
804 typedef pkgCache::VerIterator VerIterator;
a52f938b 805 typedef pkgCache::DescIterator DescIterator;
b2e465d6
AL
806 typedef pkgCache::DepIterator DepIterator;
807 typedef pkgCache::PrvIterator PrvIterator;
b07aeb1a 808 typedef pkgCache::RlsFileIterator RlsFileIterator;
b2e465d6 809 typedef pkgCache::PkgFileIterator PkgFileIterator;
d3e8fbb3 810 typedef pkgCache::VerFileIterator VerFileIterator;
b2e465d6 811 typedef pkgCache::Version Version;
a52f938b 812 typedef pkgCache::Description Description;
b2e465d6
AL
813 typedef pkgCache::Package Package;
814 typedef pkgCache::Header Header;
815 typedef pkgCache::Dep Dep;
816 typedef pkgCache::Flag Flag;
817};
92fcbfc1 818 /*}}}*/
578bfd0a 819#endif