summaryrefslogtreecommitdiff
path: root/rpmdb/rpmdb.h
diff options
context:
space:
mode:
Diffstat (limited to 'rpmdb/rpmdb.h')
-rw-r--r--rpmdb/rpmdb.h441
1 files changed, 441 insertions, 0 deletions
diff --git a/rpmdb/rpmdb.h b/rpmdb/rpmdb.h
new file mode 100644
index 000000000..a23689160
--- /dev/null
+++ b/rpmdb/rpmdb.h
@@ -0,0 +1,441 @@
+#ifndef H_RPMDB
+#define H_RPMDB
+
+/** \ingroup rpmdb dbi db1 db3
+ * \file lib/rpmdb.h
+ * Access RPM indices using Berkeley DB interface(s).
+ */
+
+#include <rpmlib.h>
+
+#include "fprint.h"
+
+typedef /*@abstract@*/ struct _dbiIndexItem * dbiIndexItem;
+typedef /*@abstract@*/ struct _dbiIndex * dbiIndex;
+
+/* this will break if sizeof(int) != 4 */
+/** \ingroup dbi
+ * A single item from an index database (i.e. the "data returned").
+ * Note: In rpm-3.0.4 and earlier, this structure was passed by value,
+ * and was identical to the "data saved" structure below.
+ */
+struct _dbiIndexItem {
+ unsigned int hdrNum; /*!< header instance in db */
+ unsigned int tagNum; /*!< tag index in header */
+ unsigned int fpNum; /*!< finger print index */
+ unsigned int dbNum; /*!< database index */
+};
+
+/** \ingroup dbi
+ * A single item in an index database (i.e. the "data saved").
+ */
+struct _dbiIR {
+ unsigned int recOffset; /*!< byte offset of header in db */
+ unsigned int fileNumber; /*!< file array index */
+};
+typedef struct _dbiIR * DBIR_t;
+
+/** \ingroup dbi
+ * Items retrieved from the index database.
+ */
+struct _dbiIndexSet {
+/*@owned@*/ struct _dbiIndexItem * recs; /*!< array of records */
+ int count; /*!< number of records */
+};
+
+/* XXX hack to get prototypes correct */
+#if !defined(DB_VERSION_MAJOR)
+#define DB_ENV void
+#define DBC void
+#define DBT void
+#define DB_LSN void
+#endif
+
+/** \ingroup dbi
+ * Private methods for accessing an index database.
+ */
+struct _dbiVec {
+ int dbv_major; /*!< Berkeley db version major */
+ int dbv_minor; /*!< Berkeley db version minor */
+ int dbv_patch; /*!< Berkeley db version patch */
+
+/** \ingroup dbi
+ * Return handle for an index database.
+ * @param rpmdb rpm database
+ * @param rpmtag rpm tag
+ * @return 0 on success
+ */
+ int (*open) (rpmdb rpmdb, int rpmtag, /*@out@*/ dbiIndex * dbip);
+
+/** \ingroup dbi
+ * Close index database.
+ * @param dbi index database handle
+ * @param flags (unused)
+ * @return 0 on success
+ */
+ int (*close) (/*@only@*/ dbiIndex dbi, unsigned int flags);
+
+/** \ingroup dbi
+ * Flush pending operations to disk.
+ * @param dbi index database handle
+ * @param flags (unused)
+ * @return 0 on success
+ */
+ int (*sync) (dbiIndex dbi, unsigned int flags);
+
+/** \ingroup dbi
+ * Open database cursor.
+ * @param dbi index database handle
+ * @param dbcp address of database cursor
+ * @param flags (unused)
+ */
+ int (*copen) (dbiIndex dbi, /*@out@*/ DBC ** dbcp, unsigned int flags);
+
+/** \ingroup dbi
+ * Close database cursor.
+ * @param dbi index database handle
+ * @param dbcursor database cursor
+ * @param flags (unused)
+ */
+ int (*cclose) (dbiIndex dbi, /*@only@*/ DBC * dbcursor, unsigned int flags);
+
+/** \ingroup dbi
+ * Delete (key,data) pair(s) using db->del or dbcursor->c_del.
+ * @param dbi index database handle
+ * @param dbcursor database cursor
+ * @param keyp key data
+ * @param keylen key data length
+ * @param flags (unused)
+ * @return 0 on success
+ */
+ int (*cdel) (dbiIndex dbi, DBC * dbcursor, const void * keyp, size_t keylen, unsigned int flags);
+
+/** \ingroup dbi
+ * Retrieve (key,data) pair using db->get or dbcursor->c_get.
+ * @param dbi index database handle
+ * @param dbcursor database cursor
+ * @param keypp address of key data
+ * @param keylenp address of key data length
+ * @param datapp address of data pointer
+ * @param datalenp address of data length
+ * @param flags (unused)
+ * @return 0 on success
+ */
+ int (*cget) (dbiIndex dbi, DBC * dbcursor,
+ /*@out@*/ void ** keypp, /*@out@*/ size_t * keylenp,
+ /*@out@*/ void ** datapp, /*@out@*/ size_t * datalenp,
+ unsigned int flags);
+
+/** \ingroup dbi
+ * Store (key,data) pair using db->put or dbcursor->c_put.
+ * @param dbi index database handle
+ * @param dbcursor database cursor
+ * @param keyp key data
+ * @param keylen key data length
+ * @param datap data pointer
+ * @param datalen data length
+ * @param flags (unused)
+ * @return 0 on success
+ */
+ int (*cput) (dbiIndex dbi, DBC * dbcursor,
+ const void * keyp, size_t keylen,
+ const void * datap, size_t datalen,
+ unsigned int flags);
+
+/** \ingroup dbi
+ * Is database byte swapped?
+ * @param dbi index database handle
+ * @return 0 no
+ */
+ int (*byteswapped) (dbiIndex dbi);
+
+};
+
+/** \ingroup dbi
+ * Describes an index database (implemented on Berkeley db[123] API).
+ */
+struct _dbiIndex {
+/*@null@*/ const char * dbi_root;
+/*@null@*/ const char * dbi_home;
+/*@null@*/ const char * dbi_file;
+/*@null@*/ const char * dbi_subfile;
+
+ int dbi_cflags; /*!< db_create/db_env_create flags */
+ int dbi_oeflags; /*!< common (db,dbenv}->open flags */
+ int dbi_eflags; /*!< dbenv->open flags */
+ int dbi_oflags; /*!< db->open flags */
+ int dbi_tflags; /*!< dbenv->txn_begin flags */
+
+ int dbi_type; /*!< db index type */
+ unsigned dbi_mode; /*!< mode to use on open */
+ int dbi_perms; /*!< file permission to use on open */
+ int dbi_api; /*!< Berkeley API type */
+
+ int dbi_tear_down;
+ int dbi_use_cursors;
+ int dbi_use_dbenv;
+ int dbi_get_rmw_cursor;
+ int dbi_no_fsync; /*!< no-op fsync for db */
+ int dbi_no_dbsync; /*!< don't call dbiSync */
+ int dbi_lockdbfd; /*!< do fcntl lock on db fd */
+ int dbi_temporary; /*!< non-persistent */
+ int dbi_debug;
+
+ /* dbenv parameters */
+ int dbi_lorder;
+/*@null@*/ void (*db_errcall) (const char *db_errpfx, char *buffer);
+/*@shared@*/ FILE * dbi_errfile;
+ const char * dbi_errpfx;
+ int dbi_verbose;
+ int dbi_region_init;
+ int dbi_tas_spins;
+ /* mpool sub-system parameters */
+ int dbi_mp_mmapsize; /*!< (10Mb) */
+ int dbi_mp_size; /*!< (128Kb) */
+ /* lock sub-system parameters */
+ unsigned int dbi_lk_max;
+ unsigned int dbi_lk_detect;
+ int dbi_lk_nmodes;
+ unsigned char *dbi_lk_conflicts;
+ /* log sub-system parameters */
+ unsigned int dbi_lg_max;
+ unsigned int dbi_lg_bsize;
+ /* transaction sub-system parameters */
+ unsigned int dbi_tx_max;
+#if 0
+ int (*dbi_tx_recover) (DB_ENV *dbenv, DBT *log_rec, DB_LSN *lsnp, int redo, void *info);
+#endif
+ /* dbinfo parameters */
+ int dbi_cachesize; /*!< */
+ int dbi_pagesize; /*!< (fs blksize) */
+/*@null@*/ void * (*dbi_malloc) (size_t nbytes);
+ /* hash access parameters */
+ unsigned int dbi_h_ffactor; /*!< */
+/*@null@*/ unsigned int (*dbi_h_hash_fcn) (const void *bytes, unsigned int length);
+ unsigned int dbi_h_nelem; /*!< */
+ unsigned int dbi_h_flags; /*!< DB_DUP, DB_DUPSORT */
+/*@null@*/ int (*dbi_h_dup_compare_fcn) (const DBT *, const DBT *);
+ /* btree access parameters */
+ int dbi_bt_flags;
+ int dbi_bt_minkey;
+/*@null@*/ int (*dbi_bt_compare_fcn)(const DBT *, const DBT *);
+/*@null@*/ int (*dbi_bt_dup_compare_fcn) (const DBT *, const DBT *);
+/*@null@*/ size_t (*dbi_bt_prefix_fcn) (const DBT *, const DBT *);
+ /* recno access parameters */
+ int dbi_re_flags;
+ int dbi_re_delim;
+ unsigned int dbi_re_len;
+ int dbi_re_pad;
+ const char * dbi_re_source;
+
+/*@kept@*/ rpmdb dbi_rpmdb;
+ int dbi_rpmtag; /*!< rpm tag used for index */
+ int dbi_jlen; /*!< size of join key */
+
+ unsigned int dbi_lastoffset; /*!< db1 with falloc.c needs this */
+
+/*@only@*//*@null@*/ void * dbi_db; /*!< dbi handle */
+/*@only@*//*@null@*/ void * dbi_dbenv;
+/*@only@*//*@null@*/ void * dbi_dbinfo;
+/*@only@*//*@null@*/ void * dbi_rmw; /*!< db cursor (with DB_WRITECURSOR) */
+
+/*@observer@*/ const struct _dbiVec * dbi_vec; /*!< private methods */
+
+};
+
+/** \ingroup rpmdb
+ * Describes the collection of index databases used by rpm.
+ */
+struct rpmdb_s {
+/*@owned@*/ const char *db_root; /*!< path prefix */
+/*@owned@*/ const char *db_home; /*!< directory path */
+ int db_flags;
+ int db_mode; /*!< open mode */
+ int db_perms; /*!< open permissions */
+ int db_api; /*!< Berkeley API type */
+ int db_remove_env;
+ int db_filter_dups;
+/*@owned@*/ const char *db_errpfx;
+ void (*db_errcall) (const char *db_errpfx, char *buffer);
+/*@shared@*/ FILE * db_errfile;
+/*@observer@*/ void * (*db_malloc) (size_t nbytes);
+ int db_ndbi;
+ dbiIndex *_dbi;
+};
+
+/* for RPM's internal use only */
+
+/** \ingroup rpmdb
+ */
+enum rpmdbFlags {
+ RPMDB_FLAG_JUSTCHECK = (1 << 0),
+ RPMDB_FLAG_MINIMAL = (1 << 1),
+ RPMDB_FLAG_CHROOT = (1 << 2)
+};
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*@-exportlocal@*/
+/** \ingroup db3
+ * Return new configured index database handle instance.
+ * @param rpmdb rpm database
+ */
+/*@only@*/ /*@null@*/ dbiIndex db3New(/*@keep@*/ rpmdb rpmdb, int rpmtag);
+
+/** \ingroup db3
+ * Destroy index database handle instance.
+ * @param dbi index database handle
+ */
+void db3Free( /*@only@*/ /*@null@*/ dbiIndex dbi);
+
+/** \ingroup db3
+ * Format db3 open flags for debugging print.
+ * @param dbflags db open flags
+ * @param print_dbenv_flags format db env flags instead?
+ * @return formatted flags (static buffer)
+ */
+/*@exposed@*/ extern const char *const prDbiOpenFlags(int dbflags,
+ int print_dbenv_flags);
+
+/** \ingroup dbi
+ * Return handle for an index database.
+ * @param rpmdb rpm database
+ * @param rpmtag rpm tag
+ * @param flags (unused)
+ * @return index database handle
+ */
+/*@only@*/ /*@null@*/ dbiIndex dbiOpen(/*@null@*/ rpmdb rpmdb, int rpmtag,
+ unsigned int flags);
+
+/** \ingroup dbi
+ * @param dbi index database handle
+ * @param flags (unused)
+ */
+int dbiCopen(dbiIndex dbi, /*@out@*/ DBC ** dbcp, unsigned int flags);
+int XdbiCopen(dbiIndex dbi, /*@out@*/ DBC ** dbcp, unsigned int flags, const char *f, unsigned int l);
+#define dbiCopen(_a,_b,_c) \
+ XdbiCopen(_a, _b, _c, __FILE__, __LINE__)
+
+/** \ingroup dbi
+ * @param dbi index database handle
+ * @param flags (unused)
+ */
+int dbiCclose(dbiIndex dbi, /*@only@*/ DBC * dbcursor, unsigned int flags);
+int XdbiCclose(dbiIndex dbi, /*@only@*/ DBC * dbcursor, unsigned int flags, const char *f, unsigned int l);
+#define dbiCclose(_a,_b,_c) \
+ XdbiCclose(_a, _b, _c, __FILE__, __LINE__)
+
+/** \ingroup dbi
+ * Delete (key,data) pair(s) from index database.
+ * @param dbi index database handle
+ * @param keyp key data
+ * @param keylen key data length
+ * @param flags (unused)
+ * @return 0 on success
+ */
+int dbiDel(dbiIndex dbi, DBC * dbcursor, const void * keyp, size_t keylen,
+ unsigned int flags);
+
+/** \ingroup dbi
+ * Retrieve (key,data) pair from index database.
+ * @param dbi index database handle
+ * @param keypp address of key data
+ * @param keylenp address of key data length
+ * @param datapp address of data pointer
+ * @param datalenp address of data length
+ * @param flags (unused)
+ * @return 0 on success
+ */
+int dbiGet(dbiIndex dbi, DBC * dbcursor, void ** keypp, size_t * keylenp,
+ void ** datapp, size_t * datalenp, unsigned int flags);
+
+/** \ingroup dbi
+ * Store (key,data) pair in index database.
+ * @param dbi index database handle
+ * @param keyp key data
+ * @param keylen key data length
+ * @param datap data pointer
+ * @param datalen data length
+ * @param flags (unused)
+ * @return 0 on success
+ */
+int dbiPut(dbiIndex dbi, DBC * dbcursor, const void * keyp, size_t keylen,
+ const void * datap, size_t datalen, unsigned int flags);
+
+/** \ingroup dbi
+ * Close index database.
+ * @param dbi index database handle
+ * @param flags (unused)
+ * @return 0 on success
+ */
+int dbiClose(/*@only@*/ dbiIndex dbi, unsigned int flags);
+
+/** \ingroup dbi
+ * Flush pending operations to disk.
+ * @param dbi index database handle
+ * @param flags (unused)
+ * @return 0 on success
+ */
+int dbiSync (dbiIndex dbi, unsigned int flags);
+
+/** \ingroup dbi
+ * Is database byte swapped?
+ * @param dbi index database handle
+ * @return 0 no
+ */
+int dbiByteSwapped(dbiIndex dbi);
+
+/** \ingroup db1
+ * Return base file name for db1 database (legacy).
+ * @param rpmtag rpm tag
+ * @return base file name of db1 database
+ */
+char * db1basename(int rpmtag);
+/*@=exportlocal@*/
+
+/** \ingroup rpmdb
+ */
+unsigned int rpmdbGetIteratorFileNum(rpmdbMatchIterator mi);
+
+/** \ingroup rpmdb
+ * @param rpmdb rpm database
+ */
+int rpmdbFindFpList(/*@null@*/ rpmdb rpmdb, fingerPrint * fpList,
+ /*@out@*/dbiIndexSet * matchList, int numItems);
+
+/** \ingroup dbi
+ * Destroy set of index database items.
+ * @param set set of index database items
+ */
+void dbiFreeIndexSet(/*@only@*/ /*@null@*/ dbiIndexSet set);
+
+/** \ingroup dbi
+ * Count items in index database set.
+ * @param set set of index database items
+ * @return number of items
+ */
+unsigned int dbiIndexSetCount(dbiIndexSet set);
+
+/** \ingroup dbi
+ * Return record offset of header from element in index database set.
+ * @param set set of index database items
+ * @param recno index of item in set
+ * @return record offset of header
+ */
+unsigned int dbiIndexRecordOffset(dbiIndexSet set, int recno);
+
+/** \ingroup dbi
+ * Return file index from element in index database set.
+ * @param set set of index database items
+ * @param recno index of item in set
+ * @return file index
+ */
+unsigned int dbiIndexRecordFileNumber(dbiIndexSet set, int recno);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* H_RPMDB */