Blame lib/backend/dbi.h

2ff057
#ifndef _DBI_H
2ff057
#define _DBI_H
2ff057
2ff057
#include "dbiset.h"
2ff057
2ff057
/* XXX: make this backend-specific, eliminate or something... */
2ff057
#define	_USE_COPY_LOAD
2ff057
2ff057
enum rpmdbFlags {
2ff057
    RPMDB_FLAG_JUSTCHECK	= (1 << 0),
2ff057
    RPMDB_FLAG_REBUILD		= (1 << 1),
2ff057
    RPMDB_FLAG_VERIFYONLY	= (1 << 2),
2ff057
};
2ff057
2ff057
typedef enum dbCtrlOp_e {
2ff057
    DB_CTRL_LOCK_RO		= 1,
2ff057
    DB_CTRL_UNLOCK_RO		= 2,
2ff057
    DB_CTRL_LOCK_RW		= 3,
2ff057
    DB_CTRL_UNLOCK_RW		= 4,
2ff057
    DB_CTRL_INDEXSYNC		= 5
2ff057
} dbCtrlOp;
2ff057
2ff057
typedef struct dbiIndex_s * dbiIndex;
2ff057
typedef struct dbiCursor_s * dbiCursor;
2ff057
2ff057
struct dbConfig_s {
2ff057
    int	db_mmapsize;	/*!< (10Mb) */
2ff057
    int	db_cachesize;	/*!< (128Kb) */
2ff057
    int	db_verbose;
2ff057
    int	db_no_fsync;	/*!< no-op fsync for db */
2ff057
    int db_eflags;	/*!< obsolete */
2ff057
};
2ff057
2ff057
struct dbiConfig_s {
2ff057
    int	dbi_oflags;		/*!< open flags */
2ff057
    int	dbi_no_dbsync;		/*!< don't call dbiSync */
2ff057
    int	dbi_lockdbfd;		/*!< do fcntl lock on db fd */
2ff057
};
2ff057
2ff057
struct rpmdbOps_s;
2ff057
2ff057
/** \ingroup rpmdb
2ff057
 * Describes the collection of index databases used by rpm.
2ff057
 */
2ff057
struct rpmdb_s {
2ff057
    char 	* db_root;/*!< path prefix */
2ff057
    char 	* db_home;/*!< directory path */
2ff057
    char	* db_fullpath;	/*!< full db path including prefix */
2ff057
    int		db_flags;
2ff057
    int		db_mode;	/*!< open mode */
2ff057
    int		db_perms;	/*!< open permissions */
2ff057
    char	* db_descr;	/*!< db backend description (for error msgs) */
2ff057
    struct dbChk_s * db_checked;/*!< headerCheck()'ed package instances */
2ff057
    rpmdb	db_next;
2ff057
    int		db_opens;
2ff057
    dbiIndex	db_pkgs;	/*!< Package db */
2ff057
    const rpmDbiTag * db_tags;
2ff057
    int		db_ndbi;	/*!< No. of tag indices. */
2ff057
    dbiIndex 	* db_indexes;	/*!< Tag indices. */
2ff057
    int		db_buildindex;	/*!< Index rebuild indicator */
2ff057
2ff057
    struct rpmdbOps_s * db_ops;	/*!< backend ops */
2ff057
2ff057
    /* dbenv and related parameters */
2ff057
    void * db_dbenv;		/*!< Backend private handle */
2ff057
    struct dbConfig_s cfg;
2ff057
    int db_remove_env;
2ff057
2ff057
    struct rpmop_s db_getops;
2ff057
    struct rpmop_s db_putops;
2ff057
    struct rpmop_s db_delops;
2ff057
2ff057
    int nrefs;			/*!< Reference count. */
2ff057
};
2ff057
2ff057
/* Type of the dbi, also serves as the join key size */
2ff057
typedef enum dbiIndexType_e {
2ff057
    DBI_PRIMARY 	= (1 * sizeof(int32_t)),
2ff057
    DBI_SECONDARY	= (2 * sizeof(int32_t)),
2ff057
} dbiIndexType;
2ff057
2ff057
enum dbiFlags_e {
2ff057
    DBI_NONE		= 0,
2ff057
    DBI_CREATED		= (1 << 0),
2ff057
    DBI_RDONLY		= (1 << 1),
2ff057
};
2ff057
2ff057
enum dbcFlags_e {
2ff057
    DBC_READ	= 0,
2ff057
    DBC_WRITE	= (1 << 0),
2ff057
};
2ff057
2ff057
enum dbcSearchType_e {
2ff057
    DBC_NORMAL_SEARCH   = 0,
2ff057
    DBC_PREFIX_SEARCH   = (1 << 0),
2ff057
};
2ff057
2ff057
/** \ingroup dbi
2ff057
 * Describes an index database (implemented on Berkeley db functionality).
2ff057
 */
2ff057
struct dbiIndex_s {
2ff057
    rpmdb dbi_rpmdb;		/*!< the parent rpm database */
2ff057
    dbiIndexType dbi_type;	/*! Type of dbi (primary / index) */
2ff057
    const char * dbi_file;	/*!< file component of path */
2ff057
    int dbi_flags;
2ff057
    int	dbi_byteswapped;
2ff057
2ff057
    struct dbiConfig_s cfg;
2ff057
2ff057
    void * dbi_db;		/*!< Backend private handle */
2ff057
};
2ff057
2ff057
union _dbswap {
2ff057
    unsigned int ui;
2ff057
    unsigned char uc[4];
2ff057
};
2ff057
2ff057
#define	_DBSWAP(_a) \
2ff057
\
2ff057
  { unsigned char _b, *_c = (_a).uc; \
2ff057
    _b = _c[3]; _c[3] = _c[0]; _c[0] = _b; \
2ff057
    _b = _c[2]; _c[2] = _c[1]; _c[1] = _b; \
2ff057
\
2ff057
  }
2ff057
2ff057
#ifdef __cplusplus
2ff057
extern "C" {
2ff057
#endif
2ff057
2ff057
2ff057
RPM_GNUC_INTERNAL
2ff057
/* Globally enable/disable fsync in the backend */
2ff057
void dbSetFSync(rpmdb rdb, int enable);
2ff057
2ff057
RPM_GNUC_INTERNAL
2ff057
int dbCtrl(rpmdb rdb, dbCtrlOp ctrl);
2ff057
2ff057
/** \ingroup dbi
2ff057
 * Return new configured index database handle instance.
2ff057
 * @param rdb		rpm database
2ff057
 * @param rpmtag	database index tag
2ff057
 * @return		index database handle
2ff057
 */
2ff057
RPM_GNUC_INTERNAL
2ff057
dbiIndex dbiNew(rpmdb rdb, rpmDbiTagVal rpmtag);
2ff057
2ff057
/** \ingroup dbi
2ff057
 * Destroy index database handle instance.
2ff057
 * @param dbi		index database handle
2ff057
 * @return		NULL always
2ff057
 */
2ff057
RPM_GNUC_INTERNAL
2ff057
dbiIndex dbiFree( dbiIndex dbi);
2ff057
2ff057
/** \ingroup dbi
2ff057
 * Actually open the database of the index.
2ff057
 * @param db		rpm database
2ff057
 * @param rpmtag	database index tag
2ff057
 * @param dbiIndex	address of index database handle
2ff057
 * @param flags
2ff057
 * @return		0 on success
2ff057
 */
2ff057
RPM_GNUC_INTERNAL
2ff057
int dbiOpen(rpmdb rdb, rpmDbiTagVal rpmtag, dbiIndex * dbip, int flags);
2ff057
2ff057
/** \ingroup dbi
2ff057
 * Close index database.
2ff057
 * @param dbi		index database handle
2ff057
 * @param flags		(unused)
2ff057
 * @return		0 on success
2ff057
 */
2ff057
RPM_GNUC_INTERNAL
2ff057
int dbiClose(dbiIndex dbi, unsigned int flags);
2ff057
2ff057
/** \ingroup dbi
2ff057
 * Verify (and close) index database.
2ff057
 * @param dbi		index database handle
2ff057
 * @param flags		(unused)
2ff057
 * @return		0 on success
2ff057
 */
2ff057
RPM_GNUC_INTERNAL
2ff057
int dbiVerify(dbiIndex dbi, unsigned int flags);
2ff057
2ff057
/** \ingroup dbi
2ff057
 * Retrieve index control flags (new/existing, read-only etc)
2ff057
 * @param dbi		index database handle
2ff057
 * @return		dbi control flags
2ff057
 */
2ff057
RPM_GNUC_INTERNAL
2ff057
int dbiFlags(dbiIndex dbi);
2ff057
2ff057
/** \ingroup dbi
2ff057
 * Retrieve index name (same as the backing file name)
2ff057
 * @param dbi		index database handle
2ff057
 * @return		dbi name
2ff057
 */
2ff057
RPM_GNUC_INTERNAL
2ff057
const char * dbiName(dbiIndex dbi);
2ff057
2ff057
/** \ingroup dbi
2ff057
 * Open a database cursor.
2ff057
 * @param dbi		index database handle
2ff057
 * @param flags		DBC_WRITE if writing, or 0 (DBC_READ) for reading
2ff057
 * @return		database cursor handle
2ff057
 */
2ff057
RPM_GNUC_INTERNAL
2ff057
dbiCursor dbiCursorInit(dbiIndex dbi, unsigned int flags);
2ff057
2ff057
/** \ingroup dbi
2ff057
 * Destroy a database cursor handle
2ff057
 * @param dbc		database cursor handle
2ff057
 * @return		NULL always
2ff057
 */
2ff057
RPM_GNUC_INTERNAL
2ff057
dbiCursor dbiCursorFree(dbiIndex dbi, dbiCursor dbc);
2ff057
2ff057
2ff057
RPM_GNUC_INTERNAL
2ff057
rpmRC pkgdbPut(dbiIndex dbi, dbiCursor dbc,  unsigned int hdrNum,
2ff057
               unsigned char *hdrBlob, unsigned int hdrLen);
2ff057
RPM_GNUC_INTERNAL
2ff057
rpmRC pkgdbDel(dbiIndex dbi, dbiCursor dbc,  unsigned int hdrNum);
2ff057
RPM_GNUC_INTERNAL
2ff057
rpmRC pkgdbGet(dbiIndex dbi, dbiCursor dbc, unsigned int hdrNum,
2ff057
               unsigned char **hdrBlob, unsigned int *hdrLen);
2ff057
RPM_GNUC_INTERNAL
2ff057
rpmRC pkgdbNew(dbiIndex dbi, dbiCursor dbc,  unsigned int *hdrNum);
2ff057
RPM_GNUC_INTERNAL
2ff057
unsigned int pkgdbKey(dbiIndex dbi, dbiCursor dbc);
2ff057
2ff057
RPM_GNUC_INTERNAL
2ff057
rpmRC idxdbGet(dbiIndex dbi, dbiCursor dbc, const char *keyp, size_t keylen,
2ff057
               dbiIndexSet *set, int curFlags);
2ff057
RPM_GNUC_INTERNAL
2ff057
rpmRC idxdbPut(dbiIndex dbi, dbiCursor dbc, const char *keyp, size_t keylen,
2ff057
               dbiIndexItem rec);
2ff057
RPM_GNUC_INTERNAL
2ff057
rpmRC idxdbDel(dbiIndex dbi, dbiCursor dbc, const char *keyp, size_t keylen,
2ff057
               dbiIndexItem rec);
2ff057
RPM_GNUC_INTERNAL
2ff057
const void * idxdbKey(dbiIndex dbi, dbiCursor dbc, unsigned int *keylen);
2ff057
2ff057
struct rpmdbOps_s {
2ff057
    int (*open)(rpmdb rdb, rpmDbiTagVal rpmtag, dbiIndex * dbip, int flags);
2ff057
    int (*close)(dbiIndex dbi, unsigned int flags);
2ff057
    int (*verify)(dbiIndex dbi, unsigned int flags);
2ff057
    void (*setFSync)(rpmdb rdb, int enable);
2ff057
    int (*ctrl)(rpmdb rdb, dbCtrlOp ctrl);
2ff057
2ff057
    dbiCursor (*cursorInit)(dbiIndex dbi, unsigned int flags);
2ff057
    dbiCursor (*cursorFree)(dbiIndex dbi, dbiCursor dbc);
2ff057
2ff057
    rpmRC (*pkgdbGet)(dbiIndex dbi, dbiCursor dbc, unsigned int hdrNum, unsigned char **hdrBlob, unsigned int *hdrLen);
2ff057
    rpmRC (*pkgdbPut)(dbiIndex dbi, dbiCursor dbc, unsigned int hdrNum, unsigned char *hdrBlob, unsigned int hdrLen);
2ff057
    rpmRC (*pkgdbDel)(dbiIndex dbi, dbiCursor dbc,  unsigned int hdrNum);
2ff057
    rpmRC (*pkgdbNew)(dbiIndex dbi, dbiCursor dbc,  unsigned int *hdrNum);
2ff057
    unsigned int (*pkgdbKey)(dbiIndex dbi, dbiCursor dbc);
2ff057
2ff057
    rpmRC (*idxdbGet)(dbiIndex dbi, dbiCursor dbc, const char *keyp, size_t keylen, dbiIndexSet *set, int curFlags);
2ff057
    rpmRC (*idxdbPut)(dbiIndex dbi, dbiCursor dbc, const char *keyp, size_t keylen, dbiIndexItem rec);
2ff057
    rpmRC (*idxdbDel)(dbiIndex dbi, dbiCursor dbc, const char *keyp, size_t keylen, dbiIndexItem rec);
2ff057
    const void * (*idxdbKey)(dbiIndex dbi, dbiCursor dbc, unsigned int *keylen);
2ff057
};
2ff057
2ff057
RPM_GNUC_INTERNAL
2ff057
extern struct rpmdbOps_s db3_dbops;
2ff057
2ff057
#ifdef ENABLE_NDB
2ff057
RPM_GNUC_INTERNAL
2ff057
extern struct rpmdbOps_s ndb_dbops;
2ff057
#endif
2ff057
2ff057
#if defined(WITH_LMDB)
2ff057
RPM_GNUC_INTERNAL
2ff057
extern struct rpmdbOps_s lmdb_dbops;
2ff057
#endif
2ff057
2ff057
#ifdef __cplusplus
2ff057
}
2ff057
#endif
2ff057
2ff057
#endif /* _DBI_H */