4 /** \ingroup rpmdb dbi db1 db3
6 * Access RPM indices using Berkeley DB interface(s).
13 typedef /*@abstract@*/ struct _dbiIndexItem * dbiIndexItem;
17 typedef /*@abstract@*/ struct _dbiIndex * dbiIndex;
19 /* this will break if sizeof(int) != 4 */
21 * A single item from an index database (i.e. the "data returned").
22 * Note: In rpm-3.0.4 and earlier, this structure was passed by value,
23 * and was identical to the "data saved" structure below.
25 struct _dbiIndexItem {
26 unsigned int hdrNum; /*!< header instance in db */
27 unsigned int tagNum; /*!< tag index in header */
28 unsigned int fpNum; /*!< finger print index */
29 unsigned int dbNum; /*!< database index */
33 * Items retrieved from the index database.
36 /*@owned@*/ struct _dbiIndexItem * recs; /*!< array of records */
37 int count; /*!< number of records */
40 /* XXX hack to get prototypes correct */
41 #if !defined(DB_VERSION_MAJOR)
50 * Private methods for accessing an index database.
53 int dbv_major; /*!< Berkeley db version major */
54 int dbv_minor; /*!< Berkeley db version minor */
55 int dbv_patch; /*!< Berkeley db version patch */
58 * Return handle for an index database.
59 * @param rpmdb rpm database
60 * @param rpmtag rpm tag
61 * @return 0 on success
63 int (*open) (rpmdb rpmdb, int rpmtag, /*@out@*/ dbiIndex * dbip)
64 /*@globals fileSystem@*/
65 /*@modifies *dbip, fileSystem @*/;
68 * Close index database, and destroy database handle.
69 * @param dbi index database handle
70 * @param flags (unused)
71 * @return 0 on success
73 int (*close) (/*@only@*/ dbiIndex dbi, unsigned int flags)
74 /*@globals fileSystem@*/
75 /*@modifies dbi, fileSystem @*/;
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)
84 /*@globals fileSystem@*/
85 /*@modifies fileSystem @*/;
88 * Open database cursor.
89 * @param dbi index database handle
90 * @param dbcp address of database cursor
91 * @param flags (unused)
93 int (*copen) (dbiIndex dbi, /*@out@*/ DBC ** dbcp, unsigned int flags)
94 /*@globals fileSystem@*/
95 /*@modifies dbi, *dbcp, fileSystem @*/;
98 * Close database cursor.
99 * @param dbi index database handle
100 * @param dbcursor database cursor
101 * @param flags (unused)
103 int (*cclose) (dbiIndex dbi, /*@only@*/ DBC * dbcursor, unsigned int flags)
104 /*@globals fileSystem@*/
105 /*@modifies dbi, *dbcursor, fileSystem @*/;
108 * Delete (key,data) pair(s) using db->del or dbcursor->c_del.
109 * @param dbi index database handle
110 * @param dbcursor database cursor
111 * @param keyp key data
112 * @param keylen key data length
113 * @param flags (unused)
114 * @return 0 on success
116 int (*cdel) (dbiIndex dbi, DBC * dbcursor,
117 const void * keyp, size_t keylen, unsigned int flags)
118 /*@globals fileSystem@*/
119 /*@modifies *dbcursor, fileSystem @*/;
122 * Retrieve (key,data) pair using db->get or dbcursor->c_get.
123 * @param dbi index database handle
124 * @param dbcursor database cursor
125 * @param keypp address of key data
126 * @param keylenp address of key data length
127 * @param datapp address of data pointer
128 * @param datalenp address of data length
129 * @param flags (unused)
130 * @return 0 on success
132 int (*cget) (dbiIndex dbi, DBC * dbcursor,
133 /*@null@*/ void ** keypp, /*@null@*/ size_t * keylenp,
134 /*@null@*/ void ** datapp, /*@null@*/ size_t * datalenp,
136 /*@globals fileSystem@*/
137 /*@modifies *dbcursor, *keypp, *keylenp, *datapp, *datalenp,
141 * Store (key,data) pair using db->put or dbcursor->c_put.
142 * @param dbi index database handle
143 * @param dbcursor database cursor
144 * @param keyp key data
145 * @param keylen key data length
146 * @param datap data pointer
147 * @param datalen data length
148 * @param flags (unused)
149 * @return 0 on success
151 int (*cput) (dbiIndex dbi, DBC * dbcursor,
152 const void * keyp, size_t keylen,
153 const void * datap, size_t datalen,
155 /*@globals fileSystem@*/
156 /*@modifies *dbcursor, fileSystem @*/;
159 * Retrieve count of (possible) duplicate items using dbcursor->c_count.
160 * @param dbi index database handle
161 * @param dbcursor database cursor
162 * @param countp address of count
163 * @param flags (unused)
164 * @return 0 on success
166 int (*ccount) (dbiIndex dbi, DBC * dbcursor,
167 /*@out@*/ unsigned int * countp,
169 /*@globals fileSystem@*/
170 /*@modifies *dbcursor, fileSystem @*/;
173 * Is database byte swapped?
174 * @param dbi index database handle
177 int (*byteswapped) (dbiIndex dbi)
178 /*@globals fileSystem@*/
179 /*@modifies fileSystem@*/;
182 * Save statistics in database handle.
183 * @param dbi index database handle
184 * @param flags retrieve statistics that don't require traversal?
185 * @return 0 on success
187 int (*stat) (dbiIndex dbi, unsigned int flags)
188 /*@globals fileSystem@*/
189 /*@modifies dbi, fileSystem @*/;
194 * Describes an index database (implemented on Berkeley db3 functionality).
197 /*@null@*/ const char * dbi_root; /*!< chroot(2) component of path */
198 /*@null@*/ const char * dbi_home; /*!< directory component of path */
199 /*@null@*/ const char * dbi_file; /*!< file component of path */
200 /*@null@*/ const char * dbi_subfile;
201 /*@null@*/ const char * dbi_tmpdir; /*!< temporary directory */
203 int dbi_ecflags; /*!< db_env_create flags */
204 int dbi_cflags; /*!< db_create flags */
205 int dbi_oeflags; /*!< common (db,dbenv}->open flags */
206 int dbi_eflags; /*!< dbenv->open flags */
207 int dbi_oflags; /*!< db->open flags */
208 int dbi_tflags; /*!< dbenv->txn_begin flags */
210 int dbi_type; /*!< db index type */
211 unsigned dbi_mode; /*!< mode to use on open */
212 int dbi_perms; /*!< file permission to use on open */
213 long dbi_shmkey; /*!< shared memory base key */
214 int dbi_api; /*!< Berkeley API type */
216 int dbi_verify_on_close;
217 int dbi_tear_down; /*!< tear down dbenv on close */
218 int dbi_use_cursors;/*!< access with cursors? (always) */
219 int dbi_use_dbenv; /*!< use db environment? */
220 int dbi_permit_dups;/*!< permit duplicate entries? */
221 int dbi_get_rmw_cursor;
222 int dbi_no_fsync; /*!< no-op fsync for db */
223 int dbi_no_dbsync; /*!< don't call dbiSync */
224 int dbi_lockdbfd; /*!< do fcntl lock on db fd */
225 int dbi_temporary; /*!< non-persistent */
229 /*@null@*/ char * dbi_host;
233 /* dbenv parameters */
235 /*@unused@*/ /*@null@*/ void (*db_errcall) (const char *db_errpfx, char *buffer)
236 /*@globals fileSystem@*/
237 /*@modifies fileSystem @*/;
238 /*@unused@*/ /*@shared@*/ FILE * dbi_errfile;
239 const char * dbi_errpfx;
243 /* mpool sub-system parameters */
244 int dbi_mp_mmapsize; /*!< (10Mb) */
245 int dbi_mp_size; /*!< (128Kb) */
246 /* lock sub-system parameters */
247 unsigned int dbi_lk_max;
248 unsigned int dbi_lk_detect;
249 /*@unused@*/ int dbi_lk_nmodes;
250 /*@unused@*/ unsigned char * dbi_lk_conflicts;
251 /* log sub-system parameters */
252 unsigned int dbi_lg_max;
253 unsigned int dbi_lg_bsize;
254 /* transaction sub-system parameters */
255 unsigned int dbi_tx_max;
257 int (*dbi_tx_recover) (DB_ENV *dbenv, DBT *log_rec,
258 DB_LSN *lsnp, int redo, void *info)
259 /*@globals fileSystem@*/
260 /*@modifies fileSystem @*/;
262 /* dbinfo parameters */
263 int dbi_cachesize; /*!< */
264 int dbi_pagesize; /*!< (fs blksize) */
265 /*@unused@*/ /*@null@*/ void * (*dbi_malloc) (size_t nbytes)
267 /* hash access parameters */
268 unsigned int dbi_h_ffactor; /*!< */
269 /*@null@*/ unsigned int (*dbi_h_hash_fcn) (DB *, const void *bytes, unsigned int length) /*@*/;
270 unsigned int dbi_h_nelem; /*!< */
271 unsigned int dbi_h_flags; /*!< DB_DUP, DB_DUPSORT */
272 /*@null@*/ int (*dbi_h_dup_compare_fcn) (DB *, const DBT *, const DBT *) /*@*/;
273 /* btree access parameters */
276 /*@null@*/ int (*dbi_bt_compare_fcn) (DB *, const DBT *, const DBT *) /*@*/;
277 /*@null@*/ int (*dbi_bt_dup_compare_fcn) (DB *, const DBT *, const DBT *) /*@*/;
278 /*@null@*/ size_t (*dbi_bt_prefix_fcn) (DB *, const DBT *, const DBT *) /*@*/;
279 /* recno access parameters */
282 unsigned int dbi_re_len;
284 const char * dbi_re_source;
285 /* queue access parameters */
286 unsigned int dbi_q_extentsize;
288 /*@refcounted@*/ rpmdb dbi_rpmdb;
289 rpmTag dbi_rpmtag; /*!< rpm tag used for index */
290 int dbi_jlen; /*!< size of join key */
292 unsigned int dbi_lastoffset; /*!< db1 with falloc.c needs this */
294 /*@only@*//*@null@*/ void * dbi_db; /*!< Berkeley DB handle */
295 /*@only@*//*@null@*/ void * dbi_rmw; /*!< db cursor (with DB_WRITECURSOR) */
296 /*@only@*//*@null@*/ void * dbi_stats; /*!< Berkeley db statistics */
298 /*@observer@*/ const struct _dbiVec * dbi_vec; /*!< private methods */
303 * Describes the collection of index databases used by rpm.
306 /*@owned@*/ const char * db_root;/*!< path prefix */
307 /*@owned@*/ const char * db_home;/*!< directory path */
309 int db_mode; /*!< open mode */
310 int db_perms; /*!< open permissions */
311 int db_api; /*!< Berkeley API type */
312 /*@owned@*/ const char * db_errpfx;
315 int db_chrootDone; /*!< If chroot(2) done, ignore db_root. */
316 void (*db_errcall) (const char *db_errpfx, char *buffer)
318 /*@shared@*/ FILE * db_errfile;
319 /*@only@*/ void * (*db_malloc) (size_t nbytes)
321 /*@only@*/ void * (*db_realloc) (/*@only@*//*@null@*/ void * ptr,
324 void (*db_free) (/*@only@*/ void * ptr)
325 /*@modifies *ptr @*/;
327 /*@only@*//*@null@*/ void * db_dbenv; /*!< Berkeley DB_ENV handle */
328 int db_ndbi; /*!< No. of tag indices. */
329 dbiIndex * _dbi; /*!< Tag indices. */
331 /*@refs@*/ int nrefs; /*!< Reference count. */
334 /* for RPM's internal use only */
339 RPMDB_FLAG_JUSTCHECK = (1 << 0),
340 RPMDB_FLAG_MINIMAL = (1 << 1),
342 RPMDB_FLAG_CHROOT = (1 << 2)
352 * Return new configured index database handle instance.
353 * @param rpmdb rpm database
355 /*@unused@*/ /*@only@*/ /*@null@*/
356 dbiIndex db3New(rpmdb rpmdb, int rpmtag)
357 /*@globals rpmGlobalMacroContext @*/
358 /*@modifies rpmGlobalMacroContext @*/;
361 * Destroy index database handle instance.
362 * @param dbi index database handle
363 * @return NULL always
366 dbiIndex db3Free( /*@only@*/ /*@null@*/ dbiIndex dbi)
370 * Format db3 open flags for debugging print.
371 * @param dbflags db open flags
372 * @param print_dbenv_flags format db env flags instead?
373 * @return formatted flags (static buffer)
377 extern const char *const prDbiOpenFlags(int dbflags,
378 int print_dbenv_flags)
383 * Return handle for an index database.
384 * @param db rpm database
385 * @param rpmtag rpm tag
386 * @param flags (unused)
387 * @return index database handle
389 /*@only@*/ /*@null@*/ dbiIndex dbiOpen(/*@null@*/ rpmdb db, int rpmtag,
394 * @param dbi index database handle
395 * @param flags DBI_WRITECURSOR, DBI_ITERATOR or 0
397 int dbiCopen(dbiIndex dbi, /*@out@*/ DBC ** dbcp, unsigned int flags)
398 /*@globals fileSystem@*/
399 /*@modifies dbi, *dbcp, fileSystem @*/;
401 #define DBI_WRITECURSOR (1 << 0)
402 #define DBI_ITERATOR (1 << 1)
405 * @param dbi index database handle
406 * @param flags (unused)
408 int dbiCclose(dbiIndex dbi, /*@only@*/ DBC * dbcursor, unsigned int flags)
409 /*@globals fileSystem@*/
410 /*@modifies dbi, *dbcursor, fileSystem @*/;
413 * Delete (key,data) pair(s) from index database.
414 * @param dbi index database handle
415 * @param keyp key data
416 * @param keylen key data length
417 * @param flags (unused)
418 * @return 0 on success
420 int dbiDel(dbiIndex dbi, DBC * dbcursor, const void * keyp, size_t keylen,
422 /*@globals fileSystem@*/
423 /*@modifies *dbcursor, fileSystem @*/;
426 * Retrieve (key,data) pair from index database.
427 * @param dbi index database handle
428 * @param keypp address of key data
429 * @param keylenp address of key data length
430 * @param datapp address of data pointer
431 * @param datalenp address of data length
432 * @param flags (unused)
433 * @return 0 on success
435 int dbiGet(dbiIndex dbi, DBC * dbcursor, void ** keypp,
436 /*@null@*/ size_t * keylenp,
437 /*@null@*/ void ** datapp,
438 /*@null@*/ size_t * datalenp,
440 /*@globals fileSystem@*/
441 /*@modifies *dbcursor, **keypp, *keylenp, **datapp, *datalenp,
445 * Store (key,data) pair in index database.
446 * @param dbi index database handle
447 * @param keyp key data
448 * @param keylen key data length
449 * @param datap data pointer
450 * @param datalen data length
451 * @param flags (unused)
452 * @return 0 on success
454 int dbiPut(dbiIndex dbi, DBC * dbcursor, const void * keyp, size_t keylen,
455 const void * datap, size_t datalen, unsigned int flags)
456 /*@globals fileSystem@*/
457 /*@modifies *dbcursor, fileSystem @*/;
460 * Retrieve count of (possible) duplicate items.
461 * @param dbi index database handle
462 * @param dbcursor database cursor
463 * @param countp address of count
464 * @param flags (unused)
465 * @return 0 on success
468 int dbiCount(dbiIndex dbi, DBC * dbcursor, /*@out@*/ unsigned int * countp,
470 /*@globals fileSystem@*/
471 /*@modifies *dbcursor, fileSystem @*/;
474 * Verify (and close) index database.
475 * @param dbi index database handle
476 * @param flags (unused)
477 * @return 0 on success
479 int dbiVerify(/*@only@*/ dbiIndex dbi, unsigned int flags)
480 /*@globals fileSystem@*/
481 /*@modifies dbi, fileSystem @*/;
484 * Close index database.
485 * @param dbi index database handle
486 * @param flags (unused)
487 * @return 0 on success
489 int dbiClose(/*@only@*/ dbiIndex dbi, unsigned int flags)
490 /*@globals fileSystem@*/
491 /*@modifies dbi, fileSystem @*/;
494 * Flush pending operations to disk.
495 * @param dbi index database handle
496 * @param flags (unused)
497 * @return 0 on success
499 int dbiSync (dbiIndex dbi, unsigned int flags)
500 /*@globals fileSystem@*/
501 /*@modifies fileSystem @*/;
504 * Is database byte swapped?
505 * @param dbi index database handle
508 int dbiByteSwapped(dbiIndex dbi)
512 * Return base file name for db1 database (legacy).
513 * @param rpmtag rpm tag
514 * @return base file name of db1 database
516 char * db1basename(int rpmtag)
522 unsigned int rpmdbGetIteratorFileNum(rpmdbMatchIterator mi)
526 * Destroy set of index database items.
527 * @param set set of index database items
528 * @return NULL always
530 /*@null@*/ dbiIndexSet dbiFreeIndexSet(/*@only@*/ /*@null@*/ dbiIndexSet set)
534 * Count items in index database set.
535 * @param set set of index database items
536 * @return number of items
538 unsigned int dbiIndexSetCount(dbiIndexSet set)
542 * Return record offset of header from element in index database set.
543 * @param set set of index database items
544 * @param recno index of item in set
545 * @return record offset of header
547 unsigned int dbiIndexRecordOffset(dbiIndexSet set, int recno)
551 * Return file index from element in index database set.
552 * @param set set of index database items
553 * @param recno index of item in set
556 unsigned int dbiIndexRecordFileNumber(dbiIndexSet set, int recno)