44b7f3add2584969308b41c59a8ec8cfdd99e10f
[platform/upstream/libsolv.git] / src / repo.h
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  * repo.h
10  * 
11  */
12
13 #ifndef SATSOLVER_REPO_H
14 #define SATSOLVER_REPO_H
15
16 #include "pooltypes.h"
17 #include "pool.h"
18
19 typedef struct _Repo {
20   const char *name;
21   struct _Pool *pool;           /* pool containing repo data */
22   int start;                    /* start of this repo solvables within pool->solvables */
23   int end;                      /* last solvable + 1 of this repo */
24   int nsolvables;               /* number of solvables repo is contributing to pool */
25
26   int priority;                 /* priority of this repo */
27
28   Id *idarraydata;              /* array of metadata Ids, solvable dependencies are offsets into this array */
29   int idarraysize;
30   Offset lastoff;
31
32   Id *rpmdbid;
33 } Repo;
34
35 extern Repo *repo_create(Pool *pool, const char *name);
36 extern void repo_free(Repo *repo, int reuseids);
37 extern void repo_freeallrepos(Pool *pool, int reuseids);
38
39 extern Offset repo_addid(Repo *repo, Offset olddeps, Id id);
40 extern Offset repo_addid_dep(Repo *repo, Offset olddeps, Id id, int isreq);
41 extern Offset repo_reserve_ids(Repo *repo, Offset olddeps, int num);
42 extern Offset repo_fix_legacy(Repo *repo, Offset provides, Offset supplements);
43
44 static inline const char *repo_name(const Repo *repo)
45 {
46   return repo->name;
47 }
48
49 static inline Id repo_add_solvable(Repo *repo)
50 {
51   extern Id pool_add_solvable(Pool *pool);
52   Id p = pool_add_solvable(repo->pool);
53   if (!repo->start || repo->start == repo->end)
54     {
55       repo->start = p;
56       repo->end = p + 1;
57     }
58   else
59     {
60       if (p < repo->start)
61         repo->start = p;
62       if (p + 1 > repo->end)
63         repo->end = p + 1;
64     }
65   repo->nsolvables++;
66   repo->pool->solvables[p].repo = repo;
67   return p;
68 }
69
70 static inline Id repo_add_solvable_block(Repo *repo, int count)
71 {
72   extern Id pool_add_solvable_block(Pool *pool, int count);
73   Id p;
74   Solvable *s;
75   if (!count)
76     return 0;
77   p = pool_add_solvable_block(repo->pool, count);
78   if (!repo->start || repo->start == repo->end)
79     {
80       repo->start = p;
81       repo->end = p + count;
82     }
83   else
84     {
85       if (p < repo->start)
86         repo->start = p;
87       if (p + count > repo->end)
88         repo->end = p + count;
89     }
90   repo->nsolvables += count;
91   for (s = repo->pool->solvables + p; count--; s++)
92     s->repo = repo;
93   return p;
94 }
95
96 static inline void repo_free_solvable_block(Repo *repo, Id start, int count, int reuseids)
97 {
98   extern void pool_free_solvable_block(Pool *pool, Id start, int count, int reuseids);
99   Solvable *s;
100   int i;
101   if (start + count == repo->end)
102     repo->end -= count;
103   repo->nsolvables -= count;
104   for (s = repo->pool->solvables + start, i = count; i--; s++)
105     s->repo = 0;
106   pool_free_solvable_block(repo->pool, start, count, reuseids);
107 }
108
109 #define FOR_REPO_SOLVABLES(r, p, s)                                             \
110   for (p = (r)->start, s = (r)->pool->solvables + p; p < (r)->end; p++, s++)    \
111     if (s->repo == (r))
112
113 #endif /* SATSOLVER_REPO_H */