5 /** \ingroup rpmdb dbi db1 db3
7 * Access RPM indices using Berkeley DB interface(s).
16 extern int _rpmdb_debug;
21 * Database of headers and tag value indices.
23 typedef /*@abstract@*/ /*@refcounted@*/ struct rpmdb_s * rpmdb;
28 typedef /*@abstract@*/ struct _rpmdbMatchIterator * rpmdbMatchIterator;
32 * Tag value pattern match mode.
34 typedef enum rpmMireMode_e {
35 RPMMIRE_DEFAULT = 0, /*!< regex with \., .* and ^...$ added */
36 RPMMIRE_STRCMP = 1, /*!< strings using strcmp(3) */
37 RPMMIRE_REGEX = 2, /*!< regex(7) patterns through regcomp(3) */
38 RPMMIRE_GLOB = 3 /*!< glob(7) patterns through fnmatch(3) */
43 typedef /*@abstract@*/ struct _dbiIndexItem * dbiIndexItem;
46 * A single element (i.e. inverted list from tag values) of a database.
48 typedef /*@abstract@*/ struct _dbiIndexSet * dbiIndexSet;
52 typedef /*@abstract@*/ struct _dbiIndex * dbiIndex;
54 /* this will break if sizeof(int) != 4 */
56 * A single item from an index database (i.e. the "data returned").
57 * Note: In rpm-3.0.4 and earlier, this structure was passed by value,
58 * and was identical to the "data saved" structure below.
60 struct _dbiIndexItem {
61 unsigned int hdrNum; /*!< header instance in db */
62 unsigned int tagNum; /*!< tag index in header */
63 unsigned int fpNum; /*!< finger print index */
67 * Items retrieved from the index database.
70 /*@owned@*/ struct _dbiIndexItem * recs; /*!< array of records */
71 int count; /*!< number of records */
75 * Private methods for accessing an index database.
78 int dbv_major; /*!< Berkeley db version major */
79 int dbv_minor; /*!< Berkeley db version minor */
80 int dbv_patch; /*!< Berkeley db version patch */
83 * Return handle for an index database.
84 * @param rpmdb rpm database
85 * @param rpmtag rpm tag
86 * @return 0 on success
88 int (*open) (rpmdb rpmdb, rpmTag rpmtag, /*@out@*/ dbiIndex * dbip)
89 /*@globals fileSystem @*/
90 /*@modifies *dbip, fileSystem @*/;
93 * Close index database, and destroy database handle.
94 * @param dbi index database handle
95 * @param flags (unused)
96 * @return 0 on success
98 int (*close) (/*@only@*/ dbiIndex dbi, unsigned int flags)
99 /*@globals fileSystem @*/
100 /*@modifies dbi, fileSystem @*/;
103 * Flush pending operations to disk.
104 * @param dbi index database handle
105 * @param flags (unused)
106 * @return 0 on success
108 int (*sync) (dbiIndex dbi, unsigned int flags)
109 /*@globals fileSystem @*/
110 /*@modifies fileSystem @*/;
113 * Associate secondary database with primary.
114 * @param dbi index database handle
115 * @param dbisecondary secondary index database handle
116 * @param callback create secondary key from primary (NULL if DB_RDONLY)
117 * @param flags DB_CREATE or 0
118 * @return 0 on success
120 int (*associate) (dbiIndex dbi, dbiIndex dbisecondary,
121 int (*callback) (DB *, const DBT *, const DBT *, DBT *),
123 /*@globals fileSystem @*/
124 /*@modifies dbi, fileSystem @*/;
127 * Return join cursor for list of cursors.
128 * @param dbi index database handle
129 * @param curslist NULL terminated list of database cursors
130 * @retval dbcp address of join database cursor
131 * @param flags DB_JOIN_NOSORT or 0
132 * @return 0 on success
134 int (*join) (dbiIndex dbi, DBC ** curslist, /*@out@*/ DBC ** dbcp,
136 /*@globals fileSystem @*/
137 /*@modifies dbi, *dbcp, fileSystem @*/;
140 * Open database cursor.
141 * @param dbi index database handle
142 * @param txnid database transaction handle
143 * @retval dbcp address of new database cursor
144 * @param dbiflags DB_WRITECURSOR or 0
145 * @return 0 on success
147 int (*copen) (dbiIndex dbi, /*@null@*/ DB_TXN * txnid,
148 /*@out@*/ DBC ** dbcp, unsigned int dbiflags)
149 /*@globals fileSystem @*/
150 /*@modifies dbi, *txnid, *dbcp, fileSystem @*/;
153 * Close database cursor.
154 * @param dbi index database handle
155 * @param dbcursor database cursor
156 * @param flags (unused)
157 * @return 0 on success
159 int (*cclose) (dbiIndex dbi, /*@only@*/ DBC * dbcursor, unsigned int flags)
160 /*@globals fileSystem @*/
161 /*@modifies dbi, *dbcursor, fileSystem @*/;
164 * Duplicate a database cursor.
165 * @param dbi index database handle
166 * @param dbcursor database cursor
167 * @retval dbcp address of new database cursor
168 * @param flags DB_POSITION for same position, 0 for uninitialized
169 * @return 0 on success
171 int (*cdup) (dbiIndex dbi, DBC * dbcursor, /*@out@*/ DBC ** dbcp,
173 /*@globals fileSystem @*/
174 /*@modifies dbi, *dbcp, fileSystem @*/;
177 * Delete (key,data) pair(s) using db->del or dbcursor->c_del.
178 * @param dbi index database handle
179 * @param dbcursor database cursor (NULL will use db->del)
180 * @param key delete key value/length/flags
181 * @param data delete data value/length/flags
182 * @param flags (unused)
183 * @return 0 on success
185 int (*cdel) (dbiIndex dbi, /*@null@*/ DBC * dbcursor, DBT * key, DBT * data,
187 /*@globals fileSystem @*/
188 /*@modifies *dbcursor, fileSystem @*/;
191 * Retrieve (key,data) pair using db->get or dbcursor->c_get.
192 * @param dbi index database handle
193 * @param dbcursor database cursor (NULL will use db->get)
194 * @param key retrieve key value/length/flags
195 * @param data retrieve data value/length/flags
196 * @param flags (unused)
197 * @return 0 on success
199 int (*cget) (dbiIndex dbi, /*@null@*/ DBC * dbcursor, DBT * key, DBT * data,
201 /*@globals fileSystem @*/
202 /*@modifies *dbcursor, *key, *data, fileSystem @*/;
205 * Retrieve (key,data) pair using dbcursor->c_pget.
206 * @param dbi index database handle
207 * @param dbcursor database cursor
208 * @param key secondary retrieve key value/length/flags
209 * @param pkey primary retrieve key value/length/flags
210 * @param data primary retrieve data value/length/flags
211 * @param flags DB_NEXT, DB_SET, or 0
212 * @return 0 on success
214 int (*cpget) (dbiIndex dbi, /*@null@*/ DBC * dbcursor,
215 DBT * key, DBT * pkey, DBT * data, unsigned int flags)
216 /*@globals fileSystem @*/
217 /*@modifies *dbcursor, *key, *pkey, *data, fileSystem @*/;
220 * Store (key,data) pair using db->put or dbcursor->c_put.
221 * @param dbi index database handle
222 * @param dbcursor database cursor (NULL will use db->put)
223 * @param key store key value/length/flags
224 * @param data store data value/length/flags
225 * @param flags (unused)
226 * @return 0 on success
228 int (*cput) (dbiIndex dbi, /*@null@*/ DBC * dbcursor, DBT * key, DBT * data,
230 /*@globals fileSystem @*/
231 /*@modifies *dbcursor, fileSystem @*/;
234 * Retrieve count of (possible) duplicate items using dbcursor->c_count.
235 * @param dbi index database handle
236 * @param dbcursor database cursor
237 * @param countp address of count
238 * @param flags (unused)
239 * @return 0 on success
241 int (*ccount) (dbiIndex dbi, DBC * dbcursor,
242 /*@out@*/ unsigned int * countp,
244 /*@globals fileSystem @*/
245 /*@modifies *dbcursor, fileSystem @*/;
248 * Is database byte swapped?
249 * @param dbi index database handle
252 int (*byteswapped) (dbiIndex dbi)
253 /*@globals fileSystem @*/
254 /*@modifies fileSystem @*/;
257 * Save statistics in database handle.
258 * @param dbi index database handle
259 * @param flags retrieve statistics that don't require traversal?
260 * @return 0 on success
262 int (*stat) (dbiIndex dbi, unsigned int flags)
263 /*@globals fileSystem @*/
264 /*@modifies dbi, fileSystem @*/;
269 * Describes an index database (implemented on Berkeley db3 functionality).
273 const char * dbi_root; /*!< chroot(2) component of path */
275 const char * dbi_home; /*!< directory component of path */
277 const char * dbi_file; /*!< file component of path */
279 const char * dbi_subfile;
281 const char * dbi_tmpdir; /*!< temporary directory */
283 int dbi_ecflags; /*!< db_env_create flags */
284 int dbi_cflags; /*!< db_create flags */
285 int dbi_oeflags; /*!< common (db,dbenv}->open flags */
286 int dbi_eflags; /*!< dbenv->open flags */
287 int dbi_oflags; /*!< db->open flags */
288 int dbi_tflags; /*!< dbenv->txn_begin flags */
290 int dbi_type; /*!< db index type */
291 unsigned dbi_mode; /*!< mode to use on open */
292 int dbi_perms; /*!< file permission to use on open */
293 long dbi_shmkey; /*!< shared memory base key */
294 int dbi_api; /*!< Berkeley API type */
296 int dbi_verify_on_close;
297 int dbi_use_dbenv; /*!< use db environment? */
298 int dbi_permit_dups; /*!< permit duplicate entries? */
299 int dbi_no_fsync; /*!< no-op fsync for db */
300 int dbi_no_dbsync; /*!< don't call dbiSync */
301 int dbi_lockdbfd; /*!< do fcntl lock on db fd */
302 int dbi_temporary; /*!< non-persistent */
308 unsigned long dbi_cl_timeout;
309 unsigned long dbi_sv_timeout;
311 /* dbenv parameters */
314 void (*db_errcall) (const char *db_errpfx, char *buffer)
315 /*@globals fileSystem @*/
316 /*@modifies fileSystem @*/;
317 /*@unused@*/ /*@shared@*/
319 const char * dbi_errpfx;
323 /* mpool sub-system parameters */
324 int dbi_mp_mmapsize; /*!< (10Mb) */
325 int dbi_mp_size; /*!< (128Kb) */
326 /* lock sub-system parameters */
327 unsigned int dbi_lk_max;
328 unsigned int dbi_lk_detect;
329 /*@unused@*/ int dbi_lk_nmodes;
330 /*@unused@*/ unsigned char * dbi_lk_conflicts;
331 /* log sub-system parameters */
332 unsigned int dbi_lg_max;
333 unsigned int dbi_lg_bsize;
334 /* transaction sub-system parameters */
335 unsigned int dbi_tx_max;
337 int (*dbi_tx_recover) (DB_ENV *dbenv, DBT *log_rec,
338 DB_LSN *lsnp, int redo, void *info)
339 /*@globals fileSystem @*/
340 /*@modifies fileSystem @*/;
342 /* dbinfo parameters */
343 int dbi_cachesize; /*!< */
344 int dbi_pagesize; /*!< (fs blksize) */
345 /*@unused@*/ /*@null@*/
346 void * (*dbi_malloc) (size_t nbytes)
348 /* hash access parameters */
349 unsigned int dbi_h_ffactor; /*!< */
350 unsigned int (*dbi_h_hash_fcn) (DB *, const void *bytes,
353 unsigned int dbi_h_nelem; /*!< */
354 unsigned int dbi_h_flags; /*!< DB_DUP, DB_DUPSORT */
355 int (*dbi_h_dup_compare_fcn) (DB *, const DBT *, const DBT *)
357 /* btree access parameters */
360 int (*dbi_bt_compare_fcn) (DB *, const DBT *, const DBT *)
362 int (*dbi_bt_dup_compare_fcn) (DB *, const DBT *, const DBT *)
364 size_t (*dbi_bt_prefix_fcn) (DB *, const DBT *, const DBT *)
366 /* recno access parameters */
369 unsigned int dbi_re_len;
371 const char * dbi_re_source;
372 /* queue access parameters */
373 unsigned int dbi_q_extentsize;
376 rpmdb dbi_rpmdb; /*!< the parent rpm database */
377 rpmTag dbi_rpmtag; /*!< rpm tag used for index */
378 int dbi_jlen; /*!< size of join key */
381 DB * dbi_db; /*!< Berkeley DB * handle */
383 DB_TXN * dbi_txnid; /*!< Bekerley DB_TXN * transaction id */
385 void * dbi_stats; /*!< Berkeley db statistics */
388 const struct _dbiVec * dbi_vec; /*!< private methods */
393 * Describes the collection of index databases used by rpm.
397 const char * db_root;/*!< path prefix */
399 const char * db_home;/*!< directory path */
401 int db_mode; /*!< open mode */
402 int db_perms; /*!< open permissions */
403 int db_api; /*!< Berkeley API type */
405 const char * db_errpfx;
408 int db_chrootDone; /*!< If chroot(2) done, ignore db_root. */
409 void (*db_errcall) (const char *db_errpfx, char *buffer)
414 void * (*db_malloc) (size_t nbytes)
417 void * (*db_realloc) (/*@only@*//*@null@*/ void * ptr,
420 void (*db_free) (/*@only@*/ void * ptr)
421 /*@modifies *ptr @*/;
422 /*@only@*/ /*@null@*/
423 unsigned char * db_bits; /*!< package instance bit mask. */
424 int db_nbits; /*!< no. of bits in mask. */
427 /*@only@*/ /*@null@*/
428 void * db_dbenv; /*!< Berkeley DB_ENV handle. */
429 int db_ndbi; /*!< No. of tag indices. */
430 dbiIndex * _dbi; /*!< Tag indices. */
433 int nrefs; /*!< Reference count. */
436 /* for RPM's internal use only */
441 RPMDB_FLAG_JUSTCHECK = (1 << 0),
442 RPMDB_FLAG_MINIMAL = (1 << 1),
444 RPMDB_FLAG_CHROOT = (1 << 2)
454 * Return new configured index database handle instance.
455 * @param rpmdb rpm database
456 * @param rpmtag rpm tag
457 * @return index database handle
459 /*@unused@*/ /*@only@*/ /*@null@*/
460 dbiIndex db3New(rpmdb rpmdb, rpmTag rpmtag)
461 /*@globals rpmGlobalMacroContext @*/
462 /*@modifies rpmGlobalMacroContext @*/;
465 * Destroy index database handle instance.
466 * @param dbi index database handle
467 * @return NULL always
470 dbiIndex db3Free( /*@only@*/ /*@null@*/ dbiIndex dbi)
474 * Format db3 open flags for debugging print.
475 * @param dbflags db open flags
476 * @param print_dbenv_flags format db env flags instead?
477 * @return formatted flags (static buffer)
481 extern const char *const prDbiOpenFlags(int dbflags, int print_dbenv_flags)
486 * Return handle for an index database.
487 * @param db rpm database
488 * @param rpmtag rpm tag
489 * @param flags (unused)
490 * @return index database handle
492 /*@only@*/ /*@null@*/ dbiIndex dbiOpen(/*@null@*/ rpmdb db, rpmTag rpmtag,
494 /*@globals rpmGlobalMacroContext, errno @*/
495 /*@modifies db, rpmGlobalMacroContext, errno @*/;
497 /*@-globuse -mustmod @*/ /* FIX: vector annotations */
499 * Open a database cursor.
500 * @param dbi index database handle
501 * @param txnid database transaction handle
502 * @retval dbcp returned database cursor
503 * @param flags DB_WRITECURSOR if writing, or 0
504 * @return 0 on success
506 /*@unused@*/ static inline
507 int dbiCopen(dbiIndex dbi, /*@null@*/ DB_TXN * txnid,
508 /*@out@*/ DBC ** dbcp, unsigned int flags)
509 /*@globals fileSystem @*/
510 /*@modifies dbi, *dbcp, fileSystem @*/
512 return (*dbi->dbi_vec->copen) (dbi, txnid, dbcp, flags);
516 * Close a database cursor.
517 * @param dbi index database handle
518 * @param dbcursor database cursor
519 * @param flags (unused)
520 * @return 0 on success
522 /*@unused@*/ static inline
523 int dbiCclose(dbiIndex dbi, /*@only@*/ DBC * dbcursor, unsigned int flags)
524 /*@globals fileSystem @*/
525 /*@modifies dbi, *dbcursor, fileSystem @*/
527 return (*dbi->dbi_vec->cclose) (dbi, dbcursor, flags);
531 * Duplicate a database cursor.
532 * @param dbi index database handle
533 * @param dbcursor database cursor
534 * @retval dbcp address of new database cursor
535 * @param flags DB_POSITION for same position, 0 for uninitialized
536 * @return 0 on success
538 /*@unused@*/ static inline
539 int dbiCdup(dbiIndex dbi, DBC * dbcursor, /*@out@*/ DBC ** dbcp,
541 /*@modifies dbi, *dbcp @*/
543 return (*dbi->dbi_vec->cdup) (dbi, dbcursor, dbcp, flags);
547 * Delete (key,data) pair(s) from index database.
548 * @param dbi index database handle
549 * @param dbcursor database cursor (NULL will use db->del)
550 * @param key delete key value/length/flags
551 * @param data delete data value/length/flags
552 * @param flags (unused)
553 * @return 0 on success
555 /*@unused@*/ static inline
556 int dbiDel(dbiIndex dbi, /*@null@*/ DBC * dbcursor, DBT * key, DBT * data,
558 /*@globals fileSystem @*/
559 /*@modifies *dbcursor, fileSystem @*/
561 assert(key->data != NULL && key->size > 0);
562 return (dbi->dbi_vec->cdel) (dbi, dbcursor, key, data, flags);
566 * Retrieve (key,data) pair from index database.
567 * @param dbi index database handle
568 * @param dbcursor database cursor (NULL will use db->get)
569 * @param key retrieve key value/length/flags
570 * @param data retrieve data value/length/flags
571 * @param flags (unused)
572 * @return 0 on success
574 /*@unused@*/ static inline
575 int dbiGet(dbiIndex dbi, /*@null@*/ DBC * dbcursor, DBT * key, DBT * data,
577 /*@globals fileSystem @*/
578 /*@modifies *dbcursor, *key, *data, fileSystem @*/
580 assert((flags == DB_NEXT) || (key->data != NULL && key->size > 0));
581 return (dbi->dbi_vec->cget) (dbi, dbcursor, key, data, flags);
585 * Retrieve (key,data) pair using dbcursor->c_pget.
586 * @param dbi index database handle
587 * @param dbcursor database cursor (NULL will use db->get)
588 * @param key secondary retrieve key value/length/flags
589 * @param pkey primary retrieve key value/length/flags
590 * @param data primary retrieve data value/length/flags
591 * @param flags DB_NEXT, DB_SET, or 0
592 * @return 0 on success
594 /*@unused@*/ static inline
595 int dbiPget(dbiIndex dbi, /*@null@*/ DBC * dbcursor,
596 DBT * key, DBT * pkey, DBT * data, unsigned int flags)
597 /*@globals fileSystem @*/
598 /*@modifies *dbcursor, *key, *pkey, *data, fileSystem @*/
600 assert((flags == DB_NEXT) || (key->data != NULL && key->size > 0));
601 return (dbi->dbi_vec->cpget) (dbi, dbcursor, key, pkey, data, flags);
605 * Store (key,data) pair in index database.
606 * @param dbi index database handle
607 * @param dbcursor database cursor (NULL will use db->put)
608 * @param key store key value/length/flags
609 * @param data store data value/length/flags
610 * @param flags (unused)
611 * @return 0 on success
613 /*@unused@*/ static inline
614 int dbiPut(dbiIndex dbi, /*@null@*/ DBC * dbcursor, DBT * key, DBT * data,
616 /*@globals fileSystem @*/
617 /*@modifies *dbcursor, *key, fileSystem @*/
619 assert(key->data != NULL && key->size > 0 && data->data != NULL && data->size > 0);
620 return (dbi->dbi_vec->cput) (dbi, dbcursor, key, data, flags);
624 * Retrieve count of (possible) duplicate items.
625 * @param dbi index database handle
626 * @param dbcursor database cursor
627 * @param countp address of count
628 * @param flags (unused)
629 * @return 0 on success
631 /*@unused@*/ static inline
632 int dbiCount(dbiIndex dbi, DBC * dbcursor, /*@out@*/ unsigned int * countp,
634 /*@globals fileSystem @*/
635 /*@modifies *dbcursor, fileSystem @*/
637 return (*dbi->dbi_vec->ccount) (dbi, dbcursor, countp, flags);
641 * Verify (and close) index database.
642 * @param dbi index database handle
643 * @param flags (unused)
644 * @return 0 on success
646 /*@unused@*/ static inline
647 int dbiVerify(/*@only@*/ dbiIndex dbi, unsigned int flags)
648 /*@globals fileSystem @*/
649 /*@modifies dbi, fileSystem @*/
651 dbi->dbi_verify_on_close = 1;
652 return (*dbi->dbi_vec->close) (dbi, flags);
656 * Close index database.
657 * @param dbi index database handle
658 * @param flags (unused)
659 * @return 0 on success
661 /*@unused@*/ static inline
662 int dbiClose(/*@only@*/ dbiIndex dbi, unsigned int flags)
663 /*@globals fileSystem @*/
664 /*@modifies dbi, fileSystem @*/
666 return (*dbi->dbi_vec->close) (dbi, flags);
670 * Flush pending operations to disk.
671 * @param dbi index database handle
672 * @param flags (unused)
673 * @return 0 on success
675 /*@unused@*/ static inline
676 int dbiSync (dbiIndex dbi, unsigned int flags)
677 /*@globals fileSystem @*/
678 /*@modifies fileSystem @*/
680 return (*dbi->dbi_vec->sync) (dbi, flags);
684 * Associate secondary database with primary.
685 * @param dbi index database handle
686 * @param dbisecondary secondary index database handle
687 * @param callback create secondary key from primary (NULL if DB_RDONLY)
688 * @param flags DB_CREATE or 0
689 * @return 0 on success
691 /*@unused@*/ static inline
692 int dbiAssociate(dbiIndex dbi, dbiIndex dbisecondary,
693 int (*callback) (DB *, const DBT *, const DBT *, DBT *),
695 /*@globals fileSystem @*/
696 /*@modifies dbi, fileSystem @*/
698 return (*dbi->dbi_vec->associate) (dbi, dbisecondary, callback, flags);
702 * Return join cursor for list of cursors.
703 * @param dbi index database handle
704 * @param curslist NULL terminated list of database cursors
705 * @retval dbcp address of join database cursor
706 * @param flags DB_JOIN_NOSORT or 0
707 * @return 0 on success
709 /*@unused@*/ static inline
710 int dbiJoin(dbiIndex dbi, DBC ** curslist, /*@out@*/ DBC ** dbcp,
712 /*@globals fileSystem @*/
713 /*@modifies dbi, *dbcp, fileSystem @*/
715 return (*dbi->dbi_vec->join) (dbi, curslist, dbcp, flags);
719 * Is database byte swapped?
720 * @param dbi index database handle
721 * @return 0 same order, 1 swapped order
723 /*@unused@*/ static inline
724 int dbiByteSwapped(dbiIndex dbi)
727 if (dbi->dbi_byteswapped == -1)
728 dbi->dbi_byteswapped = (*dbi->dbi_vec->byteswapped) (dbi);
729 return dbi->dbi_byteswapped;
732 * Is database byte swapped?
733 * @param dbi index database handle
734 * @param flags DB_FAST_STAT or 0
735 * @return 0 on success
737 /*@unused@*/ static inline
738 int dbiStat(dbiIndex dbi, unsigned int flags)
741 return (*dbi->dbi_vec->stat) (dbi, flags);
743 /*@=globuse =mustmod @*/
749 unsigned int rpmdbGetIteratorFileNum(rpmdbMatchIterator mi)
753 * Destroy set of index database items.
754 * @param set set of index database items
755 * @return NULL always
757 /*@null@*/ dbiIndexSet dbiFreeIndexSet(/*@only@*/ /*@null@*/ dbiIndexSet set)
761 * Count items in index database set.
762 * @param set set of index database items
763 * @return number of items
765 unsigned int dbiIndexSetCount(dbiIndexSet set)
769 * Return record offset of header from element in index database set.
770 * @param set set of index database items
771 * @param recno index of item in set
772 * @return record offset of header
774 unsigned int dbiIndexRecordOffset(dbiIndexSet set, int recno)
778 * Return file index from element in index database set.
779 * @param set set of index database items
780 * @param recno index of item in set
783 unsigned int dbiIndexRecordFileNumber(dbiIndexSet set, int recno)
787 * Tags for which rpmdb indices will be built.
791 /*@only@*/ /*@null@*/ extern int * dbiTags;
793 extern int dbiTagsMax;
797 * Unreference a database instance.
798 * @param db rpm database
800 * @return NULL always
802 /*@unused@*/ /*@null@*/
803 rpmdb rpmdbUnlink (/*@killref@*/ /*@only@*/ rpmdb db, const char * msg)
806 /** @todo Remove debugging entry from the ABI. */
809 rpmdb XrpmdbUnlink (/*@killref@*/ /*@only@*/ rpmdb db, const char * msg,
810 const char * fn, unsigned ln)
813 #define rpmdbUnlink(_db, _msg) XrpmdbUnlink(_db, _msg, __FILE__, __LINE__)
816 * Reference a database instance.
817 * @param db rpm database
819 * @return new rpm database reference
822 rpmdb rpmdbLink (rpmdb db, const char * msg)
825 /** @todo Remove debugging entry from the ABI. */
827 rpmdb XrpmdbLink (rpmdb db, const char * msg,
828 const char * fn, unsigned ln)
831 #define rpmdbLink(_db, _msg) XrpmdbLink(_db, _msg, __FILE__, __LINE__)
835 * @param prefix path to top of install tree
836 * @retval dbp address of rpm database
837 * @param mode open(2) flags: O_RDWR or O_RDONLY (O_CREAT also)
838 * @param perms database permissions
839 * @return 0 on success
841 int rpmdbOpen (/*@null@*/ const char * prefix, /*@null@*/ /*@out@*/ rpmdb * dbp,
843 /*@globals rpmGlobalMacroContext, fileSystem, internalState @*/
844 /*@modifies *dbp, rpmGlobalMacroContext, fileSystem, internalState @*/;
847 * Initialize database.
848 * @param prefix path to top of install tree
849 * @param perms database permissions
850 * @return 0 on success
852 int rpmdbInit(/*@null@*/ const char * prefix, int perms)
853 /*@globals rpmGlobalMacroContext, fileSystem, internalState @*/
854 /*@modifies rpmGlobalMacroContext, fileSystem, internalState @*/;
857 * Verify database components.
858 * @param prefix path to top of install tree
859 * @return 0 on success
861 int rpmdbVerify(/*@null@*/ const char * prefix)
862 /*@globals rpmGlobalMacroContext, fileSystem, internalState @*/
863 /*@modifies rpmGlobalMacroContext, fileSystem, internalState @*/;
866 * Close a single database index.
867 * @param db rpm database
868 * @param rpmtag rpm tag
869 * @return 0 on success
871 int rpmdbCloseDBI(/*@null@*/ rpmdb db, int rpmtag)
872 /*@globals fileSystem @*/
873 /*@modifies db, fileSystem @*/;
876 * Close all database indices and free rpmdb.
877 * @param db rpm database
878 * @return 0 on success
880 int rpmdbClose (/*@killref@*/ /*@only@*/ /*@null@*/ rpmdb db)
881 /*@globals fileSystem @*/
882 /*@modifies db, fileSystem @*/;
885 * Sync all database indices.
886 * @param db rpm database
887 * @return 0 on success
889 int rpmdbSync (/*@null@*/ rpmdb db)
890 /*@globals fileSystem @*/
891 /*@modifies fileSystem @*/;
894 * Open all database indices.
895 * @param db rpm database
896 * @return 0 on success
899 int rpmdbOpenAll (/*@null@*/ rpmdb db)
900 /*@globals rpmGlobalMacroContext @*/
901 /*@modifies db, rpmGlobalMacroContext @*/;
905 * Return number of instances of package in rpm database.
906 * @param db rpm database
907 * @param name rpm package name
908 * @return number of instances
910 int rpmdbCountPackages(/*@null@*/ rpmdb db, const char * name)
911 /*@globals rpmGlobalMacroContext, fileSystem @*/
912 /*@modifies db, rpmGlobalMacroContext, fileSystem @*/;
915 * Return header join key for current position of rpm database iterator.
916 * @param mi rpm database iterator
917 * @return current header join key
919 unsigned int rpmdbGetIteratorOffset(/*@null@*/ rpmdbMatchIterator mi)
923 * Return number of elements in rpm database iterator.
924 * @param mi rpm database iterator
925 * @return number of elements
927 int rpmdbGetIteratorCount(/*@null@*/ rpmdbMatchIterator mi)
931 * Append items to set of package instances to iterate.
932 * @param mi rpm database iterator
933 * @param hdrNums array of package instances
934 * @param nHdrNums number of elements in array
935 * @return 0 on success, 1 on failure (bad args)
937 int rpmdbAppendIterator(/*@null@*/ rpmdbMatchIterator mi,
938 /*@null@*/ const int * hdrNums, int nHdrNums)
942 * Remove items from set of package instances to iterate.
943 * @note Sorted hdrNums are always passed in rpmlib.
944 * @param mi rpm database iterator
945 * @param hdrNums array of package instances
946 * @param nHdrNums number of elements in array
947 * @param sorted is the array sorted? (array will be sorted on return)
948 * @return 0 on success, 1 on failure (bad args)
950 int rpmdbPruneIterator(/*@null@*/ rpmdbMatchIterator mi,
951 /*@null@*/ int * hdrNums, int nHdrNums, int sorted)
952 /*@modifies mi, hdrNums @*/;
955 * Add pattern to iterator selector.
956 * @param mi rpm database iterator
958 * @param mode type of pattern match
959 * @param pattern pattern to match
960 * @return 0 on success
962 int rpmdbSetIteratorRE(/*@null@*/ rpmdbMatchIterator mi, rpmTag tag,
963 rpmMireMode mode, /*@null@*/ const char * pattern)
964 /*@globals rpmGlobalMacroContext @*/
965 /*@modifies mi, mode, rpmGlobalMacroContext @*/;
968 * Prepare iterator for lazy writes.
969 * @note Must be called before rpmdbNextIterator() with CDB model database.
970 * @param mi rpm database iterator
971 * @param rewrite new value of rewrite
972 * @return previous value
974 int rpmdbSetIteratorRewrite(/*@null@*/ rpmdbMatchIterator mi, int rewrite)
978 * Modify iterator to mark header for lazy write on release.
979 * @param mi rpm database iterator
980 * @param modified new value of modified
981 * @return previous value
983 int rpmdbSetIteratorModified(/*@null@*/ rpmdbMatchIterator mi, int modified)
987 * Modify iterator to verify retrieved header blobs.
988 * @param mi rpm database iterator
989 * @param ts transaction set
990 * @param (*hdrchk) headerCheck() vector
993 int rpmdbSetHdrChk(/*@null@*/ rpmdbMatchIterator mi, /*@null@*/ rpmts ts,
994 /*@null@*/ rpmRC (*hdrchk) (rpmts ts, const void * uh, size_t uc, const char ** msg))
998 * Return database iterator.
999 * @param db rpm database
1000 * @param rpmtag rpm tag
1001 * @param keyp key data (NULL for sequential access)
1002 * @param keylen key data length (0 will use strlen(keyp))
1003 * @return NULL on failure
1005 /*@only@*/ /*@null@*/
1006 rpmdbMatchIterator rpmdbInitIterator(/*@null@*/ rpmdb db, rpmTag rpmtag,
1007 /*@null@*/ const void * keyp, size_t keylen)
1008 /*@globals rpmGlobalMacroContext, fileSystem @*/
1009 /*@modifies db, rpmGlobalMacroContext, fileSystem @*/;
1012 * Return next package header from iteration.
1013 * @param mi rpm database iterator
1014 * @return NULL on end of iteration.
1017 Header rpmdbNextIterator(/*@null@*/ rpmdbMatchIterator mi)
1018 /*@globals rpmGlobalMacroContext, fileSystem @*/
1019 /*@modifies mi, rpmGlobalMacroContext, fileSystem @*/;
1022 * Destroy rpm database iterator.
1023 * @param mi rpm database iterator
1024 * @return NULL always
1027 rpmdbMatchIterator rpmdbFreeIterator(/*@only@*/ /*@null@*/rpmdbMatchIterator mi)
1028 /*@globals rpmGlobalMacroContext, fileSystem @*/
1029 /*@modifies mi, rpmGlobalMacroContext, fileSystem @*/;
1032 * Add package header to rpm database and indices.
1033 * @param db rpm database
1034 * @param iid install transaction id (iid = 0 or -1 to skip)
1036 * @param ts (unused) transaction set (or NULL)
1037 * @param (*hdrchk) (unused) headerCheck() vector (or NULL)
1038 * @return 0 on success
1040 int rpmdbAdd(/*@null@*/ rpmdb db, int iid, Header h, /*@null@*/ rpmts ts,
1041 /*@null@*/ rpmRC (*hdrchk) (rpmts ts, const void *uh, size_t uc, const char ** msg))
1042 /*@globals rpmGlobalMacroContext, fileSystem @*/
1043 /*@modifies db, h, rpmGlobalMacroContext, fileSystem @*/;
1046 * Remove package header from rpm database and indices.
1047 * @param db rpm database
1048 * @param rid (unused) remove transaction id (rid = 0 or -1 to skip)
1049 * @param hdrNum package instance number in database
1050 * @param ts (unused) transaction set (or NULL)
1051 * @param (*hdrchk) (unused) headerCheck() vector (or NULL)
1052 * @return 0 on success
1054 int rpmdbRemove(/*@null@*/ rpmdb db, /*@unused@*/ int rid, unsigned int hdrNum,
1055 /*@null@*/ rpmts ts,
1056 /*@null@*/ rpmRC (*hdrchk) (rpmts ts, const void *uh, size_t uc, const char ** msg))
1057 /*@globals rpmGlobalMacroContext, fileSystem @*/
1058 /*@modifies db, rpmGlobalMacroContext, fileSystem @*/;
1061 * Rebuild database indices from package headers.
1062 * @param prefix path to top of install tree
1063 * @param ts transaction set (or NULL)
1064 * @param (*hdrchk) headerCheck() vector (or NULL)
1065 * @return 0 on success
1067 int rpmdbRebuild(/*@null@*/ const char * prefix, /*@null@*/ rpmts ts,
1068 /*@null@*/ rpmRC (*hdrchk) (rpmts ts, const void *uh, size_t uc, const char ** msg))
1069 /*@globals rpmGlobalMacroContext, fileSystem, internalState @*/
1070 /*@modifies rpmGlobalMacroContext, fileSystem, internalState @*/;
1073 * Mergesort, same arguments as qsort(2).
1076 int mergesort(void *base, size_t nmemb, size_t size,
1077 int (*cmp) (const void *, const void *))
1078 /*@globals errno @*/
1079 /*@modifies base, errno @*/;
1086 #endif /* H_RPMDB */