4 /** \ingroup rpmdb dbi db1 db3
6 * Access RPM indices using Berkeley DB interface(s).
14 typedef /*@abstract@*/ struct _dbiIndexItem * dbiIndexItem;
18 typedef /*@abstract@*/ struct _dbiIndex * dbiIndex;
20 /* this will break if sizeof(int) != 4 */
22 * A single item from an index database (i.e. the "data returned").
23 * Note: In rpm-3.0.4 and earlier, this structure was passed by value,
24 * and was identical to the "data saved" structure below.
26 struct _dbiIndexItem {
27 unsigned int hdrNum; /*!< header instance in db */
28 unsigned int tagNum; /*!< tag index in header */
29 unsigned int fpNum; /*!< finger print index */
30 unsigned int dbNum; /*!< database index */
34 * Items retrieved from the index database.
37 /*@owned@*/ struct _dbiIndexItem * recs; /*!< array of records */
38 int count; /*!< number of records */
42 * Private methods for accessing an index database.
45 int dbv_major; /*!< Berkeley db version major */
46 int dbv_minor; /*!< Berkeley db version minor */
47 int dbv_patch; /*!< Berkeley db version patch */
50 * Return handle for an index database.
51 * @param rpmdb rpm database
52 * @param rpmtag rpm tag
53 * @return 0 on success
55 int (*open) (rpmdb rpmdb, int rpmtag, /*@out@*/ dbiIndex * dbip)
56 /*@globals fileSystem@*/
57 /*@modifies *dbip, fileSystem @*/;
60 * Close index database, and destroy database handle.
61 * @param dbi index database handle
62 * @param flags (unused)
63 * @return 0 on success
65 int (*close) (/*@only@*/ dbiIndex dbi, unsigned int flags)
66 /*@globals fileSystem@*/
67 /*@modifies dbi, fileSystem @*/;
70 * Flush pending operations to disk.
71 * @param dbi index database handle
72 * @param flags (unused)
73 * @return 0 on success
75 int (*sync) (dbiIndex dbi, unsigned int flags)
76 /*@globals fileSystem@*/
77 /*@modifies fileSystem @*/;
80 * Open database cursor.
81 * @param dbi index database handle
82 * @param txnid database transaction handle
83 * @retval dbcp address of database cursor
84 * @param flags (unused)
85 * @return 0 on success
87 int (*copen) (dbiIndex dbi, /*@null@*/ DB_TXN * txnid,
88 /*@out@*/ DBC ** dbcp, unsigned int flags)
89 /*@globals fileSystem@*/
90 /*@modifies dbi, *txnidp, *dbcp, fileSystem @*/;
93 * Close database cursor.
94 * @param dbi index database handle
95 * @param dbcursor database cursor
96 * @param flags (unused)
97 * @return 0 on success
99 int (*cclose) (dbiIndex dbi, /*@only@*/ DBC * dbcursor, unsigned int flags)
100 /*@globals fileSystem@*/
101 /*@modifies dbi, *dbcursor, fileSystem @*/;
104 * Delete (key,data) pair(s) using db->del or dbcursor->c_del.
105 * @param dbi index database handle
106 * @param dbcursor database cursor (NULL will use db->del)
107 * @param key delete key value/length/flags
108 * @param flags (unused)
109 * @return 0 on success
111 int (*cdel) (dbiIndex dbi, /*@null@*/ DBC * dbcursor, DBT * key,
113 /*@globals fileSystem@*/
114 /*@modifies *dbcursor, fileSystem @*/;
117 * Retrieve (key,data) pair using db->get or dbcursor->c_get.
118 * @param dbi index database handle
119 * @param dbcursor database cursor (NULL will use db->get)
120 * @param key retrieve key value/length/flags
121 * @param data retrieve data value/length/flags
122 * @return 0 on success
124 int (*cget) (dbiIndex dbi, /*@null@*/ DBC * dbcursor, DBT * key, DBT * data)
125 /*@globals fileSystem@*/
126 /*@modifies *dbcursor, *key, *data, fileSystem @*/;
129 * Store (key,data) pair using db->put or dbcursor->c_put.
130 * @param dbi index database handle
131 * @param dbcursor database cursor (NULL will use db->put)
132 * @param key store key value/length/flags
133 * @param data store data value/length/flags
134 * @return 0 on success
136 int (*cput) (dbiIndex dbi, /*@null@*/ DBC * dbcursor, DBT * key, DBT * data)
137 /*@globals fileSystem@*/
138 /*@modifies *dbcursor, fileSystem @*/;
141 * Retrieve count of (possible) duplicate items using dbcursor->c_count.
142 * @param dbi index database handle
143 * @param dbcursor database cursor
144 * @param countp address of count
145 * @param flags (unused)
146 * @return 0 on success
148 int (*ccount) (dbiIndex dbi, DBC * dbcursor,
149 /*@out@*/ unsigned int * countp,
151 /*@globals fileSystem@*/
152 /*@modifies *dbcursor, fileSystem @*/;
155 * Is database byte swapped?
156 * @param dbi index database handle
159 int (*byteswapped) (dbiIndex dbi)
160 /*@globals fileSystem@*/
161 /*@modifies fileSystem@*/;
164 * Save statistics in database handle.
165 * @param dbi index database handle
166 * @param flags retrieve statistics that don't require traversal?
167 * @return 0 on success
169 int (*stat) (dbiIndex dbi, unsigned int flags)
170 /*@globals fileSystem@*/
171 /*@modifies dbi, fileSystem @*/;
176 * Describes an index database (implemented on Berkeley db3 functionality).
180 const char * dbi_root; /*!< chroot(2) component of path */
182 const char * dbi_home; /*!< directory component of path */
184 const char * dbi_file; /*!< file component of path */
186 const char * dbi_subfile;
188 const char * dbi_tmpdir; /*!< temporary directory */
190 int dbi_ecflags; /*!< db_env_create flags */
191 int dbi_cflags; /*!< db_create flags */
192 int dbi_oeflags; /*!< common (db,dbenv}->open flags */
193 int dbi_eflags; /*!< dbenv->open flags */
194 int dbi_oflags; /*!< db->open flags */
195 int dbi_tflags; /*!< dbenv->txn_begin flags */
197 int dbi_type; /*!< db index type */
198 unsigned dbi_mode; /*!< mode to use on open */
199 int dbi_perms; /*!< file permission to use on open */
200 long dbi_shmkey; /*!< shared memory base key */
201 int dbi_api; /*!< Berkeley API type */
203 int dbi_verify_on_close;
204 int dbi_tear_down; /*!< tear down dbenv on close */
205 int dbi_use_cursors; /*!< access with cursors? (always) */
206 int dbi_use_dbenv; /*!< use db environment? */
207 int dbi_permit_dups; /*!< permit duplicate entries? */
208 int dbi_no_fsync; /*!< no-op fsync for db */
209 int dbi_no_dbsync; /*!< don't call dbiSync */
210 int dbi_lockdbfd; /*!< do fcntl lock on db fd */
211 int dbi_temporary; /*!< non-persistent */
215 /*@null@*/ char * dbi_host;
219 /* dbenv parameters */
222 void (*db_errcall) (const char *db_errpfx, char *buffer)
223 /*@globals fileSystem@*/
224 /*@modifies fileSystem @*/;
225 /*@unused@*/ /*@shared@*/
227 const char * dbi_errpfx;
231 /* mpool sub-system parameters */
232 int dbi_mp_mmapsize; /*!< (10Mb) */
233 int dbi_mp_size; /*!< (128Kb) */
234 /* lock sub-system parameters */
235 unsigned int dbi_lk_max;
236 unsigned int dbi_lk_detect;
237 /*@unused@*/ int dbi_lk_nmodes;
238 /*@unused@*/ unsigned char * dbi_lk_conflicts;
239 /* log sub-system parameters */
240 unsigned int dbi_lg_max;
241 unsigned int dbi_lg_bsize;
242 /* transaction sub-system parameters */
243 unsigned int dbi_tx_max;
245 int (*dbi_tx_recover) (DB_ENV *dbenv, DBT *log_rec,
246 DB_LSN *lsnp, int redo, void *info)
247 /*@globals fileSystem@*/
248 /*@modifies fileSystem @*/;
250 /* dbinfo parameters */
251 int dbi_cachesize; /*!< */
252 int dbi_pagesize; /*!< (fs blksize) */
253 /*@unused@*/ /*@null@*/
254 void * (*dbi_malloc) (size_t nbytes)
256 /* hash access parameters */
257 unsigned int dbi_h_ffactor; /*!< */
258 unsigned int (*dbi_h_hash_fcn) (DB *, const void *bytes,
261 unsigned int dbi_h_nelem; /*!< */
262 unsigned int dbi_h_flags; /*!< DB_DUP, DB_DUPSORT */
263 int (*dbi_h_dup_compare_fcn) (DB *, const DBT *, const DBT *)
265 /* btree access parameters */
268 int (*dbi_bt_compare_fcn) (DB *, const DBT *, const DBT *)
270 int (*dbi_bt_dup_compare_fcn) (DB *, const DBT *, const DBT *)
272 size_t (*dbi_bt_prefix_fcn) (DB *, const DBT *, const DBT *)
274 /* recno access parameters */
277 unsigned int dbi_re_len;
279 const char * dbi_re_source;
280 /* queue access parameters */
281 unsigned int dbi_q_extentsize;
285 rpmTag dbi_rpmtag; /*!< rpm tag used for index */
286 int dbi_jlen; /*!< size of join key */
288 unsigned int dbi_lastoffset; /*!< db1 with falloc.c needs this */
291 DB * dbi_db; /*!< Berkeley DB * handle */
293 DB_TXN * dbi_txnid; /*!< Bekerley DB_TXN * transaction id */
295 void * dbi_stats; /*!< Berkeley db statistics */
298 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 * @return index database handle
357 /*@unused@*/ /*@only@*/ /*@null@*/
358 dbiIndex db3New(rpmdb rpmdb, int rpmtag)
359 /*@globals rpmGlobalMacroContext @*/
360 /*@modifies rpmGlobalMacroContext @*/;
363 * Destroy index database handle instance.
364 * @param dbi index database handle
365 * @return NULL always
368 dbiIndex db3Free( /*@only@*/ /*@null@*/ dbiIndex dbi)
372 * Format db3 open flags for debugging print.
373 * @param dbflags db open flags
374 * @param print_dbenv_flags format db env flags instead?
375 * @return formatted flags (static buffer)
379 extern const char *const prDbiOpenFlags(int dbflags,
380 int print_dbenv_flags)
385 * Return handle for an index database.
386 * @param db rpm database
387 * @param rpmtag rpm tag
388 * @param flags (unused)
389 * @return index database handle
391 /*@only@*/ /*@null@*/ dbiIndex dbiOpen(/*@null@*/ rpmdb db, int rpmtag,
396 * Open a database cursor.
397 * @param dbi index database handle
398 * @param txnid database transaction handle
399 * @retval dbcp returned database cursor
400 * @param flags DBI_WRITECURSOR, DBI_ITERATOR or 0
401 * @return 0 on success
403 /*@unused@*/ static inline
404 int dbiCopen(dbiIndex dbi, /*@null@*/ DB_TXN * txnid,
405 /*@out@*/ DBC ** dbcp, unsigned int flags)
406 /*@globals fileSystem@*/
407 /*@modifies dbi, *dbcp, fileSystem @*/
409 return (*dbi->dbi_vec->copen) (dbi, txnid, dbcp, flags);
412 #define DBI_WRITECURSOR (1 << 0)
413 #define DBI_ITERATOR (1 << 1)
416 * Close a database cursor.
417 * @param dbi index database handle
418 * @param dbcursor database cursor
419 * @param flags (unused)
420 * @return 0 on success
422 /*@unused@*/ static inline
423 int dbiCclose(dbiIndex dbi, /*@only@*/ DBC * dbcursor, unsigned int flags)
424 /*@globals fileSystem@*/
425 /*@modifies dbi, *dbcursor, fileSystem @*/
427 return (*dbi->dbi_vec->cclose) (dbi, dbcursor, flags);
431 * Delete (key,data) pair(s) from index database.
432 * @param dbi index database handle
433 * @param dbcursor database cursor (NULL will use db->del)
434 * @param key delete key value/length/flags
435 * @param flags (unused)
436 * @return 0 on success
438 /*@unused@*/ static inline
439 int dbiDel(dbiIndex dbi, /*@null@*/ DBC * dbcursor, DBT * key,
441 /*@globals fileSystem@*/
442 /*@modifies *dbcursor, fileSystem @*/
445 (key && key->data && *((char *)key->data) == '\0' && key->size == 0);
448 if (NULkey) key->size++;
449 rc = (dbi->dbi_vec->cdel) (dbi, dbcursor, key, flags);
450 if (NULkey) key->size--;
456 * Retrieve (key,data) pair from index database.
457 * @param dbi index database handle
458 * @param dbcursor database cursor (NULL will use db->get)
459 * @param key retrieve key value/length/flags
460 * @param data retrieve data value/length/flags
461 * @return 0 on success
463 /*@unused@*/ static inline
464 int dbiGet(dbiIndex dbi, /*@null@*/ DBC * dbcursor, DBT * key, DBT * data)
465 /*@globals fileSystem@*/
466 /*@modifies *dbcursor, *key, *data, fileSystem @*/
469 (key && key->data && *((char *)key->data) == '\0' && key->size == 0);
472 if (NULkey) key->size++;
473 rc = (dbi->dbi_vec->cget) (dbi, dbcursor, key, data);
474 if (NULkey) key->size--;
479 * Store (key,data) pair in index database.
480 * @param dbi index database handle
481 * @param dbcursor database cursor (NULL will use db->put)
482 * @param key store key value/length/flags
483 * @param data store data value/length/flags
484 * @return 0 on success
486 /*@unused@*/ static inline
487 int dbiPut(dbiIndex dbi, /*@null@*/ DBC * dbcursor, DBT * key, DBT * data)
488 /*@globals fileSystem@*/
489 /*@modifies *dbcursor, *key, fileSystem @*/
492 (key && key->data && *((char *)key->data) == '\0' && key->size == 0);
495 if (NULkey) key->size++;
496 rc = (dbi->dbi_vec->cput) (dbi, dbcursor, key, data);
497 if (NULkey) key->size--;
502 * Retrieve count of (possible) duplicate items.
503 * @param dbi index database handle
504 * @param dbcursor database cursor
505 * @param countp address of count
506 * @param flags (unused)
507 * @return 0 on success
509 /*@unused@*/ static inline
510 int dbiCount(dbiIndex dbi, DBC * dbcursor, /*@out@*/ unsigned int * countp,
512 /*@globals fileSystem@*/
513 /*@modifies *dbcursor, fileSystem @*/
515 return (*dbi->dbi_vec->ccount) (dbi, dbcursor, countp, flags);
519 * Verify (and close) index database.
520 * @param dbi index database handle
521 * @param flags (unused)
522 * @return 0 on success
524 /*@unused@*/ static inline
525 int dbiVerify(/*@only@*/ dbiIndex dbi, unsigned int flags)
526 /*@globals fileSystem@*/
527 /*@modifies dbi, fileSystem @*/
529 dbi->dbi_verify_on_close = 1;
530 return (*dbi->dbi_vec->close) (dbi, flags);
534 * Close index database.
535 * @param dbi index database handle
536 * @param flags (unused)
537 * @return 0 on success
539 /*@unused@*/ static inline
540 int dbiClose(/*@only@*/ dbiIndex dbi, unsigned int flags)
541 /*@globals fileSystem@*/
542 /*@modifies dbi, fileSystem @*/
544 return (*dbi->dbi_vec->close) (dbi, flags);
548 * Flush pending operations to disk.
549 * @param dbi index database handle
550 * @param flags (unused)
551 * @return 0 on success
553 /*@unused@*/ static inline
554 int dbiSync (dbiIndex dbi, unsigned int flags)
555 /*@globals fileSystem@*/
556 /*@modifies fileSystem @*/
558 return (*dbi->dbi_vec->sync) (dbi, flags);
562 * Is database byte swapped?
563 * @param dbi index database handle
566 /*@unused@*/ static inline
567 int dbiByteSwapped(dbiIndex dbi)
570 /*@-mods@*/ /* FIX: shrug */
571 if (dbi->dbi_byteswapped == -1)
572 dbi->dbi_byteswapped = (*dbi->dbi_vec->byteswapped) (dbi);
574 return dbi->dbi_byteswapped;
578 * Return base file name for db1 database (legacy).
579 * @param rpmtag rpm tag
580 * @return base file name of db1 database
582 char * db1basename(int rpmtag)
588 unsigned int rpmdbGetIteratorFileNum(rpmdbMatchIterator mi)
592 * Destroy set of index database items.
593 * @param set set of index database items
594 * @return NULL always
596 /*@null@*/ dbiIndexSet dbiFreeIndexSet(/*@only@*/ /*@null@*/ dbiIndexSet set)
600 * Count items in index database set.
601 * @param set set of index database items
602 * @return number of items
604 unsigned int dbiIndexSetCount(dbiIndexSet set)
608 * Return record offset of header from element in index database set.
609 * @param set set of index database items
610 * @param recno index of item in set
611 * @return record offset of header
613 unsigned int dbiIndexRecordOffset(dbiIndexSet set, int recno)
617 * Return file index from element in index database set.
618 * @param set set of index database items
619 * @param recno index of item in set
622 unsigned int dbiIndexRecordFileNumber(dbiIndexSet set, int recno)
626 * Mergesort, same arguments as qsort(2).
629 int mergesort(void *base, size_t nmemb, size_t size,
630 int (*cmp) (const void *, const void *))
632 /*@modifies base, errno @*/;