5 /** \ingroup rpmdb dbi db1 db3
7 * Access RPM indices using Berkeley DB interface(s).
16 * Database of headers and tag value indices.
18 typedef /*@abstract@*/ /*@refcounted@*/ struct rpmdb_s * rpmdb;
23 typedef /*@abstract@*/ struct _rpmdbMatchIterator * rpmdbMatchIterator;
27 * Tag value pattern match mode.
29 typedef enum rpmMireMode_e {
30 RPMMIRE_DEFAULT = 0, /*!< regex with \., .* and ^...$ added */
31 RPMMIRE_STRCMP = 1, /*!< strcmp on strings */
32 RPMMIRE_REGEX = 2, /*!< regex patterns */
33 RPMMIRE_GLOB = 3 /*!< glob patterns through fnmatch(3) */
38 typedef /*@abstract@*/ struct _dbiIndexItem * dbiIndexItem;
41 * A single element (i.e. inverted list from tag values) of a database.
43 typedef /*@abstract@*/ struct _dbiIndexSet * dbiIndexSet;
47 typedef /*@abstract@*/ struct _dbiIndex * dbiIndex;
49 /* this will break if sizeof(int) != 4 */
51 * A single item from an index database (i.e. the "data returned").
52 * Note: In rpm-3.0.4 and earlier, this structure was passed by value,
53 * and was identical to the "data saved" structure below.
55 struct _dbiIndexItem {
56 unsigned int hdrNum; /*!< header instance in db */
57 unsigned int tagNum; /*!< tag index in header */
58 unsigned int fpNum; /*!< finger print index */
62 * Items retrieved from the index database.
65 /*@owned@*/ struct _dbiIndexItem * recs; /*!< array of records */
66 int count; /*!< number of records */
70 * Private methods for accessing an index database.
73 int dbv_major; /*!< Berkeley db version major */
74 int dbv_minor; /*!< Berkeley db version minor */
75 int dbv_patch; /*!< Berkeley db version patch */
78 * Return handle for an index database.
79 * @param rpmdb rpm database
80 * @param rpmtag rpm tag
81 * @return 0 on success
83 int (*open) (rpmdb rpmdb, rpmTag rpmtag, /*@out@*/ dbiIndex * dbip)
84 /*@globals fileSystem @*/
85 /*@modifies *dbip, fileSystem @*/;
88 * Close index database, and destroy database handle.
89 * @param dbi index database handle
90 * @param flags (unused)
91 * @return 0 on success
93 int (*close) (/*@only@*/ dbiIndex dbi, unsigned int flags)
94 /*@globals fileSystem @*/
95 /*@modifies dbi, fileSystem @*/;
98 * Flush pending operations to disk.
99 * @param dbi index database handle
100 * @param flags (unused)
101 * @return 0 on success
103 int (*sync) (dbiIndex dbi, unsigned int flags)
104 /*@globals fileSystem @*/
105 /*@modifies fileSystem @*/;
108 * Associate secondary database with primary.
109 * @param dbi index database handle
110 * @param dbisecondary secondary index database handle
111 * @param callback create secondary key from primary (NULL if DB_RDONLY)
112 * @param flags DB_CREATE or 0
113 * @return 0 on success
115 int (*associate) (dbiIndex dbi, dbiIndex dbisecondary,
116 int (*callback) (DB *, const DBT *, const DBT *, DBT *),
118 /*@globals fileSystem @*/
119 /*@modifies dbi, fileSystem @*/;
122 * Return join cursor for list of cursors.
123 * @param dbi index database handle
124 * @param curslist NULL terminated list of database cursors
125 * @retval dbcp address of join database cursor
126 * @param flags DB_JOIN_NOSORT or 0
127 * @return 0 on success
129 int (*join) (dbiIndex dbi, DBC ** curslist, /*@out@*/ DBC ** dbcp,
131 /*@globals fileSystem @*/
132 /*@modifies dbi, *dbcp, fileSystem @*/;
135 * Open database cursor.
136 * @param dbi index database handle
137 * @param txnid database transaction handle
138 * @retval dbcp address of new database cursor
139 * @param dbiflags DB_WRITECURSOR or 0
140 * @return 0 on success
142 int (*copen) (dbiIndex dbi, /*@null@*/ DB_TXN * txnid,
143 /*@out@*/ DBC ** dbcp, unsigned int dbiflags)
144 /*@globals fileSystem @*/
145 /*@modifies dbi, *txnid, *dbcp, fileSystem @*/;
148 * Close database cursor.
149 * @param dbi index database handle
150 * @param dbcursor database cursor
151 * @param flags (unused)
152 * @return 0 on success
154 int (*cclose) (dbiIndex dbi, /*@only@*/ DBC * dbcursor, unsigned int flags)
155 /*@globals fileSystem @*/
156 /*@modifies dbi, *dbcursor, fileSystem @*/;
159 * Duplicate a database cursor.
160 * @param dbi index database handle
161 * @param dbcursor database cursor
162 * @retval dbcp address of new database cursor
163 * @param flags DB_POSITION for same position, 0 for uninitialized
164 * @return 0 on success
166 int (*cdup) (dbiIndex dbi, DBC * dbcursor, /*@out@*/ DBC ** dbcp,
168 /*@globals fileSystem @*/
169 /*@modifies dbi, *dbcp, fileSystem @*/;
172 * Delete (key,data) pair(s) using db->del or dbcursor->c_del.
173 * @param dbi index database handle
174 * @param dbcursor database cursor (NULL will use db->del)
175 * @param key delete key value/length/flags
176 * @param data delete data value/length/flags
177 * @param flags (unused)
178 * @return 0 on success
180 int (*cdel) (dbiIndex dbi, /*@null@*/ DBC * dbcursor, DBT * key, DBT * data,
182 /*@globals fileSystem @*/
183 /*@modifies *dbcursor, fileSystem @*/;
186 * Retrieve (key,data) pair using db->get or dbcursor->c_get.
187 * @param dbi index database handle
188 * @param dbcursor database cursor (NULL will use db->get)
189 * @param key retrieve key value/length/flags
190 * @param data retrieve data value/length/flags
191 * @param flags (unused)
192 * @return 0 on success
194 int (*cget) (dbiIndex dbi, /*@null@*/ DBC * dbcursor, DBT * key, DBT * data,
196 /*@globals fileSystem @*/
197 /*@modifies *dbcursor, *key, *data, fileSystem @*/;
200 * Retrieve (key,data) pair using dbcursor->c_pget.
201 * @param dbi index database handle
202 * @param dbcursor database cursor
203 * @param key secondary retrieve key value/length/flags
204 * @param pkey primary retrieve key value/length/flags
205 * @param data primary retrieve data value/length/flags
206 * @param flags DB_NEXT, DB_SET, or 0
207 * @return 0 on success
209 int (*cpget) (dbiIndex dbi, /*@null@*/ DBC * dbcursor,
210 DBT * key, DBT * pkey, DBT * data, unsigned int flags)
211 /*@globals fileSystem @*/
212 /*@modifies *dbcursor, *key, *pkey, *data, fileSystem @*/;
215 * Store (key,data) pair using db->put or dbcursor->c_put.
216 * @param dbi index database handle
217 * @param dbcursor database cursor (NULL will use db->put)
218 * @param key store key value/length/flags
219 * @param data store data value/length/flags
220 * @param flags (unused)
221 * @return 0 on success
223 int (*cput) (dbiIndex dbi, /*@null@*/ DBC * dbcursor, DBT * key, DBT * data,
225 /*@globals fileSystem @*/
226 /*@modifies *dbcursor, fileSystem @*/;
229 * Retrieve count of (possible) duplicate items using dbcursor->c_count.
230 * @param dbi index database handle
231 * @param dbcursor database cursor
232 * @param countp address of count
233 * @param flags (unused)
234 * @return 0 on success
236 int (*ccount) (dbiIndex dbi, DBC * dbcursor,
237 /*@out@*/ unsigned int * countp,
239 /*@globals fileSystem @*/
240 /*@modifies *dbcursor, fileSystem @*/;
243 * Is database byte swapped?
244 * @param dbi index database handle
247 int (*byteswapped) (dbiIndex dbi)
248 /*@globals fileSystem @*/
249 /*@modifies fileSystem @*/;
252 * Save statistics in database handle.
253 * @param dbi index database handle
254 * @param flags retrieve statistics that don't require traversal?
255 * @return 0 on success
257 int (*stat) (dbiIndex dbi, unsigned int flags)
258 /*@globals fileSystem @*/
259 /*@modifies dbi, fileSystem @*/;
264 * Describes an index database (implemented on Berkeley db3 functionality).
268 const char * dbi_root; /*!< chroot(2) component of path */
270 const char * dbi_home; /*!< directory component of path */
272 const char * dbi_file; /*!< file component of path */
274 const char * dbi_subfile;
276 const char * dbi_tmpdir; /*!< temporary directory */
278 int dbi_ecflags; /*!< db_env_create flags */
279 int dbi_cflags; /*!< db_create flags */
280 int dbi_oeflags; /*!< common (db,dbenv}->open flags */
281 int dbi_eflags; /*!< dbenv->open flags */
282 int dbi_oflags; /*!< db->open flags */
283 int dbi_tflags; /*!< dbenv->txn_begin flags */
285 int dbi_type; /*!< db index type */
286 unsigned dbi_mode; /*!< mode to use on open */
287 int dbi_perms; /*!< file permission to use on open */
288 long dbi_shmkey; /*!< shared memory base key */
289 int dbi_api; /*!< Berkeley API type */
291 int dbi_verify_on_close;
292 int dbi_tear_down; /*!< tear down dbenv on close */
293 int dbi_use_dbenv; /*!< use db environment? */
294 int dbi_permit_dups; /*!< permit duplicate entries? */
295 int dbi_no_fsync; /*!< no-op fsync for db */
296 int dbi_no_dbsync; /*!< don't call dbiSync */
297 int dbi_lockdbfd; /*!< do fcntl lock on db fd */
298 int dbi_temporary; /*!< non-persistent */
304 unsigned long dbi_cl_timeout;
305 unsigned long dbi_sv_timeout;
307 /* dbenv parameters */
310 void (*db_errcall) (const char *db_errpfx, char *buffer)
311 /*@globals fileSystem @*/
312 /*@modifies fileSystem @*/;
313 /*@unused@*/ /*@shared@*/
315 const char * dbi_errpfx;
319 /* mpool sub-system parameters */
320 int dbi_mp_mmapsize; /*!< (10Mb) */
321 int dbi_mp_size; /*!< (128Kb) */
322 /* lock sub-system parameters */
323 unsigned int dbi_lk_max;
324 unsigned int dbi_lk_detect;
325 /*@unused@*/ int dbi_lk_nmodes;
326 /*@unused@*/ unsigned char * dbi_lk_conflicts;
327 /* log sub-system parameters */
328 unsigned int dbi_lg_max;
329 unsigned int dbi_lg_bsize;
330 /* transaction sub-system parameters */
331 unsigned int dbi_tx_max;
333 int (*dbi_tx_recover) (DB_ENV *dbenv, DBT *log_rec,
334 DB_LSN *lsnp, int redo, void *info)
335 /*@globals fileSystem @*/
336 /*@modifies fileSystem @*/;
338 /* dbinfo parameters */
339 int dbi_cachesize; /*!< */
340 int dbi_pagesize; /*!< (fs blksize) */
341 /*@unused@*/ /*@null@*/
342 void * (*dbi_malloc) (size_t nbytes)
344 /* hash access parameters */
345 unsigned int dbi_h_ffactor; /*!< */
346 unsigned int (*dbi_h_hash_fcn) (DB *, const void *bytes,
349 unsigned int dbi_h_nelem; /*!< */
350 unsigned int dbi_h_flags; /*!< DB_DUP, DB_DUPSORT */
351 int (*dbi_h_dup_compare_fcn) (DB *, const DBT *, const DBT *)
353 /* btree access parameters */
356 int (*dbi_bt_compare_fcn) (DB *, const DBT *, const DBT *)
358 int (*dbi_bt_dup_compare_fcn) (DB *, const DBT *, const DBT *)
360 size_t (*dbi_bt_prefix_fcn) (DB *, const DBT *, const DBT *)
362 /* recno access parameters */
365 unsigned int dbi_re_len;
367 const char * dbi_re_source;
368 /* queue access parameters */
369 unsigned int dbi_q_extentsize;
373 rpmTag dbi_rpmtag; /*!< rpm tag used for index */
374 int dbi_jlen; /*!< size of join key */
376 unsigned int dbi_lastoffset; /*!< db1 with falloc.c needs this */
379 DB * dbi_db; /*!< Berkeley DB * handle */
381 DB_TXN * dbi_txnid; /*!< Bekerley DB_TXN * transaction id */
383 void * dbi_stats; /*!< Berkeley db statistics */
386 const struct _dbiVec * dbi_vec; /*!< private methods */
391 * Describes the collection of index databases used by rpm.
394 /*@owned@*/ const char * db_root;/*!< path prefix */
395 /*@owned@*/ const char * db_home;/*!< directory path */
397 int db_mode; /*!< open mode */
398 int db_perms; /*!< open permissions */
399 int db_api; /*!< Berkeley API type */
400 /*@owned@*/ const char * db_errpfx;
403 int db_chrootDone; /*!< If chroot(2) done, ignore db_root. */
404 void (*db_errcall) (const char *db_errpfx, char *buffer)
406 /*@shared@*/ FILE * db_errfile;
407 /*@only@*/ void * (*db_malloc) (size_t nbytes)
409 /*@only@*/ void * (*db_realloc) (/*@only@*//*@null@*/ void * ptr,
412 void (*db_free) (/*@only@*/ void * ptr)
413 /*@modifies *ptr @*/;
415 /*@only@*//*@null@*/ void * db_dbenv; /*!< Berkeley DB_ENV handle */
416 int db_ndbi; /*!< No. of tag indices. */
417 dbiIndex * _dbi; /*!< Tag indices. */
419 /*@refs@*/ int nrefs; /*!< Reference count. */
422 /* for RPM's internal use only */
427 RPMDB_FLAG_JUSTCHECK = (1 << 0),
428 RPMDB_FLAG_MINIMAL = (1 << 1),
430 RPMDB_FLAG_CHROOT = (1 << 2)
440 * Return new configured index database handle instance.
441 * @param rpmdb rpm database
442 * @param rpmtag rpm tag
443 * @return index database handle
445 /*@unused@*/ /*@only@*/ /*@null@*/
446 dbiIndex db3New(rpmdb rpmdb, rpmTag rpmtag)
447 /*@globals rpmGlobalMacroContext @*/
448 /*@modifies rpmGlobalMacroContext @*/;
451 * Destroy index database handle instance.
452 * @param dbi index database handle
453 * @return NULL always
456 dbiIndex db3Free( /*@only@*/ /*@null@*/ dbiIndex dbi)
460 * Format db3 open flags for debugging print.
461 * @param dbflags db open flags
462 * @param print_dbenv_flags format db env flags instead?
463 * @return formatted flags (static buffer)
467 extern const char *const prDbiOpenFlags(int dbflags, int print_dbenv_flags)
472 * Return handle for an index database.
473 * @param db rpm database
474 * @param rpmtag rpm tag
475 * @param flags (unused)
476 * @return index database handle
478 /*@only@*/ /*@null@*/ dbiIndex dbiOpen(/*@null@*/ rpmdb db, rpmTag rpmtag,
482 /*@-globuse -mods -mustmod @*/
484 * Open a database cursor.
485 * @param dbi index database handle
486 * @param txnid database transaction handle
487 * @retval dbcp returned database cursor
488 * @param flags DB_WRITECURSOR if writing, or 0
489 * @return 0 on success
491 /*@unused@*/ static inline
492 int dbiCopen(dbiIndex dbi, /*@null@*/ DB_TXN * txnid,
493 /*@out@*/ DBC ** dbcp, unsigned int flags)
494 /*@globals fileSystem @*/
495 /*@modifies dbi, *dbcp, fileSystem @*/
497 return (*dbi->dbi_vec->copen) (dbi, txnid, dbcp, flags);
501 * Close a database cursor.
502 * @param dbi index database handle
503 * @param dbcursor database cursor
504 * @param flags (unused)
505 * @return 0 on success
507 /*@unused@*/ static inline
508 int dbiCclose(dbiIndex dbi, /*@only@*/ DBC * dbcursor, unsigned int flags)
509 /*@globals fileSystem @*/
510 /*@modifies dbi, *dbcursor, fileSystem @*/
512 return (*dbi->dbi_vec->cclose) (dbi, dbcursor, flags);
516 * Duplicate a database cursor.
517 * @param dbi index database handle
518 * @param dbcursor database cursor
519 * @retval dbcp address of new database cursor
520 * @param flags DB_POSITION for same position, 0 for uninitialized
521 * @return 0 on success
523 /*@unused@*/ static inline
524 int dbiCdup(dbiIndex dbi, DBC * dbcursor, /*@out@*/ DBC ** dbcp,
526 /*@modifies dbi, *dbcp @*/
528 return (*dbi->dbi_vec->cdup) (dbi, dbcursor, dbcp, flags);
532 * Delete (key,data) pair(s) from index database.
533 * @param dbi index database handle
534 * @param dbcursor database cursor (NULL will use db->del)
535 * @param key delete key value/length/flags
536 * @param data delete data value/length/flags
537 * @param flags (unused)
538 * @return 0 on success
540 /*@unused@*/ static inline
541 int dbiDel(dbiIndex dbi, /*@null@*/ DBC * dbcursor, DBT * key, DBT * data,
543 /*@globals fileSystem @*/
544 /*@modifies *dbcursor, fileSystem @*/
546 assert(key->data != NULL && key->size > 0);
547 return (dbi->dbi_vec->cdel) (dbi, dbcursor, key, data, flags);
551 * Retrieve (key,data) pair from index database.
552 * @param dbi index database handle
553 * @param dbcursor database cursor (NULL will use db->get)
554 * @param key retrieve key value/length/flags
555 * @param data retrieve data value/length/flags
556 * @param flags (unused)
557 * @return 0 on success
559 /*@unused@*/ static inline
560 int dbiGet(dbiIndex dbi, /*@null@*/ DBC * dbcursor, DBT * key, DBT * data,
562 /*@globals fileSystem @*/
563 /*@modifies *dbcursor, *key, *data, fileSystem @*/
565 assert((flags == DB_NEXT) || (key->data != NULL && key->size > 0));
566 return (dbi->dbi_vec->cget) (dbi, dbcursor, key, data, flags);
570 * Retrieve (key,data) pair using dbcursor->c_pget.
571 * @param dbi index database handle
572 * @param dbcursor database cursor (NULL will use db->get)
573 * @param key secondary retrieve key value/length/flags
574 * @param pkey primary retrieve key value/length/flags
575 * @param data primary retrieve data value/length/flags
576 * @param flags DB_NEXT, DB_SET, or 0
577 * @return 0 on success
579 /*@unused@*/ static inline
580 int dbiPget(dbiIndex dbi, /*@null@*/ DBC * dbcursor,
581 DBT * key, DBT * pkey, DBT * data, unsigned int flags)
582 /*@globals fileSystem @*/
583 /*@modifies *dbcursor, *key, *pkey, *data, fileSystem @*/
585 assert((flags == DB_NEXT) || (key->data != NULL && key->size > 0));
586 return (dbi->dbi_vec->cpget) (dbi, dbcursor, key, pkey, data, flags);
590 * Store (key,data) pair in index database.
591 * @param dbi index database handle
592 * @param dbcursor database cursor (NULL will use db->put)
593 * @param key store key value/length/flags
594 * @param data store data value/length/flags
595 * @param flags (unused)
596 * @return 0 on success
598 /*@unused@*/ static inline
599 int dbiPut(dbiIndex dbi, /*@null@*/ DBC * dbcursor, DBT * key, DBT * data,
601 /*@globals fileSystem @*/
602 /*@modifies *dbcursor, *key, fileSystem @*/
604 assert(key->data != NULL && key->size > 0 && data->data != NULL && data->size > 0);
605 return (dbi->dbi_vec->cput) (dbi, dbcursor, key, data, flags);
609 * Retrieve count of (possible) duplicate items.
610 * @param dbi index database handle
611 * @param dbcursor database cursor
612 * @param countp address of count
613 * @param flags (unused)
614 * @return 0 on success
616 /*@unused@*/ static inline
617 int dbiCount(dbiIndex dbi, DBC * dbcursor, /*@out@*/ unsigned int * countp,
619 /*@globals fileSystem @*/
620 /*@modifies *dbcursor, fileSystem @*/
622 return (*dbi->dbi_vec->ccount) (dbi, dbcursor, countp, flags);
626 * Verify (and close) index database.
627 * @param dbi index database handle
628 * @param flags (unused)
629 * @return 0 on success
631 /*@unused@*/ static inline
632 int dbiVerify(/*@only@*/ dbiIndex dbi, unsigned int flags)
633 /*@globals fileSystem @*/
634 /*@modifies dbi, fileSystem @*/
636 dbi->dbi_verify_on_close = 1;
637 return (*dbi->dbi_vec->close) (dbi, flags);
641 * Close index database.
642 * @param dbi index database handle
643 * @param flags (unused)
644 * @return 0 on success
646 /*@unused@*/ static inline
647 int dbiClose(/*@only@*/ dbiIndex dbi, unsigned int flags)
648 /*@globals fileSystem @*/
649 /*@modifies dbi, fileSystem @*/
651 return (*dbi->dbi_vec->close) (dbi, flags);
655 * Flush pending operations to disk.
656 * @param dbi index database handle
657 * @param flags (unused)
658 * @return 0 on success
660 /*@unused@*/ static inline
661 int dbiSync (dbiIndex dbi, unsigned int flags)
662 /*@globals fileSystem @*/
663 /*@modifies fileSystem @*/
665 return (*dbi->dbi_vec->sync) (dbi, flags);
669 * Associate secondary database with primary.
670 * @param dbi index database handle
671 * @param dbisecondary secondary index database handle
672 * @param callback create secondary key from primary (NULL if DB_RDONLY)
673 * @param flags DB_CREATE or 0
674 * @return 0 on success
676 /*@unused@*/ static inline
677 int dbiAssociate(dbiIndex dbi, dbiIndex dbisecondary,
678 int (*callback) (DB *, const DBT *, const DBT *, DBT *),
680 /*@globals fileSystem @*/
681 /*@modifies dbi, fileSystem @*/
683 return (*dbi->dbi_vec->associate) (dbi, dbisecondary, callback, flags);
687 * Return join cursor for list of cursors.
688 * @param dbi index database handle
689 * @param curslist NULL terminated list of database cursors
690 * @retval dbcp address of join database cursor
691 * @param flags DB_JOIN_NOSORT or 0
692 * @return 0 on success
694 /*@unused@*/ static inline
695 int dbiJoin(dbiIndex dbi, DBC ** curslist, /*@out@*/ DBC ** dbcp,
697 /*@globals fileSystem @*/
698 /*@modifies dbi, *dbcp, fileSystem @*/
700 return (*dbi->dbi_vec->join) (dbi, curslist, dbcp, flags);
704 * Is database byte swapped?
705 * @param dbi index database handle
708 /*@unused@*/ static inline
709 int dbiByteSwapped(dbiIndex dbi)
712 /*@-mods@*/ /* FIX: shrug */
713 if (dbi->dbi_byteswapped == -1)
714 dbi->dbi_byteswapped = (*dbi->dbi_vec->byteswapped) (dbi);
716 return dbi->dbi_byteswapped;
718 /*@=globuse =mods =mustmod @*/
724 unsigned int rpmdbGetIteratorFileNum(rpmdbMatchIterator mi)
728 * Destroy set of index database items.
729 * @param set set of index database items
730 * @return NULL always
732 /*@null@*/ dbiIndexSet dbiFreeIndexSet(/*@only@*/ /*@null@*/ dbiIndexSet set)
736 * Count items in index database set.
737 * @param set set of index database items
738 * @return number of items
740 unsigned int dbiIndexSetCount(dbiIndexSet set)
744 * Return record offset of header from element in index database set.
745 * @param set set of index database items
746 * @param recno index of item in set
747 * @return record offset of header
749 unsigned int dbiIndexRecordOffset(dbiIndexSet set, int recno)
753 * Return file index from element in index database set.
754 * @param set set of index database items
755 * @param recno index of item in set
758 unsigned int dbiIndexRecordFileNumber(dbiIndexSet set, int recno)
762 * Tags for which rpmdb indices will be built.
766 /*@only@*/ /*@null@*/ extern int * dbiTags;
768 extern int dbiTagsMax;
772 * Unreference a database instance.
773 * @param db rpm database
775 * @return NULL always
777 /*@unused@*/ /*@null@*/
778 rpmdb rpmdbUnlink (/*@killref@*/ /*@only@*/ rpmdb db, const char * msg)
781 /** @todo Remove debugging entry from the ABI. */
784 rpmdb XrpmdbUnlink (/*@killref@*/ /*@only@*/ rpmdb db, const char * msg,
785 const char * fn, unsigned ln)
788 #define rpmdbUnlink(_db, _msg) XrpmdbUnlink(_db, _msg, __FILE__, __LINE__)
791 * Reference a database instance.
792 * @param db rpm database
794 * @return new rpm database reference
797 rpmdb rpmdbLink (rpmdb db, const char * msg)
800 /** @todo Remove debugging entry from the ABI. */
802 rpmdb XrpmdbLink (rpmdb db, const char * msg,
803 const char * fn, unsigned ln)
806 #define rpmdbLink(_db, _msg) XrpmdbLink(_db, _msg, __FILE__, __LINE__)
810 * @param prefix path to top of install tree
811 * @retval dbp address of rpm database
812 * @param mode open(2) flags: O_RDWR or O_RDONLY (O_CREAT also)
813 * @param perms database permissions
814 * @return 0 on success
816 int rpmdbOpen (/*@null@*/ const char * prefix, /*@null@*/ /*@out@*/ rpmdb * dbp,
818 /*@globals fileSystem @*/
819 /*@modifies *dbp, fileSystem @*/;
822 * Initialize database.
823 * @param prefix path to top of install tree
824 * @param perms database permissions
825 * @return 0 on success
827 int rpmdbInit(/*@null@*/ const char * prefix, int perms)
828 /*@globals fileSystem @*/
829 /*@modifies fileSystem @*/;
832 * Verify database components.
833 * @param prefix path to top of install tree
834 * @return 0 on success
836 int rpmdbVerify(/*@null@*/ const char * prefix)
837 /*@globals fileSystem @*/
838 /*@modifies fileSystem @*/;
841 * Close a single database index.
842 * @param db rpm database
843 * @param rpmtag rpm tag
844 * @return 0 on success
846 int rpmdbCloseDBI(/*@null@*/ rpmdb db, int rpmtag)
847 /*@globals fileSystem @*/
848 /*@modifies db, fileSystem @*/;
851 * Close all database indices and free rpmdb.
852 * @param db rpm database
853 * @return 0 on success
855 int rpmdbClose (/*@killref@*/ /*@only@*/ /*@null@*/ rpmdb db)
856 /*@globals fileSystem @*/
857 /*@modifies db, fileSystem @*/;
860 * Sync all database indices.
861 * @param db rpm database
862 * @return 0 on success
864 int rpmdbSync (/*@null@*/ rpmdb db)
865 /*@globals fileSystem @*/
866 /*@modifies fileSystem @*/;
869 * Open all database indices.
870 * @param db rpm database
871 * @return 0 on success
874 int rpmdbOpenAll (/*@null@*/ rpmdb db)
879 * Return number of instances of package in rpm database.
880 * @param db rpm database
881 * @param name rpm package name
882 * @return number of instances
884 int rpmdbCountPackages(/*@null@*/ rpmdb db, const char * name)
885 /*@globals fileSystem @*/
886 /*@modifies db, fileSystem @*/;
889 * Return header join key for current position of rpm database iterator.
890 * @param mi rpm database iterator
891 * @return current header join key
893 unsigned int rpmdbGetIteratorOffset(/*@null@*/ rpmdbMatchIterator mi)
897 * Return number of elements in rpm database iterator.
898 * @param mi rpm database iterator
899 * @return number of elements
901 int rpmdbGetIteratorCount(/*@null@*/ rpmdbMatchIterator mi)
905 * Append items to set of package instances to iterate.
906 * @param mi rpm database iterator
907 * @param hdrNums array of package instances
908 * @param nHdrNums number of elements in array
909 * @return 0 on success, 1 on failure (bad args)
911 int rpmdbAppendIterator(/*@null@*/ rpmdbMatchIterator mi,
912 /*@null@*/ const int * hdrNums, int nHdrNums)
916 * Remove items from set of package instances to iterate.
917 * @note Sorted hdrNums are always passed in rpmlib.
918 * @param mi rpm database iterator
919 * @param hdrNums array of package instances
920 * @param nHdrNums number of elements in array
921 * @param sorted is the array sorted? (array will be sorted on return)
922 * @return 0 on success, 1 on failure (bad args)
924 int rpmdbPruneIterator(/*@null@*/ rpmdbMatchIterator mi,
925 /*@null@*/ int * hdrNums, int nHdrNums, int sorted)
926 /*@modifies mi, hdrNums @*/;
929 * Add pattern to iterator selector.
930 * @param mi rpm database iterator
932 * @param mode type of pattern match
933 * @param pattern pattern to match
934 * @return 0 on success
936 int rpmdbSetIteratorRE(/*@null@*/ rpmdbMatchIterator mi, rpmTag tag,
937 rpmMireMode mode, /*@null@*/ const char * pattern)
938 /*@modifies mi, mode @*/;
941 * Prepare iterator for lazy writes.
942 * @note Must be called before rpmdbNextIterator() with CDB model database.
943 * @param mi rpm database iterator
944 * @param rewrite new value of rewrite
945 * @return previous value
947 int rpmdbSetIteratorRewrite(/*@null@*/ rpmdbMatchIterator mi, int rewrite)
951 * Modify iterator to mark header for lazy write.
952 * @param mi rpm database iterator
953 * @param modified new value of modified
954 * @return previous value
956 int rpmdbSetIteratorModified(/*@null@*/ rpmdbMatchIterator mi, int modified)
960 * Return database iterator.
961 * @param db rpm database
962 * @param rpmtag rpm tag
963 * @param keyp key data (NULL for sequential access)
964 * @param keylen key data length (0 will use strlen(keyp))
965 * @return NULL on failure
967 /*@only@*/ /*@null@*/
968 rpmdbMatchIterator rpmdbInitIterator(/*@null@*/ rpmdb db, rpmTag rpmtag,
969 /*@null@*/ const void * keyp, size_t keylen)
970 /*@globals fileSystem @*/
971 /*@modifies db, fileSystem @*/;
974 * Return next package header from iteration.
975 * @param mi rpm database iterator
976 * @return NULL on end of iteration.
979 Header rpmdbNextIterator(/*@null@*/ rpmdbMatchIterator mi)
980 /*@globals fileSystem @*/
981 /*@modifies mi, fileSystem @*/;
984 * Destroy rpm database iterator.
985 * @param mi rpm database iterator
986 * @return NULL always
989 rpmdbMatchIterator rpmdbFreeIterator(/*@only@*/ /*@null@*/rpmdbMatchIterator mi)
990 /*@globals fileSystem @*/
991 /*@modifies mi, fileSystem @*/;
994 * Add package header to rpm database and indices.
995 * @param db rpm database
996 * @param iid install transaction id (iid = 0 or -1 to skip)
998 * @return 0 on success
1000 int rpmdbAdd(/*@null@*/ rpmdb db, int iid, Header h)
1001 /*@globals fileSystem @*/
1002 /*@modifies db, h, fileSystem @*/;
1005 * Remove package header from rpm database and indices.
1006 * @param db rpm database
1007 * @param rid remove transaction id (rid = 0 or -1 to skip)
1008 * @param hdrNum package instance number in database
1009 * @return 0 on success
1011 int rpmdbRemove(/*@null@*/ rpmdb db, /*@unused@*/ int rid, unsigned int hdrNum)
1012 /*@globals fileSystem @*/
1013 /*@modifies db, fileSystem @*/;
1016 * Rebuild database indices from package headers.
1017 * @param prefix path to top of install tree
1018 * @return 0 on success
1020 int rpmdbRebuild(/*@null@*/ const char * prefix)
1021 /*@globals rpmGlobalMacroContext, fileSystem, internalState @*/
1022 /*@modifies rpmGlobalMacroContext, fileSystem, internalState @*/;
1025 * Mergesort, same arguments as qsort(2).
1028 int mergesort(void *base, size_t nmemb, size_t size,
1029 int (*cmp) (const void *, const void *))
1030 /*@globals errno @*/
1031 /*@modifies base, errno @*/;
1038 #endif /* H_RPMDB */