diff --git a/lib/backend/db3.c b/lib/backend/db3.c index f1344510be..b6d5875646 100644 --- a/lib/backend/db3.c +++ b/lib/backend/db3.c @@ -524,7 +524,7 @@ static int db_init(rpmdb rdb, const char * dbhome) return rc; } -void dbSetFSync(rpmdb rdb, int enable) +static void db3_dbSetFSync(rpmdb rdb, int enable) { #ifdef HAVE_FDATASYNC db_env_set_func_fsync(enable ? fdatasync : fsync_disable); @@ -545,7 +545,7 @@ static int dbiSync(dbiIndex dbi, unsigned int flags) return rc; } -dbiCursor dbiCursorInit(dbiIndex dbi, unsigned int flags) +static dbiCursor db3_dbiCursorInit(dbiIndex dbi, unsigned int flags) { dbiCursor dbc = NULL; @@ -593,7 +593,7 @@ dbiCursor dbiCursorInit(dbiIndex dbi, unsigned int flags) return dbc; } -dbiCursor dbiCursorFree(dbiIndex dbi, dbiCursor dbc) +static dbiCursor db3_dbiCursorFree(dbiIndex dbi, dbiCursor dbc) { if (dbc) { /* Automatically sync on write-cursor close */ @@ -700,7 +700,7 @@ static int dbiByteSwapped(dbiIndex dbi) return rc; } -int dbiVerify(dbiIndex dbi, unsigned int flags) +static int db3_dbiVerify(dbiIndex dbi, unsigned int flags) { int rc = 0; @@ -718,7 +718,7 @@ int dbiVerify(dbiIndex dbi, unsigned int flags) return rc; } -int dbiClose(dbiIndex dbi, unsigned int flags) +static int db3_dbiClose(dbiIndex dbi, unsigned int flags) { rpmdb rdb = dbi->dbi_rpmdb; const char * dbhome = rpmdbHome(rdb); @@ -802,7 +802,7 @@ static int dbiFlock(dbiIndex dbi, int mode) return rc; } -int dbiOpen(rpmdb rdb, rpmDbiTagVal rpmtag, dbiIndex * dbip, int flags) +static int db3_dbiOpen(rpmdb rdb, rpmDbiTagVal rpmtag, dbiIndex * dbip, int flags) { const char *dbhome = rpmdbHome(rdb); dbiIndex dbi = NULL; @@ -1005,7 +1005,7 @@ static int set2dbt(dbiIndex dbi, DBT * data, dbiIndexSet set) return 0; } -rpmRC idxdbGet(dbiIndex dbi, dbiCursor dbc, const char *keyp, size_t keylen, +static rpmRC db3_idxdbGet(dbiIndex dbi, dbiCursor dbc, const char *keyp, size_t keylen, dbiIndexSet *set, int searchType) { rpmRC rc = RPMRC_FAIL; /* assume failure */ @@ -1112,7 +1112,7 @@ static rpmRC updateIndex(dbiCursor dbc, const char *keyp, unsigned int keylen, return rc; } -rpmRC idxdbPut(dbiIndex dbi, dbiCursor dbc, const char *keyp, size_t keylen, +static rpmRC db3_idxdbPut(dbiIndex dbi, dbiCursor dbc, const char *keyp, size_t keylen, dbiIndexItem rec) { dbiIndexSet set = NULL; @@ -1138,7 +1138,7 @@ rpmRC idxdbPut(dbiIndex dbi, dbiCursor dbc, const char *keyp, size_t keylen, return rc; } -rpmRC idxdbDel(dbiIndex dbi, dbiCursor dbc, const char *keyp, size_t keylen, +static rpmRC db3_idxdbDel(dbiIndex dbi, dbiCursor dbc, const char *keyp, size_t keylen, dbiIndexItem rec) { dbiIndexSet set = NULL; @@ -1168,7 +1168,7 @@ rpmRC idxdbDel(dbiIndex dbi, dbiCursor dbc, const char *keyp, size_t keylen, return rc; } -const void * idxdbKey(dbiIndex dbi, dbiCursor dbc, unsigned int *keylen) +static const void * db3_idxdbKey(dbiIndex dbi, dbiCursor dbc, unsigned int *keylen) { const void *key = NULL; if (dbc) { @@ -1275,7 +1275,7 @@ static unsigned int pkgInstance(dbiIndex dbi, int alloc) return hdrNum; } -rpmRC pkgdbPut(dbiIndex dbi, dbiCursor dbc, unsigned int hdrNum, +static rpmRC db3_pkgdbPut(dbiIndex dbi, dbiCursor dbc, unsigned int hdrNum, unsigned char *hdrBlob, unsigned int hdrLen) { DBT hdr; @@ -1285,12 +1285,12 @@ rpmRC pkgdbPut(dbiIndex dbi, dbiCursor dbc, unsigned int hdrNum, return updatePackages(dbc, hdrNum, &hdr); } -rpmRC pkgdbDel(dbiIndex dbi, dbiCursor dbc, unsigned int hdrNum) +static rpmRC db3_pkgdbDel(dbiIndex dbi, dbiCursor dbc, unsigned int hdrNum) { return updatePackages(dbc, hdrNum, NULL); } -rpmRC pkgdbGet(dbiIndex dbi, dbiCursor dbc, unsigned int hdrNum, +static rpmRC db3_pkgdbGet(dbiIndex dbi, dbiCursor dbc, unsigned int hdrNum, unsigned char **hdrBlob, unsigned int *hdrLen) { DBT key, data; @@ -1327,7 +1327,7 @@ rpmRC pkgdbGet(dbiIndex dbi, dbiCursor dbc, unsigned int hdrNum, return RPMRC_FAIL; } -unsigned int pkgdbKey(dbiIndex dbi, dbiCursor dbc) +static unsigned int db3_pkgdbKey(dbiIndex dbi, dbiCursor dbc) { union _dbswap mi_offset; @@ -1339,7 +1339,7 @@ unsigned int pkgdbKey(dbiIndex dbi, dbiCursor dbc) return mi_offset.ui; } -rpmRC pkgdbNew(dbiIndex dbi, dbiCursor dbc, unsigned int *hdrNum) +static rpmRC db3_pkgdbNew(dbiIndex dbi, dbiCursor dbc, unsigned int *hdrNum) { unsigned int num; if (dbc == NULL) @@ -1350,3 +1350,26 @@ rpmRC pkgdbNew(dbiIndex dbi, dbiCursor dbc, unsigned int *hdrNum) *hdrNum = num; return RPMRC_OK; } + +struct rpmdbOps_s db3_dbops = { + .open = db3_dbiOpen, + .close = db3_dbiClose, + .verify = db3_dbiVerify, + + .setFSync = db3_dbSetFSync, + + .cursorInit = db3_dbiCursorInit, + .cursorFree = db3_dbiCursorFree, + + .pkgdbGet = db3_pkgdbGet, + .pkgdbPut = db3_pkgdbPut, + .pkgdbDel = db3_pkgdbDel, + .pkgdbNew = db3_pkgdbNew, + .pkgdbKey = db3_pkgdbKey, + + .idxdbGet = db3_idxdbGet, + .idxdbPut = db3_idxdbPut, + .idxdbDel = db3_idxdbDel, + .idxdbKey = db3_idxdbKey +}; + diff --git a/lib/backend/dbi.c b/lib/backend/dbi.c index 478481064f..1ca877af4c 100644 --- a/lib/backend/dbi.c +++ b/lib/backend/dbi.c @@ -29,6 +29,12 @@ dbiIndex dbiNew(rpmdb rdb, rpmDbiTagVal rpmtag) return dbi; } +static void +dbDetectBackend(rpmdb rdb) +{ + rdb->db_ops = &db3_dbops; +} + const char * dbiName(dbiIndex dbi) { return dbi->dbi_file; @@ -39,3 +45,82 @@ int dbiFlags(dbiIndex dbi) return dbi->dbi_flags; } +void dbSetFSync(rpmdb rdb, int enable) +{ + if (!rdb->db_ops) + dbDetectBackend(rdb); + rdb->db_ops->setFSync(rdb, enable); +} + +int dbiOpen(rpmdb rdb, rpmDbiTagVal rpmtag, dbiIndex * dbip, int flags) +{ + if (!rdb->db_ops) + dbDetectBackend(rdb); + return rdb->db_ops->open(rdb, rpmtag, dbip, flags); +} + +int dbiClose(dbiIndex dbi, unsigned int flags) +{ + return dbi ? dbi->dbi_rpmdb->db_ops->close(dbi, flags) : 0; +} + +int dbiVerify(dbiIndex dbi, unsigned int flags) +{ + return dbi->dbi_rpmdb->db_ops->verify(dbi, flags); +} + +dbiCursor dbiCursorInit(dbiIndex dbi, unsigned int flags) +{ + return dbi->dbi_rpmdb->db_ops->cursorInit(dbi, flags); +} + +dbiCursor dbiCursorFree(dbiIndex dbi, dbiCursor dbc) +{ + return dbi->dbi_rpmdb->db_ops->cursorFree(dbi, dbc); +} + +rpmRC pkgdbPut(dbiIndex dbi, dbiCursor dbc, unsigned int hdrNum, unsigned char *hdrBlob, unsigned int hdrLen) +{ + return dbi->dbi_rpmdb->db_ops->pkgdbPut(dbi, dbc, hdrNum, hdrBlob, hdrLen); +} + +rpmRC pkgdbDel(dbiIndex dbi, dbiCursor dbc, unsigned int hdrNum) +{ + return dbi->dbi_rpmdb->db_ops->pkgdbDel(dbi, dbc, hdrNum); +} + +rpmRC pkgdbGet(dbiIndex dbi, dbiCursor dbc, unsigned int hdrNum, unsigned char **hdrBlob, unsigned int *hdrLen) +{ + return dbi->dbi_rpmdb->db_ops->pkgdbGet(dbi, dbc, hdrNum, hdrBlob, hdrLen); +} + +rpmRC pkgdbNew(dbiIndex dbi, dbiCursor dbc, unsigned int *hdrNum) +{ + return dbi->dbi_rpmdb->db_ops->pkgdbNew(dbi, dbc, hdrNum); +} + +unsigned int pkgdbKey(dbiIndex dbi, dbiCursor dbc) +{ + return dbi->dbi_rpmdb->db_ops->pkgdbKey(dbi, dbc); +} + +rpmRC idxdbGet(dbiIndex dbi, dbiCursor dbc, const char *keyp, size_t keylen, dbiIndexSet *set, int curFlags) +{ + return dbi->dbi_rpmdb->db_ops->idxdbGet(dbi, dbc, keyp, keylen, set, curFlags); +} + +rpmRC idxdbPut(dbiIndex dbi, dbiCursor dbc, const char *keyp, size_t keylen, dbiIndexItem rec) +{ + return dbi->dbi_rpmdb->db_ops->idxdbPut(dbi, dbc, keyp, keylen, rec); +} + +rpmRC idxdbDel(dbiIndex dbi, dbiCursor dbc, const char *keyp, size_t keylen, dbiIndexItem rec) +{ + return dbi->dbi_rpmdb->db_ops->idxdbDel(dbi, dbc, keyp, keylen, rec); +} + +const void * idxdbKey(dbiIndex dbi, dbiCursor dbc, unsigned int *keylen) +{ + return dbi->dbi_rpmdb->db_ops->idxdbKey(dbi, dbc, keylen); +} + diff --git a/lib/backend/dbi.h b/lib/backend/dbi.h index 851af03541..6c7cf555e4 100644 --- a/lib/backend/dbi.h +++ b/lib/backend/dbi.h @@ -29,6 +29,8 @@ struct dbiConfig_s { int dbi_lockdbfd; /*!< do fcntl lock on db fd */ }; +struct rpmdbOps_s; + /** \ingroup rpmdb * Describes the collection of index databases used by rpm. */ @@ -49,6 +51,8 @@ struct rpmdb_s { 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; @@ -212,6 +216,30 @@ rpmRC idxdbDel(dbiIndex dbi, dbiCursor dbc, const char *keyp, size_t keylen, 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); + + 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 __cplusplus } #endif