rpm/backport-Use-the-new-backend-struct-data-for-backend-configur.patch
2021-01-12 20:52:15 +08:00

119 lines
3.4 KiB
Diff

From bc236cc369b8af9995dd50ba5263d354f47421ce Mon Sep 17 00:00:00 2001
From: Panu Matilainen <pmatilai@redhat.com>
Date: Mon, 21 Oct 2019 14:39:50 +0300
Subject: [PATCH] Use the new backend struct data for backend configuration and
detection
Refactor the hand-written separate tests into an array walk now that we can.
No functional changes, except that there's no more special fallback for BDB.
URL:https://github.com/rpm-software-management/rpm/commit/bc236cc369b8af9995dd50ba5263d354f47421ce
Conflict:delete the contents of sqlite, because we have no sqlite database.
---
lib/backend/dbi.c | 77 +++++++++++++++++++++++++------------------------------
1 file changed, 35 insertions(+), 42 deletions(-)
diff --git a/lib/backend/dbi.c b/lib/backend/dbi.c
index 5e00310..a4a40a8 100644
--- a/lib/backend/dbi.c
+++ b/lib/backend/dbi.c
@@ -12,6 +12,19 @@
#include "lib/rpmdb_internal.h"
#include "debug.h"
+const struct rpmdbOps_s *backends[] = {
+#if defined(WITH_LMDB)
+ &lmdb_dbops,
+#endif
+#ifdef ENABLE_NDB
+ &ndb_dbops,
+#endif
+#if defined(WITH_BDB)
+ &db3_dbops,
+#endif
+ &dummydb_dbops,
+ NULL
+};
dbiIndex dbiFree(dbiIndex dbi)
{
@@ -38,53 +51,33 @@ dbDetectBackend(rpmdb rdb)
const char *dbhome = rpmdbHome(rdb);
char *db_backend = rpmExpand("%{?_db_backend}", NULL);
char *path = NULL;
+ const struct rpmdbOps_s **ops;
-#if defined(WITH_LMDB)
- if (!strcmp(db_backend, "lmdb")) {
- rdb->db_ops = &lmdb_dbops;
- } else
-#endif
-#ifdef ENABLE_NDB
- if (!strcmp(db_backend, "ndb")) {
- rdb->db_ops = &ndb_dbops;
- } else
-#endif
-#if defined(WITH_BDB)
- {
- rdb->db_ops = &db3_dbops;
- if (*db_backend == '\0') {
- free(db_backend);
- db_backend = xstrdup("bdb");
+ for (ops = backends; ops && *ops; ops++) {
+ if (rstreq(db_backend, (*ops)->name)) {
+ rdb->db_ops = *ops;
+ break;
}
}
-#endif
-#if defined(WITH_LMDB)
- path = rstrscat(NULL, dbhome, "/data.mdb", NULL);
- if (access(path, F_OK) == 0 && rdb->db_ops != &lmdb_dbops) {
- rdb->db_ops = &lmdb_dbops;
- rpmlog(RPMLOG_WARNING, _("Found LMDB data.mdb database while attempting %s backend: using lmdb backend.\n"), db_backend);
- }
- free(path);
-#endif
-
-#ifdef ENABLE_NDB
- path = rstrscat(NULL, dbhome, "/Packages.db", NULL);
- if (access(path, F_OK) == 0 && rdb->db_ops != &ndb_dbops) {
- rdb->db_ops = &ndb_dbops;
- rpmlog(RPMLOG_WARNING, _("Found NDB Packages.db database while attempting %s backend: using ndb backend.\n"), db_backend);
- }
- free(path);
-#endif
-
-#if defined(WITH_BDB)
- path = rstrscat(NULL, dbhome, "/Packages", NULL);
- if (access(path, F_OK) == 0 && rdb->db_ops != &db3_dbops) {
- rdb->db_ops = &db3_dbops;
- rpmlog(RPMLOG_WARNING, _("Found BDB Packages database while attempting %s backend: using bdb backend.\n"), db_backend);
+ for (ops = backends; ops && *ops; ops++) {
+ int stop = 0;
+ if ((*ops)->path == NULL)
+ continue;
+
+ path = rstrscat(NULL, dbhome, "/", (*ops)->path, NULL);
+ if (access(path, F_OK) == 0 && rdb->db_ops != *ops) {
+ rpmlog(RPMLOG_WARNING,
+ _("Found %s %s database while attempting %s backend: "
+ "using %s backend.\n"),
+ (*ops)->name, (*ops)->path, db_backend, (*ops)->name);
+ rdb->db_ops = *ops;
+ stop = 1;
+ }
+ free(path);
+ if (stop)
+ break;
}
- free(path);
-#endif
if (rdb->db_ops == NULL) {
rdb->db_ops = &dummydb_dbops;
--
1.8.3.1