|
|
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 */
|