Skip to content

Commit

Permalink
Support multiple db backend implementations (again)
Browse files Browse the repository at this point in the history
  • Loading branch information
mlschroe committed Jul 16, 2015
1 parent 33a8b61 commit 1defb7e
Show file tree
Hide file tree
Showing 3 changed files with 151 additions and 15 deletions.
53 changes: 38 additions & 15 deletions lib/backend/db3.c
Expand Up @@ -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);
Expand All @@ -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;

Expand Down Expand Up @@ -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 */
Expand Down Expand Up @@ -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;

Expand All @@ -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);
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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 */
Expand Down Expand Up @@ -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;
Expand All @@ -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;
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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;
Expand All @@ -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;
Expand Down Expand Up @@ -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;

Expand All @@ -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)
Expand All @@ -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
};

85 changes: 85 additions & 0 deletions lib/backend/dbi.c
Expand Up @@ -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;
Expand All @@ -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);
}

28 changes: 28 additions & 0 deletions lib/backend/dbi.h
Expand Up @@ -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.
*/
Expand All @@ -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;
Expand Down Expand Up @@ -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
Expand Down

0 comments on commit 1defb7e

Please sign in to comment.