Make headers self-contained.
[platform/upstream/rpm.git] / lib / rpmds.h
1 #ifndef H_RPMDS
2 #define H_RPMDS
3
4 /** \ingroup rpmdep rpmtrans
5  * \file lib/rpmds.h
6  * Structure(s) used for dependency tag sets.
7  */
8
9 #include "rpmlib.h"     /* for rpmds */
10 #include "rpmps.h"
11
12 #ifdef __cplusplus
13 extern "C" {
14 #endif
15
16 /**
17  */
18 extern int _rpmds_debug;
19
20 /**
21  */
22 extern int _rpmds_nopromote;
23
24 #if defined(_RPMDS_INTERNAL)
25 /**
26  * A package dependency set.
27  */
28 struct rpmds_s {
29     const char * Type;          /*!< Tag name. */
30     const char * DNEVR;         /*!< Formatted dependency string. */
31     Header h;                   /*!< Header for dependency set (or NULL) */
32     const char ** N;            /*!< Name. */
33     const char ** EVR;          /*!< Epoch-Version-Release. */
34     int_32 * Flags;             /*!< Bit(s) identifying context/comparison. */
35     uint_32 * Color;            /*!< Bit(s) calculated from file color(s). */
36     int_32 * Refs;              /*!< No. of file refs. */
37     int_32 BT;                  /*!< Package build time tie breaker. */
38     rpmTag tagN;                /*!< Header tag. */
39     rpmTagType Nt, EVRt, Ft;    /*!< Tag data types. */
40     int_32 Count;               /*!< No. of elements */
41     int i;                      /*!< Element index. */
42     unsigned l;                 /*!< Low element (bsearch). */
43     unsigned u;                 /*!< High element (bsearch). */
44     int nopromote;              /*!< Don't promote Epoch: in rpmdsCompare()? */
45     int nrefs;                  /*!< Reference count. */
46 };
47 #endif  /* _RPMDS_INTERNAL */
48
49 /**
50  * Unreference a dependency set instance.
51  * @param ds            dependency set
52  * @param msg
53  * @return              NULL always
54  */
55 rpmds rpmdsUnlink (rpmds ds,
56                 const char * msg);
57
58 /** @todo Remove debugging entry from the ABI. */
59 rpmds XrpmdsUnlink (rpmds ds,
60                 const char * msg, const char * fn, unsigned ln);
61 #define rpmdsUnlink(_ds, _msg)  XrpmdsUnlink(_ds, _msg, __FILE__, __LINE__)
62
63 /**
64  * Reference a dependency set instance.
65  * @param ds            dependency set
66  * @param msg
67  * @return              new dependency set reference
68  */
69 rpmds rpmdsLink (rpmds ds, const char * msg);
70
71 /** @todo Remove debugging entry from the ABI. */
72 rpmds XrpmdsLink (rpmds ds, const char * msg,
73                 const char * fn, unsigned ln);
74 #define rpmdsLink(_ds, _msg)    XrpmdsLink(_ds, _msg, __FILE__, __LINE__)
75
76 /**
77  * Destroy a dependency set.
78  * @param ds            dependency set
79  * @return              NULL always
80  */
81 rpmds rpmdsFree(rpmds ds);
82 /**
83  * Create and load a dependency set.
84  * @deprecated Only scareMem = 0 will be permitted.
85  * @param h             header
86  * @param tagN          type of dependency
87  * @param flags         scareMem(0x1)
88  * @return              new dependency set
89  */
90 rpmds rpmdsNew(Header h, rpmTag tagN, int flags);
91
92 /**
93  * Return new formatted dependency string.
94  * @param dspfx         formatted dependency string prefix
95  * @param ds            dependency set
96  * @return              new formatted dependency (malloc'ed)
97  */
98 char * rpmdsNewDNEVR(const char * dspfx, const rpmds ds);
99
100 /**
101  * Create, load and initialize a dependency for this header. 
102  * @param h             header
103  * @param tagN          type of dependency
104  * @param Flags         comparison flags
105  * @return              new dependency set
106  */
107 rpmds rpmdsThis(Header h, rpmTag tagN, int_32 Flags);
108
109 /**
110  * Create, load and initialize a dependency set of size 1.
111  * @param tagN          type of dependency
112  * @param N             name
113  * @param EVR           epoch:version-release
114  * @param Flags         comparison flags
115  * @return              new dependency set
116  */
117 rpmds rpmdsSingle(rpmTag tagN, const char * N, const char * EVR, int_32 Flags);
118
119 /**
120  * Return dependency set count.
121  * @param ds            dependency set
122  * @return              current count
123  */
124 int rpmdsCount(const rpmds ds);
125
126 /**
127  * Return dependency set index.
128  * @param ds            dependency set
129  * @return              current index
130  */
131 int rpmdsIx(const rpmds ds);
132
133 /**
134  * Set dependency set index.
135  * @param ds            dependency set
136  * @param ix            new index
137  * @return              current index
138  */
139 int rpmdsSetIx(rpmds ds, int ix);
140
141 /**
142  * Return current formatted dependency string.
143  * @param ds            dependency set
144  * @return              current dependency DNEVR, NULL on invalid
145  */
146 extern const char * rpmdsDNEVR(const rpmds ds);
147
148 /**
149  * Return current dependency name.
150  * @param ds            dependency set
151  * @return              current dependency name, NULL on invalid
152  */
153 extern const char * rpmdsN(const rpmds ds);
154
155 /**
156  * Return current dependency epoch-version-release.
157  * @param ds            dependency set
158  * @return              current dependency EVR, NULL on invalid
159  */
160 extern const char * rpmdsEVR(const rpmds ds);
161
162 /**
163  * Return current dependency flags.
164  * @param ds            dependency set
165  * @return              current dependency flags, 0 on invalid
166  */
167 int_32 rpmdsFlags(const rpmds ds);
168
169 /**
170  * Return current dependency type.
171  * @param ds            dependency set
172  * @return              current dependency type, 0 on invalid
173  */
174 rpmTag rpmdsTagN(const rpmds ds);
175
176 /**
177  * Return dependency build time.
178  * @param ds            dependency set
179  * @return              dependency build time, 0 on invalid
180  */
181 time_t rpmdsBT(const rpmds ds);
182
183 /**
184  * Set dependency build time.
185  * @param ds            dependency set
186  * @param BT            build time
187  * @return              dependency build time, 0 on invalid
188  */
189 time_t rpmdsSetBT(const rpmds ds, time_t BT);
190
191 /**
192  * Return current "Don't promote Epoch:" flag.
193  *
194  * This flag controls for Epoch: promotion when a dependency set is
195  * compared. If the flag is set (for already installed packages), then
196  * an unspecified value will be treated as Epoch: 0. Otherwise (for added
197  * packages), the Epoch: portion of the comparison is skipped if the value
198  * is not specified, i.e. an unspecified Epoch: is assumed to be equal
199  * in dependency comparisons.
200  *
201  * @param ds            dependency set
202  * @return              current "Don't promote Epoch:" flag
203  */
204 int rpmdsNoPromote(const rpmds ds);
205
206 /**
207  * Set "Don't promote Epoch:" flag.
208  * @param ds            dependency set
209  * @param nopromote     Should an unspecified Epoch: be treated as Epoch: 0?
210  * @return              previous "Don't promote Epoch:" flag
211  */
212 int rpmdsSetNoPromote(rpmds ds, int nopromote);
213
214 /**
215  * Return current dependency color.
216  * @param ds            dependency set
217  * @return              current dependency color
218  */
219 uint_32 rpmdsColor(const rpmds ds);
220
221 /**
222  * Return current dependency color.
223  * @param ds            dependency set
224  * @param color         new dependency color
225  * @return              previous dependency color
226  */
227 uint_32 rpmdsSetColor(const rpmds ds, uint_32 color);
228
229 /**
230  * Return current dependency file refs.
231  * @param ds            dependency set
232  * @return              current dependency file refs, -1 on global
233  */
234 int_32 rpmdsRefs(const rpmds ds);
235
236 /**
237  * Return current dependency color.
238  * @param ds            dependency set
239  * @param refs          new dependency refs
240  * @return              previous dependency refs
241  */
242 int_32 rpmdsSetRefs(const rpmds ds, int_32 refs);
243
244 /**
245  * Notify of results of dependency match.
246  * @param ds            dependency set
247  * @param where         where dependency was resolved (or NULL)
248  * @param rc            0 == YES, otherwise NO
249  */
250 /* FIX: rpmMessage annotation is a lie */
251 void rpmdsNotify(rpmds ds, const char * where, int rc);
252
253 /**
254  * Return next dependency set iterator index.
255  * @param ds            dependency set
256  * @return              dependency set iterator index, -1 on termination
257  */
258 int rpmdsNext(rpmds ds);
259
260 /**
261  * Initialize dependency set iterator.
262  * @param ds            dependency set
263  * @return              dependency set
264  */
265 rpmds rpmdsInit(rpmds ds);
266
267 /**
268  * Find a dependency set element using binary search.
269  * @param ds            dependency set to search
270  * @param ods           dependency set element to find.
271  * @return              dependency index (or -1 if not found)
272  */
273 int rpmdsFind(rpmds ds, const rpmds ods);
274
275 /**
276  * Merge a dependency set maintaining (N,EVR,Flags) sorted order.
277  * @retval *dsp         (merged) dependency set
278  * @param ods           dependency set to merge
279  * @return              (merged) dependency index
280  */
281 int rpmdsMerge(rpmds * dsp, rpmds ods);
282
283 /**
284  * Compare two versioned dependency ranges, looking for overlap.
285  * @param A             1st dependency
286  * @param B             2nd dependency
287  * @return              1 if dependencies overlap, 0 otherwise
288  */
289 int rpmdsCompare(const rpmds A, const rpmds B);
290
291 /**
292  * Report a Requires: or Conflicts: dependency problem.
293  * @param ps            transaction set problems
294  * @param pkgNEVR       package name/epoch/version/release
295  * @param ds            dependency set
296  * @param suggestedKeys filename or python object address
297  * @param adding        dependency problem is from added package set?
298  */
299 void rpmdsProblem(rpmps ps, const char * pkgNEVR, const rpmds ds,
300                 const fnpyKey * suggestedKeys,
301                 int adding);
302
303 /**
304  * Compare package provides dependencies from header with a single dependency.
305  * @param h             header
306  * @param req           dependency set
307  * @param nopromote     Don't promote Epoch: in comparison?
308  * @return              1 if any dependency overlaps, 0 otherwise
309  */
310 int rpmdsAnyMatchesDep (const Header h, const rpmds req, int nopromote);
311
312 /**
313  * Compare package name-version-release from header with a single dependency.
314  * @param h             header
315  * @param req           dependency set
316  * @param nopromote     Don't promote Epoch: in comparison?
317  * @return              1 if dependency overlaps, 0 otherwise
318  */
319 int rpmdsNVRMatchesDep(const Header h, const rpmds req, int nopromote);
320
321 #ifdef __cplusplus
322 }
323 #endif
324
325 #endif  /* H_RPMDS */