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