5 * Access RPM indices using Berkeley db[123] interface.
12 typedef /*@abstract@*/ struct _dbiIndexItem * dbiIndexItem;
13 typedef /*@abstract@*/ struct _dbiIndex * dbiIndex;
15 /* this will break if sizeof(int) != 4 */
17 * A single item from an index database (i.e. the "data returned").
18 * Note: In rpm-3.0.4 and earlier, this structure was passed by value,
19 * and was identical to the "data saved" structure below.
21 struct _dbiIndexItem {
22 unsigned int hdrNum; /*!< header instance in db */
23 unsigned int tagNum; /*!< tag index in header */
24 unsigned int fpNum; /*!< finger print index */
25 unsigned int dbNum; /*!< database index */
29 * A single item in an index database (i.e. the "data saved").
32 unsigned int recOffset; /*!< byte offset of header in db */
33 unsigned int fileNumber; /*!< file array index */
35 typedef struct _dbiIR * DBIR_t;
38 * Items retrieved from the index database.
41 /*@owned@*/ struct _dbiIndexItem * recs; /*!< array of records */
42 int count; /*!< number of records */
45 /* XXX hack to get prototypes correct */
46 #if !defined(DB_VERSION_MAJOR)
54 * Private methods for accessing an index database.
57 int dbv_major; /*<! Berkeley db version major */
58 int dbv_minor; /*<! Berkeley db version minor */
59 int dbv_patch; /*<! Berkeley db version patch */
62 * Return handle for an index database.
63 * @param rpmdb rpm database
64 * @param rpmtag rpm tag
65 * @return 0 on success
67 int (*open) (rpmdb rpmdb, int rpmtag, dbiIndex * dbip);
70 * Close index database.
71 * @param dbi index database handle
72 * @param flags (unused)
73 * @return 0 on success
75 int (*close) (dbiIndex dbi, unsigned int flags);
78 * Flush pending operations to disk.
79 * @param dbi index database handle
80 * @param flags (unused)
81 * @return 0 on success
83 int (*sync) (dbiIndex dbi, unsigned int flags);
87 int (*copen) (dbiIndex dbi, DBC ** dbcp, unsigned int flags);
91 int (*cclose) (dbiIndex dbi, /*@only@*/ DBC * dbcursor, unsigned int flags);
94 * Delete (key,data) pair(s) using db->del or dbcursor->c_del.
95 * @param dbi index database handle
96 * @param keyp key data
97 * @param keylen key data length
98 * @param flags (unused)
99 * @return 0 on success
101 int (*cdel) (dbiIndex dbi, DBC * dbcursor, const void * keyp, size_t keylen, unsigned int flags);
104 * Retrieve (key,data) pair using db->get or dbcursor->c_get.
105 * @param dbi index database handle
106 * @param keypp address of key data
107 * @param keylenp address of key data length
108 * @param datapp address of data pointer
109 * @param datalenp address of data length
110 * @param flags (unused)
111 * @return 0 on success
113 int (*cget) (dbiIndex dbi, DBC * dbcursor, void ** keypp, size_t * keylenp,
114 void ** datapp, size_t * datalenp, unsigned int flags);
117 * Store (key,data) pair using db->put or dbcursor->c_put.
118 * @param dbi index database handle
119 * @param keyp key data
120 * @param keylen key data length
121 * @param datap data pointer
122 * @param datalen data length
123 * @param flags (unused)
124 * @return 0 on success
126 int (*cput) (dbiIndex dbi, DBC * dbcursor, const void * keyp, size_t keylen,
127 const void * datap, size_t datalen, unsigned int flags);
130 * Is database byte swapped?
131 * @param dbi index database handle
134 int (*byteswapped) (dbiIndex dbi);
139 * Describes an index database (implemented on Berkeley db[123] API).
142 const char * dbi_root;
143 const char * dbi_home;
144 const char * dbi_file;
145 const char * dbi_subfile;
147 int dbi_cflags; /*<! db_create/db_env_create flags */
148 int dbi_oeflags; /*<! common (db,dbenv}->open flags */
149 int dbi_eflags; /*<! dbenv->open flags */
150 int dbi_oflags; /*<! db->open flags */
151 int dbi_tflags; /*<! dbenv->txn_begin flags */
153 int dbi_type; /*<! db index type */
154 int dbi_mode; /*<! mode to use on open */
155 int dbi_perms; /*<! file permission to use on open */
156 int dbi_api; /*<! Berkeley API type */
161 int dbi_get_rmw_cursor;
162 int dbi_no_fsync; /*<! no-op fsync for db */
163 int dbi_no_dbsync; /*<! don't call dbiSync */
164 int dbi_lockdbfd; /*<! do fcntl lock on db fd */
165 int dbi_temporary; /*<! non-persistent */
168 /* dbenv parameters */
170 void (*db_errcall) (const char *db_errpfx, char *buffer);
172 const char * dbi_errpfx;
176 /* mpool sub-system parameters */
177 int dbi_mp_mmapsize; /*<! (10Mb) */
178 int dbi_mp_size; /*<! (128Kb) */
179 /* lock sub-system parameters */
180 unsigned int dbi_lk_max;
181 unsigned int dbi_lk_detect;
183 unsigned char *dbi_lk_conflicts;
184 /* log sub-system parameters */
185 unsigned int dbi_lg_max;
186 unsigned int dbi_lg_bsize;
187 /* transaction sub-system parameters */
188 unsigned int dbi_tx_max;
190 int (*dbi_tx_recover) (DB_ENV *dbenv, DBT *log_rec, DB_LSN *lsnp, int redo, void *info);
192 /* dbinfo parameters */
193 int dbi_cachesize; /*<! */
194 int dbi_pagesize; /*<! (fs blksize) */
195 void * (*dbi_malloc) (size_t nbytes);
196 /* hash access parameters */
197 unsigned int dbi_h_ffactor; /*<! */
198 unsigned int (*dbi_h_hash_fcn) (const void *bytes, unsigned int length);
199 unsigned int dbi_h_nelem; /*<! */
200 unsigned int dbi_h_flags; /*<! DB_DUP, DB_DUPSORT */
201 int (*dbi_h_dup_compare_fcn) (const DBT *, const DBT *);
202 /* btree access parameters */
205 int (*dbi_bt_compare_fcn)(const DBT *, const DBT *);
206 int (*dbi_bt_dup_compare_fcn) (const DBT *, const DBT *);
207 size_t (*dbi_bt_prefix_fcn) (const DBT *, const DBT *);
208 /* recno access parameters */
211 unsigned int dbi_re_len;
213 const char * dbi_re_source;
216 int dbi_rpmtag; /*<! rpm tag used for index */
217 int dbi_jlen; /*<! size of join key */
219 unsigned int dbi_lastoffset; /*<! db1 with falloc.c needs this */
221 void * dbi_db; /*<! dbi handle */
224 void * dbi_rmw; /*<! db cursor (with DB_WRITECURSOR) */
226 /*@observer@*/ const struct _dbiVec * dbi_vec; /*<! private methods */
231 * Describes the collection of index databases used by rpm.
234 const char * db_root; /*<! path prefix */
235 const char * db_home; /*<! directory path */
238 int db_mode; /*<! open mode */
239 int db_perms; /*<! open permissions */
241 int db_api; /*<! Berkeley API type */
246 const char * db_errpfx;
248 void (*db_errcall) (const char *db_errpfx, char *buffer);
250 void * (*db_malloc) (size_t nbytes);
256 /* for RPM's internal use only */
258 #define RPMDB_FLAG_JUSTCHECK (1 << 0)
259 #define RPMDB_FLAG_MINIMAL (1 << 1)
260 #define RPMDB_FLAG_CHROOT (1 << 2)
267 * Return new configured index database handle instance.
268 * @param rpmdb rpm database
270 /*@only@*/ /*@null@*/ dbiIndex db3New(rpmdb rpmdb, int rpmtag);
273 * Destroy index database handle instance.
274 * @param dbi index database handle
276 void db3Free( /*@only@*/ /*@null@*/ dbiIndex dbi);
279 * Return handle for an index database.
280 * @param rpmdb rpm database
281 * @param rpmtag rpm tag
282 * @param flags (unused)
283 * @return index database handle
285 dbiIndex dbiOpen(rpmdb rpmdb, int rpmtag, unsigned int flags);
288 * @param flags (unused)
290 int dbiCopen(dbiIndex dbi, DBC ** dbcp, unsigned int flags);
291 int XdbiCopen(dbiIndex dbi, DBC ** dbcp, unsigned int flags, const char *f, unsigned int l);
292 #define dbiCopen(_a,_b,_c) \
293 XdbiCopen(_a, _b, _c, __FILE__, __LINE__)
296 * @param flags (unused)
298 int dbiCclose(dbiIndex dbi, DBC * dbcursor, unsigned int flags);
299 int XdbiCclose(dbiIndex dbi, DBC * dbcursor, unsigned int flags, const char *f, unsigned int l);
300 #define dbiCclose(_a,_b,_c) \
301 XdbiCclose(_a, _b, _c, __FILE__, __LINE__)
304 * Delete (key,data) pair(s) from index database.
305 * @param dbi index database handle
306 * @param keyp key data
307 * @param keylen key data length
308 * @param flags (unused)
309 * @return 0 on success
311 int dbiDel(dbiIndex dbi, DBC * dbcursor, const void * keyp, size_t keylen,
315 * Retrieve (key,data) pair from index database.
316 * @param dbi index database handle
317 * @param keypp address of key data
318 * @param keylenp address of key data length
319 * @param datapp address of data pointer
320 * @param datalenp address of data length
321 * @param flags (unused)
322 * @return 0 on success
324 int dbiGet(dbiIndex dbi, DBC * dbcursor, void ** keypp, size_t * keylenp,
325 void ** datapp, size_t * datalenp, unsigned int flags);
328 * Store (key,data) pair in index database.
329 * @param dbi index database handle
330 * @param keyp key data
331 * @param keylen key data length
332 * @param datap data pointer
333 * @param datalen data length
334 * @param flags (unused)
335 * @return 0 on success
337 int dbiPut(dbiIndex dbi, DBC * dbcursor, const void * keyp, size_t keylen,
338 const void * datap, size_t datalen, unsigned int flags);
341 * Close index database.
342 * @param dbi index database handle
343 * @param flags (unused)
344 * @return 0 on success
346 int dbiClose(dbiIndex dbi, unsigned int flags);
349 * Flush pending operations to disk.
350 * @param dbi index database handle
351 * @param flags (unused)
352 * @return 0 on success
354 int dbiSync (dbiIndex dbi, unsigned int flags);
357 * Is database byte swapped?
358 * @param dbi index database handle
361 int dbiByteSwapped(dbiIndex dbi);
364 * Return base file name for index database (legacy).
365 * @param rpmtag rpm tag
366 * @return base file name
368 char * db1basename(int rpmtag);
372 unsigned int rpmdbGetIteratorFileNum(rpmdbMatchIterator mi);
375 * @param rpmdb rpm database
377 int rpmdbFindFpList(rpmdb rpmdb, fingerPrint * fpList, /*@out@*/dbiIndexSet * matchList,
381 * Destroy set of index database items.
382 * @param set set of index database items
384 void dbiFreeIndexSet(/*@only@*/ /*@null@*/ dbiIndexSet set);
387 * Count items in index database set.
388 * @param set set of index database items
389 * @return number of items
391 unsigned int dbiIndexSetCount(dbiIndexSet set);
394 * Return record offset of header from element in index database set.
395 * @param set set of index database items
396 * @param recno index of item in set
397 * @return record offset of header
399 unsigned int dbiIndexRecordOffset(dbiIndexSet set, int recno);
402 * Return file index from element in index database set.
403 * @param set set of index database items
404 * @param recno index of item in set
407 unsigned int dbiIndexRecordFileNumber(dbiIndexSet set, int recno);