1 #ifndef H_RPMDB_INTERNAL 2 #define H_RPMDB_INTERNAL 3 4 #include <assert.h> 5 6 #include <rpm/rpmsw.h> 7 #include <rpm/rpmtypes.h> 8 #include <rpm/rpmutil.h> 9 #include "lib/backend/dbi.h" 10 11 #ifdef __cplusplus 12 extern "C" { 13 #endif 14 15 #undef HASHTYPE 16 #undef HTKEYTYPE 17 #undef HTDATATYPE 18 #define HASHTYPE packageHash 19 #define HTKEYTYPE unsigned int 20 #define HTDATATYPE struct rpmte_s * 21 #include "rpmhash.H" 22 #undef HASHTYPE 23 #undef HTKEYTYPE 24 #undef HTDATATYPE 25 26 enum rpmdbRebuildFlags_e { 27 RPMDB_REBUILD_FLAG_SALVAGE = (1 << 0), 28 }; 29 30 /** \ingroup rpmdb 31 * Reference a database instance. 32 * @param db rpm database 33 * @return new rpm database reference 34 */ 35 rpmdb rpmdbLink(rpmdb db); 36 37 /** \ingroup rpmdb 38 * Open rpm database. 39 * @param prefix path to top of install tree 40 * @retval dbp address of rpm database 41 * @param mode open(2) flags: O_RDWR or O_RDONLY (O_CREAT also) 42 * @param perms database permissions 43 * @return 0 on success 44 */ 45 RPM_GNUC_INTERNAL 46 int rpmdbOpen (const char * prefix, rpmdb * dbp, int mode, int perms); 47 48 /** \ingroup rpmdb 49 * Initialize database. 50 * @param prefix path to top of install tree 51 * @param perms database permissions 52 * @return 0 on success 53 */ 54 RPM_GNUC_INTERNAL 55 int rpmdbInit(const char * prefix, int perms); 56 57 /** \ingroup rpmdb 58 * Close all database indices and free rpmdb. 59 * @param db rpm database 60 * @return 0 on success 61 */ 62 RPM_GNUC_INTERNAL 63 int rpmdbClose (rpmdb db); 64 65 /** \ingroup rpmdb 66 * Rebuild database indices from package headers. 67 * @param prefix path to top of install tree 68 * @param ts transaction set (or NULL) 69 * @param (*hdrchk) headerCheck() vector (or NULL) 70 * @param rebuildflags flags 71 * @return 0 on success 72 */ 73 RPM_GNUC_INTERNAL 74 int rpmdbRebuild(const char * prefix, rpmts ts, 75 rpmRC (*hdrchk) (rpmts ts, const void *uh, size_t uc, char ** msg), 76 int rebuildflags); 77 78 /** \ingroup rpmdb 79 * Verify database components. 80 * @param prefix path to top of install tree 81 * @return 0 on success 82 */ 83 RPM_GNUC_INTERNAL 84 int rpmdbVerify(const char * prefix); 85 86 /** \ingroup rpmdb 87 * Add package header to rpm database and indices. 88 * @param db rpm database 89 * @param h header 90 * @return 0 on success 91 */ 92 RPM_GNUC_INTERNAL 93 int rpmdbAdd(rpmdb db, Header h); 94 95 /** \ingroup rpmdb 96 * Remove package header from rpm database and indices. 97 * @param db rpm database 98 * @param hdrNum package instance number in database 99 * @return 0 on success 100 */ 101 RPM_GNUC_INTERNAL 102 int rpmdbRemove(rpmdb db, unsigned int hdrNum); 103 104 /** \ingroup rpmdb 105 * Return rpmdb home directory (depending on chroot state) 106 * param db rpmdb handle 107 * return db home directory (or NULL on error) 108 */ 109 RPM_GNUC_INTERNAL 110 const char *rpmdbHome(rpmdb db); 111 112 /** \ingroup rpmdb 113 * Return database iterator. 114 * @param mi rpm database iterator 115 * @param keyp key data (NULL for sequential access) 116 * @param keylen key data length (0 will use strlen(keyp)) 117 * @return 0 on success 118 */ 119 int rpmdbExtendIterator(rpmdbMatchIterator mi, 120 const void * keyp, size_t keylen); 121 122 /** \ingroup rpmdb 123 * sort the iterator by (recnum, filenum) 124 * Return database iterator. 125 * @param mi rpm database iterator 126 */ 127 void rpmdbSortIterator(rpmdbMatchIterator mi); 128 129 /** \ingroup rpmdb 130 * uniq the iterator by recnum 131 * Return database iterator. 132 * @param mi rpm database iterator 133 */ 134 void rpmdbUniqIterator(rpmdbMatchIterator mi); 135 136 /** \ingroup rpmdb 137 * If neg equals to zero then it leaves in iterator only packages that 138 * header numbers are in hdrNums. If neg is not zero then removes from iterator 139 * all packages that header numbers are in hdrNums. 140 * @param mi rpm database iterator 141 * @param hdrNums hash of package numbers 142 * @param neg mode 143 * return 0 on success, 1 on failure (bad args) 144 */ 145 int rpmdbFilterIterator(rpmdbMatchIterator mi, packageHash hdrNums, int neg); 146 147 /** \ingroup rpmdb 148 * Remove items from set of package instances to iterate. 149 * @note Sorted hdrNums are always passed in rpmlib. 150 * @param mi rpm database iterator 151 * @param hdrNums hash of package instances 152 * @return 0 on success, 1 on failure (bad args) 153 */ 154 int rpmdbPruneIterator(rpmdbMatchIterator mi, packageHash hdrNums); 155 156 /** \ingroup rpmdb 157 * Create a new, empty match iterator (for purposes of extending it 158 * through other means) 159 * @param db rpm database 160 * @param dbitag database index tag 161 * @return empty match iterator 162 */ 163 RPM_GNUC_INTERNAL 164 rpmdbMatchIterator rpmdbNewIterator(rpmdb db, rpmDbiTagVal dbitag); 165 166 /** \ingroup rpmdb 167 * Return database iterator that iterates over database items 168 * starting with pfx. 169 * @param db rpm database 170 * @param rpmtag database index tag 171 * @param pfx prefix data 172 * @param plen prefix data length (0 will use strlen(keyp)) 173 * @return NULL on failure 174 */ 175 RPM_GNUC_INTERNAL 176 rpmdbMatchIterator rpmdbInitPrefixIterator(rpmdb db, rpmDbiTagVal rpmtag, 177 const void * pfx, size_t plen); 178 /** \ingroup rpmdb 179 * Get package offsets of entries 180 * @param ii index iterator 181 * @return db offsets of pkgs 182 */ 183 RPM_GNUC_INTERNAL 184 const unsigned int *rpmdbIndexIteratorPkgOffsets(rpmdbIndexIterator ii); 185 186 /** \ingroup rpmdb 187 * Return current index (position) in iterator. 188 * @param mi rpm database iterator 189 * @return current index 190 */ 191 RPM_GNUC_INTERNAL 192 int rpmdbGetIteratorIndex(rpmdbMatchIterator mi); 193 194 /** \ingroup rpmdb 195 * Set iterator index. 196 * @param mi rpm database iterator 197 * @param ix index 198 */ 199 RPM_GNUC_INTERNAL 200 void rpmdbSetIteratorIndex(rpmdbMatchIterator mi, unsigned int ix); 201 202 /** \ingroup rpmdb 203 * Return offset of package with given index. 204 * @param mi rpm database iterator 205 * @param ix index 206 * @return package offset 207 */ 208 RPM_GNUC_INTERNAL 209 unsigned int rpmdbGetIteratorOffsetFor(rpmdbMatchIterator mi, unsigned int ix); 210 211 /** \ingroup rpmdb 212 * Return header located in rpmdb at given offset. 213 * @param db rpm database 214 * @param offset database offset 215 * @return header at given offset 216 */ 217 RPM_GNUC_INTERNAL 218 Header rpmdbGetHeaderAt(rpmdb db, unsigned int offset); 219 220 #ifdef __cplusplus 221 } 222 #endif 223 224 #endif 225