073acf5784270bb95f00406a5196e5f1443a0e31
[apt.git] / apt-pkg / rpm / rpmhandler.h
1
2 /* ######################################################################
3   
4    RPM database and hdlist related handling
5
6    ######################################################################
7  */
8
9
10 #ifndef PKGLIB_RPMHANDLER_H
11 #define PKGLIB_RPMHANDLER_H
12
13 #include <apt-pkg/aptconf.h>
14 #include <apt-pkg/fileutl.h>
15 #include <apt-pkg/pkgrecords.h>
16
17 #ifdef APT_WITH_REPOMD
18 #include <libxml/parser.h>
19 #include <libxml/tree.h>
20 #include <libxml/xmlreader.h>
21 #include <apt-pkg/sqlite.h>
22 #endif
23
24 #include <rpm/rpmlib.h>
25 #include <rpm/rpmmacro.h>
26
27 #include <vector>
28
29 // Our Extra RPM tags. These should not be accessed directly. Use
30 // the methods in RPMHandler instead.
31 #define CRPMTAG_FILENAME          (rpmTag)1000000
32 #define CRPMTAG_FILESIZE          (rpmTag)1000001
33 #define CRPMTAG_MD5               (rpmTag)1000005
34 #define CRPMTAG_SHA1              (rpmTag)1000006
35
36 #define CRPMTAG_DIRECTORY         (rpmTag)1000010
37 #define CRPMTAG_BINARY            (rpmTag)1000011
38
39 #define CRPMTAG_UPDATE_SUMMARY    (rpmTag)1000020
40 #define CRPMTAG_UPDATE_IMPORTANCE (rpmTag)1000021
41 #define CRPMTAG_UPDATE_DATE       (rpmTag)1000022
42 #define CRPMTAG_UPDATE_URL        (rpmTag)1000023
43
44 using namespace std;
45
46 struct Dependency
47 {
48    string Name;
49    string Version;
50    unsigned int Op;
51    unsigned int Type;
52 };
53
54 class RPMHandler
55 {
56    protected:
57
58    off_t iOffset;
59    off_t iSize;
60    string ID;
61
62    unsigned int DepOp(int_32 rpmflags);
63    bool InternalDep(const char *name, const char *ver, int_32 flag);
64    bool PutDep(const char *name, const char *ver, int_32 flags,
65                unsigned int type, vector<Dependency*> &Deps);
66
67    public:
68
69    // Return a unique ID for that handler. Actually, implemented used
70    // the file/dir name.
71    virtual string GetID() { return ID; };
72
73    virtual bool Skip() = 0;
74    virtual bool Jump(off_t Offset) = 0;
75    virtual void Rewind() = 0;
76    inline unsigned Offset() {return iOffset;};
77    virtual bool OrderedOffset() {return true;};
78    inline unsigned Size() {return iSize;};
79    virtual bool IsDatabase() = 0;
80
81    virtual string FileName() = 0;
82    virtual string Directory() = 0;
83    virtual off_t FileSize() = 0;
84    virtual string MD5Sum() = 0;
85    virtual string SHA1Sum() = 0;
86    virtual bool ProvideFileName() {return false;};
87
88    virtual string Name() = 0;
89    virtual string Arch() = 0;
90    virtual string Epoch() = 0;
91    virtual string Version() = 0;
92    virtual string Release() = 0;
93    virtual string EVR();
94    virtual string Group() = 0;
95    virtual string Packager() = 0;
96    virtual string Vendor() = 0;
97    virtual string Summary() = 0;
98    virtual string Description() = 0;
99    virtual off_t InstalledSize() = 0;
100    virtual string SourceRpm() = 0;
101    virtual bool IsSourceRpm() {return SourceRpm().empty();}
102
103    virtual bool PRCO(unsigned int Type, vector<Dependency*> &Deps) = 0;
104    virtual bool FileList(vector<string> &FileList) = 0;
105    virtual bool ChangeLog(vector<ChangeLogEntry* > &ChangeLogs) = 0;
106
107    virtual bool HasFile(const char *File);
108
109    RPMHandler() : iOffset(0), iSize(0) {};
110    virtual ~RPMHandler() {};
111 };
112
113 class RPMHdrHandler : public RPMHandler
114 {
115    protected:
116
117    Header HeaderP;
118
119    string GetSTag(rpmTag Tag);
120    off_t GetITag(rpmTag Tag);
121
122    public:
123
124    virtual string FileName() {return "";};
125    virtual string Directory() {return "";};
126    virtual off_t FileSize() {return 1;};
127    virtual string MD5Sum() {return "";};
128    virtual string SHA1Sum() {return "";};
129    virtual bool ProvideFileName() {return false;};
130
131    virtual string Name() {return GetSTag(RPMTAG_NAME);};
132    virtual string Arch() {return GetSTag(RPMTAG_ARCH);};
133    virtual string Epoch();
134    virtual string Version() {return GetSTag(RPMTAG_VERSION);};
135    virtual string Release() {return GetSTag(RPMTAG_RELEASE);};
136    virtual string Group() {return GetSTag(RPMTAG_GROUP);};
137    virtual string Packager() {return GetSTag(RPMTAG_PACKAGER);};
138    virtual string Vendor() {return GetSTag(RPMTAG_VENDOR);};
139    virtual string Summary() {return GetSTag(RPMTAG_SUMMARY);};
140    virtual string Description() {return GetSTag(RPMTAG_DESCRIPTION);};
141    virtual off_t InstalledSize() {return GetITag(RPMTAG_SIZE);};
142    virtual string SourceRpm() {return GetSTag(RPMTAG_SOURCERPM);};
143    virtual bool IsSourceRpm() {return SourceRpm().empty();}
144
145    virtual bool PRCO(unsigned int Type, vector<Dependency*> &Deps);
146    virtual bool FileList(vector<string> &FileList);
147    virtual bool ChangeLog(vector<ChangeLogEntry* > &ChangeLogs);
148
149    RPMHdrHandler() : RPMHandler(), HeaderP(0) {};
150    virtual ~RPMHdrHandler() {};
151 };
152
153
154 class RPMFileHandler : public RPMHdrHandler
155 {   
156    protected:
157
158    FD_t FD;
159
160    public:
161
162    virtual bool Skip();
163    virtual bool Jump(off_t Offset);
164    virtual void Rewind();
165    virtual inline bool IsDatabase() {return false;};
166    virtual bool OrderedOffset() {return true;};
167
168    virtual string FileName();
169    virtual string Directory();
170    virtual off_t FileSize();
171    virtual string MD5Sum();
172
173    // the rpm-repotype stripped down hdrlists dont carry changelog data
174    virtual bool ChangeLog(vector<ChangeLogEntry* > &ChangeLogs) { return false; };
175
176    RPMFileHandler(FileFd *File);
177    RPMFileHandler(string File);
178    virtual ~RPMFileHandler();
179 };
180
181 class RPMSingleFileHandler : public RPMFileHandler
182 {   
183    protected:
184
185    string sFilePath;
186
187    public:
188
189    virtual bool Skip();
190    virtual bool Jump(off_t Offset);
191    virtual void Rewind();
192
193    virtual string FileName() {return sFilePath;};
194    virtual string Directory() {return "";};
195    virtual off_t FileSize();
196    virtual string MD5Sum();
197    virtual bool ProvideFileName() {return true;};
198    virtual bool ChangeLog(vector<ChangeLogEntry* > &ChangeLogs);
199
200    RPMSingleFileHandler(string File) : RPMFileHandler(File), sFilePath(File) {};
201    virtual ~RPMSingleFileHandler() {};
202 };
203
204 class RPMDBHandler : public RPMHdrHandler
205 {
206    protected:
207
208 #if RPM_VERSION >= 0x040100
209    rpmts Handler;
210 #else
211    rpmdb Handler;
212 #endif
213 #if RPM_VERSION >= 0x040000
214    rpmdbMatchIterator RpmIter;
215 #endif
216    bool WriteLock;
217
218    time_t DbFileMtime;
219
220    public:
221
222    static string DataPath(bool DirectoryOnly=true);
223    virtual bool Skip();
224    virtual bool Jump(off_t Offset);
225    virtual void Rewind();
226    virtual inline bool IsDatabase() {return true;};
227    virtual bool HasWriteLock() {return WriteLock;};
228    virtual time_t Mtime() {return DbFileMtime;}
229    virtual bool OrderedOffset() {return false;};
230
231    // used by rpmSystem::DistroVer()
232    bool JumpByName(string PkgName);
233
234    RPMDBHandler(bool WriteLock=false);
235    virtual ~RPMDBHandler();
236 };
237
238 class RPMDirHandler : public RPMHdrHandler
239 {   
240    protected:
241
242    DIR *Dir;
243    string sDirName;
244    string sFileName;
245    string sFilePath;
246
247 #if RPM_VERSION >= 0x040100
248    rpmts TS;
249 #endif
250
251    const char *nextFileName();
252
253    public:
254
255    virtual bool Skip();
256    virtual bool Jump(off_t Offset);
257    virtual void Rewind();
258    virtual inline bool IsDatabase() {return false;};
259
260    virtual string FileName() {return (Dir == NULL)?"":sFileName;};
261    virtual off_t FileSize();
262    virtual string MD5Sum();
263
264    RPMDirHandler(string DirName);
265    virtual ~RPMDirHandler();
266 };
267
268 #ifdef APT_WITH_REPOMD
269 class RPMRepomdHandler : public RPMHandler
270 {
271
272    xmlDocPtr Primary;
273    xmlNode *Root;
274    xmlNode *NodeP;
275
276    vector<xmlNode *> Pkgs;
277    vector<xmlNode *>::iterator PkgIter;
278
279    string PrimaryPath;
280    string FilelistPath;
281    string OtherPath;
282
283    xmlNode *FindNode(const string Name);
284    xmlNode *FindNode(xmlNode *Node, const string Name);
285
286    string FindTag(xmlNode *Node, const string Tag);
287    string GetProp(xmlNode *Node, char *Prop);
288
289    public:
290
291
292    virtual bool Skip();
293    virtual bool Jump(off_t Offset);
294    virtual void Rewind();
295    virtual inline bool IsDatabase() {return false;};
296
297    virtual string FileName();
298    virtual string Directory();
299    virtual off_t FileSize();
300    virtual off_t InstalledSize();
301    virtual string MD5Sum();
302    virtual string SHA1Sum();
303
304    virtual string Name() {return FindTag(NodeP, "name");};
305    virtual string Arch() {return FindTag(NodeP, "arch");};
306    virtual string Epoch();
307    virtual string Version();
308    virtual string Release();
309
310    virtual string Group();
311    virtual string Packager() {return FindTag(NodeP, "packager");};
312    virtual string Vendor();
313    virtual string Summary() {return FindTag(NodeP, "summary");};
314    virtual string Description() {return FindTag(NodeP, "description");};
315    virtual string SourceRpm();
316
317    virtual bool HasFile(const char *File);
318    virtual bool ShortFileList(vector<string> &FileList);
319
320    virtual bool PRCO(unsigned int Type, vector<Dependency*> &Deps);
321    virtual bool FileList(vector<string> &FileList);
322    virtual bool ChangeLog(vector<ChangeLogEntry* > &ChangeLogs);
323
324    RPMRepomdHandler(string File);
325    virtual ~RPMRepomdHandler();
326 };
327
328 class RPMRepomdReaderHandler : public RPMHandler
329 {
330    protected:
331    xmlTextReaderPtr XmlFile;
332    string XmlPath;
333    xmlNode *NodeP;
334
335    string FindTag(char *Tag);
336    string FindVerTag(char *Tag);
337
338    public:
339    virtual bool Skip();
340    virtual bool Jump(off_t Offset);
341    virtual void Rewind();
342    virtual bool IsDatabase() {return false;};
343
344    virtual string FileName() {return XmlPath;};
345    virtual string Directory() {return "";};
346    virtual off_t FileSize() {return 0;};
347    virtual off_t InstalledSize() {return 0;};
348    virtual string MD5Sum() {return "";};
349    virtual string SHA1Sum() {return "";};
350
351    virtual string Name() {return FindTag("name");};
352    virtual string Arch() {return FindTag("arch");};
353    virtual string Epoch() {return FindVerTag("epoch");};
354    virtual string Version() {return FindVerTag("ver");};
355    virtual string Release() {return FindVerTag("rel");};
356
357    virtual string Group() {return "";};
358    virtual string Packager() {return "";};
359    virtual string Vendor() {return "";};
360    virtual string Summary() {return "";};
361    virtual string Description() {return "";};
362    virtual string SourceRpm() {return "";};
363    virtual bool PRCO(unsigned int Type, vector<Dependency*> &Deps)
364        {return true;};
365
366    RPMRepomdReaderHandler(string File);
367    virtual ~RPMRepomdReaderHandler();
368 };
369
370 class RPMRepomdFLHandler : public RPMRepomdReaderHandler
371 {
372    public:
373    virtual bool FileList(vector<string> &FileList);
374    RPMRepomdFLHandler(string File) : RPMRepomdReaderHandler(File) {};
375    virtual bool ChangeLog(vector<ChangeLogEntry* > &ChangeLogs) {return true;};
376    virtual ~RPMRepomdFLHandler() {};
377 };
378
379 class RPMRepomdOtherHandler : public RPMRepomdReaderHandler
380 {
381    public:
382    virtual bool FileList(vector<string> &FileList) {return true;};
383    virtual bool ChangeLog(vector<ChangeLogEntry* > &ChangeLogs);
384
385    RPMRepomdOtherHandler(string File) : RPMRepomdReaderHandler(File) {};
386    virtual ~RPMRepomdOtherHandler() {};
387 };
388
389 class RPMSqliteHandler : public RPMHandler
390 {
391    protected:
392
393    SqliteDB *Primary;
394    SqliteDB *Filelists;
395    SqliteDB *Other;
396    
397    SqliteQuery *Packages;
398   
399    string DBPath;
400    string FilesDBPath;
401    string OtherDBPath;
402
403    public:
404
405    virtual bool Skip();
406    virtual bool Jump(off_t Offset);
407    virtual void Rewind();
408    virtual inline bool IsDatabase() {return false;};
409
410    virtual string FileName();
411    virtual string Directory();
412    virtual off_t FileSize();
413    virtual off_t InstalledSize();
414    virtual string MD5Sum();
415    virtual string SHA1Sum();
416
417    virtual string Name();
418    virtual string Arch();
419    virtual string Epoch();
420    virtual string Version();
421    virtual string Release();
422
423    virtual string Group();
424    virtual string Packager();
425    virtual string Vendor();
426    virtual string Summary();
427    virtual string Description();
428    virtual string SourceRpm();
429
430    virtual bool PRCO(unsigned int Type, vector<Dependency*> &Deps);
431    virtual bool FileList(vector<string> &FileList);
432    virtual bool ChangeLog(vector<ChangeLogEntry* > &ChangeLogs);
433
434    RPMSqliteHandler(string File);
435    virtual ~RPMSqliteHandler();
436 };
437 #endif /* APT_WITH_REPOMD */
438
439 #endif
440 // vim:sts=3:sw=3