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 * Open database cursor.
82 * @param dbi index database handle
83 * @param txnid database transaction handle
84 * @retval dbcp address of database cursor
85 * @param flags (unused)
86 * @return 0 on success
88 int (*copen) (dbiIndex dbi, /*@null@*/ DB_TXN * txnid,
89 /*@out@*/ DBC ** dbcp, unsigned int flags)
90 /*@globals fileSystem@*/
91 /*@modifies dbi, *txnid, *dbcp, fileSystem @*/;
94 * Close database cursor.
95 * @param dbi index database handle
96 * @param dbcursor database cursor
97 * @param flags (unused)
98 * @return 0 on success
100 int (*cclose) (dbiIndex dbi, /*@only@*/ DBC * dbcursor, unsigned int flags)
101 /*@globals fileSystem@*/
102 /*@modifies dbi, *dbcursor, fileSystem @*/;
105 * Delete (key,data) pair(s) using db->del or dbcursor->c_del.
106 * @param dbi index database handle
107 * @param dbcursor database cursor (NULL will use db->del)
108 * @param key delete key value/length/flags
109 * @param data delete data value/length/flags
110 * @param flags (unused)
111 * @return 0 on success
113 int (*cdel) (dbiIndex dbi, /*@null@*/ DBC * dbcursor, DBT * key, DBT * data,
115 /*@globals fileSystem@*/
116 /*@modifies *dbcursor, fileSystem @*/;
119 * Retrieve (key,data) pair using db->get or dbcursor->c_get.
120 * @param dbi index database handle
121 * @param dbcursor database cursor (NULL will use db->get)
122 * @param key retrieve key value/length/flags
123 * @param data retrieve data value/length/flags
124 * @param flags (unused)
125 * @return 0 on success
127 int (*cget) (dbiIndex dbi, /*@null@*/ DBC * dbcursor, DBT * key, DBT * data,
129 /*@globals fileSystem@*/
130 /*@modifies *dbcursor, *key, *data, fileSystem @*/;
133 * Store (key,data) pair using db->put or dbcursor->c_put.
134 * @param dbi index database handle
135 * @param dbcursor database cursor (NULL will use db->put)
136 * @param key store key value/length/flags
137 * @param data store data value/length/flags
138 * @param flags (unused)
139 * @return 0 on success
141 int (*cput) (dbiIndex dbi, /*@null@*/ DBC * dbcursor, DBT * key, DBT * data,
143 /*@globals fileSystem@*/
144 /*@modifies *dbcursor, fileSystem @*/;
147 * Retrieve count of (possible) duplicate items using dbcursor->c_count.
148 * @param dbi index database handle
149 * @param dbcursor database cursor
150 * @param countp address of count
151 * @param flags (unused)
152 * @return 0 on success
154 int (*ccount) (dbiIndex dbi, DBC * dbcursor,
155 /*@out@*/ unsigned int * countp,
157 /*@globals fileSystem@*/
158 /*@modifies *dbcursor, fileSystem @*/;
161 * Is database byte swapped?
162 * @param dbi index database handle
165 int (*byteswapped) (dbiIndex dbi)
166 /*@globals fileSystem@*/
167 /*@modifies fileSystem@*/;
170 * Save statistics in database handle.
171 * @param dbi index database handle
172 * @param flags retrieve statistics that don't require traversal?
173 * @return 0 on success
175 int (*stat) (dbiIndex dbi, unsigned int flags)
176 /*@globals fileSystem@*/
177 /*@modifies dbi, fileSystem @*/;
182 * Describes an index database (implemented on Berkeley db3 functionality).
186 const char * dbi_root; /*!< chroot(2) component of path */
188 const char * dbi_home; /*!< directory component of path */
190 const char * dbi_file; /*!< file component of path */
192 const char * dbi_subfile;
194 const char * dbi_tmpdir; /*!< temporary directory */
196 int dbi_ecflags; /*!< db_env_create flags */
197 int dbi_cflags; /*!< db_create flags */
198 int dbi_oeflags; /*!< common (db,dbenv}->open flags */
199 int dbi_eflags; /*!< dbenv->open flags */
200 int dbi_oflags; /*!< db->open flags */
201 int dbi_tflags; /*!< dbenv->txn_begin flags */
203 int dbi_type; /*!< db index type */
204 unsigned dbi_mode; /*!< mode to use on open */
205 int dbi_perms; /*!< file permission to use on open */
206 long dbi_shmkey; /*!< shared memory base key */
207 int dbi_api; /*!< Berkeley API type */
209 int dbi_verify_on_close;
210 int dbi_tear_down; /*!< tear down dbenv on close */
211 int dbi_use_cursors; /*!< access with cursors? (always) */
212 int dbi_use_dbenv; /*!< use db environment? */
213 int dbi_permit_dups; /*!< permit duplicate entries? */
214 int dbi_no_fsync; /*!< no-op fsync for db */
215 int dbi_no_dbsync; /*!< don't call dbiSync */
216 int dbi_lockdbfd; /*!< do fcntl lock on db fd */
217 int dbi_temporary; /*!< non-persistent */
221 /*@null@*/ char * dbi_host;
225 /* dbenv parameters */
228 void (*db_errcall) (const char *db_errpfx, char *buffer)
229 /*@globals fileSystem@*/
230 /*@modifies fileSystem @*/;
231 /*@unused@*/ /*@shared@*/
233 const char * dbi_errpfx;
237 /* mpool sub-system parameters */
238 int dbi_mp_mmapsize; /*!< (10Mb) */
239 int dbi_mp_size; /*!< (128Kb) */
240 /* lock sub-system parameters */
241 unsigned int dbi_lk_max;
242 unsigned int dbi_lk_detect;
243 /*@unused@*/ int dbi_lk_nmodes;
244 /*@unused@*/ unsigned char * dbi_lk_conflicts;
245 /* log sub-system parameters */
246 unsigned int dbi_lg_max;
247 unsigned int dbi_lg_bsize;
248 /* transaction sub-system parameters */
249 unsigned int dbi_tx_max;
251 int (*dbi_tx_recover) (DB_ENV *dbenv, DBT *log_rec,
252 DB_LSN *lsnp, int redo, void *info)
253 /*@globals fileSystem@*/
254 /*@modifies fileSystem @*/;
256 /* dbinfo parameters */
257 int dbi_cachesize; /*!< */
258 int dbi_pagesize; /*!< (fs blksize) */
259 /*@unused@*/ /*@null@*/
260 void * (*dbi_malloc) (size_t nbytes)
262 /* hash access parameters */
263 unsigned int dbi_h_ffactor; /*!< */
264 unsigned int (*dbi_h_hash_fcn) (DB *, const void *bytes,
267 unsigned int dbi_h_nelem; /*!< */
268 unsigned int dbi_h_flags; /*!< DB_DUP, DB_DUPSORT */
269 int (*dbi_h_dup_compare_fcn) (DB *, const DBT *, const DBT *)
271 /* btree access parameters */
274 int (*dbi_bt_compare_fcn) (DB *, const DBT *, const DBT *)
276 int (*dbi_bt_dup_compare_fcn) (DB *, const DBT *, const DBT *)
278 size_t (*dbi_bt_prefix_fcn) (DB *, const DBT *, const DBT *)
280 /* recno access parameters */
283 unsigned int dbi_re_len;
285 const char * dbi_re_source;
286 /* queue access parameters */
287 unsigned int dbi_q_extentsize;
291 rpmTag dbi_rpmtag; /*!< rpm tag used for index */
292 int dbi_jlen; /*!< size of join key */
294 unsigned int dbi_lastoffset; /*!< db1 with falloc.c needs this */
297 DB * dbi_db; /*!< Berkeley DB * handle */
299 DB_TXN * dbi_txnid; /*!< Bekerley DB_TXN * transaction id */
301 void * dbi_stats; /*!< Berkeley db statistics */
304 const struct _dbiVec * dbi_vec; /*!< private methods */
309 * Describes the collection of index databases used by rpm.
312 /*@owned@*/ const char * db_root;/*!< path prefix */
313 /*@owned@*/ const char * db_home;/*!< directory path */
315 int db_mode; /*!< open mode */
316 int db_perms; /*!< open permissions */
317 int db_api; /*!< Berkeley API type */
318 /*@owned@*/ const char * db_errpfx;
321 int db_chrootDone; /*!< If chroot(2) done, ignore db_root. */
322 void (*db_errcall) (const char *db_errpfx, char *buffer)
324 /*@shared@*/ FILE * db_errfile;
325 /*@only@*/ void * (*db_malloc) (size_t nbytes)
327 /*@only@*/ void * (*db_realloc) (/*@only@*//*@null@*/ void * ptr,
330 void (*db_free) (/*@only@*/ void * ptr)
331 /*@modifies *ptr @*/;
333 /*@only@*//*@null@*/ void * db_dbenv; /*!< Berkeley DB_ENV handle */
334 int db_ndbi; /*!< No. of tag indices. */
335 dbiIndex * _dbi; /*!< Tag indices. */
337 /*@refs@*/ int nrefs; /*!< Reference count. */
340 /* for RPM's internal use only */
345 RPMDB_FLAG_JUSTCHECK = (1 << 0),
346 RPMDB_FLAG_MINIMAL = (1 << 1),
348 RPMDB_FLAG_CHROOT = (1 << 2)
358 * Return new configured index database handle instance.
359 * @param rpmdb rpm database
360 * @param rpmtag rpm tag
361 * @return index database handle
363 /*@unused@*/ /*@only@*/ /*@null@*/
364 dbiIndex db3New(rpmdb rpmdb, rpmTag rpmtag)
365 /*@globals rpmGlobalMacroContext @*/
366 /*@modifies rpmGlobalMacroContext @*/;
369 * Destroy index database handle instance.
370 * @param dbi index database handle
371 * @return NULL always
374 dbiIndex db3Free( /*@only@*/ /*@null@*/ dbiIndex dbi)
378 * Format db3 open flags for debugging print.
379 * @param dbflags db open flags
380 * @param print_dbenv_flags format db env flags instead?
381 * @return formatted flags (static buffer)
385 extern const char *const prDbiOpenFlags(int dbflags, int print_dbenv_flags)
390 * Return handle for an index database.
391 * @param db rpm database
392 * @param rpmtag rpm tag
393 * @param flags (unused)
394 * @return index database handle
396 /*@only@*/ /*@null@*/ dbiIndex dbiOpen(/*@null@*/ rpmdb db, rpmTag rpmtag,
400 /*@-globuse -mods -mustmod @*/
402 * Open a database cursor.
403 * @param dbi index database handle
404 * @param txnid database transaction handle
405 * @retval dbcp returned database cursor
406 * @param flags DB_WRITECURSOR if writing, or 0
407 * @return 0 on success
409 /*@unused@*/ static inline
410 int dbiCopen(dbiIndex dbi, /*@null@*/ DB_TXN * txnid,
411 /*@out@*/ DBC ** dbcp, unsigned int flags)
412 /*@globals fileSystem@*/
413 /*@modifies dbi, *dbcp, fileSystem @*/
415 return (*dbi->dbi_vec->copen) (dbi, txnid, dbcp, flags);
419 * Close a database cursor.
420 * @param dbi index database handle
421 * @param dbcursor database cursor
422 * @param flags (unused)
423 * @return 0 on success
425 /*@unused@*/ static inline
426 int dbiCclose(dbiIndex dbi, /*@only@*/ DBC * dbcursor, unsigned int flags)
427 /*@globals fileSystem@*/
428 /*@modifies dbi, *dbcursor, fileSystem @*/
430 return (*dbi->dbi_vec->cclose) (dbi, dbcursor, flags);
434 * Delete (key,data) pair(s) from index database.
435 * @param dbi index database handle
436 * @param dbcursor database cursor (NULL will use db->del)
437 * @param key delete key value/length/flags
438 * @param data delete data value/length/flags
439 * @param flags (unused)
440 * @return 0 on success
442 /*@unused@*/ static inline
443 int dbiDel(dbiIndex dbi, /*@null@*/ DBC * dbcursor, DBT * key, DBT * data,
445 /*@globals fileSystem@*/
446 /*@modifies *dbcursor, fileSystem @*/
448 assert(key->size > 0);
449 return (dbi->dbi_vec->cdel) (dbi, dbcursor, key, data, flags);
453 * Retrieve (key,data) pair from index database.
454 * @param dbi index database handle
455 * @param dbcursor database cursor (NULL will use db->get)
456 * @param key retrieve key value/length/flags
457 * @param data retrieve data value/length/flags
458 * @param flags (unused)
459 * @return 0 on success
461 /*@unused@*/ static inline
462 int dbiGet(dbiIndex dbi, /*@null@*/ DBC * dbcursor, DBT * key, DBT * data,
464 /*@globals fileSystem@*/
465 /*@modifies *dbcursor, *key, *data, fileSystem @*/
467 assert((flags == DB_NEXT) || key->size > 0);
468 return (dbi->dbi_vec->cget) (dbi, dbcursor, key, data, flags);
472 * Store (key,data) pair in index database.
473 * @param dbi index database handle
474 * @param dbcursor database cursor (NULL will use db->put)
475 * @param key store key value/length/flags
476 * @param data store data value/length/flags
477 * @param flags (unused)
478 * @return 0 on success
480 /*@unused@*/ static inline
481 int dbiPut(dbiIndex dbi, /*@null@*/ DBC * dbcursor, DBT * key, DBT * data,
483 /*@globals fileSystem@*/
484 /*@modifies *dbcursor, *key, fileSystem @*/
486 assert(key->size > 0);
487 return (dbi->dbi_vec->cput) (dbi, dbcursor, key, data, flags);
491 * Retrieve count of (possible) duplicate items.
492 * @param dbi index database handle
493 * @param dbcursor database cursor
494 * @param countp address of count
495 * @param flags (unused)
496 * @return 0 on success
498 /*@unused@*/ static inline
499 int dbiCount(dbiIndex dbi, DBC * dbcursor, /*@out@*/ unsigned int * countp,
501 /*@globals fileSystem@*/
502 /*@modifies *dbcursor, fileSystem @*/
504 return (*dbi->dbi_vec->ccount) (dbi, dbcursor, countp, flags);
508 * Verify (and close) index database.
509 * @param dbi index database handle
510 * @param flags (unused)
511 * @return 0 on success
513 /*@unused@*/ static inline
514 int dbiVerify(/*@only@*/ dbiIndex dbi, unsigned int flags)
515 /*@globals fileSystem@*/
516 /*@modifies dbi, fileSystem @*/
518 dbi->dbi_verify_on_close = 1;
519 return (*dbi->dbi_vec->close) (dbi, flags);
523 * Close index database.
524 * @param dbi index database handle
525 * @param flags (unused)
526 * @return 0 on success
528 /*@unused@*/ static inline
529 int dbiClose(/*@only@*/ dbiIndex dbi, unsigned int flags)
530 /*@globals fileSystem@*/
531 /*@modifies dbi, fileSystem @*/
533 return (*dbi->dbi_vec->close) (dbi, flags);
537 * Flush pending operations to disk.
538 * @param dbi index database handle
539 * @param flags (unused)
540 * @return 0 on success
542 /*@unused@*/ static inline
543 int dbiSync (dbiIndex dbi, unsigned int flags)
544 /*@globals fileSystem@*/
545 /*@modifies fileSystem @*/
547 return (*dbi->dbi_vec->sync) (dbi, flags);
551 * Is database byte swapped?
552 * @param dbi index database handle
555 /*@unused@*/ static inline
556 int dbiByteSwapped(dbiIndex dbi)
559 /*@-mods@*/ /* FIX: shrug */
560 if (dbi->dbi_byteswapped == -1)
561 dbi->dbi_byteswapped = (*dbi->dbi_vec->byteswapped) (dbi);
563 return dbi->dbi_byteswapped;
565 /*@=globuse =mods =mustmod @*/
571 unsigned int rpmdbGetIteratorFileNum(rpmdbMatchIterator mi)
575 * Destroy set of index database items.
576 * @param set set of index database items
577 * @return NULL always
579 /*@null@*/ dbiIndexSet dbiFreeIndexSet(/*@only@*/ /*@null@*/ dbiIndexSet set)
583 * Count items in index database set.
584 * @param set set of index database items
585 * @return number of items
587 unsigned int dbiIndexSetCount(dbiIndexSet set)
591 * Return record offset of header from element in index database set.
592 * @param set set of index database items
593 * @param recno index of item in set
594 * @return record offset of header
596 unsigned int dbiIndexRecordOffset(dbiIndexSet set, int recno)
600 * Return file index from element in index database set.
601 * @param set set of index database items
602 * @param recno index of item in set
605 unsigned int dbiIndexRecordFileNumber(dbiIndexSet set, int recno)
609 * Mergesort, same arguments as qsort(2).
612 int mergesort(void *base, size_t nmemb, size_t size,
613 int (*cmp) (const void *, const void *))
615 /*@modifies base, errno @*/;