4 /** \ingroup rpmdb dbi db1 db3
6 * Access RPM indices using Berkeley DB interface(s).
15 typedef /*@abstract@*/ struct _dbiIndexItem * dbiIndexItem;
19 typedef /*@abstract@*/ struct _dbiIndex * dbiIndex;
21 /* this will break if sizeof(int) != 4 */
23 * A single item from an index database (i.e. the "data returned").
24 * Note: In rpm-3.0.4 and earlier, this structure was passed by value,
25 * and was identical to the "data saved" structure below.
27 struct _dbiIndexItem {
28 unsigned int hdrNum; /*!< header instance in db */
29 unsigned int tagNum; /*!< tag index in header */
30 unsigned int fpNum; /*!< finger print index */
31 unsigned int dbNum; /*!< database index */
35 * Items retrieved from the index database.
38 /*@owned@*/ struct _dbiIndexItem * recs; /*!< array of records */
39 int count; /*!< number of records */
43 * Private methods for accessing an index database.
46 int dbv_major; /*!< Berkeley db version major */
47 int dbv_minor; /*!< Berkeley db version minor */
48 int dbv_patch; /*!< Berkeley db version patch */
51 * Return handle for an index database.
52 * @param rpmdb rpm database
53 * @param rpmtag rpm tag
54 * @return 0 on success
56 int (*open) (rpmdb rpmdb, rpmTag rpmtag, /*@out@*/ dbiIndex * dbip)
57 /*@globals fileSystem @*/
58 /*@modifies *dbip, fileSystem @*/;
61 * Close index database, and destroy database handle.
62 * @param dbi index database handle
63 * @param flags (unused)
64 * @return 0 on success
66 int (*close) (/*@only@*/ dbiIndex dbi, unsigned int flags)
67 /*@globals fileSystem @*/
68 /*@modifies dbi, fileSystem @*/;
71 * Flush pending operations to disk.
72 * @param dbi index database handle
73 * @param flags (unused)
74 * @return 0 on success
76 int (*sync) (dbiIndex dbi, unsigned int flags)
77 /*@globals fileSystem @*/
78 /*@modifies fileSystem @*/;
81 * Associate secondary database with primary.
82 * @param dbi index database handle
83 * @param dbisecondary secondary index database handle
84 * @param callback create secondary key from primary (NULL if DB_RDONLY)
85 * @param flags DB_CREATE or 0
86 * @return 0 on success
88 int (*associate) (dbiIndex dbi, dbiIndex dbisecondary,
89 int (*callback) (DB *, const DBT *, const DBT *, DBT *),
91 /*@globals fileSystem @*/
92 /*@modifies dbi, fileSystem @*/;
95 * Return join cursor for list of cursors.
96 * @param dbi index database handle
97 * @param curslist NULL terminated list of database cursors
98 * @retval dbcp address of join database cursor
99 * @param flags DB_JOIN_NOSORT or 0
100 * @return 0 on success
102 int (*join) (dbiIndex dbi, DBC ** curslist, /*@out@*/ DBC ** dbcp,
104 /*@globals fileSystem @*/
105 /*@modifies dbi, *dbcp, fileSystem @*/;
108 * Open database cursor.
109 * @param dbi index database handle
110 * @param txnid database transaction handle
111 * @retval dbcp address of new database cursor
112 * @param dbiflags DB_WRITECURSOR or 0
113 * @return 0 on success
115 int (*copen) (dbiIndex dbi, /*@null@*/ DB_TXN * txnid,
116 /*@out@*/ DBC ** dbcp, unsigned int dbiflags)
117 /*@globals fileSystem @*/
118 /*@modifies dbi, *txnid, *dbcp, fileSystem @*/;
121 * Close database cursor.
122 * @param dbi index database handle
123 * @param dbcursor database cursor
124 * @param flags (unused)
125 * @return 0 on success
127 int (*cclose) (dbiIndex dbi, /*@only@*/ DBC * dbcursor, unsigned int flags)
128 /*@globals fileSystem @*/
129 /*@modifies dbi, *dbcursor, fileSystem @*/;
132 * Duplicate a database cursor.
133 * @param dbi index database handle
134 * @param dbcursor database cursor
135 * @retval dbcp address of new database cursor
136 * @param flags DB_POSITION for same position, 0 for uninitialized
137 * @return 0 on success
139 int (*cdup) (dbiIndex dbi, DBC * dbcursor, /*@out@*/ DBC ** dbcp,
141 /*@globals fileSystem @*/
142 /*@modifies dbi, *dbcp, fileSystem @*/;
145 * Delete (key,data) pair(s) using db->del or dbcursor->c_del.
146 * @param dbi index database handle
147 * @param dbcursor database cursor (NULL will use db->del)
148 * @param key delete key value/length/flags
149 * @param data delete data value/length/flags
150 * @param flags (unused)
151 * @return 0 on success
153 int (*cdel) (dbiIndex dbi, /*@null@*/ DBC * dbcursor, DBT * key, DBT * data,
155 /*@globals fileSystem @*/
156 /*@modifies *dbcursor, fileSystem @*/;
159 * Retrieve (key,data) pair using db->get or dbcursor->c_get.
160 * @param dbi index database handle
161 * @param dbcursor database cursor (NULL will use db->get)
162 * @param key retrieve key value/length/flags
163 * @param data retrieve data value/length/flags
164 * @param flags (unused)
165 * @return 0 on success
167 int (*cget) (dbiIndex dbi, /*@null@*/ DBC * dbcursor, DBT * key, DBT * data,
169 /*@globals fileSystem @*/
170 /*@modifies *dbcursor, *key, *data, fileSystem @*/;
173 * Retrieve (key,data) pair using dbcursor->c_pget.
174 * @param dbi index database handle
175 * @param dbcursor database cursor
176 * @param key secondary retrieve key value/length/flags
177 * @param pkey primary retrieve key value/length/flags
178 * @param data primary retrieve data value/length/flags
179 * @param flags DB_NEXT, DB_SET, or 0
180 * @return 0 on success
182 int (*cpget) (dbiIndex dbi, /*@null@*/ DBC * dbcursor,
183 DBT * key, DBT * pkey, DBT * data, unsigned int flags)
184 /*@globals fileSystem @*/
185 /*@modifies *dbcursor, *key, *pkey, *data, fileSystem @*/;
188 * Store (key,data) pair using db->put or dbcursor->c_put.
189 * @param dbi index database handle
190 * @param dbcursor database cursor (NULL will use db->put)
191 * @param key store key value/length/flags
192 * @param data store data value/length/flags
193 * @param flags (unused)
194 * @return 0 on success
196 int (*cput) (dbiIndex dbi, /*@null@*/ DBC * dbcursor, DBT * key, DBT * data,
198 /*@globals fileSystem @*/
199 /*@modifies *dbcursor, fileSystem @*/;
202 * Retrieve count of (possible) duplicate items using dbcursor->c_count.
203 * @param dbi index database handle
204 * @param dbcursor database cursor
205 * @param countp address of count
206 * @param flags (unused)
207 * @return 0 on success
209 int (*ccount) (dbiIndex dbi, DBC * dbcursor,
210 /*@out@*/ unsigned int * countp,
212 /*@globals fileSystem @*/
213 /*@modifies *dbcursor, fileSystem @*/;
216 * Is database byte swapped?
217 * @param dbi index database handle
220 int (*byteswapped) (dbiIndex dbi)
221 /*@globals fileSystem @*/
222 /*@modifies fileSystem @*/;
225 * Save statistics in database handle.
226 * @param dbi index database handle
227 * @param flags retrieve statistics that don't require traversal?
228 * @return 0 on success
230 int (*stat) (dbiIndex dbi, unsigned int flags)
231 /*@globals fileSystem @*/
232 /*@modifies dbi, fileSystem @*/;
237 * Describes an index database (implemented on Berkeley db3 functionality).
241 const char * dbi_root; /*!< chroot(2) component of path */
243 const char * dbi_home; /*!< directory component of path */
245 const char * dbi_file; /*!< file component of path */
247 const char * dbi_subfile;
249 const char * dbi_tmpdir; /*!< temporary directory */
251 int dbi_ecflags; /*!< db_env_create flags */
252 int dbi_cflags; /*!< db_create flags */
253 int dbi_oeflags; /*!< common (db,dbenv}->open flags */
254 int dbi_eflags; /*!< dbenv->open flags */
255 int dbi_oflags; /*!< db->open flags */
256 int dbi_tflags; /*!< dbenv->txn_begin flags */
258 int dbi_type; /*!< db index type */
259 unsigned dbi_mode; /*!< mode to use on open */
260 int dbi_perms; /*!< file permission to use on open */
261 long dbi_shmkey; /*!< shared memory base key */
262 int dbi_api; /*!< Berkeley API type */
264 int dbi_verify_on_close;
265 int dbi_tear_down; /*!< tear down dbenv on close */
266 int dbi_use_cursors; /*!< access with cursors? (always) */
267 int dbi_use_dbenv; /*!< use db environment? */
268 int dbi_permit_dups; /*!< permit duplicate entries? */
269 int dbi_no_fsync; /*!< no-op fsync for db */
270 int dbi_no_dbsync; /*!< don't call dbiSync */
271 int dbi_lockdbfd; /*!< do fcntl lock on db fd */
272 int dbi_temporary; /*!< non-persistent */
276 /*@null@*/ char * dbi_host;
280 /* dbenv parameters */
283 void (*db_errcall) (const char *db_errpfx, char *buffer)
284 /*@globals fileSystem @*/
285 /*@modifies fileSystem @*/;
286 /*@unused@*/ /*@shared@*/
288 const char * dbi_errpfx;
292 /* mpool sub-system parameters */
293 int dbi_mp_mmapsize; /*!< (10Mb) */
294 int dbi_mp_size; /*!< (128Kb) */
295 /* lock sub-system parameters */
296 unsigned int dbi_lk_max;
297 unsigned int dbi_lk_detect;
298 /*@unused@*/ int dbi_lk_nmodes;
299 /*@unused@*/ unsigned char * dbi_lk_conflicts;
300 /* log sub-system parameters */
301 unsigned int dbi_lg_max;
302 unsigned int dbi_lg_bsize;
303 /* transaction sub-system parameters */
304 unsigned int dbi_tx_max;
306 int (*dbi_tx_recover) (DB_ENV *dbenv, DBT *log_rec,
307 DB_LSN *lsnp, int redo, void *info)
308 /*@globals fileSystem @*/
309 /*@modifies fileSystem @*/;
311 /* dbinfo parameters */
312 int dbi_cachesize; /*!< */
313 int dbi_pagesize; /*!< (fs blksize) */
314 /*@unused@*/ /*@null@*/
315 void * (*dbi_malloc) (size_t nbytes)
317 /* hash access parameters */
318 unsigned int dbi_h_ffactor; /*!< */
319 unsigned int (*dbi_h_hash_fcn) (DB *, const void *bytes,
322 unsigned int dbi_h_nelem; /*!< */
323 unsigned int dbi_h_flags; /*!< DB_DUP, DB_DUPSORT */
324 int (*dbi_h_dup_compare_fcn) (DB *, const DBT *, const DBT *)
326 /* btree access parameters */
329 int (*dbi_bt_compare_fcn) (DB *, const DBT *, const DBT *)
331 int (*dbi_bt_dup_compare_fcn) (DB *, const DBT *, const DBT *)
333 size_t (*dbi_bt_prefix_fcn) (DB *, const DBT *, const DBT *)
335 /* recno access parameters */
338 unsigned int dbi_re_len;
340 const char * dbi_re_source;
341 /* queue access parameters */
342 unsigned int dbi_q_extentsize;
346 rpmTag dbi_rpmtag; /*!< rpm tag used for index */
347 int dbi_jlen; /*!< size of join key */
349 unsigned int dbi_lastoffset; /*!< db1 with falloc.c needs this */
352 DB * dbi_db; /*!< Berkeley DB * handle */
354 DB_TXN * dbi_txnid; /*!< Bekerley DB_TXN * transaction id */
356 void * dbi_stats; /*!< Berkeley db statistics */
359 const struct _dbiVec * dbi_vec; /*!< private methods */
364 * Describes the collection of index databases used by rpm.
367 /*@owned@*/ const char * db_root;/*!< path prefix */
368 /*@owned@*/ const char * db_home;/*!< directory path */
370 int db_mode; /*!< open mode */
371 int db_perms; /*!< open permissions */
372 int db_api; /*!< Berkeley API type */
373 /*@owned@*/ const char * db_errpfx;
376 int db_chrootDone; /*!< If chroot(2) done, ignore db_root. */
377 void (*db_errcall) (const char *db_errpfx, char *buffer)
379 /*@shared@*/ FILE * db_errfile;
380 /*@only@*/ void * (*db_malloc) (size_t nbytes)
382 /*@only@*/ void * (*db_realloc) (/*@only@*//*@null@*/ void * ptr,
385 void (*db_free) (/*@only@*/ void * ptr)
386 /*@modifies *ptr @*/;
388 /*@only@*//*@null@*/ void * db_dbenv; /*!< Berkeley DB_ENV handle */
389 int db_ndbi; /*!< No. of tag indices. */
390 dbiIndex * _dbi; /*!< Tag indices. */
392 /*@refs@*/ int nrefs; /*!< Reference count. */
395 /* for RPM's internal use only */
400 RPMDB_FLAG_JUSTCHECK = (1 << 0),
401 RPMDB_FLAG_MINIMAL = (1 << 1),
403 RPMDB_FLAG_CHROOT = (1 << 2)
413 * Return new configured index database handle instance.
414 * @param rpmdb rpm database
415 * @param rpmtag rpm tag
416 * @return index database handle
418 /*@unused@*/ /*@only@*/ /*@null@*/
419 dbiIndex db3New(rpmdb rpmdb, rpmTag rpmtag)
420 /*@globals rpmGlobalMacroContext @*/
421 /*@modifies rpmGlobalMacroContext @*/;
424 * Destroy index database handle instance.
425 * @param dbi index database handle
426 * @return NULL always
429 dbiIndex db3Free( /*@only@*/ /*@null@*/ dbiIndex dbi)
433 * Format db3 open flags for debugging print.
434 * @param dbflags db open flags
435 * @param print_dbenv_flags format db env flags instead?
436 * @return formatted flags (static buffer)
440 extern const char *const prDbiOpenFlags(int dbflags, int print_dbenv_flags)
445 * Return handle for an index database.
446 * @param db rpm database
447 * @param rpmtag rpm tag
448 * @param flags (unused)
449 * @return index database handle
451 /*@only@*/ /*@null@*/ dbiIndex dbiOpen(/*@null@*/ rpmdb db, rpmTag rpmtag,
455 /*@-globuse -mods -mustmod @*/
457 * Open a database cursor.
458 * @param dbi index database handle
459 * @param txnid database transaction handle
460 * @retval dbcp returned database cursor
461 * @param flags DB_WRITECURSOR if writing, or 0
462 * @return 0 on success
464 /*@unused@*/ static inline
465 int dbiCopen(dbiIndex dbi, /*@null@*/ DB_TXN * txnid,
466 /*@out@*/ DBC ** dbcp, unsigned int flags)
467 /*@globals fileSystem @*/
468 /*@modifies dbi, *dbcp, fileSystem @*/
470 return (*dbi->dbi_vec->copen) (dbi, txnid, dbcp, flags);
474 * Close a database cursor.
475 * @param dbi index database handle
476 * @param dbcursor database cursor
477 * @param flags (unused)
478 * @return 0 on success
480 /*@unused@*/ static inline
481 int dbiCclose(dbiIndex dbi, /*@only@*/ DBC * dbcursor, unsigned int flags)
482 /*@globals fileSystem @*/
483 /*@modifies dbi, *dbcursor, fileSystem @*/
485 return (*dbi->dbi_vec->cclose) (dbi, dbcursor, flags);
489 * Duplicate a database cursor.
490 * @param dbi index database handle
491 * @param dbcursor database cursor
492 * @retval dbcp address of new database cursor
493 * @param flags DB_POSITION for same position, 0 for uninitialized
494 * @return 0 on success
496 /*@unused@*/ static inline
497 int dbiCdup(dbiIndex dbi, DBC * dbcursor, /*@out@*/ DBC ** dbcp,
499 /*@modifies dbi, *dbcp @*/
501 return (*dbi->dbi_vec->cdup) (dbi, dbcursor, dbcp, flags);
505 * Delete (key,data) pair(s) from index database.
506 * @param dbi index database handle
507 * @param dbcursor database cursor (NULL will use db->del)
508 * @param key delete key value/length/flags
509 * @param data delete data value/length/flags
510 * @param flags (unused)
511 * @return 0 on success
513 /*@unused@*/ static inline
514 int dbiDel(dbiIndex dbi, /*@null@*/ DBC * dbcursor, DBT * key, DBT * data,
516 /*@globals fileSystem @*/
517 /*@modifies *dbcursor, fileSystem @*/
519 assert(key->size > 0);
520 return (dbi->dbi_vec->cdel) (dbi, dbcursor, key, data, flags);
524 * Retrieve (key,data) pair from index database.
525 * @param dbi index database handle
526 * @param dbcursor database cursor (NULL will use db->get)
527 * @param key retrieve key value/length/flags
528 * @param data retrieve data value/length/flags
529 * @param flags (unused)
530 * @return 0 on success
532 /*@unused@*/ static inline
533 int dbiGet(dbiIndex dbi, /*@null@*/ DBC * dbcursor, DBT * key, DBT * data,
535 /*@globals fileSystem @*/
536 /*@modifies *dbcursor, *key, *data, fileSystem @*/
538 assert((flags == DB_NEXT) || key->size > 0);
539 return (dbi->dbi_vec->cget) (dbi, dbcursor, key, data, flags);
543 * Retrieve (key,data) pair using dbcursor->c_pget.
544 * @param dbi index database handle
545 * @param dbcursor database cursor (NULL will use db->get)
546 * @param key secondary retrieve key value/length/flags
547 * @param pkey primary retrieve key value/length/flags
548 * @param data primary retrieve data value/length/flags
549 * @param flags DB_NEXT, DB_SET, or 0
550 * @return 0 on success
552 /*@unused@*/ static inline
553 int dbiPget(dbiIndex dbi, /*@null@*/ DBC * dbcursor,
554 DBT * key, DBT * pkey, DBT * data, unsigned int flags)
555 /*@globals fileSystem @*/
556 /*@modifies *dbcursor, *key, *pkey, *data, fileSystem @*/
558 assert((flags == DB_NEXT) || key->size > 0);
559 return (dbi->dbi_vec->cpget) (dbi, dbcursor, key, pkey, data, flags);
563 * Store (key,data) pair in index database.
564 * @param dbi index database handle
565 * @param dbcursor database cursor (NULL will use db->put)
566 * @param key store key value/length/flags
567 * @param data store data value/length/flags
568 * @param flags (unused)
569 * @return 0 on success
571 /*@unused@*/ static inline
572 int dbiPut(dbiIndex dbi, /*@null@*/ DBC * dbcursor, DBT * key, DBT * data,
574 /*@globals fileSystem @*/
575 /*@modifies *dbcursor, *key, fileSystem @*/
577 assert(key->size > 0);
578 return (dbi->dbi_vec->cput) (dbi, dbcursor, key, data, flags);
582 * Retrieve count of (possible) duplicate items.
583 * @param dbi index database handle
584 * @param dbcursor database cursor
585 * @param countp address of count
586 * @param flags (unused)
587 * @return 0 on success
589 /*@unused@*/ static inline
590 int dbiCount(dbiIndex dbi, DBC * dbcursor, /*@out@*/ unsigned int * countp,
592 /*@globals fileSystem @*/
593 /*@modifies *dbcursor, fileSystem @*/
595 return (*dbi->dbi_vec->ccount) (dbi, dbcursor, countp, flags);
599 * Verify (and close) index database.
600 * @param dbi index database handle
601 * @param flags (unused)
602 * @return 0 on success
604 /*@unused@*/ static inline
605 int dbiVerify(/*@only@*/ dbiIndex dbi, unsigned int flags)
606 /*@globals fileSystem @*/
607 /*@modifies dbi, fileSystem @*/
609 dbi->dbi_verify_on_close = 1;
610 return (*dbi->dbi_vec->close) (dbi, flags);
614 * Close index database.
615 * @param dbi index database handle
616 * @param flags (unused)
617 * @return 0 on success
619 /*@unused@*/ static inline
620 int dbiClose(/*@only@*/ dbiIndex dbi, unsigned int flags)
621 /*@globals fileSystem @*/
622 /*@modifies dbi, fileSystem @*/
624 return (*dbi->dbi_vec->close) (dbi, flags);
628 * Flush pending operations to disk.
629 * @param dbi index database handle
630 * @param flags (unused)
631 * @return 0 on success
633 /*@unused@*/ static inline
634 int dbiSync (dbiIndex dbi, unsigned int flags)
635 /*@globals fileSystem @*/
636 /*@modifies fileSystem @*/
638 return (*dbi->dbi_vec->sync) (dbi, flags);
642 * Associate secondary database with primary.
643 * @param dbi index database handle
644 * @param dbisecondary secondary index database handle
645 * @param callback create secondary key from primary (NULL if DB_RDONLY)
646 * @param flags DB_CREATE or 0
647 * @return 0 on success
649 /*@unused@*/ static inline
650 int dbiAssociate(dbiIndex dbi, dbiIndex dbisecondary,
651 int (*callback) (DB *, const DBT *, const DBT *, DBT *),
653 /*@globals fileSystem @*/
654 /*@modifies dbi, fileSystem @*/
656 return (*dbi->dbi_vec->associate) (dbi, dbisecondary, callback, flags);
660 * Return join cursor for list of cursors.
661 * @param dbi index database handle
662 * @param curslist NULL terminated list of database cursors
663 * @retval dbcp address of join database cursor
664 * @param flags DB_JOIN_NOSORT or 0
665 * @return 0 on success
667 /*@unused@*/ static inline
668 int dbiJoin(dbiIndex dbi, DBC ** curslist, /*@out@*/ DBC ** dbcp,
670 /*@globals fileSystem @*/
671 /*@modifies dbi, *dbcp, fileSystem @*/
673 return (*dbi->dbi_vec->join) (dbi, curslist, dbcp, flags);
677 * Is database byte swapped?
678 * @param dbi index database handle
681 /*@unused@*/ static inline
682 int dbiByteSwapped(dbiIndex dbi)
685 /*@-mods@*/ /* FIX: shrug */
686 if (dbi->dbi_byteswapped == -1)
687 dbi->dbi_byteswapped = (*dbi->dbi_vec->byteswapped) (dbi);
689 return dbi->dbi_byteswapped;
691 /*@=globuse =mods =mustmod @*/
697 unsigned int rpmdbGetIteratorFileNum(rpmdbMatchIterator mi)
701 * Destroy set of index database items.
702 * @param set set of index database items
703 * @return NULL always
705 /*@null@*/ dbiIndexSet dbiFreeIndexSet(/*@only@*/ /*@null@*/ dbiIndexSet set)
709 * Count items in index database set.
710 * @param set set of index database items
711 * @return number of items
713 unsigned int dbiIndexSetCount(dbiIndexSet set)
717 * Return record offset of header from element in index database set.
718 * @param set set of index database items
719 * @param recno index of item in set
720 * @return record offset of header
722 unsigned int dbiIndexRecordOffset(dbiIndexSet set, int recno)
726 * Return file index from element in index database set.
727 * @param set set of index database items
728 * @param recno index of item in set
731 unsigned int dbiIndexRecordFileNumber(dbiIndexSet set, int recno)
735 * Mergesort, same arguments as qsort(2).
738 int mergesort(void *base, size_t nmemb, size_t size,
739 int (*cmp) (const void *, const void *))
741 /*@modifies base, errno @*/;