- don't attempt to remove dbenv on --rebuilddb.
[platform/upstream/rpm.git] / lib / rpmte.h
1 #ifndef H_RPMTE
2 #define H_RPMTE
3
4 /** \ingroup rpmts rpmte
5  * \file lib/rpmte.h
6  * Structures used for an "rpmte" transaction element.
7  */
8
9 /**
10  */
11 /*@-exportlocal@*/
12 /*@unchecked@*/
13 extern int _rpmte_debug;
14 /*@=exportlocal@*/
15
16 /**
17  * Transaction element ordering chain linkage.
18  */
19 typedef /*@abstract@*/ struct tsortInfo_s *             tsortInfo;
20
21 /**
22  * Transaction element iterator.
23  */
24 typedef /*@abstract@*/ struct rpmtsi_s *                rpmtsi;
25
26 /** \ingroup rpmte
27  * Transaction element type.
28  */
29 typedef enum rpmElementType_e {
30     TR_ADDED            = (1 << 0),     /*!< Package will be installed. */
31     TR_REMOVED          = (1 << 1)      /*!< Package will be removed. */
32 } rpmElementType;
33
34 #if     defined(_RPMTE_INTERNAL)
35 /** \ingroup rpmte
36  * Dependncy ordering information.
37  */
38 /*@-fielduse@*/ /* LCL: confused by union? */
39 struct tsortInfo_s {
40     union {
41         int     count;
42         /*@exposed@*/ /*@dependent@*/ /*@null@*/
43         rpmte   suc;
44     } tsi_u;
45 #define tsi_count       tsi_u.count
46 #define tsi_suc         tsi_u.suc
47 /*@owned@*/ /*@null@*/
48     struct tsortInfo_s * tsi_next;
49 /*@exposed@*/ /*@dependent@*/ /*@null@*/
50     rpmte tsi_chain;
51     int         tsi_reqx;
52     int         tsi_qcnt;
53 };
54 /*@=fielduse@*/
55
56 /** \ingroup rpmte
57  * A single package instance to be installed/removed atomically.
58  */
59 struct rpmte_s {
60     rpmElementType type;        /*!< Package disposition (installed/removed). */
61
62 /*@refcounted@*/ /*@relnull@*/
63     Header h;                   /*!< Package header. */
64 /*@only@*/
65     const char * NEVR;          /*!< Package name-version-release. */
66 /*@only@*/
67     const char * NEVRA;         /*!< Package name-version-release.arch. */
68 /*@owned@*/
69     const char * name;          /*!< Name: */
70 /*@only@*/ /*@null@*/
71     char * epoch;
72 /*@dependent@*/ /*@null@*/
73     char * version;             /*!< Version: */
74 /*@dependent@*/ /*@null@*/
75     char * release;             /*!< Release: */
76 /*@only@*/ /*@null@*/
77     const char * arch;          /*!< Architecture hint. */
78 /*@only@*/ /*@null@*/
79     const char * os;            /*!< Operating system hint. */
80
81     rpmte parent;               /*!< Parent transaction element. */
82     int degree;                 /*!< No. of immediate children. */
83     int depth;                  /*!< Max. depth in dependency tree. */
84     int npreds;                 /*!< No. of predecessors. */
85     int tree;                   /*!< Tree index. */
86 /*@owned@*/
87     tsortInfo tsi;              /*!< Dependency ordering chains. */
88
89 /*@refcounted@*/ /*@null@*/
90     rpmds this;                 /*!< This package's provided NEVR. */
91 /*@refcounted@*/ /*@null@*/
92     rpmds provides;             /*!< Provides: dependencies. */
93 /*@refcounted@*/ /*@null@*/
94     rpmds requires;             /*!< Requires: dependencies. */
95 /*@refcounted@*/ /*@null@*/
96     rpmds conflicts;            /*!< Conflicts: dependencies. */
97 /*@refcounted@*/ /*@null@*/
98     rpmds obsoletes;            /*!< Obsoletes: dependencies. */
99 /*@refcounted@*/ /*@null@*/
100     rpmfi fi;                   /*!< File information. */
101
102     uint_32 color;              /*!< Color bit(s) from package dependencies. */
103     uint_32 pkgFileSize;        /*!< No. of bytes in package file (approx). */
104
105 /*@exposed@*/ /*@dependent@*/ /*@null@*/
106     fnpyKey key;                /*!< (TR_ADDED) Retrieval key. */
107 /*@owned@*/ /*@null@*/
108     rpmRelocation * relocs;     /*!< (TR_ADDED) Payload file relocations. */
109     int nrelocs;                /*!< (TR_ADDED) No. of relocations. */
110 /*@refcounted@*/ /*@null@*/     
111     FD_t fd;                    /*!< (TR_ADDED) Payload file descriptor. */
112
113 /*@-fielduse@*/ /* LCL: confused by union? */
114     union { 
115 /*@exposed@*/ /*@dependent@*/ /*@null@*/
116         alKey addedKey;
117         struct {
118 /*@exposed@*/ /*@dependent@*/ /*@null@*/
119             alKey dependsOnKey;
120             int dboffset;
121         } removed;
122     } u;
123 /*@=fielduse@*/
124
125 };
126
127 /**
128  * Iterator across transaction elements, forward on install, backward on erase.
129  */
130 struct rpmtsi_s {
131 /*@refcounted@*/
132     rpmts ts;           /*!< transaction set. */
133     int reverse;        /*!< reversed traversal? */
134     int ocsave;         /*!< last returned iterator index. */
135     int oc;             /*!< iterator index. */
136 };
137
138 #endif  /* _RPMTE_INTERNAL */
139
140 #ifdef __cplusplus
141 extern "C" {
142 #endif
143
144 /**
145  * Destroy a transaction element.
146  * @param te            transaction element
147  * @return              NULL always
148  */
149 /*@null@*/
150 rpmte rpmteFree(/*@only@*/ /*@null@*/ rpmte te)
151         /*@globals fileSystem @*/
152         /*@modifies te, fileSystem @*/;
153
154 /**
155  * Create a transaction element.
156  * @param ts            transaction set
157  * @param h             header
158  * @param type          TR_ADDED/TR_REMOVED
159  * @param key           (TR_ADDED) package retrieval key (e.g. file name)
160  * @param relocs        (TR_ADDED) package file relocations
161  * @param dboffset      (TR_REMOVED) rpmdb instance
162  * @param pkgKey        associated added package (if any)
163  * @return              new transaction element
164  */
165 /*@only@*/ /*@null@*/
166 rpmte rpmteNew(const rpmts ts, Header h, rpmElementType type,
167                 /*@exposed@*/ /*@dependent@*/ /*@null@*/ fnpyKey key,
168                 /*@null@*/ rpmRelocation * relocs,
169                 int dboffset,
170                 /*@exposed@*/ /*@dependent@*/ /*@null@*/ alKey pkgKey)
171         /*@globals fileSystem @*/
172         /*@modifies ts, h, fileSystem @*/;
173
174 /**
175  * Retrieve type of transaction element.
176  * @param te            transaction element
177  * @return              type
178  */
179 rpmElementType rpmteType(rpmte te)
180         /*@*/;
181
182 /**
183  * Retrieve name string of transaction element.
184  * @param te            transaction element
185  * @return              name string
186  */
187 /*@observer@*/
188 extern const char * rpmteN(rpmte te)
189         /*@*/;
190
191 /**
192  * Retrieve epoch string of transaction element.
193  * @param te            transaction element
194  * @return              epoch string
195  */
196 /*@observer@*/ /*@null@*/
197 extern const char * rpmteE(rpmte te)
198         /*@*/;
199
200 /**
201  * Retrieve version string of transaction element.
202  * @param te            transaction element
203  * @return              version string
204  */
205 /*@observer@*/ /*@null@*/
206 extern const char * rpmteV(rpmte te)
207         /*@*/;
208
209 /**
210  * Retrieve release string of transaction element.
211  * @param te            transaction element
212  * @return              release string
213  */
214 /*@observer@*/ /*@null@*/
215 extern const char * rpmteR(rpmte te)
216         /*@*/;
217
218 /**
219  * Retrieve arch string of transaction element.
220  * @param te            transaction element
221  * @return              arch string
222  */
223 /*@observer@*/ /*@null@*/
224 extern const char * rpmteA(rpmte te)
225         /*@*/;
226
227 /**
228  * Retrieve os string of transaction element.
229  * @param te            transaction element
230  * @return              os string
231  */
232 /*@observer@*/ /*@null@*/
233 extern const char * rpmteO(rpmte te)
234         /*@*/;
235
236 /**
237  * Retrieve color bits of transaction element.
238  * @param te            transaction element
239  * @return              color bits
240  */
241 uint_32 rpmteColor(rpmte te)
242         /*@*/;
243
244 /**
245  * Set color bits of transaction element.
246  * @param te            transaction element
247  * @param color         new color bits
248  * @return              previous color bits
249  */
250 uint_32 rpmteSetColor(rpmte te, uint_32 color)
251         /*@modifies te @*/;
252
253 /**
254  * Retrieve size in bytes of package file.
255  * @todo Signature header is estimated at 256b.
256  * @param te            transaction element
257  * @return              size in bytes of package file.
258  */
259 uint_32 rpmtePkgFileSize(rpmte te)
260         /*@*/;
261
262 /**
263  * Retrieve tsort tree depth of transaction element.
264  * @param te            transaction element
265  * @return              depth
266  */
267 int rpmteDepth(rpmte te)
268         /*@*/;
269
270 /**
271  * Set tsort tree depth of transaction element.
272  * @param te            transaction element
273  * @param ndepth        new depth
274  * @return              previous depth
275  */
276 int rpmteSetDepth(rpmte te, int ndepth)
277         /*@modifies te @*/;
278
279 /**
280  * Retrieve tsort no. of predecessors of transaction element.
281  * @param te            transaction element
282  * @return              no. of predecessors
283  */
284 int rpmteNpreds(rpmte te)
285         /*@*/;
286
287 /**
288  * Set tsort no. of predecessors of transaction element.
289  * @param te            transaction element
290  * @param npreds        new no. of predecessors
291  * @return              previous no. of predecessors
292  */
293 int rpmteSetNpreds(rpmte te, int npreds)
294         /*@modifies te @*/;
295
296 /**
297  * Retrieve tree index of transaction element.
298  * @param te            transaction element
299  * @return              tree index
300  */
301 int rpmteTree(rpmte te)
302         /*@*/;
303
304 /**
305  * Set tree index of transaction element.
306  * @param te            transaction element
307  * @param ntree         new tree index
308  * @return              previous tree index
309  */
310 int rpmteSetTree(rpmte te, int ntree)
311         /*@modifies te @*/;
312
313 /**
314  * Retrieve parent transaction element.
315  * @param te            transaction element
316  * @return              parent transaction element
317  */
318 /*@observer@*/ /*@unused@*/
319 rpmte rpmteParent(rpmte te)
320         /*@*/;
321
322 /**
323  * Set parent transaction element.
324  * @param te            transaction element
325  * @param pte           new parent transaction element
326  * @return              previous parent transaction element
327  */
328 /*@null@*/
329 rpmte rpmteSetParent(rpmte te, rpmte pte)
330         /*@modifies te @*/;
331
332 /**
333  * Retrieve number of children of transaction element.
334  * @param te            transaction element
335  * @return              tree index
336  */
337 int rpmteDegree(rpmte te)
338         /*@*/;
339
340 /**
341  * Set number of children of transaction element.
342  * @param te            transaction element
343  * @param ndegree       new number of children
344  * @return              previous number of children
345  */
346 int rpmteSetDegree(rpmte te, int ndegree)
347         /*@modifies te @*/;
348
349 /**
350  * Retrieve tsort info for transaction element.
351  * @param te            transaction element
352  * @return              tsort info
353  */
354 tsortInfo rpmteTSI(rpmte te)
355         /*@*/;
356
357 /**
358  * Destroy tsort info of transaction element.
359  * @param te            transaction element
360  */
361 void rpmteFreeTSI(rpmte te)
362         /*@modifies te @*/;
363
364 /**
365  * Initialize tsort info of transaction element.
366  * @param te            transaction element
367  */
368 void rpmteNewTSI(rpmte te)
369         /*@modifies te @*/;
370
371 /**
372  * Destroy dependency set info of transaction element.
373  * @param te            transaction element
374  */
375 /*@unused@*/
376 void rpmteCleanDS(rpmte te)
377         /*@modifies te @*/;
378
379 /**
380  * Retrieve pkgKey of TR_ADDED transaction element.
381  * @param te            transaction element
382  * @return              pkgKey
383  */
384 /*@exposed@*/ /*@dependent@*/ /*@null@*/
385 alKey rpmteAddedKey(rpmte te)
386         /*@*/;
387
388 /**
389  * Set pkgKey of TR_ADDED transaction element.
390  * @param te            transaction element
391  * @param npkgKey       new pkgKey
392  * @return              previous pkgKey
393  */
394 /*@exposed@*/ /*@dependent@*/ /*@null@*/
395 alKey rpmteSetAddedKey(rpmte te,
396                 /*@exposed@*/ /*@dependent@*/ /*@null@*/ alKey npkgKey)
397         /*@modifies te @*/;
398
399 /**
400  * Retrieve dependent pkgKey of TR_REMOVED transaction element.
401  * @param te            transaction element
402  * @return              dependent pkgKey
403  */
404 /*@exposed@*/ /*@dependent@*/ /*@null@*/
405 alKey rpmteDependsOnKey(rpmte te)
406         /*@*/;
407
408 /**
409  * Retrieve rpmdb instance of TR_REMOVED transaction element.
410  * @param te            transaction element
411  * @return              rpmdb instance
412  */
413 int rpmteDBOffset(rpmte te)
414         /*@*/;
415
416 /**
417  * Retrieve name-version-release string from transaction element.
418  * @param te            transaction element
419  * @return              name-version-release string
420  */
421 /*@observer@*/
422 extern const char * rpmteNEVR(rpmte te)
423         /*@*/;
424
425 /**
426  * Retrieve name-version-release.arch string from transaction element.
427  * @param te            transaction element
428  * @return              name-version-release.arch string
429  */
430 /*@-exportlocal@*/
431 /*@observer@*/
432 extern const char * rpmteNEVRA(rpmte te)
433         /*@*/;
434 /*@=exportlocal@*/
435
436 /**
437  * Retrieve file handle from transaction element.
438  * @param te            transaction element
439  * @return              file handle
440  */
441 FD_t rpmteFd(rpmte te)
442         /*@*/;
443
444 /**
445  * Retrieve key from transaction element.
446  * @param te            transaction element
447  * @return              key
448  */
449 /*@exposed@*/
450 fnpyKey rpmteKey(rpmte te)
451         /*@*/;
452
453 /**
454  * Retrieve dependency tag set from transaction element.
455  * @param te            transaction element
456  * @param tag           dependency tag
457  * @return              dependency tag set
458  */
459 rpmds rpmteDS(rpmte te, rpmTag tag)
460         /*@*/;
461
462 /**
463  * Retrieve file info tag set from transaction element.
464  * @param te            transaction element
465  * @param tag           file info tag (RPMTAG_BASENAMES)
466  * @return              file info tag set
467  */
468 rpmfi rpmteFI(rpmte te, rpmTag tag)
469         /*@*/;
470
471 /**
472  * Calculate transaction element dependency colors/refs from file info.
473  * @param te            transaction element
474  * @param tag           dependency tag (RPMTAG_PROVIDENAME, RPMTAG_REQUIRENAME)
475  */
476 /*@-exportlocal@*/
477 void rpmteColorDS(rpmte te, rpmTag tag)
478         /*@modifies te @*/;
479 /*@=exportlocal@*/
480
481 /**
482  * Return transaction element index.
483  * @param tsi           transaction element iterator
484  * @return              transaction element index
485  */
486 int rpmtsiOc(rpmtsi tsi)
487         /*@*/;
488
489 /**
490  * Destroy transaction element iterator.
491  * @param tsi           transaction element iterator
492  * @return              NULL always
493  */
494 /*@unused@*/ /*@null@*/
495 rpmtsi rpmtsiFree(/*@only@*//*@null@*/ rpmtsi tsi)
496         /*@globals fileSystem @*/
497         /*@modifies fileSystem @*/;
498
499 /**
500  * Destroy transaction element iterator.
501  * @param tsi           transaction element iterator
502  * @param fn
503  * @param ln
504  * @return              NULL always
505  */
506 /*@null@*/
507 rpmtsi XrpmtsiFree(/*@only@*//*@null@*/ rpmtsi tsi,
508                 const char * fn, unsigned int ln)
509         /*@globals fileSystem @*/
510         /*@modifies fileSystem @*/;
511 #define rpmtsiFree(_tsi)        XrpmtsiFree(_tsi, __FILE__, __LINE__)
512
513 /**
514  * Create transaction element iterator.
515  * @param ts            transaction set
516  * @return              transaction element iterator
517  */
518 /*@unused@*/ /*@only@*/
519 rpmtsi rpmtsiInit(rpmts ts)
520         /*@modifies ts @*/;
521
522 /**
523  * Create transaction element iterator.
524  * @param ts            transaction set
525  * @param fn
526  * @param ln
527  * @return              transaction element iterator
528  */
529 /*@unused@*/ /*@only@*/
530 rpmtsi XrpmtsiInit(rpmts ts,
531                 const char * fn, unsigned int ln)
532         /*@modifies ts @*/;
533 #define rpmtsiInit(_ts)         XrpmtsiInit(_ts, __FILE__, __LINE__)
534
535 /**
536  * Return next transaction element of type.
537  * @param tsi           transaction element iterator
538  * @param type          transaction element type selector (0 for any)
539  * @return              next transaction element of type, NULL on termination
540  */
541 /*@dependent@*/ /*@null@*/
542 rpmte rpmtsiNext(rpmtsi tsi, rpmElementType type)
543         /*@modifies tsi @*/;
544
545 #ifdef __cplusplus
546 }
547 #endif
548
549 #endif  /* H_RPMTE */