2 * Copyright (c) 2007, Novell Inc.
4 * This program is licensed under the BSD license, read LICENSE.BSD
5 * for further information
13 #ifndef LIBSOLV_POOL_H
14 #define LIBSOLV_POOL_H
18 #include "solvversion.h"
19 #include "pooltypes.h"
33 /* well known solvable */
34 #define SYSTEMSOLVABLE 1
37 /*----------------------------------------------- */
44 typedef struct s_Datapos
{
53 #ifdef LIBSOLV_INTERNAL
55 /* how many strings to maintain (round robin) */
56 #define POOL_TMPSPACEBUF 16
58 struct s_Pool_tmpspace
{
59 char *buf
[POOL_TMPSPACEBUF
];
60 int len
[POOL_TMPSPACEBUF
];
67 void *appdata
; /* application private pointer */
69 struct s_Stringpool ss
;
71 Reldep
*rels
; /* table of rels: Id -> Reldep */
72 int nrels
; /* number of unique rels */
74 struct s_Repo
**repos
;
75 int nrepos
; /* repos allocated */
76 int urepos
; /* repos in use */
78 struct s_Repo
*installed
; /* packages considered installed */
81 int nsolvables
; /* solvables allocated */
83 const char **languages
;
86 /* package manager type, deb/rpm */
89 Id
*id2arch
; /* map arch ids to scores */
90 unsigned char *id2color
; /* map arch ids to colors */
91 Id lastarch
; /* size of the id2arch/id2color arrays */
93 Queue vendormap
; /* map vendor to vendorclasses mask */
94 const char **vendorclasses
; /* vendor equivalence classes */
96 /* providers data, as two-step indirect list
97 * whatprovides[Id] -> Offset into whatprovidesdata for name
98 * whatprovidesdata[Offset] -> 0-terminated list of solvables providing Id
100 Offset
*whatprovides
; /* Offset to providers of a specific name, Id -> Offset */
101 Offset
*whatprovides_rel
; /* Offset to providers of a specific relation, Id -> Offset */
103 Id
*whatprovidesdata
; /* Ids of solvable providing Id */
104 Offset whatprovidesdataoff
; /* next free slot within whatprovidesdata */
105 int whatprovidesdataleft
; /* number of 'free slots' within whatprovidesdata */
107 /* If nonzero, then consider only the solvables with Ids set in this
108 bitmap for solving. If zero, consider all solvables. */
111 /* callback for REL_NAMESPACE dependencies handled by the application */
112 Id (*nscallback
)(struct s_Pool
*, void *data
, Id name
, Id evr
);
113 void *nscallbackdata
;
115 /* debug mask and callback */
117 void (*debugcallback
)(struct s_Pool
*, void *data
, int type
, const char *str
);
118 void *debugcallbackdata
;
121 int (*loadcallback
)(struct s_Pool
*, struct s_Repodata
*, void *);
122 void *loadcallbackdata
;
124 /* search position */
127 Queue pooljobs
; /* fixed jobs, like USERINSTALLED/MULTIVERSION */
129 #ifdef LIBSOLV_INTERNAL
130 /* flags to tell the library how the installed package manager works */
131 int promoteepoch
; /* true: missing epoch is replaced by epoch of dependency */
132 int havedistepoch
; /* true: thr release part in the evr may contain a distepoch suffix */
133 int obsoleteusesprovides
; /* true: obsoletes are matched against provides, not names */
134 int implicitobsoleteusesprovides
; /* true: implicit obsoletes due to same name are matched against provides, not names */
135 int obsoleteusescolors
; /* true: obsoletes check arch color */
136 int implicitobsoleteusescolors
; /* true: implicit obsoletes check arch color */
137 int noinstalledobsoletes
; /* true: ignore obsoletes of installed packages */
138 int forbidselfconflicts
; /* true: packages which conflict with itself are not installable */
139 int noobsoletesmultiversion
; /* true: obsoletes are ignored for multiversion installs */
141 Id noarchid
; /* ARCH_NOARCH, ARCH_ALL, ARCH_ANY, ... */
143 /* hash for rel unification */
144 Hashtable relhashtbl
; /* hashtable: (name,evr,op)Hash -> Id */
148 int languagecacheother
;
150 /* our tmp space string space */
151 struct s_Pool_tmpspace tmpspace
;
153 char *errstr
; /* last error string */
154 int errstra
; /* allocated space for errstr */
158 int (*custom_vendorcheck
)(struct s_Pool
*, Solvable
*, Solvable
*);
160 int addfileprovidesfiltered
; /* 1: only use filtered file list for addfileprovides */
161 int addedfileprovides
; /* true: application called addfileprovides */
162 Queue lazywhatprovidesq
; /* queue to store old whatprovides offsets */
163 int nowhatprovidesaux
; /* don't allocate and use the whatprovides aux helper */
164 Offset
*whatprovidesaux
;
165 Offset whatprovidesauxoff
;
166 Id
*whatprovidesauxdata
;
167 Offset whatprovidesauxdataoff
;
172 #define DISTTYPE_RPM 0
173 #define DISTTYPE_DEB 1
174 #define DISTTYPE_ARCH 2
175 #define DISTTYPE_HAIKU 3
176 #define DISTTYPE_CONDA 4
178 #define SOLV_FATAL (1<<0)
179 #define SOLV_ERROR (1<<1)
180 #define SOLV_WARN (1<<2)
181 #define SOLV_DEBUG_STATS (1<<3)
182 #define SOLV_DEBUG_RULE_CREATION (1<<4)
183 #define SOLV_DEBUG_PROPAGATE (1<<5)
184 #define SOLV_DEBUG_ANALYZE (1<<6)
185 #define SOLV_DEBUG_UNSOLVABLE (1<<7)
186 #define SOLV_DEBUG_SOLUTIONS (1<<8)
187 #define SOLV_DEBUG_POLICY (1<<9)
188 #define SOLV_DEBUG_RESULT (1<<10)
189 #define SOLV_DEBUG_JOB (1<<11)
190 #define SOLV_DEBUG_SOLVER (1<<12)
191 #define SOLV_DEBUG_TRANSACTION (1<<13)
192 #define SOLV_DEBUG_WATCHES (1<<14)
194 #define SOLV_DEBUG_TO_STDERR (1<<30)
196 #define POOL_FLAG_PROMOTEEPOCH 1
197 #define POOL_FLAG_FORBIDSELFCONFLICTS 2
198 #define POOL_FLAG_OBSOLETEUSESPROVIDES 3
199 #define POOL_FLAG_IMPLICITOBSOLETEUSESPROVIDES 4
200 #define POOL_FLAG_OBSOLETEUSESCOLORS 5
201 #define POOL_FLAG_NOINSTALLEDOBSOLETES 6
202 #define POOL_FLAG_HAVEDISTEPOCH 7
203 #define POOL_FLAG_NOOBSOLETESMULTIVERSION 8
204 #define POOL_FLAG_ADDFILEPROVIDESFILTERED 9
205 #define POOL_FLAG_IMPLICITOBSOLETEUSESCOLORS 10
206 #define POOL_FLAG_NOWHATPROVIDESAUX 11
208 /* ----------------------------------------------- */
211 /* mark dependencies with relation by setting bit31 */
213 #define MAKERELDEP(id) ((id) | 0x80000000)
214 #define ISRELDEP(id) (((id) & 0x80000000) != 0)
215 #define GETRELID(id) ((id) ^ 0x80000000) /* returns Id */
216 #define GETRELDEP(pool, id) ((pool)->rels + ((id) ^ 0x80000000)) /* returns Reldep* */
225 #define REL_NAMESPACE 19
227 #define REL_FILECONFLICT 21
228 #define REL_COND 22 /* OR_NOT */
229 #define REL_COMPAT 23
230 #define REL_KIND 24 /* for filters only */
231 #define REL_MULTIARCH 25 /* debian multiarch annotation */
232 #define REL_ELSE 26 /* only as evr part of REL_COND/REL_UNLESS */
233 #define REL_ERROR 27 /* parse errors and the like */
234 #define REL_WITHOUT 28
235 #define REL_UNLESS 29 /* AND_NOT */
237 #if !defined(__GNUC__) && !defined(__attribute__)
238 # define __attribute__(x)
241 extern Pool
*pool_create(void);
242 extern void pool_free(Pool
*pool
);
243 extern void pool_freeallrepos(Pool
*pool
, int reuseids
);
245 extern void pool_setdebuglevel(Pool
*pool
, int level
);
246 extern int pool_setdisttype(Pool
*pool
, int disttype
);
247 extern int pool_set_flag(Pool
*pool
, int flag
, int value
);
248 extern int pool_get_flag(Pool
*pool
, int flag
);
250 extern void pool_debug(Pool
*pool
, int type
, const char *format
, ...) __attribute__((format(printf
, 3, 4)));
251 extern void pool_setdebugcallback(Pool
*pool
, void (*debugcallback
)(struct s_Pool
*, void *data
, int type
, const char *str
), void *debugcallbackdata
);
252 extern void pool_setdebugmask(Pool
*pool
, int mask
);
253 extern void pool_setloadcallback(Pool
*pool
, int (*cb
)(struct s_Pool
*, struct s_Repodata
*, void *), void *loadcbdata
);
254 extern void pool_setnamespacecallback(Pool
*pool
, Id (*cb
)(struct s_Pool
*, void *, Id
, Id
), void *nscbdata
);
255 extern void pool_flush_namespaceproviders(Pool
*pool
, Id ns
, Id evr
);
257 extern void pool_set_custom_vendorcheck(Pool
*pool
, int (*vendorcheck
)(struct s_Pool
*, Solvable
*, Solvable
*));
260 extern char *pool_alloctmpspace(Pool
*pool
, int len
);
261 extern void pool_freetmpspace(Pool
*pool
, const char *space
);
262 extern char *pool_tmpjoin(Pool
*pool
, const char *str1
, const char *str2
, const char *str3
);
263 extern char *pool_tmpappend(Pool
*pool
, const char *str1
, const char *str2
, const char *str3
);
264 extern const char *pool_bin2hex(Pool
*pool
, const unsigned char *buf
, int len
);
266 extern void pool_set_installed(Pool
*pool
, struct s_Repo
*repo
);
268 extern int pool_error(Pool
*pool
, int ret
, const char *format
, ...) __attribute__((format(printf
, 3, 4)));
269 extern char *pool_errstr(Pool
*pool
);
271 extern void pool_set_rootdir(Pool
*pool
, const char *rootdir
);
272 extern const char *pool_get_rootdir(Pool
*pool
);
273 extern char *pool_prepend_rootdir(Pool
*pool
, const char *dir
);
274 extern const char *pool_prepend_rootdir_tmp(Pool
*pool
, const char *dir
);
277 * Solvable management
279 extern Id
pool_add_solvable(Pool
*pool
);
280 extern Id
pool_add_solvable_block(Pool
*pool
, int count
);
282 extern void pool_free_solvable_block(Pool
*pool
, Id start
, int count
, int reuseids
);
283 static inline Solvable
*pool_id2solvable(const Pool
*pool
, Id p
)
285 return pool
->solvables
+ p
;
287 static inline Id
pool_solvable2id(const Pool
*pool
, Solvable
*s
)
289 return s
- pool
->solvables
;
292 extern const char *pool_solvable2str(Pool
*pool
, Solvable
*s
);
293 static inline const char *pool_solvid2str(Pool
*pool
, Id p
)
295 return pool_solvable2str(pool
, pool
->solvables
+ p
);
298 void pool_set_languages(Pool
*pool
, const char **languages
, int nlanguages
);
299 Id
pool_id2langid(Pool
*pool
, Id id
, const char *lang
, int create
);
301 int pool_intersect_evrs(Pool
*pool
, int pflags
, Id pevr
, int flags
, Id evr
);
302 int pool_match_dep(Pool
*pool
, Id d1
, Id d2
);
304 /* semi private, used in pool_match_nevr */
305 int pool_match_nevr_rel(Pool
*pool
, Solvable
*s
, Id d
);
307 static inline int pool_match_nevr(Pool
*pool
, Solvable
*s
, Id d
)
312 return pool_match_nevr_rel(pool
, s
, d
);
317 * Prepares a pool for solving
319 extern void pool_createwhatprovides(Pool
*pool
);
320 extern void pool_addfileprovides(Pool
*pool
);
321 extern void pool_addfileprovides_queue(Pool
*pool
, Queue
*idq
, Queue
*idqinst
);
322 extern void pool_freewhatprovides(Pool
*pool
);
323 extern Id
pool_queuetowhatprovides(Pool
*pool
, Queue
*q
);
324 extern Id
pool_ids2whatprovides(Pool
*pool
, Id
*ids
, int count
);
325 extern Id
pool_searchlazywhatprovidesq(Pool
*pool
, Id d
);
327 extern Id
pool_addrelproviders(Pool
*pool
, Id d
);
329 static inline Id
pool_whatprovides(Pool
*pool
, Id d
)
333 if (pool
->whatprovides
[d
])
334 return pool
->whatprovides
[d
];
339 if (pool
->whatprovides_rel
[v
])
340 return pool
->whatprovides_rel
[v
];
342 return pool_addrelproviders(pool
, d
);
345 static inline Id
*pool_whatprovides_ptr(Pool
*pool
, Id d
)
347 Id off
= pool_whatprovides(pool
, d
);
348 return pool
->whatprovidesdata
+ off
;
351 void pool_whatmatchesdep(Pool
*pool
, Id keyname
, Id dep
, Queue
*q
, int marker
);
352 void pool_whatcontainsdep(Pool
*pool
, Id keyname
, Id dep
, Queue
*q
, int marker
);
353 void pool_whatmatchessolvable(Pool
*pool
, Id keyname
, Id solvid
, Queue
*q
, int marker
);
354 void pool_set_whatprovides(Pool
*pool
, Id id
, Id providers
);
357 /* search the pool. the following filters are available:
358 * p - search just this solvable
359 * key - search only this key
360 * match - key must match this string
362 void pool_search(Pool
*pool
, Id p
, Id key
, const char *match
, int flags
, int (*callback
)(void *cbdata
, Solvable
*s
, struct s_Repodata
*data
, struct s_Repokey
*key
, struct s_KeyValue
*kv
), void *cbdata
);
364 void pool_clear_pos(Pool
*pool
);
366 /* lookup functions */
367 const char *pool_lookup_str(Pool
*pool
, Id entry
, Id keyname
);
368 Id
pool_lookup_id(Pool
*pool
, Id entry
, Id keyname
);
369 unsigned long long pool_lookup_num(Pool
*pool
, Id entry
, Id keyname
, unsigned long long notfound
);
370 int pool_lookup_void(Pool
*pool
, Id entry
, Id keyname
);
371 const unsigned char *pool_lookup_bin_checksum(Pool
*pool
, Id entry
, Id keyname
, Id
*typep
);
372 int pool_lookup_idarray(Pool
*pool
, Id entry
, Id keyname
, Queue
*q
);
373 const char *pool_lookup_checksum(Pool
*pool
, Id entry
, Id keyname
, Id
*typep
);
374 const char *pool_lookup_deltalocation(Pool
*pool
, Id entry
, unsigned int *medianrp
);
377 #define DUCHANGES_ONLYADD 1
379 typedef struct s_DUChanges
{
387 void pool_create_state_maps(Pool
*pool
, Queue
*installed
, Map
*installedmap
, Map
*conflictsmap
);
388 void pool_calc_duchanges(Pool
*pool
, Map
*installedmap
, DUChanges
*mps
, int nmps
);
389 long long pool_calc_installsizechange(Pool
*pool
, Map
*installedmap
);
391 void pool_add_fileconflicts_deps(Pool
*pool
, Queue
*conflicts
);
395 /* loop over all providers of d */
396 #define FOR_PROVIDES(v, vp, d) \
397 for (vp = pool_whatprovides(pool, d) ; (v = pool->whatprovidesdata[vp++]) != 0; )
399 /* loop over all repositories */
400 #define FOR_REPOS(repoid, r) \
401 for (repoid = 1; repoid < pool->nrepos; repoid++) \
402 if ((r = pool->repos[repoid]) == 0) \
406 #define FOR_POOL_SOLVABLES(p) \
407 for (p = 2; p < pool->nsolvables; p++) \
408 if (pool->solvables[p].repo == 0) \
412 #define POOL_DEBUG(type, ...) do {if ((pool->debugmask & (type)) != 0) pool_debug(pool, (type), __VA_ARGS__);} while (0)
413 #define IF_POOLDEBUG(type) if ((pool->debugmask & (type)) != 0)
415 /* weird suse stuff */
416 void pool_trivial_installable_multiversionmap(Pool
*pool
, Map
*installedmap
, Queue
*pkgs
, Queue
*res
, Map
*multiversionmap
);
417 void pool_trivial_installable(Pool
*pool
, Map
*installedmap
, Queue
*pkgs
, Queue
*res
);
424 #endif /* LIBSOLV_POOL_H */