repo.h 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  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. * repo.h
  9. *
  10. */
  11. #ifndef LIBSOLV_REPO_H
  12. #define LIBSOLV_REPO_H
  13. #include "pooltypes.h"
  14. #include "pool.h"
  15. #include "poolarch.h"
  16. #include "repodata.h"
  17. #include "dataiterator.h"
  18. #include "hash.h"
  19. #ifdef __cplusplus
  20. extern "C" {
  21. #endif
  22. typedef struct s_Repo {
  23. const char *name; /* name pointer */
  24. Id repoid; /* our id */
  25. void *appdata; /* application private pointer */
  26. Pool *pool; /* pool containing this repo */
  27. int start; /* start of this repo solvables within pool->solvables */
  28. int end; /* last solvable + 1 of this repo */
  29. int nsolvables; /* number of solvables repo is contributing to pool */
  30. int disabled; /* ignore the solvables? */
  31. int priority; /* priority of this repo */
  32. int subpriority; /* sub-priority of this repo, used just for sorting, not pruning */
  33. Id *idarraydata; /* array of metadata Ids, solvable dependencies are offsets into this array */
  34. int idarraysize;
  35. int nrepodata; /* number of our stores.. */
  36. Id *rpmdbid; /* solvable side data: rpm database id */
  37. #ifdef LIBSOLV_INTERNAL
  38. Repodata *repodata; /* our stores for non-solvable related data */
  39. Offset lastoff; /* start of last array in idarraydata */
  40. Hashtable lastidhash; /* hash to speed up repo_addid_dep */
  41. Hashval lastidhash_mask;
  42. int lastidhash_idarraysize;
  43. int lastmarker;
  44. Offset lastmarkerpos;
  45. #endif /* LIBSOLV_INTERNAL */
  46. } Repo;
  47. extern Repo *repo_create(Pool *pool, const char *name);
  48. extern void repo_free(Repo *repo, int reuseids);
  49. extern void repo_empty(Repo *repo, int reuseids);
  50. extern void repo_freedata(Repo *repo);
  51. extern Id repo_add_solvable(Repo *repo);
  52. extern Id repo_add_solvable_block(Repo *repo, int count);
  53. extern void repo_free_solvable(Repo *repo, Id p, int reuseids);
  54. extern void repo_free_solvable_block(Repo *repo, Id start, int count, int reuseids);
  55. extern void *repo_sidedata_create(Repo *repo, size_t size);
  56. extern void *repo_sidedata_extend(Repo *repo, void *b, size_t size, Id p, int count);
  57. extern Id repo_add_solvable_block_before(Repo *repo, int count, Repo *beforerepo);
  58. extern Offset repo_addid(Repo *repo, Offset olddeps, Id id);
  59. extern Offset repo_addid_dep(Repo *repo, Offset olddeps, Id id, Id marker);
  60. extern Offset repo_reserve_ids(Repo *repo, Offset olddeps, int num);
  61. static inline const char *repo_name(const Repo *repo)
  62. {
  63. return repo->name;
  64. }
  65. /* those two functions are here because they need the Repo definition */
  66. static inline Repo *pool_id2repo(Pool *pool, Id repoid)
  67. {
  68. return repoid < pool->nrepos ? pool->repos[repoid] : 0;
  69. }
  70. static inline int pool_disabled_solvable(const Pool *pool, Solvable *s)
  71. {
  72. if (s->repo && s->repo->disabled)
  73. return 1;
  74. if (pool->considered)
  75. {
  76. Id id = s - pool->solvables;
  77. if (!MAPTST(pool->considered, id))
  78. return 1;
  79. }
  80. return 0;
  81. }
  82. static inline int pool_badarch_solvable(const Pool *pool, Solvable *s)
  83. {
  84. if (pool->id2arch && (!s->arch || pool_arch2score(pool, s->arch) == 0))
  85. return 1;
  86. return 0;
  87. }
  88. static inline int pool_installable(const Pool *pool, Solvable *s)
  89. {
  90. if (s->arch == ARCH_SRC || s->arch == ARCH_NOSRC)
  91. return 0;
  92. if (s->repo && s->repo->disabled)
  93. return 0;
  94. if (pool->id2arch && (!s->arch || pool_arch2score(pool, s->arch) == 0))
  95. return 0;
  96. if (pool->considered)
  97. {
  98. Id id = s - pool->solvables;
  99. if (!MAPTST(pool->considered, id))
  100. return 0;
  101. }
  102. return 1;
  103. }
  104. #ifdef LIBSOLV_INTERNAL
  105. static inline int pool_installable_whatprovides(const Pool *pool, Solvable *s)
  106. {
  107. /* we always need the installed solvable in the whatprovides data,
  108. otherwise obsoletes/conflicts on them won't work */
  109. if (s->repo != pool->installed)
  110. {
  111. if (s->arch == ARCH_SRC || s->arch == ARCH_NOSRC || pool_badarch_solvable(pool, s))
  112. return 0;
  113. if (pool->considered && !pool->whatprovideswithdisabled)
  114. {
  115. Id id = s - pool->solvables;
  116. if (!MAPTST(pool->considered, id))
  117. return 0;
  118. }
  119. }
  120. return 1;
  121. }
  122. #endif
  123. /* not in solvable.h because we need the repo definition */
  124. static inline Solvable *solvable_free(Solvable *s, int reuseids)
  125. {
  126. if (s && s->repo)
  127. repo_free_solvable(s->repo, s - s->repo->pool->solvables, reuseids);
  128. return 0;
  129. }
  130. /* search callback values */
  131. #define SEARCH_NEXT_KEY 1
  132. #define SEARCH_NEXT_SOLVABLE 2
  133. #define SEARCH_STOP 3
  134. #define SEARCH_ENTERSUB -1
  135. /* standard flags used in the repo_add functions */
  136. #define REPO_REUSE_REPODATA (1 << 0)
  137. #define REPO_NO_INTERNALIZE (1 << 1)
  138. #define REPO_LOCALPOOL (1 << 2)
  139. #define REPO_USE_LOADING (1 << 3)
  140. #define REPO_EXTEND_SOLVABLES (1 << 4)
  141. #define REPO_USE_ROOTDIR (1 << 5)
  142. #define REPO_NO_LOCATION (1 << 6)
  143. Repodata *repo_add_repodata(Repo *repo, int flags);
  144. Repodata *repo_id2repodata(Repo *repo, Id id);
  145. Repodata *repo_last_repodata(Repo *repo);
  146. void repo_search(Repo *repo, Id p, Id key, const char *match, int flags, int (*callback)(void *cbdata, Solvable *s, Repodata *data, Repokey *key, KeyValue *kv), void *cbdata);
  147. /* returns the last repodata that contains the key */
  148. Repodata *repo_lookup_repodata(Repo *repo, Id entry, Id keyname);
  149. Repodata *repo_lookup_repodata_opt(Repo *repo, Id entry, Id keyname);
  150. Repodata *repo_lookup_filelist_repodata(Repo *repo, Id entry, Datamatcher *matcher);
  151. /* returns the string value of the attribute, or NULL if not found */
  152. Id repo_lookup_type(Repo *repo, Id entry, Id keyname);
  153. const char *repo_lookup_str(Repo *repo, Id entry, Id keyname);
  154. /* returns the integer value of the attribute, or notfound if not found */
  155. unsigned long long repo_lookup_num(Repo *repo, Id entry, Id keyname, unsigned long long notfound);
  156. Id repo_lookup_id(Repo *repo, Id entry, Id keyname);
  157. int repo_lookup_idarray(Repo *repo, Id entry, Id keyname, Queue *q);
  158. int repo_lookup_deparray(Repo *repo, Id entry, Id keyname, Queue *q, Id marker);
  159. int repo_lookup_void(Repo *repo, Id entry, Id keyname);
  160. const char *repo_lookup_checksum(Repo *repo, Id entry, Id keyname, Id *typep);
  161. const unsigned char *repo_lookup_bin_checksum(Repo *repo, Id entry, Id keyname, Id *typep);
  162. const void *repo_lookup_binary(Repo *repo, Id entry, Id keyname, int *lenp);
  163. unsigned int repo_lookup_count(Repo *repo, Id entry, Id keyname); /* internal */
  164. Id solv_depmarker(Id keyname, Id marker);
  165. void repo_set_id(Repo *repo, Id p, Id keyname, Id id);
  166. void repo_set_num(Repo *repo, Id p, Id keyname, unsigned long long num);
  167. void repo_set_str(Repo *repo, Id p, Id keyname, const char *str);
  168. void repo_set_poolstr(Repo *repo, Id p, Id keyname, const char *str);
  169. void repo_add_poolstr_array(Repo *repo, Id p, Id keyname, const char *str);
  170. void repo_add_idarray(Repo *repo, Id p, Id keyname, Id id);
  171. void repo_add_deparray(Repo *repo, Id p, Id keyname, Id dep, Id marker);
  172. void repo_set_idarray(Repo *repo, Id p, Id keyname, Queue *q);
  173. void repo_set_deparray(Repo *repo, Id p, Id keyname, Queue *q, Id marker);
  174. void repo_unset(Repo *repo, Id p, Id keyname);
  175. void repo_internalize(Repo *repo);
  176. void repo_disable_paging(Repo *repo);
  177. Id *repo_create_keyskip(Repo *repo, Id entry, Id **oldkeyskip);
  178. /* iterator macros */
  179. #define FOR_REPO_SOLVABLES(r, p, s) \
  180. for (p = (r)->start, s = (r)->pool->solvables + p; p < (r)->end; p++, s = (r)->pool->solvables + p) \
  181. if (s->repo != (r)) \
  182. continue; \
  183. else
  184. #ifdef LIBSOLV_INTERNAL
  185. #define FOR_REPODATAS(repo, rdid, data) \
  186. for (rdid = 1, data = repo->repodata + rdid; rdid < repo->nrepodata; rdid++, data++)
  187. #else
  188. #define FOR_REPODATAS(repo, rdid, data) \
  189. for (rdid = 1; rdid < repo->nrepodata && (data = repo_id2repodata(repo, rdid)); rdid++)
  190. #endif
  191. /* weird suse stuff, do not use */
  192. extern Offset repo_fix_supplements(Repo *repo, Offset provides, Offset supplements, Offset freshens);
  193. extern Offset repo_fix_conflicts(Repo *repo, Offset conflicts);
  194. extern void repo_rewrite_suse_deps(Solvable *s, Offset freshens);
  195. #ifdef __cplusplus
  196. }
  197. #endif
  198. #endif /* LIBSOLV_REPO_H */