]> git.saurik.com Git - apt.git/blame - apt-pkg/pkgcachegen.h
Bug #807012 also involves package dependencies :/.
[apt.git] / apt-pkg / pkgcachegen.h
CommitLineData
578bfd0a
AL
1// -*- mode: cpp; mode: fold -*-
2// Description /*{{{*/
578bfd0a
AL
3/* ######################################################################
4
5 Package Cache Generator - Generator for the cache structure.
6
7 This builds the cache structure from the abstract package list parser.
6fc33863
AL
8 Each archive source has it's own list parser that is instantiated by
9 the caller to provide data for the generator.
10
11 Parts of the cache are created by this generator class while other
12 parts are created by the list parser. The list parser is responsible
13 for creating version, depends and provides structures, and some of
14 their contents
578bfd0a
AL
15
16 ##################################################################### */
17 /*}}}*/
578bfd0a
AL
18#ifndef PKGLIB_PKGCACHEGEN_H
19#define PKGLIB_PKGCACHEGEN_H
20
a52f938b 21#include <apt-pkg/md5.h>
453b82a3
DK
22#include <apt-pkg/mmap.h>
23#include <apt-pkg/pkgcache.h>
24#include <apt-pkg/cacheiterators.h>
5a8e963b 25#include <apt-pkg/macros.h>
b35d2f5f 26
7635093c 27#include <vector>
453b82a3 28#include <string>
2837a718 29#if __cplusplus >= 201103L
869700d8 30#include <unordered_set>
2837a718 31#endif
eff0c22e
JAK
32#ifdef APT_PKG_EXPOSE_STRING_VIEW
33#include <apt-pkg/string_view.h>
34#endif
a9fe5928 35
453b82a3 36class FileFd;
b35d2f5f
AL
37class pkgSourceList;
38class OpProgress;
b2e465d6 39class pkgIndexFile;
c9443c01 40class pkgCacheListParser;
578bfd0a 41
dce45dbe 42class APT_HIDDEN pkgCacheGenerator /*{{{*/
578bfd0a 43{
49521f87
JAK
44#ifdef APT_PKG_EXPOSE_STRING_VIEW
45 APT_HIDDEN map_stringitem_t WriteStringInMap(APT::StringView String) { return WriteStringInMap(String.data(), String.size()); };
46#endif
4ad8619b
DK
47 APT_HIDDEN map_stringitem_t WriteStringInMap(const char *String);
48 APT_HIDDEN map_stringitem_t WriteStringInMap(const char *String, const unsigned long &Len);
49 APT_HIDDEN map_pointer_t AllocateInMap(const unsigned long &size);
7e58ab0c 50
2837a718
JAK
51 // Dirty hack for public users that do not use C++11 yet
52#if __cplusplus >= 201103L
869700d8
JAK
53 struct string_pointer {
54 const char *data_;
55 size_t size;
56 pkgCacheGenerator *generator;
57 map_stringitem_t item;
58
59 const char *data() const {
60 return data_ != nullptr ? data_ : static_cast<char*>(generator->Map.Data()) + item;
61 }
62
63 bool operator ==(string_pointer const &other) const {
64 return size == other.size && memcmp(data(), other.data(), size) == 0;
65 }
66 };
67 struct hash {
68 uint32_t operator()(string_pointer const &that) const {
69 uint32_t Hash = 5381;
70 const char * const end = that.data() + that.size;
71 for (const char *I = that.data(); I != end; ++I)
a0e3c0f5 72 Hash = 33 * Hash + *I;
869700d8
JAK
73 return Hash;
74 }
75 };
76
77 std::unordered_set<string_pointer, hash> strMixed;
78 std::unordered_set<string_pointer, hash> strPkgNames;
79 std::unordered_set<string_pointer, hash> strVersions;
80 std::unordered_set<string_pointer, hash> strSections;
2837a718 81#endif
78a5476f 82
c9443c01
DK
83 friend class pkgCacheListParser;
84 typedef pkgCacheListParser ListParser;
85
578bfd0a 86 public:
a9fe5928
DK
87
88 template<typename Iter> class Dynamic {
a9fe5928 89 public:
7635093c 90 static std::vector<Iter*> toReMap;
e8afd168 91 explicit Dynamic(Iter &I) {
7635093c 92 toReMap.push_back(&I);
a9fe5928
DK
93 }
94
95 ~Dynamic() {
7635093c 96 toReMap.pop_back();
a9fe5928 97 }
96f66f82
JAK
98
99#if __cplusplus >= 201103L
100 Dynamic(const Dynamic&) = delete;
101 void operator=(const Dynamic&) = delete;
102#endif
a9fe5928
DK
103 };
104
578bfd0a 105 protected:
a9fe5928 106
578bfd0a
AL
107 DynamicMMap &Map;
108 pkgCache Cache;
ddc1d8d0 109 OpProgress *Progress;
b07aeb1a
DK
110
111 std::string RlsFileName;
112 pkgCache::ReleaseFile *CurrentRlsFile;
8f3ba4e8 113 std::string PkgFileName;
578bfd0a 114 pkgCache::PackageFile *CurrentFile;
45415543 115
eff0c22e
JAK
116#ifdef APT_PKG_EXPOSE_STRING_VIEW
117 bool NewGroup(pkgCache::GrpIterator &Grp, APT::StringView Name);
118 bool NewPackage(pkgCache::PkgIterator &Pkg, APT::StringView Name, APT::StringView Arch);
8efd5947
DK
119 map_pointer_t NewVersion(pkgCache::VerIterator &Ver, APT::StringView const &VerStr,
120 map_pointer_t const ParentPkg, unsigned short const Hash,
121 map_pointer_t const Next);
49521f87 122 map_pointer_t NewDescription(pkgCache::DescIterator &Desc,const std::string &Lang, APT::StringView md5sum,map_stringitem_t const idxmd5str);
eff0c22e 123#endif
f55a958f 124 bool NewFileVer(pkgCache::VerIterator &Ver,ListParser &List);
a52f938b 125 bool NewFileDesc(pkgCache::DescIterator &Desc,ListParser &List);
9c44383f 126 bool NewDepends(pkgCache::PkgIterator &Pkg, pkgCache::VerIterator &Ver,
8c7af4d4
DK
127 map_pointer_t const Version, uint8_t const Op,
128 uint8_t const Type, map_pointer_t* &OldDepLast);
ecc138f8
DK
129 bool NewProvides(pkgCache::VerIterator &Ver, pkgCache::PkgIterator &Pkg,
130 map_stringitem_t const ProvidesVersion, uint8_t const Flags);
a473295d 131 bool NewTag(pkgCache::VerIterator &Ver,const char *NameStart,unsigned int NameSize);
578bfd0a 132
b2e465d6
AL
133 public:
134
30b45652
DK
135 enum StringType { MIXED, PKGNAME, VERSIONNUMBER, SECTION };
136 map_stringitem_t StoreString(StringType const type, const char * S, unsigned int const Size);
dd592790
JAK
137
138#ifdef APT_PKG_EXPOSE_STRING_VIEW
139 inline map_stringitem_t StoreString(enum StringType const type, APT::StringView S) {return StoreString(type, S.data(),S.length());};
140#endif
813c8eea 141
ddc1d8d0 142 void DropProgress() {Progress = 0;};
e185d8b3 143 bool SelectFile(const std::string &File,pkgIndexFile const &Index, std::string const &Architecture, std::string const &Component, unsigned long Flags = 0);
b07aeb1a 144 bool SelectReleaseFile(const std::string &File, const std::string &Site, unsigned long Flags = 0);
ddc1d8d0 145 bool MergeList(ListParser &List,pkgCache::VerIterator *Ver = 0);
ad00ae81 146 inline pkgCache &GetCache() {return Cache;};
1d3eea5c 147 inline pkgCache::PkgFileIterator GetCurFile()
b0b4efb9 148 {return pkgCache::PkgFileIterator(Cache,CurrentFile);};
1d3eea5c 149 inline pkgCache::RlsFileIterator GetCurRlsFile()
b07aeb1a 150 {return pkgCache::RlsFileIterator(Cache,CurrentRlsFile);};
45415543 151
dce45dbe 152 APT_PUBLIC static bool MakeStatusCache(pkgSourceList &List,OpProgress *Progress,
2e5f4e45 153 MMap **OutMap = 0,bool AllowMem = false);
f1616039
JAK
154 APT_HIDDEN static bool MakeStatusCache(pkgSourceList &List,OpProgress *Progress,
155 MMap **OutMap,pkgCache **OutCache, bool AllowMem = false);
dce45dbe 156 APT_PUBLIC static bool MakeOnlyStatusCache(OpProgress *Progress,DynamicMMap **OutMap);
25396fb0 157
19819ac5 158 void ReMap(void const * const oldMap, void const * const newMap, size_t oldSize);
a133f79c 159 bool Start();
a9fe5928 160
b2e465d6 161 pkgCacheGenerator(DynamicMMap *Map,OpProgress *Progress);
c8a4ce6c 162 virtual ~pkgCacheGenerator();
99a2ea5a
DK
163
164 private:
6c55f07a 165 void * const d;
ce62f1de
DK
166 APT_HIDDEN bool MergeListGroup(ListParser &List, std::string const &GrpName);
167 APT_HIDDEN bool MergeListPackage(ListParser &List, pkgCache::PkgIterator &Pkg);
8efd5947 168#ifdef APT_PKG_EXPOSE_STRING_VIEW
ce62f1de 169 APT_HIDDEN bool MergeListVersion(ListParser &List, pkgCache::PkgIterator &Pkg,
8efd5947
DK
170 APT::StringView const &Version, pkgCache::VerIterator* &OutVer);
171#endif
5a8e963b 172
ce62f1de 173 APT_HIDDEN bool AddImplicitDepends(pkgCache::GrpIterator &G, pkgCache::PkgIterator &P,
5a8e963b 174 pkgCache::VerIterator &V);
ce62f1de 175 APT_HIDDEN bool AddImplicitDepends(pkgCache::VerIterator &V, pkgCache::PkgIterator &D);
ffe3c68e 176
49521f87 177#ifdef APT_PKG_EXPOSE_STRING_VIEW
ffe3c68e 178 APT_HIDDEN bool AddNewDescription(ListParser &List, pkgCache::VerIterator &Ver,
49521f87
JAK
179 std::string const &lang, APT::StringView CurMd5, map_stringitem_t &md5idx);
180#endif
578bfd0a 181};
92fcbfc1
DK
182 /*}}}*/
183// This is the abstract package list parser class. /*{{{*/
c9443c01 184class APT_HIDDEN pkgCacheListParser
f55ece0e
AL
185{
186 pkgCacheGenerator *Owner;
b2e465d6 187 friend class pkgCacheGenerator;
c9443c01 188
f9eec0e7
AL
189 // Some cache items
190 pkgCache::VerIterator OldDepVer;
4ad8619b 191 map_pointer_t *OldDepLast;
45415543 192
6c55f07a 193 void * const d;
c8a4ce6c 194
f55ece0e 195 protected:
813c8eea 196
78a5476f 197 inline map_stringitem_t StoreString(pkgCacheGenerator::StringType const type, const char *S,unsigned int Size) {return Owner->StoreString(type, S, Size);};
dd592790
JAK
198#ifdef APT_PKG_EXPOSE_STRING_VIEW
199 inline map_stringitem_t StoreString(pkgCacheGenerator::StringType const type, APT::StringView S) {return Owner->StoreString(type, S);};
49521f87 200 inline map_stringitem_t WriteString(APT::StringView S) {return Owner->WriteStringInMap(S.data(), S.size());};
dd592790 201#endif
78a5476f 202
4ad8619b 203 inline map_stringitem_t WriteString(const char *S,unsigned int Size) {return Owner->WriteStringInMap(S,Size);};
eff0c22e
JAK
204#ifdef APT_PKG_EXPOSE_STRING_VIEW
205 bool NewDepends(pkgCache::VerIterator &Ver,APT::StringView Package, APT::StringView Arch,
206 APT::StringView Version,uint8_t const Op,
8c7af4d4 207 uint8_t const Type);
eff0c22e
JAK
208 bool NewProvides(pkgCache::VerIterator &Ver,APT::StringView PkgName,
209 APT::StringView PkgArch, APT::StringView Version,
8c7af4d4 210 uint8_t const Flags);
eff0c22e
JAK
211 bool NewProvidesAllArch(pkgCache::VerIterator &Ver, APT::StringView Package,
212 APT::StringView Version, uint8_t const Flags);
a473295d 213 bool NewTag(pkgCache::VerIterator &Ver,const char *NameStart,unsigned int NameSize);
eff0c22e 214#endif
f55ece0e
AL
215 public:
216
217 // These all operate against the current section
8f3ba4e8 218 virtual std::string Package() = 0;
857e9c13 219 virtual bool ArchitectureAll() = 0;
8efd5947
DK
220#ifdef APT_PKG_EXPOSE_STRING_VIEW
221 virtual APT::StringView Architecture() = 0;
222 virtual APT::StringView Version() = 0;
223#endif
32b9a14c 224 virtual bool NewVersion(pkgCache::VerIterator &Ver) = 0;
ffe3c68e 225 virtual std::vector<std::string> AvailableDescriptionLanguages() = 0;
49521f87
JAK
226#ifdef APT_PKG_EXPOSE_STRING_VIEW
227 virtual APT::StringView Description_md5() = 0;
228#endif
204fbdcc 229 virtual unsigned short VersionHash() = 0;
68134bda
DK
230 /** compare currently parsed version with given version
231 *
232 * \param Hash of the currently parsed version
233 * \param Ver to compare with
234 */
c8a4ce6c 235 virtual bool SameVersion(unsigned short const Hash, pkgCache::VerIterator const &Ver);
32b9a14c
DK
236 virtual bool UsePackage(pkgCache::PkgIterator &Pkg,
237 pkgCache::VerIterator &Ver) = 0;
4ad8619b
DK
238 virtual map_filesize_t Offset() = 0;
239 virtual map_filesize_t Size() = 0;
f55ece0e
AL
240
241 virtual bool Step() = 0;
242
65512241
DK
243 virtual bool CollectFileProvides(pkgCache &/*Cache*/,
244 pkgCache::VerIterator &/*Ver*/) {return true;};
45415543 245
c9443c01
DK
246 pkgCacheListParser();
247 virtual ~pkgCacheListParser();
f55ece0e 248};
92fcbfc1 249 /*}}}*/
2e5f4e45 250
5dd00edb 251APT_DEPRECATED_MSG("Use pkgCacheGenerator::MakeStatusCache instead") bool pkgMakeStatusCache(pkgSourceList &List,OpProgress &Progress,
b2e465d6 252 MMap **OutMap = 0,bool AllowMem = false);
5dd00edb 253APT_DEPRECATED_MSG("Use pkgCacheGenerator::MakeOnlyStatusCache instead") bool pkgMakeOnlyStatusCache(OpProgress &Progress,DynamicMMap **OutMap);
b2e465d6 254
578bfd0a 255#endif