From: Michael Schroeder Date: Wed, 22 Jan 2020 12:00:43 +0000 (+0100) Subject: Put the path to the database in the state X-Git-Tag: 0.7.11~1 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=10a1ecf4f00b9472039412244d2ab6947bf074bd;p=thirdparty%2Flibsolv.git Put the path to the database in the state This allows us to make the path configurable if we need to do this in the future. It also makes the ostree handling a bit easier. --- diff --git a/ext/repo_rpmdb_bdb.h b/ext/repo_rpmdb_bdb.h index a7f51951..1c833171 100644 --- a/ext/repo_rpmdb_bdb.h +++ b/ext/repo_rpmdb_bdb.h @@ -47,7 +47,7 @@ struct rpmdbstate { int dbenvopened; /* database environment opened */ int pkgdbopened; /* package database openend */ - int is_ostree; /* read-only db that lives in /usr/share/rpm */ + const char *dbpath; /* path to the database */ DB_ENV *dbenv; /* database environment */ DB *db; /* packages database */ @@ -70,17 +70,20 @@ access_rootdir(struct rpmdbstate *state, const char *dir, int mode) } static void -detect_ostree(struct rpmdbstate *state) +detect_dbpath(struct rpmdbstate *state) { - state->is_ostree = access_rootdir(state, "/var/lib/rpm", W_OK) == -1 && - access_rootdir(state, "/usr/share/rpm/Packages", R_OK) == 0 ? 1 : -1; + state->dbpath = access_rootdir(state, "/var/lib/rpm", W_OK) == -1 + && access_rootdir(state, "/usr/share/rpm/Packages", R_OK) == 0 + ? "/usr/share/rpm" : "/var/lib/rpm"; } static int stat_database_name(struct rpmdbstate *state, char *dbname, struct stat *statbuf, int seterror) { char *dbpath; - dbpath = solv_dupjoin(state->rootdir, state->is_ostree > 0 ? "/usr/share/rpm/" : "/var/lib/rpm/", dbname); + if (!state->dbpath) + detect_dbpath(state); + dbpath = solv_dupjoin(state->rootdir, state->dbpath, dbname); if (stat(dbpath, statbuf)) { if (seterror) @@ -95,9 +98,7 @@ stat_database_name(struct rpmdbstate *state, char *dbname, struct stat *statbuf, static int stat_database(struct rpmdbstate *state, struct stat *statbuf) { - if (!state->is_ostree) - detect_ostree(state); - return stat_database_name(state, "Packages", statbuf, 1); + return stat_database_name(state, "/Packages", statbuf, 1); } @@ -171,7 +172,6 @@ serialize_dbenv_ops(struct rpmdbstate *state) static int opendbenv(struct rpmdbstate *state) { - const char *rootdir = state->rootdir; char *dbpath; DB_ENV *dbenv = 0; int r; @@ -181,16 +181,16 @@ opendbenv(struct rpmdbstate *state) #if (defined(FEDORA) || defined(MAGEIA)) && (DB_VERSION_MAJOR >= 5 || (DB_VERSION_MAJOR == 4 && DB_VERSION_MINOR >= 5)) dbenv->set_thread_count(dbenv, 8); #endif - dbpath = solv_dupjoin(rootdir, "/var/lib/rpm", 0); - state->is_ostree = -1; + state->dbpath = "/var/lib/rpm"; + dbpath = solv_dupjoin(state->rootdir, state->dbpath, 0); if (access(dbpath, W_OK) == -1) { - free(dbpath); - dbpath = solv_dupjoin(rootdir, "/usr/share/rpm/Packages", 0); - if (access(dbpath, R_OK) == 0) - state->is_ostree = 1; - free(dbpath); - dbpath = solv_dupjoin(rootdir, state->is_ostree > 0 ? "/usr/share/rpm" : "/var/lib/rpm", 0); + if (access_rootdir(state, "/usr/share/rpm/Packages", R_OK) == 0) + { + state->dbpath = "/usr/share/rpm"; + free(dbpath); + dbpath = solv_dupjoin(state->rootdir, state->dbpath, 0); + } r = dbenv->open(dbenv, dbpath, DB_CREATE|DB_PRIVATE|DB_INIT_MPOOL, 0); } else @@ -426,7 +426,7 @@ count_headers(struct rpmdbstate *state) DBT dbkey; DBT dbdata; - if (stat_database_name(state, "Name", &statbuf, 0)) + if (stat_database_name(state, "/Name", &statbuf, 0)) return 0; memset(&dbkey, 0, sizeof(dbkey)); memset(&dbdata, 0, sizeof(dbdata)); @@ -502,7 +502,9 @@ hash_name_index(struct rpmdbstate *state, Chksum *chk) int fd, l; char buf[4096]; - dbpath = solv_dupjoin(state->rootdir, state->is_ostree > 0 ? "/usr/share/rpm/" : "/var/lib/rpm/", "Name"); + if (!state->dbpath) + detect_dbpath(state); + dbpath = solv_dupjoin(state->rootdir, state->dbpath, "/Name"); if ((fd = open(dbpath, O_RDONLY)) < 0) return -1; while ((l = read(fd, buf, sizeof(buf))) > 0) diff --git a/ext/repo_rpmdb_librpm.h b/ext/repo_rpmdb_librpm.h index b424eddd..34e66989 100644 --- a/ext/repo_rpmdb_librpm.h +++ b/ext/repo_rpmdb_librpm.h @@ -23,7 +23,7 @@ struct rpmdbstate { unsigned int rpmheadsize; int dbenvopened; /* database environment opened */ - int is_ostree; /* read-only db that lives in /usr/share/rpm */ + const char *dbpath; /* path to the database */ rpmts ts; rpmdbMatchIterator mi; /* iterator over packages database */ @@ -43,21 +43,22 @@ access_rootdir(struct rpmdbstate *state, const char *dir, int mode) } static void -detect_ostree(struct rpmdbstate *state) +detect_dbpath(struct rpmdbstate *state) { - state->is_ostree = access_rootdir(state, "/var/lib/rpm", W_OK) == -1 && - access_rootdir(state, "/usr/share/rpm/Packages", R_OK) == 0 ? 1 : -1; + state->dbpath = access_rootdir(state, "/var/lib/rpm", W_OK) == -1 + && access_rootdir(state, "/usr/share/rpm/Packages", R_OK) == 0 + ? "/usr/share/rpm" : "/var/lib/rpm"; } static int stat_database(struct rpmdbstate *state, struct stat *statbuf) { static const char *dbname[] = { - "Packages", - "Packages.db", - "rpmdb.sqlite", - "data.mdb", - "Packages", /* for error reporting */ + "/Packages", + "/Packages.db", + "/rpmdb.sqlite", + "/data.mdb", + "/Packages", /* for error reporting */ 0, }; int i; @@ -66,11 +67,11 @@ stat_database(struct rpmdbstate *state, struct stat *statbuf) if (state->dbenvopened == 1) return rpmdbFStat(rpmtsGetRdb(state->ts), statbuf); #endif - if (!state->is_ostree) - detect_ostree(state); + if (!state->dbpath) + detect_dbpath(state); for (i = 0; ; i++) { - char *dbpath = solv_dupjoin(state->rootdir, state->is_ostree > 0 ? "/usr/share/rpm/" : "/var/lib/rpm/", dbname[i]); + char *dbpath = solv_dupjoin(state->rootdir, state->dbpath, dbname[i]); if (!stat(dbpath, statbuf)) { free(dbpath); @@ -92,11 +93,12 @@ stat_database(struct rpmdbstate *state, struct stat *statbuf) static int opendbenv(struct rpmdbstate *state) { - const char *rootdir = state->rootdir; rpmts ts; char *dbpath; - detect_ostree(state); - dbpath = solv_dupjoin("_dbpath ", rootdir, state->is_ostree > 0 ? "/usr/share/rpm" : "/var/lib/rpm"); + + if (!state->dbpath) + detect_dbpath(state); + dbpath = solv_dupjoin("_dbpath ", state->rootdir, state->dbpath); rpmDefineMacro(NULL, dbpath, 0); solv_free(dbpath); ts = rpmtsCreate();