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