4 /** \ingroup rpmdb dbi db1 db3
6 * Access RPM indices using Berkeley DB interface(s).
15 * Database of headers and tag value indices.
17 typedef /*@abstract@*/ /*@refcounted@*/ struct rpmdb_s * rpmdb;
22 typedef /*@abstract@*/ struct _rpmdbMatchIterator * rpmdbMatchIterator;
26 * Tag value pattern match mode.
28 typedef enum rpmMireMode_e {
29 RPMMIRE_DEFAULT = 0, /*!< regex with \., .* and ^...$ added */
30 RPMMIRE_STRCMP = 1, /*!< strcmp on strings */
31 RPMMIRE_REGEX = 2, /*!< regex patterns */
32 RPMMIRE_GLOB = 3 /*!< glob patterns through fnmatch(3) */
37 typedef /*@abstract@*/ struct _dbiIndexItem * dbiIndexItem;
40 * A single element (i.e. inverted list from tag values) of a database.
42 typedef /*@abstract@*/ struct _dbiIndexSet * dbiIndexSet;
46 typedef /*@abstract@*/ struct _dbiIndex * dbiIndex;
48 /* this will break if sizeof(int) != 4 */
50 * A single item from an index database (i.e. the "data returned").
51 * Note: In rpm-3.0.4 and earlier, this structure was passed by value,
52 * and was identical to the "data saved" structure below.
54 struct _dbiIndexItem {
55 unsigned int hdrNum; /*!< header instance in db */
56 unsigned int tagNum; /*!< tag index in header */
57 unsigned int fpNum; /*!< finger print index */
61 * Items retrieved from the index database.
64 /*@owned@*/ struct _dbiIndexItem * recs; /*!< array of records */
65 int count; /*!< number of records */
69 * Private methods for accessing an index database.
72 int dbv_major; /*!< Berkeley db version major */
73 int dbv_minor; /*!< Berkeley db version minor */
74 int dbv_patch; /*!< Berkeley db version patch */
77 * Return handle for an index database.
78 * @param rpmdb rpm database
79 * @param rpmtag rpm tag
80 * @return 0 on success
82 int (*open) (rpmdb rpmdb, rpmTag rpmtag, /*@out@*/ dbiIndex * dbip)
83 /*@globals fileSystem @*/
84 /*@modifies *dbip, fileSystem @*/;
87 * Close index database, and destroy database handle.
88 * @param dbi index database handle
89 * @param flags (unused)
90 * @return 0 on success
92 int (*close) (/*@only@*/ dbiIndex dbi, unsigned int flags)
93 /*@globals fileSystem @*/
94 /*@modifies dbi, fileSystem @*/;
97 * Flush pending operations to disk.
98 * @param dbi index database handle
99 * @param flags (unused)
100 * @return 0 on success
102 int (*sync) (dbiIndex dbi, unsigned int flags)
103 /*@globals fileSystem @*/
104 /*@modifies fileSystem @*/;
107 * Associate secondary database with primary.
108 * @param dbi index database handle
109 * @param dbisecondary secondary index database handle
110 * @param callback create secondary key from primary (NULL if DB_RDONLY)
111 * @param flags DB_CREATE or 0
112 * @return 0 on success
114 int (*associate) (dbiIndex dbi, dbiIndex dbisecondary,
115 int (*callback) (DB *, const DBT *, const DBT *, DBT *),
117 /*@globals fileSystem @*/
118 /*@modifies dbi, fileSystem @*/;
121 * Return join cursor for list of cursors.
122 * @param dbi index database handle
123 * @param curslist NULL terminated list of database cursors
124 * @retval dbcp address of join database cursor
125 * @param flags DB_JOIN_NOSORT or 0
126 * @return 0 on success
128 int (*join) (dbiIndex dbi, DBC ** curslist, /*@out@*/ DBC ** dbcp,
130 /*@globals fileSystem @*/
131 /*@modifies dbi, *dbcp, fileSystem @*/;
134 * Open database cursor.
135 * @param dbi index database handle
136 * @param txnid database transaction handle
137 * @retval dbcp address of new database cursor
138 * @param dbiflags DB_WRITECURSOR or 0
139 * @return 0 on success
141 int (*copen) (dbiIndex dbi, /*@null@*/ DB_TXN * txnid,
142 /*@out@*/ DBC ** dbcp, unsigned int dbiflags)
143 /*@globals fileSystem @*/
144 /*@modifies dbi, *txnid, *dbcp, fileSystem @*/;
147 * Close database cursor.
148 * @param dbi index database handle
149 * @param dbcursor database cursor
150 * @param flags (unused)
151 * @return 0 on success
153 int (*cclose) (dbiIndex dbi, /*@only@*/ DBC * dbcursor, unsigned int flags)
154 /*@globals fileSystem @*/
155 /*@modifies dbi, *dbcursor, fileSystem @*/;
158 * Duplicate a database cursor.
159 * @param dbi index database handle
160 * @param dbcursor database cursor
161 * @retval dbcp address of new database cursor
162 * @param flags DB_POSITION for same position, 0 for uninitialized
163 * @return 0 on success
165 int (*cdup) (dbiIndex dbi, DBC * dbcursor, /*@out@*/ DBC ** dbcp,
167 /*@globals fileSystem @*/
168 /*@modifies dbi, *dbcp, fileSystem @*/;
171 * Delete (key,data) pair(s) using db->del or dbcursor->c_del.
172 * @param dbi index database handle
173 * @param dbcursor database cursor (NULL will use db->del)
174 * @param key delete key value/length/flags
175 * @param data delete data value/length/flags
176 * @param flags (unused)
177 * @return 0 on success
179 int (*cdel) (dbiIndex dbi, /*@null@*/ DBC * dbcursor, DBT * key, DBT * data,
181 /*@globals fileSystem @*/
182 /*@modifies *dbcursor, fileSystem @*/;
185 * Retrieve (key,data) pair using db->get or dbcursor->c_get.
186 * @param dbi index database handle
187 * @param dbcursor database cursor (NULL will use db->get)
188 * @param key retrieve key value/length/flags
189 * @param data retrieve data value/length/flags
190 * @param flags (unused)
191 * @return 0 on success
193 int (*cget) (dbiIndex dbi, /*@null@*/ DBC * dbcursor, DBT * key, DBT * data,
195 /*@globals fileSystem @*/
196 /*@modifies *dbcursor, *key, *data, fileSystem @*/;
199 * Retrieve (key,data) pair using dbcursor->c_pget.
200 * @param dbi index database handle
201 * @param dbcursor database cursor
202 * @param key secondary retrieve key value/length/flags
203 * @param pkey primary retrieve key value/length/flags
204 * @param data primary retrieve data value/length/flags
205 * @param flags DB_NEXT, DB_SET, or 0
206 * @return 0 on success
208 int (*cpget) (dbiIndex dbi, /*@null@*/ DBC * dbcursor,
209 DBT * key, DBT * pkey, DBT * data, unsigned int flags)
210 /*@globals fileSystem @*/
211 /*@modifies *dbcursor, *key, *pkey, *data, fileSystem @*/;
214 * Store (key,data) pair using db->put or dbcursor->c_put.
215 * @param dbi index database handle
216 * @param dbcursor database cursor (NULL will use db->put)
217 * @param key store key value/length/flags
218 * @param data store data value/length/flags
219 * @param flags (unused)
220 * @return 0 on success
222 int (*cput) (dbiIndex dbi, /*@null@*/ DBC * dbcursor, DBT * key, DBT * data,
224 /*@globals fileSystem @*/
225 /*@modifies *dbcursor, fileSystem @*/;
228 * Retrieve count of (possible) duplicate items using dbcursor->c_count.
229 * @param dbi index database handle
230 * @param dbcursor database cursor
231 * @param countp address of count
232 * @param flags (unused)
233 * @return 0 on success
235 int (*ccount) (dbiIndex dbi, DBC * dbcursor,
236 /*@out@*/ unsigned int * countp,
238 /*@globals fileSystem @*/
239 /*@modifies *dbcursor, fileSystem @*/;
242 * Is database byte swapped?
243 * @param dbi index database handle
246 int (*byteswapped) (dbiIndex dbi)
247 /*@globals fileSystem @*/
248 /*@modifies fileSystem @*/;
251 * Save statistics in database handle.
252 * @param dbi index database handle
253 * @param flags retrieve statistics that don't require traversal?
254 * @return 0 on success
256 int (*stat) (dbiIndex dbi, unsigned int flags)
257 /*@globals fileSystem @*/
258 /*@modifies dbi, fileSystem @*/;
263 * Describes an index database (implemented on Berkeley db3 functionality).
267 const char * dbi_root; /*!< chroot(2) component of path */
269 const char * dbi_home; /*!< directory component of path */
271 const char * dbi_file; /*!< file component of path */
273 const char * dbi_subfile;
275 const char * dbi_tmpdir; /*!< temporary directory */
277 int dbi_ecflags; /*!< db_env_create flags */
278 int dbi_cflags; /*!< db_create flags */
279 int dbi_oeflags; /*!< common (db,dbenv}->open flags */
280 int dbi_eflags; /*!< dbenv->open flags */
281 int dbi_oflags; /*!< db->open flags */
282 int dbi_tflags; /*!< dbenv->txn_begin flags */
284 int dbi_type; /*!< db index type */
285 unsigned dbi_mode; /*!< mode to use on open */
286 int dbi_perms; /*!< file permission to use on open */
287 long dbi_shmkey; /*!< shared memory base key */
288 int dbi_api; /*!< Berkeley API type */
290 int dbi_verify_on_close;
291 int dbi_tear_down; /*!< tear down dbenv on close */
292 int dbi_use_dbenv; /*!< use db environment? */
293 int dbi_permit_dups; /*!< permit duplicate entries? */
294 int dbi_no_fsync; /*!< no-op fsync for db */
295 int dbi_no_dbsync; /*!< don't call dbiSync */
296 int dbi_lockdbfd; /*!< do fcntl lock on db fd */
297 int dbi_temporary; /*!< non-persistent */
303 unsigned long dbi_cl_timeout;
304 unsigned long dbi_sv_timeout;
306 /* dbenv parameters */
309 void (*db_errcall) (const char *db_errpfx, char *buffer)
310 /*@globals fileSystem @*/
311 /*@modifies fileSystem @*/;
312 /*@unused@*/ /*@shared@*/
314 const char * dbi_errpfx;
318 /* mpool sub-system parameters */
319 int dbi_mp_mmapsize; /*!< (10Mb) */
320 int dbi_mp_size; /*!< (128Kb) */
321 /* lock sub-system parameters */
322 unsigned int dbi_lk_max;
323 unsigned int dbi_lk_detect;
324 /*@unused@*/ int dbi_lk_nmodes;
325 /*@unused@*/ unsigned char * dbi_lk_conflicts;
326 /* log sub-system parameters */
327 unsigned int dbi_lg_max;
328 unsigned int dbi_lg_bsize;
329 /* transaction sub-system parameters */
330 unsigned int dbi_tx_max;
332 int (*dbi_tx_recover) (DB_ENV *dbenv, DBT *log_rec,
333 DB_LSN *lsnp, int redo, void *info)
334 /*@globals fileSystem @*/
335 /*@modifies fileSystem @*/;
337 /* dbinfo parameters */
338 int dbi_cachesize; /*!< */
339 int dbi_pagesize; /*!< (fs blksize) */
340 /*@unused@*/ /*@null@*/
341 void * (*dbi_malloc) (size_t nbytes)
343 /* hash access parameters */
344 unsigned int dbi_h_ffactor; /*!< */
345 unsigned int (*dbi_h_hash_fcn) (DB *, const void *bytes,
348 unsigned int dbi_h_nelem; /*!< */
349 unsigned int dbi_h_flags; /*!< DB_DUP, DB_DUPSORT */
350 int (*dbi_h_dup_compare_fcn) (DB *, const DBT *, const DBT *)
352 /* btree access parameters */
355 int (*dbi_bt_compare_fcn) (DB *, const DBT *, const DBT *)
357 int (*dbi_bt_dup_compare_fcn) (DB *, const DBT *, const DBT *)
359 size_t (*dbi_bt_prefix_fcn) (DB *, const DBT *, const DBT *)
361 /* recno access parameters */
364 unsigned int dbi_re_len;
366 const char * dbi_re_source;
367 /* queue access parameters */
368 unsigned int dbi_q_extentsize;
372 rpmTag dbi_rpmtag; /*!< rpm tag used for index */
373 int dbi_jlen; /*!< size of join key */
375 unsigned int dbi_lastoffset; /*!< db1 with falloc.c needs this */
378 DB * dbi_db; /*!< Berkeley DB * handle */
380 DB_TXN * dbi_txnid; /*!< Bekerley DB_TXN * transaction id */
382 void * dbi_stats; /*!< Berkeley db statistics */
385 const struct _dbiVec * dbi_vec; /*!< private methods */
390 * Describes the collection of index databases used by rpm.
393 /*@owned@*/ const char * db_root;/*!< path prefix */
394 /*@owned@*/ const char * db_home;/*!< directory path */
396 int db_mode; /*!< open mode */
397 int db_perms; /*!< open permissions */
398 int db_api; /*!< Berkeley API type */
399 /*@owned@*/ const char * db_errpfx;
402 int db_chrootDone; /*!< If chroot(2) done, ignore db_root. */
403 void (*db_errcall) (const char *db_errpfx, char *buffer)
405 /*@shared@*/ FILE * db_errfile;
406 /*@only@*/ void * (*db_malloc) (size_t nbytes)
408 /*@only@*/ void * (*db_realloc) (/*@only@*//*@null@*/ void * ptr,
411 void (*db_free) (/*@only@*/ void * ptr)
412 /*@modifies *ptr @*/;
414 /*@only@*//*@null@*/ void * db_dbenv; /*!< Berkeley DB_ENV handle */
415 int db_ndbi; /*!< No. of tag indices. */
416 dbiIndex * _dbi; /*!< Tag indices. */
418 /*@refs@*/ int nrefs; /*!< Reference count. */
421 /* for RPM's internal use only */
426 RPMDB_FLAG_JUSTCHECK = (1 << 0),
427 RPMDB_FLAG_MINIMAL = (1 << 1),
429 RPMDB_FLAG_CHROOT = (1 << 2)
439 * Return new configured index database handle instance.
440 * @param rpmdb rpm database
441 * @param rpmtag rpm tag
442 * @return index database handle
444 /*@unused@*/ /*@only@*/ /*@null@*/
445 dbiIndex db3New(rpmdb rpmdb, rpmTag rpmtag)
446 /*@globals rpmGlobalMacroContext @*/
447 /*@modifies rpmGlobalMacroContext @*/;
450 * Destroy index database handle instance.
451 * @param dbi index database handle
452 * @return NULL always
455 dbiIndex db3Free( /*@only@*/ /*@null@*/ dbiIndex dbi)
459 * Format db3 open flags for debugging print.
460 * @param dbflags db open flags
461 * @param print_dbenv_flags format db env flags instead?
462 * @return formatted flags (static buffer)
466 extern const char *const prDbiOpenFlags(int dbflags, int print_dbenv_flags)
471 * Return handle for an index database.
472 * @param db rpm database
473 * @param rpmtag rpm tag
474 * @param flags (unused)
475 * @return index database handle
477 /*@only@*/ /*@null@*/ dbiIndex dbiOpen(/*@null@*/ rpmdb db, rpmTag rpmtag,
481 /*@-globuse -mods -mustmod @*/
483 * Open a database cursor.
484 * @param dbi index database handle
485 * @param txnid database transaction handle
486 * @retval dbcp returned database cursor
487 * @param flags DB_WRITECURSOR if writing, or 0
488 * @return 0 on success
490 /*@unused@*/ static inline
491 int dbiCopen(dbiIndex dbi, /*@null@*/ DB_TXN * txnid,
492 /*@out@*/ DBC ** dbcp, unsigned int flags)
493 /*@globals fileSystem @*/
494 /*@modifies dbi, *dbcp, fileSystem @*/
496 return (*dbi->dbi_vec->copen) (dbi, txnid, dbcp, flags);
500 * Close a database cursor.
501 * @param dbi index database handle
502 * @param dbcursor database cursor
503 * @param flags (unused)
504 * @return 0 on success
506 /*@unused@*/ static inline
507 int dbiCclose(dbiIndex dbi, /*@only@*/ DBC * dbcursor, unsigned int flags)
508 /*@globals fileSystem @*/
509 /*@modifies dbi, *dbcursor, fileSystem @*/
511 return (*dbi->dbi_vec->cclose) (dbi, dbcursor, flags);
515 * Duplicate a database cursor.
516 * @param dbi index database handle
517 * @param dbcursor database cursor
518 * @retval dbcp address of new database cursor
519 * @param flags DB_POSITION for same position, 0 for uninitialized
520 * @return 0 on success
522 /*@unused@*/ static inline
523 int dbiCdup(dbiIndex dbi, DBC * dbcursor, /*@out@*/ DBC ** dbcp,
525 /*@modifies dbi, *dbcp @*/
527 return (*dbi->dbi_vec->cdup) (dbi, dbcursor, dbcp, flags);
531 * Delete (key,data) pair(s) from index database.
532 * @param dbi index database handle
533 * @param dbcursor database cursor (NULL will use db->del)
534 * @param key delete key value/length/flags
535 * @param data delete data value/length/flags
536 * @param flags (unused)
537 * @return 0 on success
539 /*@unused@*/ static inline
540 int dbiDel(dbiIndex dbi, /*@null@*/ DBC * dbcursor, DBT * key, DBT * data,
542 /*@globals fileSystem @*/
543 /*@modifies *dbcursor, fileSystem @*/
545 assert(key->size > 0);
546 return (dbi->dbi_vec->cdel) (dbi, dbcursor, key, data, flags);
550 * Retrieve (key,data) pair from index database.
551 * @param dbi index database handle
552 * @param dbcursor database cursor (NULL will use db->get)
553 * @param key retrieve key value/length/flags
554 * @param data retrieve data value/length/flags
555 * @param flags (unused)
556 * @return 0 on success
558 /*@unused@*/ static inline
559 int dbiGet(dbiIndex dbi, /*@null@*/ DBC * dbcursor, DBT * key, DBT * data,
561 /*@globals fileSystem @*/
562 /*@modifies *dbcursor, *key, *data, fileSystem @*/
564 assert((flags == DB_NEXT) || key->size > 0);
565 return (dbi->dbi_vec->cget) (dbi, dbcursor, key, data, flags);
569 * Retrieve (key,data) pair using dbcursor->c_pget.
570 * @param dbi index database handle
571 * @param dbcursor database cursor (NULL will use db->get)
572 * @param key secondary retrieve key value/length/flags
573 * @param pkey primary retrieve key value/length/flags
574 * @param data primary retrieve data value/length/flags
575 * @param flags DB_NEXT, DB_SET, or 0
576 * @return 0 on success
578 /*@unused@*/ static inline
579 int dbiPget(dbiIndex dbi, /*@null@*/ DBC * dbcursor,
580 DBT * key, DBT * pkey, DBT * data, unsigned int flags)
581 /*@globals fileSystem @*/
582 /*@modifies *dbcursor, *key, *pkey, *data, fileSystem @*/
584 assert((flags == DB_NEXT) || key->size > 0);
585 return (dbi->dbi_vec->cpget) (dbi, dbcursor, key, pkey, data, flags);
589 * Store (key,data) pair in index database.
590 * @param dbi index database handle
591 * @param dbcursor database cursor (NULL will use db->put)
592 * @param key store key value/length/flags
593 * @param data store data value/length/flags
594 * @param flags (unused)
595 * @return 0 on success
597 /*@unused@*/ static inline
598 int dbiPut(dbiIndex dbi, /*@null@*/ DBC * dbcursor, DBT * key, DBT * data,
600 /*@globals fileSystem @*/
601 /*@modifies *dbcursor, *key, fileSystem @*/
603 assert(key->size > 0);
604 return (dbi->dbi_vec->cput) (dbi, dbcursor, key, data, flags);
608 * Retrieve count of (possible) duplicate items.
609 * @param dbi index database handle
610 * @param dbcursor database cursor
611 * @param countp address of count
612 * @param flags (unused)
613 * @return 0 on success
615 /*@unused@*/ static inline
616 int dbiCount(dbiIndex dbi, DBC * dbcursor, /*@out@*/ unsigned int * countp,
618 /*@globals fileSystem @*/
619 /*@modifies *dbcursor, fileSystem @*/
621 return (*dbi->dbi_vec->ccount) (dbi, dbcursor, countp, flags);
625 * Verify (and close) index database.
626 * @param dbi index database handle
627 * @param flags (unused)
628 * @return 0 on success
630 /*@unused@*/ static inline
631 int dbiVerify(/*@only@*/ dbiIndex dbi, unsigned int flags)
632 /*@globals fileSystem @*/
633 /*@modifies dbi, fileSystem @*/
635 dbi->dbi_verify_on_close = 1;
636 return (*dbi->dbi_vec->close) (dbi, flags);
640 * Close index database.
641 * @param dbi index database handle
642 * @param flags (unused)
643 * @return 0 on success
645 /*@unused@*/ static inline
646 int dbiClose(/*@only@*/ dbiIndex dbi, unsigned int flags)
647 /*@globals fileSystem @*/
648 /*@modifies dbi, fileSystem @*/
650 return (*dbi->dbi_vec->close) (dbi, flags);
654 * Flush pending operations to disk.
655 * @param dbi index database handle
656 * @param flags (unused)
657 * @return 0 on success
659 /*@unused@*/ static inline
660 int dbiSync (dbiIndex dbi, unsigned int flags)
661 /*@globals fileSystem @*/
662 /*@modifies fileSystem @*/
664 return (*dbi->dbi_vec->sync) (dbi, flags);
668 * Associate secondary database with primary.
669 * @param dbi index database handle
670 * @param dbisecondary secondary index database handle
671 * @param callback create secondary key from primary (NULL if DB_RDONLY)
672 * @param flags DB_CREATE or 0
673 * @return 0 on success
675 /*@unused@*/ static inline
676 int dbiAssociate(dbiIndex dbi, dbiIndex dbisecondary,
677 int (*callback) (DB *, const DBT *, const DBT *, DBT *),
679 /*@globals fileSystem @*/
680 /*@modifies dbi, fileSystem @*/
682 return (*dbi->dbi_vec->associate) (dbi, dbisecondary, callback, flags);
686 * Return join cursor for list of cursors.
687 * @param dbi index database handle
688 * @param curslist NULL terminated list of database cursors
689 * @retval dbcp address of join database cursor
690 * @param flags DB_JOIN_NOSORT or 0
691 * @return 0 on success
693 /*@unused@*/ static inline
694 int dbiJoin(dbiIndex dbi, DBC ** curslist, /*@out@*/ DBC ** dbcp,
696 /*@globals fileSystem @*/
697 /*@modifies dbi, *dbcp, fileSystem @*/
699 return (*dbi->dbi_vec->join) (dbi, curslist, dbcp, flags);
703 * Is database byte swapped?
704 * @param dbi index database handle
707 /*@unused@*/ static inline
708 int dbiByteSwapped(dbiIndex dbi)
711 /*@-mods@*/ /* FIX: shrug */
712 if (dbi->dbi_byteswapped == -1)
713 dbi->dbi_byteswapped = (*dbi->dbi_vec->byteswapped) (dbi);
715 return dbi->dbi_byteswapped;
717 /*@=globuse =mods =mustmod @*/
723 unsigned int rpmdbGetIteratorFileNum(rpmdbMatchIterator mi)
727 * Destroy set of index database items.
728 * @param set set of index database items
729 * @return NULL always
731 /*@null@*/ dbiIndexSet dbiFreeIndexSet(/*@only@*/ /*@null@*/ dbiIndexSet set)
735 * Count items in index database set.
736 * @param set set of index database items
737 * @return number of items
739 unsigned int dbiIndexSetCount(dbiIndexSet set)
743 * Return record offset of header from element in index database set.
744 * @param set set of index database items
745 * @param recno index of item in set
746 * @return record offset of header
748 unsigned int dbiIndexRecordOffset(dbiIndexSet set, int recno)
752 * Return file index from element in index database set.
753 * @param set set of index database items
754 * @param recno index of item in set
757 unsigned int dbiIndexRecordFileNumber(dbiIndexSet set, int recno)
761 * Tags for which rpmdb indices will be built.
765 /*@only@*/ /*@null@*/ extern int * dbiTags;
767 extern int dbiTagsMax;
771 * Unreference a database instance.
772 * @param db rpm database
774 * @return NULL always
776 /*@unused@*/ /*@null@*/
777 rpmdb rpmdbUnlink (/*@killref@*/ /*@only@*/ rpmdb db, const char * msg)
780 /** @todo Remove debugging entry from the ABI. */
783 rpmdb XrpmdbUnlink (/*@killref@*/ /*@only@*/ rpmdb db, const char * msg,
784 const char * fn, unsigned ln)
787 #define rpmdbUnlink(_db, _msg) XrpmdbUnlink(_db, _msg, __FILE__, __LINE__)
790 * Reference a database instance.
791 * @param db rpm database
793 * @return new rpm database reference
796 rpmdb rpmdbLink (rpmdb db, const char * msg)
799 /** @todo Remove debugging entry from the ABI. */
801 rpmdb XrpmdbLink (rpmdb db, const char * msg,
802 const char * fn, unsigned ln)
805 #define rpmdbLink(_db, _msg) XrpmdbLink(_db, _msg, __FILE__, __LINE__)
809 * @param prefix path to top of install tree
810 * @retval dbp address of rpm database
811 * @param mode open(2) flags: O_RDWR or O_RDONLY (O_CREAT also)
812 * @param perms database permissions
813 * @return 0 on success
815 int rpmdbOpen (/*@null@*/ const char * prefix, /*@null@*/ /*@out@*/ rpmdb * dbp,
817 /*@globals fileSystem @*/
818 /*@modifies *dbp, fileSystem @*/;
821 * Initialize database.
822 * @param prefix path to top of install tree
823 * @param perms database permissions
824 * @return 0 on success
826 int rpmdbInit(/*@null@*/ const char * prefix, int perms)
827 /*@globals fileSystem @*/
828 /*@modifies fileSystem @*/;
831 * Verify database components.
832 * @param prefix path to top of install tree
833 * @return 0 on success
835 int rpmdbVerify(/*@null@*/ const char * prefix)
836 /*@globals fileSystem @*/
837 /*@modifies fileSystem @*/;
840 * Close all database indices and free rpmdb.
841 * @param db rpm database
842 * @return 0 on success
844 int rpmdbClose (/*@killref@*/ /*@only@*/ /*@null@*/ rpmdb db)
845 /*@globals fileSystem @*/
846 /*@modifies db, fileSystem @*/;
849 * Sync all database indices.
850 * @param db rpm database
851 * @return 0 on success
853 int rpmdbSync (/*@null@*/ rpmdb db)
854 /*@globals fileSystem @*/
855 /*@modifies fileSystem @*/;
858 * Open all database indices.
859 * @param db rpm database
860 * @return 0 on success
863 int rpmdbOpenAll (/*@null@*/ rpmdb db)
868 * Return number of instances of package in rpm database.
869 * @param db rpm database
870 * @param name rpm package name
871 * @return number of instances
873 int rpmdbCountPackages(/*@null@*/ rpmdb db, const char * name)
874 /*@globals fileSystem @*/
875 /*@modifies db, fileSystem @*/;
878 * Return header join key for current position of rpm database iterator.
879 * @param mi rpm database iterator
880 * @return current header join key
882 unsigned int rpmdbGetIteratorOffset(/*@null@*/ rpmdbMatchIterator mi)
886 * Return number of elements in rpm database iterator.
887 * @param mi rpm database iterator
888 * @return number of elements
890 int rpmdbGetIteratorCount(/*@null@*/ rpmdbMatchIterator mi)
894 * Append items to set of package instances to iterate.
895 * @param mi rpm database iterator
896 * @param hdrNums array of package instances
897 * @param nHdrNums number of elements in array
898 * @return 0 on success, 1 on failure (bad args)
900 int rpmdbAppendIterator(/*@null@*/ rpmdbMatchIterator mi,
901 /*@null@*/ const int * hdrNums, int nHdrNums)
905 * Remove items from set of package instances to iterate.
906 * @note Sorted hdrNums are always passed in rpmlib.
907 * @param mi rpm database iterator
908 * @param hdrNums array of package instances
909 * @param nHdrNums number of elements in array
910 * @param sorted is the array sorted? (array will be sorted on return)
911 * @return 0 on success, 1 on failure (bad args)
913 int rpmdbPruneIterator(/*@null@*/ rpmdbMatchIterator mi,
914 /*@null@*/ int * hdrNums, int nHdrNums, int sorted)
915 /*@modifies mi, hdrNums @*/;
918 * Add pattern to iterator selector.
919 * @param mi rpm database iterator
921 * @param mode type of pattern match
922 * @param pattern pattern to match
923 * @return 0 on success
925 int rpmdbSetIteratorRE(/*@null@*/ rpmdbMatchIterator mi, rpmTag tag,
926 rpmMireMode mode, /*@null@*/ const char * pattern)
930 * Prepare iterator for lazy writes.
931 * @note Must be called before rpmdbNextIterator() with CDB model database.
932 * @param mi rpm database iterator
933 * @param rewrite new value of rewrite
934 * @return previous value
936 int rpmdbSetIteratorRewrite(/*@null@*/ rpmdbMatchIterator mi, int rewrite)
940 * Modify iterator to mark header for lazy write.
941 * @param mi rpm database iterator
942 * @param modified new value of modified
943 * @return previous value
945 int rpmdbSetIteratorModified(/*@null@*/ rpmdbMatchIterator mi, int modified)
949 * Return database iterator.
950 * @param db rpm database
951 * @param rpmtag rpm tag
952 * @param keyp key data (NULL for sequential access)
953 * @param keylen key data length (0 will use strlen(keyp))
954 * @return NULL on failure
956 /*@only@*/ /*@null@*/
957 rpmdbMatchIterator rpmdbInitIterator(/*@null@*/ rpmdb db, rpmTag rpmtag,
958 /*@null@*/ const void * keyp, size_t keylen)
959 /*@globals fileSystem @*/
960 /*@modifies db, fileSystem @*/;
963 * Return next package header from iteration.
964 * @param mi rpm database iterator
965 * @return NULL on end of iteration.
968 Header rpmdbNextIterator(/*@null@*/ rpmdbMatchIterator mi)
969 /*@globals fileSystem @*/
970 /*@modifies mi, fileSystem @*/;
973 * Destroy rpm database iterator.
974 * @param mi rpm database iterator
975 * @return NULL always
978 rpmdbMatchIterator rpmdbFreeIterator(/*@only@*/ /*@null@*/rpmdbMatchIterator mi)
979 /*@globals fileSystem @*/
980 /*@modifies mi, fileSystem @*/;
983 * Add package header to rpm database and indices.
984 * @param db rpm database
985 * @param iid install transaction id (iid = 0 or -1 to skip)
987 * @return 0 on success
989 int rpmdbAdd(/*@null@*/ rpmdb db, int iid, Header h)
990 /*@globals fileSystem @*/
991 /*@modifies db, h, fileSystem @*/;
994 * Remove package header from rpm database and indices.
995 * @param db rpm database
996 * @param rid remove transaction id (rid = 0 or -1 to skip)
997 * @param hdrNum package instance number in database
998 * @return 0 on success
1000 int rpmdbRemove(/*@null@*/ rpmdb db, /*@unused@*/ int rid, unsigned int hdrNum)
1001 /*@globals fileSystem @*/
1002 /*@modifies db, fileSystem @*/;
1005 * Rebuild database indices from package headers.
1006 * @param prefix path to top of install tree
1007 * @return 0 on success
1009 int rpmdbRebuild(/*@null@*/ const char * prefix)
1010 /*@globals rpmGlobalMacroContext, fileSystem, internalState @*/
1011 /*@modifies rpmGlobalMacroContext, fileSystem, internalState @*/;
1014 * Mergesort, same arguments as qsort(2).
1017 int mergesort(void *base, size_t nmemb, size_t size,
1018 int (*cmp) (const void *, const void *))
1019 /*@globals errno @*/
1020 /*@modifies base, errno @*/;
1026 #endif /* H_RPMDB */