- use rpmdb-redhat to suggest dependency resolution(s).
[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 /**
10  * A package dependency set.
11  */
12 struct rpmDepSet_s {
13     int i;                      /*!< Element index. */
14
15 /*@observer@*/
16     const char * Type;          /*!< Tag name. */
17 /*@only@*/ /*@null@*/
18     const char * DNEVR;         /*!< Formatted dependency string. */
19
20     rpmTag tagN;                /*!< Header tag. */
21 /*@refcounted@*/ /*@null@*/
22     Header h;                   /*!< Header for dependency set (or NULL) */
23
24 /*@only@*/
25     const char ** N;            /*!< Name. */
26 /*@only@*/
27     const char ** EVR;          /*!< Epoch-Version-Release. */
28 /*@only@*/
29     int_32 * Flags;             /*!< Flags identifying context/comparison. */
30     rpmTagType Nt, EVRt, Ft;    /*!< Tag data types. */
31     int_32 Count;               /*!< No. of elements */
32 /*@refs@*/ int nrefs;           /*!< Reference count. */
33 };
34
35 #ifdef __cplusplus
36 extern "C" {
37 #endif
38
39 /**
40  * Unreference a dependency set instance.
41  * @param ds            dependency set
42  * @param msg
43  * @return              NULL always
44  */
45 /*@unused@*/ /*@null@*/
46 rpmDepSet rpmdsUnlink (/*@killref@*/ /*@only@*/ /*@null@*/ rpmDepSet ds,
47                 /*@null@*/ const char * msg)
48         /*@modifies ds @*/;
49
50 /** @todo Remove debugging entry from the ABI. */
51 /*@-exportlocal@*/
52 /*@null@*/
53 rpmDepSet XrpmdsUnlink (/*@killref@*/ /*@only@*/ /*@null@*/ rpmDepSet ds,
54                 /*@null@*/ const char * msg, const char * fn, unsigned ln)
55         /*@modifies ds @*/;
56 /*@=exportlocal@*/
57 #define rpmdsUnlink(_ds, _msg)  XrpmdsUnlink(_ds, _msg, __FILE__, __LINE__)
58
59 /**
60  * Reference a dependency set instance.
61  * @param ds            dependency set
62  * @param msg
63  * @return              new dependency set reference
64  */
65 /*@unused@*/
66 rpmDepSet rpmdsLink (/*@null@*/ rpmDepSet ds, /*@null@*/ const char * msg)
67         /*@modifies ds @*/;
68
69 /** @todo Remove debugging entry from the ABI. */
70 rpmDepSet XrpmdsLink (/*@null@*/ rpmDepSet ds, /*@null@*/ const char * msg,
71                 const char * fn, unsigned ln)
72         /*@modifies ds @*/;
73 #define rpmdsLink(_ds, _msg)    XrpmdsLink(_ds, _msg, __FILE__, __LINE__)
74
75 /**
76  * Destroy a dependency set.
77  * @param ds            dependency set
78  * @return              NULL always
79  */
80 /*@null@*/
81 rpmDepSet dsFree(/*@killref@*/ /*@only@*/ /*@null@*/ rpmDepSet ds)
82         /*@modifies ds@*/;
83 /**
84  * Create and load a dependency set.
85  * @param h             header
86  * @param tagN          type of dependency
87  * @param scareMem      Use pointers to refcounted header memory?
88  * @return              new dependency set
89  */
90 /*@null@*/
91 rpmDepSet dsNew(Header h, rpmTag tagN, int scareMem)
92         /*@modifies h @*/;
93
94 /**
95  * Return new formatted dependency string.
96  * @param dspfx         formatted dependency string prefix
97  * @param ds            dependency set
98  * @return              new formatted dependency (malloc'ed)
99  */
100 /*@only@*/
101 char * dsDNEVR(const char * dspfx, const rpmDepSet ds)
102         /*@*/;
103
104 /**
105  * Create, load and initialize a dependency for this header. 
106  * @param h             header
107  * @param tagN          type of dependency
108  * @param Flags         comparison flags
109  * @return              new dependency set
110  */
111 /*@null@*/
112 rpmDepSet dsThis(Header h, rpmTag tagN, int_32 Flags)
113         /*@*/;
114
115 /**
116  * Create, load and initialize a dependency set of size 1.
117  * @param tagN          type of dependency
118  * @param N             name
119  * @param EVR           epoch:version-release
120  * @param Flags         comparison flags
121  * @return              new dependency set
122  */
123 /*@null@*/
124 rpmDepSet dsSingle(rpmTag tagN, const char * N, const char * EVR, int_32 Flags)
125         /*@*/;
126
127 /**
128  * Return dependency set count.
129  * @param ds            dependency set
130  * @return              current count
131  */
132 int dsiGetCount(/*@null@*/ const rpmDepSet ds)
133         /*@*/;
134
135 /**
136  * Return dependency set index.
137  * @param ds            dependency set
138  * @return              current index
139  */
140 int dsiGetIx(/*@null@*/ const rpmDepSet ds)
141         /*@*/;
142
143 /**
144  * Set dependency set index.
145  * @param ds            dependency set
146  * @param ix            new index
147  * @return              current index
148  */
149 int dsiSetIx(/*@null@*/ rpmDepSet ds, int ix)
150         /*@modifies ds @*/;
151
152 /**
153  * Return current formatted dependency string.
154  * @param ds            dependency set
155  * @return              current dependency DNEVR, NULL on invalid
156  */
157 /*@null@*/
158 const char * dsiGetDNEVR(/*@null@*/ const rpmDepSet ds)
159         /*@*/;
160
161 /**
162  * Return current dependency name.
163  * @param ds            dependency set
164  * @return              current dependency name, NULL on invalid
165  */
166 /*@null@*/
167 const char * dsiGetN(/*@null@*/ const rpmDepSet ds)
168         /*@*/;
169
170 /**
171  * Return current dependency epoch-version-release.
172  * @param ds            dependency set
173  * @return              current dependency EVR, NULL on invalid
174  */
175 /*@null@*/
176 const char * dsiGetEVR(/*@null@*/ const rpmDepSet ds)
177         /*@*/;
178
179 /**
180  * Return current dependency flags.
181  * @param ds            dependency set
182  * @return              current dependency flags, 0 on invalid
183  */
184 int_32 dsiGetFlags(/*@null@*/ const rpmDepSet ds)
185         /*@*/;
186
187 /**
188  * Return current dependency type.
189  * @param ds            dependency set
190  * @return              current dependency type, 0 on invalid
191  */
192 rpmTag dsiGetTagN(/*@null@*/ const rpmDepSet ds)
193         /*@*/;
194
195 /**
196  * Notify of results of dependency match.
197  * @param ds            dependency set
198  * @param where         where dependency was resolved (or NULL)
199  * @param rc            0 == YES, otherwise NO
200  */
201 /*@-globuse@*/ /* FIX: rpmMessage annotation is a lie */
202 void dsiNotify(/*@null@*/ rpmDepSet ds, /*@null@*/ const char * where, int rc)
203         /*@globals fileSystem @*/
204         /*@modifies fileSystem @*/;
205 /*@=globuse@*/
206
207 /**
208  * Return next dependency set iterator index.
209  * @param ds            dependency set
210  * @return              dependency set iterator index, -1 on termination
211  */
212 int dsiNext(/*@null@*/ rpmDepSet ds)
213         /*@modifies ds @*/;
214
215 /**
216  * Initialize dependency set iterator.
217  * @param ds            dependency set
218  * @return              dependency set
219  */
220 /*@null@*/
221 rpmDepSet dsiInit(/*@null@*/ rpmDepSet ds)
222         /*@modifies ds @*/;
223
224 /**
225  * Compare two versioned dependency ranges, looking for overlap.
226  * @param A             1st dependency
227  * @param B             2nd dependency
228  * @return              1 if dependencies overlap, 0 otherwise
229  */
230 int dsCompare(const rpmDepSet A, const rpmDepSet B)
231         /*@*/;
232
233 /**
234  * Report a Requires: or Conflicts: dependency problem.
235  */
236 void dsProblem(/*@null@*/ rpmProblemSet tsprobs,
237                 const char * pkgNEVR, const rpmDepSet ds,
238                 /*@only@*/ /*@null@*/ const fnpyKey * suggestedKeys)
239         /*@modifies tsprobs @*/;
240
241 /**
242  * Compare package provides dependencies from header with a single dependency.
243  * @param h             header
244  * @param req           dependency set
245  */
246 int rangeMatchesDepFlags (Header h, const rpmDepSet req)
247         /*@modifies h @*/;
248
249 /**
250  * Compare package name-version-release from header with a single dependency.
251  * @deprecated Remove from API when obsoletes is correctly implemented.
252  * @param h             header
253  * @param req           dependency
254  * @return              1 if dependency overlaps, 0 otherwise
255  */
256 int headerMatchesDepFlags(const Header h, const rpmDepSet req)
257         /*@*/;
258
259 #ifdef __cplusplus
260 }
261 #endif
262
263 #endif  /* H_RPMDS */