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