satsolver
0.17.2
Main Page
Related Pages
Classes
Files
File List
File Members
src
pool.h
Go to the documentation of this file.
1
/*
2
* Copyright (c) 2007, Novell Inc.
3
*
4
* This program is licensed under the BSD license, read LICENSE.BSD
5
* for further information
6
*/
7
8
/*
9
* pool.h
10
*
11
*/
12
13
#ifndef SATSOLVER_POOL_H
14
#define SATSOLVER_POOL_H
15
16
#ifdef __cplusplus
17
extern
"C"
{
18
#endif
19
20
#include <stdio.h>
21
22
#include "satversion.h"
23
#include "
pooltypes.h
"
24
#include "
poolid.h
"
25
#include "
solvable.h
"
26
#include "
bitmap.h
"
27
#include "
queue.h
"
28
#include "
strpool.h
"
29
30
/* well known ids */
31
#include "
knownid.h
"
32
33
/* well known solvable */
34
#define SYSTEMSOLVABLE 1
35
36
37
/* how many strings to maintain (round robin) */
38
#define POOL_TMPSPACEBUF 16
39
40
//-----------------------------------------------
41
42
struct
_Repo
;
43
struct
_Repodata
;
44
struct
_Repokey
;
45
struct
_KeyValue
;
46
47
typedef
struct
_Datapos
{
48
struct
_Repo
*
repo
;
49
Id
solvid
;
50
Id
repodataid
;
51
Id
schema
;
52
Id
dp
;
53
}
Datapos
;
54
55
struct
_Pool_tmpspace
{
56
char
*
buf
[
POOL_TMPSPACEBUF
];
57
int
len
[
POOL_TMPSPACEBUF
];
58
int
n
;
59
};
60
61
struct
_Pool
{
62
void
*
appdata
;
/* application private pointer */
63
64
struct
_Stringpool
ss
;
65
66
Reldep
*
rels
;
/* table of rels: Id -> Reldep */
67
int
nrels
;
/* number of unique rels */
68
Hashtable
relhashtbl
;
/* hashtable: (name,evr,op)Hash -> Id */
69
Hashmask
relhashmask
;
70
71
struct
_Repo
**
repos
;
72
int
nrepos
;
73
74
struct
_Repo
*
installed
;
/* packages considered installed */
75
76
Solvable
*
solvables
;
77
int
nsolvables
;
78
79
const
char
**
languages
;
80
int
nlanguages
;
81
Id
*
languagecache
;
82
int
languagecacheother
;
83
84
/* flags to tell the library how the installed rpm works */
85
int
promoteepoch
;
/* true: missing epoch is replaced by epoch of dependency */
86
int
obsoleteusesprovides
;
/* true: obsoletes are matched against provides, not names */
87
int
implicitobsoleteusesprovides
;
/* true: implicit obsoletes due to same name are matched against provides, not names */
88
int
obsoleteusescolors
;
/* true: obsoletes check arch color */
89
int
noinstalledobsoletes
;
/* true: ignore obsoletes of installed packages */
90
int
novirtualconflicts
;
/* true: conflicts on names, not on provides */
91
int
allowselfconflicts
;
/* true: packages which conflict with itself are installable */
92
#ifdef MULTI_SEMANTICS
93
int
disttype;
94
#endif
95
96
Id
*
id2arch
;
/* map arch ids to scores */
97
unsigned
char
*
id2color
;
/* map arch ids to colors */
98
Id
lastarch
;
/* last valid entry in id2arch/id2color */
99
100
Queue
vendormap
;
/* map vendor to vendorclasses mask */
101
const
char
**
vendorclasses
;
/* vendor equivalence classes */
102
103
/* providers data, as two-step indirect list
104
* whatprovides[Id] -> Offset into whatprovidesdata for name
105
* whatprovidesdata[Offset] -> ID_NULL-terminated list of solvables providing Id
106
*/
107
Offset
*
whatprovides
;
/* Offset to providers of a specific name, Id -> Offset */
108
Offset
*
whatprovides_rel
;
/* Offset to providers of a specific relation, Id -> Offset */
109
110
Id
*
whatprovidesdata
;
/* Ids of solvable providing Id */
111
Offset
whatprovidesdataoff
;
/* next free slot within whatprovidesdata */
112
int
whatprovidesdataleft
;
/* number of 'free slots' within whatprovidesdata */
113
114
/* If nonzero, then consider only the solvables with Ids set in this
115
bitmap for solving. If zero, consider all solvables. */
116
Map
*
considered
;
117
118
Id
(*
nscallback
)(
struct
_Pool
*,
void
*data,
Id
name,
Id
evr);
119
void
*
nscallbackdata
;
120
121
/* our tmp space string space */
122
struct
_Pool_tmpspace
tmpspace
;
123
124
/* debug mask and callback */
125
int
debugmask
;
126
void (*
debugcallback
)(
struct
_Pool
*,
void
*data,
int
type,
const
char
*str);
127
void
*
debugcallbackdata
;
128
129
/* load callback */
130
int (*
loadcallback
)(
struct
_Pool
*,
struct
_Repodata
*,
void
*);
131
void
*
loadcallbackdata
;
132
133
/* search position */
134
Datapos
pos
;
135
};
136
137
#ifdef MULTI_SEMANTICS
138
# define DISTTYPE_RPM 0
139
# define DISTTYPE_DEB 1
140
#endif
141
142
#define SAT_FATAL (1<<0)
143
#define SAT_ERROR (1<<1)
144
#define SAT_WARN (1<<2)
145
#define SAT_DEBUG_STATS (1<<3)
146
#define SAT_DEBUG_RULE_CREATION (1<<4)
147
#define SAT_DEBUG_PROPAGATE (1<<5)
148
#define SAT_DEBUG_ANALYZE (1<<6)
149
#define SAT_DEBUG_UNSOLVABLE (1<<7)
150
#define SAT_DEBUG_SOLUTIONS (1<<8)
151
#define SAT_DEBUG_POLICY (1<<9)
152
#define SAT_DEBUG_RESULT (1<<10)
153
#define SAT_DEBUG_JOB (1<<11)
154
#define SAT_DEBUG_SCHUBI (1<<12)
155
#define SAT_DEBUG_SOLVER (1<<13)
156
#define SAT_DEBUG_TRANSACTION (1<<14)
157
158
#define SAT_DEBUG_TO_STDERR (1<<30)
159
160
//-----------------------------------------------
161
162
163
/* mark dependencies with relation by setting bit31 */
164
165
#define MAKERELDEP(id) ((id) | 0x80000000)
166
#define ISRELDEP(id) (((id) & 0x80000000) != 0)
167
#define GETRELID(id) ((id) ^ 0x80000000)
/* returns Id */
168
#define GETRELDEP(pool, id) ((pool)->rels + ((id) ^ 0x80000000))
/* returns Reldep* */
169
170
#define REL_GT 1
171
#define REL_EQ 2
172
#define REL_LT 4
173
174
#define REL_AND 16
175
#define REL_OR 17
176
#define REL_WITH 18
177
#define REL_NAMESPACE 19
178
#define REL_ARCH 20
179
#define REL_FILECONFLICT 21
180
181
#if !defined(__GNUC__) && !defined(__attribute__)
182
# define __attribute__(x)
183
#endif
184
188
extern
Pool
*
pool_create
(
void
);
192
extern
void
pool_free
(
Pool
*pool);
193
194
extern
void
pool_setdebuglevel
(
Pool
*pool,
int
level);
195
#ifdef MULTI_SEMANTICS
196
extern
void
pool_setdisttype(
Pool
*pool,
int
disttype);
197
#endif
198
extern
void
pool_setvendorclasses
(
Pool
*pool,
const
char
**vendorclasses);
199
200
extern
void
pool_debug
(
Pool
*pool,
int
type,
const
char
*format, ...)
__attribute__
((format(printf, 3, 4)));
201
202
extern
char
*
pool_alloctmpspace
(
Pool
*pool,
int
len);
203
extern
void
pool_freetmpspace
(
Pool
*pool, const
char
*space);
204
extern
char
*
pool_tmpjoin
(
Pool
*pool, const
char
*str1, const
char
*str2, const
char
*str3);
205
extern
char
*
pool_tmpappend
(
Pool
*pool, const
char
*str1, const
char
*str2, const
char
*str3);
206
extern const
char
*
pool_bin2hex
(
Pool
*pool, const
unsigned
char
*buf,
int
len);
207
208
extern
void
pool_set_installed
(
Pool
*pool, struct
_Repo
*
repo
);
209
213
extern
Id
pool_add_solvable
(
Pool
*pool);
214
extern
Id
pool_add_solvable_block
(
Pool
*pool,
int
count);
215
216
extern
void
pool_free_solvable_block
(
Pool
*pool,
Id
start
,
int
count,
int
reuseids);
217
static inline
Solvable
*
pool_id2solvable
(const
Pool
*pool,
Id
p)
218
{
219
return
pool->solvables + p;
220
}
221
222
extern
const
char
*
pool_solvable2str
(
Pool
*pool,
Solvable
*s);
223
static
inline
const
char
*
pool_solvid2str
(
Pool
*pool,
Id
p)
224
{
225
return
pool_solvable2str
(pool, pool->
solvables
+ p);
226
}
227
228
/* obsolete, do not use anymore */
229
static
inline
const
char
*
solvable2str
(
Pool
*pool,
Solvable
*s)
230
{
231
return
pool_solvable2str
(pool, s);
232
}
233
static
inline
const
char
*
solvid2str
(
Pool
*pool,
Id
p)
234
{
235
return
pool_solvable2str
(pool, pool->
solvables
+ p);
236
}
237
238
void
pool_set_languages
(
Pool
*pool,
const
char
**languages,
int
nlanguages);
239
Id
pool_id2langid
(
Pool
*pool,
Id
id
,
const
char
*lang,
int
create);
240
241
Id
solvable_lookup_id
(
Solvable
*s,
Id
keyname);
242
unsigned
int
solvable_lookup_num
(
Solvable
*s,
Id
keyname,
unsigned
int
notfound);
243
const
char
*
solvable_lookup_str
(
Solvable
*s,
Id
keyname);
244
const
char
*
solvable_lookup_str_poollang
(
Solvable
*s,
Id
keyname);
245
const
char
*
solvable_lookup_str_lang
(
Solvable
*s,
Id
keyname,
const
char
*lang,
int
usebase);
246
int
solvable_lookup_bool
(
Solvable
*s,
Id
keyname);
247
int
solvable_lookup_void
(
Solvable
*s,
Id
keyname);
248
char
*
solvable_get_location
(
Solvable
*s,
unsigned
int
*medianrp);
249
const
unsigned
char
*
solvable_lookup_bin_checksum
(
Solvable
*s,
Id
keyname,
Id
*typep);
250
const
char
*
solvable_lookup_checksum
(
Solvable
*s,
Id
keyname,
Id
*typep);
251
int
solvable_lookup_idarray
(
Solvable
*s,
Id
keyname,
Queue
*q);
252
int
solvable_identical
(
Solvable
*s1,
Solvable
*s2);
253
Id
solvable_selfprovidedep
(
Solvable
*s);
254
255
int
solvable_trivial_installable_map
(
Solvable
*s,
Map
*installedmap,
Map
*conflictsmap);
256
int
solvable_trivial_installable_repo
(
Solvable
*s,
struct
_Repo
*installed);
257
int
solvable_trivial_installable_queue
(
Solvable
*s,
Queue
*installed);
258
259
void
pool_create_state_maps
(
Pool
*pool,
Queue
*installed,
Map
*installedmap,
Map
*conflictsmap);
260
261
int
pool_match_nevr_rel
(
Pool
*pool,
Solvable
*s,
Id
d);
262
int
pool_match_dep
(
Pool
*pool,
Id
d1,
Id
d2);
263
264
static
inline
int
pool_match_nevr
(
Pool
*pool,
Solvable
*s,
Id
d)
265
{
266
if
(!
ISRELDEP
(d))
267
return
d == s->
name
;
268
else
269
return
pool_match_nevr_rel
(pool, s, d);
270
}
271
272
276
extern
void
pool_createwhatprovides
(
Pool
*pool);
277
extern
void
pool_addfileprovides
(
Pool
*pool);
278
extern
void
pool_addfileprovides_ids
(
Pool
*pool,
struct
_Repo
*installed,
Id
**idp);
279
extern
void
pool_freewhatprovides
(
Pool
*pool);
280
extern
Id
pool_queuetowhatprovides
(
Pool
*pool,
Queue
*q);
281
282
extern
Id
pool_addrelproviders
(
Pool
*pool,
Id
d);
283
284
static
inline
Id
pool_whatprovides
(
Pool
*pool,
Id
d)
285
{
286
Id
v;
287
if
(!
ISRELDEP
(d))
288
return
pool->
whatprovides
[d];
289
v =
GETRELID
(d);
290
if
(pool->
whatprovides_rel
[v])
291
return
pool->
whatprovides_rel
[v];
292
return
pool_addrelproviders
(pool, d);
293
}
294
295
static
inline
Id
*
pool_whatprovides_ptr
(
Pool
*pool,
Id
d)
296
{
297
Id
off =
pool_whatprovides
(pool, d);
298
return
pool->
whatprovidesdata
+ off;
299
}
300
301
static
inline
void
pool_setdebugcallback
(
Pool
*pool,
void
(*debugcallback)(
struct
_Pool
*,
void
*data,
int
type,
const
char
*str),
void
*debugcallbackdata)
302
{
303
pool->
debugcallback
= debugcallback;
304
pool->
debugcallbackdata
= debugcallbackdata;
305
}
306
307
static
inline
void
pool_setdebugmask
(
Pool
*pool,
int
mask)
308
{
309
pool->
debugmask
= mask;
310
}
311
312
static
inline
void
pool_setloadcallback
(
Pool
*pool,
int
(*cb)(
struct
_Pool
*,
struct
_Repodata
*,
void
*),
void
*loadcbdata)
313
{
314
pool->
loadcallback
= cb;
315
pool->
loadcallbackdata
= loadcbdata;
316
}
317
318
/* search the pool. the following filters are available:
319
* p - search just this solvable
320
* key - search only this key
321
* match - key must match this string
322
*/
323
void
pool_search
(
Pool
*pool,
Id
p,
Id
key,
const
char
*match,
int
flags,
int
(*callback)(
void
*cbdata,
Solvable
*s,
struct
_Repodata
*data,
struct
_Repokey
*key,
struct
_KeyValue
*kv),
void
*cbdata);
324
325
void
pool_clear_pos
(
Pool
*pool);
326
327
328
typedef
struct
_DUChanges
{
329
const
char
*
path
;
330
int
kbytes
;
331
int
files
;
332
}
DUChanges
;
333
334
void
pool_calc_duchanges
(
Pool
*pool,
Map
*installedmap,
DUChanges
*mps,
int
nmps);
335
int
pool_calc_installsizechange
(
Pool
*pool,
Map
*installedmap);
336
void
pool_trivial_installable
(
Pool
*pool,
Map
*installedmap,
Queue
*pkgs,
Queue
*res);
337
void
pool_trivial_installable_noobsoletesmap
(
Pool
*pool,
Map
*installedmap,
Queue
*pkgs,
Queue
*res,
Map
*noobsoletesmap);
338
339
const
char
*
pool_lookup_str
(
Pool
*pool,
Id
entry,
Id
keyname);
340
Id
pool_lookup_id
(
Pool
*pool,
Id
entry,
Id
keyname);
341
unsigned
int
pool_lookup_num
(
Pool
*pool,
Id
entry,
Id
keyname,
unsigned
int
notfound);
342
int
pool_lookup_void
(
Pool
*pool,
Id
entry,
Id
keyname);
343
const
unsigned
char
*
pool_lookup_bin_checksum
(
Pool
*pool,
Id
entry,
Id
keyname,
Id
*typep);
344
const
char
*
pool_lookup_checksum
(
Pool
*pool,
Id
entry,
Id
keyname,
Id
*typep);
345
346
void
pool_add_fileconflicts_deps
(
Pool
*pool,
Queue
*conflicts);
347
348
349
350
/* loop over all providers of d */
351
#define FOR_PROVIDES(v, vp, d) \
352
for (vp = pool_whatprovides(pool, d) ; (v = pool->whatprovidesdata[vp++]) != 0; )
353
354
/* loop over all repositories */
355
/* note that idx is not the repoid */
356
#define FOR_REPOS(idx, r) \
357
for (idx = 0; idx < pool->nrepos; idx++) \
358
if ((r = pool->repos[idx]) != 0)
359
360
361
#define POOL_DEBUG(type, ...) do {if ((pool->debugmask & (type)) != 0) pool_debug(pool, (type), __VA_ARGS__);} while (0)
362
#define IF_POOLDEBUG(type) if ((pool->debugmask & (type)) != 0)
363
364
#ifdef __cplusplus
365
}
366
#endif
367
368
369
#endif
/* SATSOLVER_POOL_H */
Generated by
1.8.4