Blame db_ops_name.diff

Bernhard M. Wiedemann 018f1b
--- ./lib/backend/db3.c.orig	2020-01-17 11:50:39.048477444 +0000
Bernhard M. Wiedemann 018f1b
+++ ./lib/backend/db3.c	2020-01-17 11:58:15.351365745 +0000
Bernhard M. Wiedemann 018f1b
@@ -421,10 +421,6 @@ static int db_init(rpmdb rdb, const char
Bernhard M. Wiedemann 018f1b
     if (rdb->db_dbenv != NULL) {
Bernhard M. Wiedemann 018f1b
 	rdb->db_opens++;
Bernhard M. Wiedemann 018f1b
 	return 0;
Bernhard M. Wiedemann 018f1b
-    } else {
Bernhard M. Wiedemann 018f1b
-	/* On first call, set backend description to something... */
Bernhard M. Wiedemann 018f1b
-	free(rdb->db_descr);
Bernhard M. Wiedemann 018f1b
-	rasprintf(&rdb->db_descr, "db%u", DB_VERSION_MAJOR);
Bernhard M. Wiedemann 018f1b
     }
Bernhard M. Wiedemann 018f1b
 
Bernhard M. Wiedemann 018f1b
     /*
Bernhard M. Wiedemann 018f1b
@@ -1426,6 +1422,9 @@ static rpmRC db3_pkgdbNew(dbiIndex dbi,
Bernhard M. Wiedemann 018f1b
 }
Bernhard M. Wiedemann 018f1b
 
Bernhard M. Wiedemann 018f1b
 struct rpmdbOps_s db3_dbops = {
Bernhard M. Wiedemann 018f1b
+    .name   = "bdb",
Bernhard M. Wiedemann 018f1b
+    .path   = "Packages",
Bernhard M. Wiedemann 018f1b
+
Bernhard M. Wiedemann 018f1b
     .open   = db3_dbiOpen,
Bernhard M. Wiedemann 018f1b
     .close  = db3_dbiClose,
Bernhard M. Wiedemann 018f1b
     .verify = db3_dbiVerify,
Bernhard M. Wiedemann 018f1b
--- ./lib/backend/dbi.c.orig	2020-01-17 11:54:38.207894769 +0000
Bernhard M. Wiedemann 018f1b
+++ ./lib/backend/dbi.c	2020-01-17 11:56:45.555584517 +0000
Bernhard M. Wiedemann 018f1b
@@ -12,6 +12,19 @@
Bernhard M. Wiedemann 018f1b
 #include "lib/rpmdb_internal.h"
Bernhard M. Wiedemann 018f1b
 #include "debug.h"
Bernhard M. Wiedemann 018f1b
 
Bernhard M. Wiedemann 018f1b
+const struct rpmdbOps_s *backends[] = {
Bernhard M. Wiedemann 018f1b
+#if defined(WITH_LMDB)
Bernhard M. Wiedemann 018f1b
+    &lmdb_dbops,
Bernhard M. Wiedemann 018f1b
+#endif
Bernhard M. Wiedemann 018f1b
+#ifdef ENABLE_NDB
Bernhard M. Wiedemann 018f1b
+    &ndb_dbops,
Bernhard M. Wiedemann 018f1b
+#endif
Bernhard M. Wiedemann 018f1b
+#if defined(WITH_BDB)
Bernhard M. Wiedemann 018f1b
+    &db3_dbops,
Bernhard M. Wiedemann 018f1b
+#endif
Bernhard M. Wiedemann 018f1b
+    &dummydb_dbops,
Bernhard M. Wiedemann 018f1b
+    NULL
Bernhard M. Wiedemann 018f1b
+};
Bernhard M. Wiedemann 018f1b
 
Bernhard M. Wiedemann 018f1b
 dbiIndex dbiFree(dbiIndex dbi)
Bernhard M. Wiedemann 018f1b
 {
Bernhard M. Wiedemann 018f1b
@@ -38,59 +51,58 @@ dbDetectBackend(rpmdb rdb)
Bernhard M. Wiedemann 018f1b
     const char *dbhome = rpmdbHome(rdb);
Bernhard M. Wiedemann 018f1b
     char *db_backend = rpmExpand("%{?_db_backend}", NULL);
Bernhard M. Wiedemann 018f1b
     char *path = NULL;
Bernhard M. Wiedemann 018f1b
+    const struct rpmdbOps_s **ops, *ops_config;
Bernhard M. Wiedemann 018f1b
 
Bernhard M. Wiedemann 018f1b
-#if defined(WITH_LMDB)
Bernhard M. Wiedemann 018f1b
-    if (!strcmp(db_backend, "lmdb")) {
Bernhard M. Wiedemann 018f1b
-	rdb->db_ops = &lmdb_dbops;
Bernhard M. Wiedemann 018f1b
-    } else
Bernhard M. Wiedemann 018f1b
-#endif
Bernhard M. Wiedemann 018f1b
-#ifdef ENABLE_NDB
Bernhard M. Wiedemann 018f1b
-    if (!strcmp(db_backend, "ndb")) {
Bernhard M. Wiedemann 018f1b
-	rdb->db_ops = &ndb_dbops;
Bernhard M. Wiedemann 018f1b
-    } else
Bernhard M. Wiedemann 018f1b
-#endif
Bernhard M. Wiedemann 018f1b
-#if defined(WITH_BDB)
Bernhard M. Wiedemann 018f1b
-    {
Bernhard M. Wiedemann 018f1b
-	rdb->db_ops = &db3_dbops;
Bernhard M. Wiedemann 018f1b
-	if (*db_backend == '\0') {
Bernhard M. Wiedemann 018f1b
-	    free(db_backend);
Bernhard M. Wiedemann 018f1b
-	    db_backend = xstrdup("bdb");
Bernhard M. Wiedemann 018f1b
+    rdb->db_ops = NULL;
Bernhard M. Wiedemann 018f1b
+
Bernhard M. Wiedemann 018f1b
+    ops_config = NULL;
Bernhard M. Wiedemann 018f1b
+    for (ops = backends; *ops; ops++) {
Bernhard M. Wiedemann 018f1b
+	if (rstreq(db_backend, (*ops)->name)) {
Bernhard M. Wiedemann 018f1b
+	    ops_config = *ops;
Bernhard M. Wiedemann 018f1b
+	    break;
Bernhard M. Wiedemann 018f1b
 	}
Bernhard M. Wiedemann 018f1b
     }
Bernhard M. Wiedemann 018f1b
-#endif
Bernhard M. Wiedemann 018f1b
 
Bernhard M. Wiedemann 018f1b
-#if defined(WITH_LMDB)
Bernhard M. Wiedemann 018f1b
-    path = rstrscat(NULL, dbhome, "/data.mdb", NULL);
Bernhard M. Wiedemann 018f1b
-    if (access(path, F_OK) == 0 && rdb->db_ops != &lmdb_dbops) {
Bernhard M. Wiedemann 018f1b
-	rdb->db_ops = &lmdb_dbops;
Bernhard M. Wiedemann 018f1b
-	rpmlog(RPMLOG_WARNING, _("Found LMDB data.mdb database while attempting %s backend: using lmdb backend.\n"), db_backend);
Bernhard M. Wiedemann 018f1b
+    /* if we have a configured backend, check it first */
Bernhard M. Wiedemann 018f1b
+    if (ops_config && ops_config->path) {
Bernhard M. Wiedemann 018f1b
+	path = rstrscat(NULL, dbhome, "/", ops_config->path, NULL);
Bernhard M. Wiedemann 018f1b
+	if (access(path, F_OK) == 0)
Bernhard M. Wiedemann 018f1b
+	    rdb->db_ops = ops_config;
Bernhard M. Wiedemann 018f1b
+	free(path);
Bernhard M. Wiedemann 018f1b
     }
Bernhard M. Wiedemann 018f1b
-    free(path);
Bernhard M. Wiedemann 018f1b
-#endif
Bernhard M. Wiedemann 018f1b
 
Bernhard M. Wiedemann 018f1b
-#ifdef ENABLE_NDB
Bernhard M. Wiedemann 018f1b
-    path = rstrscat(NULL, dbhome, "/Packages.db", NULL);
Bernhard M. Wiedemann 018f1b
-    if (access(path, F_OK) == 0 && rdb->db_ops != &ndb_dbops) {
Bernhard M. Wiedemann 018f1b
-	rdb->db_ops = &ndb_dbops;
Bernhard M. Wiedemann 018f1b
-	rpmlog(RPMLOG_WARNING, _("Found NDB Packages.db database while attempting %s backend: using ndb backend.\n"), db_backend);
Bernhard M. Wiedemann 018f1b
-    }
Bernhard M. Wiedemann 018f1b
-    free(path);
Bernhard M. Wiedemann 018f1b
-#endif
Bernhard M. Wiedemann 018f1b
+    /* if it did not match, check all available backends */
Bernhard M. Wiedemann 018f1b
+    if (rdb->db_ops == NULL) {
Bernhard M. Wiedemann 018f1b
+	for (ops = backends; *ops; ops++) {
Bernhard M. Wiedemann 018f1b
+	    if ((*ops)->path == NULL || *ops == ops_config)
Bernhard M. Wiedemann 018f1b
+		continue;
Bernhard M. Wiedemann 018f1b
 
Bernhard M. Wiedemann 018f1b
-#if defined(WITH_BDB)
Bernhard M. Wiedemann 018f1b
-    path = rstrscat(NULL, dbhome, "/Packages", NULL);
Bernhard M. Wiedemann 018f1b
-    if (access(path, F_OK) == 0 && rdb->db_ops != &db3_dbops) {
Bernhard M. Wiedemann 018f1b
-	rdb->db_ops = &db3_dbops;
Bernhard M. Wiedemann 018f1b
-	rpmlog(RPMLOG_WARNING, _("Found BDB Packages database while attempting %s backend: using bdb backend.\n"), db_backend);
Bernhard M. Wiedemann 018f1b
+	    path = rstrscat(NULL, dbhome, "/", (*ops)->path, NULL);
Bernhard M. Wiedemann 018f1b
+	    if (access(path, F_OK) == 0) {
Bernhard M. Wiedemann 018f1b
+		rpmlog(RPMLOG_DEBUG,
Bernhard M. Wiedemann 018f1b
+		    _("Found %s %s database while attempting %s backend: "
Bernhard M. Wiedemann 018f1b
+		    "using %s backend.\n"),
Bernhard M. Wiedemann 018f1b
+		    (*ops)->name, (*ops)->path, db_backend, (*ops)->name);
Bernhard M. Wiedemann 018f1b
+		rdb->db_ops = *ops;
Bernhard M. Wiedemann 018f1b
+	    }
Bernhard M. Wiedemann 018f1b
+	    free(path);
Bernhard M. Wiedemann 018f1b
+	    if (rdb->db_ops != NULL)
Bernhard M. Wiedemann 018f1b
+		break;
Bernhard M. Wiedemann 018f1b
+	}
Bernhard M. Wiedemann 018f1b
     }
Bernhard M. Wiedemann 018f1b
-    free(path);
Bernhard M. Wiedemann 018f1b
-#endif
Bernhard M. Wiedemann 018f1b
 
Bernhard M. Wiedemann 018f1b
+    /* if we did not find a match, use the configured backend */
Bernhard M. Wiedemann 018f1b
+    if (rdb->db_ops == NULL && ops_config)
Bernhard M. Wiedemann 018f1b
+	rdb->db_ops = ops_config;
Bernhard M. Wiedemann 018f1b
+
Bernhard M. Wiedemann 018f1b
+    /* if everything failed fall back to dummydb */
Bernhard M. Wiedemann 018f1b
     if (rdb->db_ops == NULL) {
Bernhard M. Wiedemann 018f1b
 	rdb->db_ops = &dummydb_dbops;
Bernhard M. Wiedemann 018f1b
-	rpmlog(RPMLOG_DEBUG, "using dummy database, installs not possible\n");
Bernhard M. Wiedemann 018f1b
+	rpmlog(RPMLOG_WARNING, "using dummy database, installs not possible\n");
Bernhard M. Wiedemann 018f1b
     }
Bernhard M. Wiedemann 018f1b
 
Bernhard M. Wiedemann 018f1b
+    rdb->db_descr = rdb->db_ops->name;
Bernhard M. Wiedemann 018f1b
+
Bernhard M. Wiedemann 018f1b
     if (db_backend)
Bernhard M. Wiedemann 018f1b
 	free(db_backend);
Bernhard M. Wiedemann 018f1b
 }
Bernhard M. Wiedemann 018f1b
--- ./lib/backend/dbi.h.orig	2020-01-17 11:52:17.960236465 +0000
Bernhard M. Wiedemann 018f1b
+++ ./lib/backend/dbi.h	2020-01-17 11:57:36.907459407 +0000
Bernhard M. Wiedemann 018f1b
@@ -51,7 +51,7 @@ struct rpmdb_s {
Bernhard M. Wiedemann 018f1b
     int		db_flags;
Bernhard M. Wiedemann 018f1b
     int		db_mode;	/*!< open mode */
Bernhard M. Wiedemann 018f1b
     int		db_perms;	/*!< open permissions */
Bernhard M. Wiedemann 018f1b
-    char	* db_descr;	/*!< db backend description (for error msgs) */
Bernhard M. Wiedemann 018f1b
+    const char	* db_descr;	/*!< db backend description (for error msgs) */
Bernhard M. Wiedemann 018f1b
     struct dbChk_s * db_checked;/*!< headerCheck()'ed package instances */
Bernhard M. Wiedemann 018f1b
     rpmdb	db_next;
Bernhard M. Wiedemann 018f1b
     int		db_opens;
Bernhard M. Wiedemann 018f1b
@@ -61,7 +61,7 @@ struct rpmdb_s {
Bernhard M. Wiedemann 018f1b
     dbiIndex 	* db_indexes;	/*!< Tag indices. */
Bernhard M. Wiedemann 018f1b
     int		db_buildindex;	/*!< Index rebuild indicator */
Bernhard M. Wiedemann 018f1b
 
Bernhard M. Wiedemann 018f1b
-    struct rpmdbOps_s * db_ops;	/*!< backend ops */
Bernhard M. Wiedemann 018f1b
+    const struct rpmdbOps_s * db_ops;	/*!< backend ops */
Bernhard M. Wiedemann 018f1b
 
Bernhard M. Wiedemann 018f1b
     /* dbenv and related parameters */
Bernhard M. Wiedemann 018f1b
     void * db_dbenv;		/*!< Backend private handle */
Bernhard M. Wiedemann 018f1b
@@ -244,6 +244,9 @@ RPM_GNUC_INTERNAL
Bernhard M. Wiedemann 018f1b
 const void * idxdbKey(dbiIndex dbi, dbiCursor dbc, unsigned int *keylen);
Bernhard M. Wiedemann 018f1b
 
Bernhard M. Wiedemann 018f1b
 struct rpmdbOps_s {
Bernhard M. Wiedemann 018f1b
+    const char *name; /* backend name */
Bernhard M. Wiedemann 018f1b
+    const char *path; /* main database name */
Bernhard M. Wiedemann 018f1b
+
Bernhard M. Wiedemann 018f1b
     int (*open)(rpmdb rdb, rpmDbiTagVal rpmtag, dbiIndex * dbip, int flags);
Bernhard M. Wiedemann 018f1b
     int (*close)(dbiIndex dbi, unsigned int flags);
Bernhard M. Wiedemann 018f1b
     int (*verify)(dbiIndex dbi, unsigned int flags);
Bernhard M. Wiedemann 018f1b
--- ./lib/backend/dummydb.c.orig	2020-01-17 11:50:49.472452046 +0000
Bernhard M. Wiedemann 018f1b
+++ ./lib/backend/dummydb.c	2020-01-17 11:52:08.048260613 +0000
Bernhard M. Wiedemann 018f1b
@@ -93,6 +93,9 @@ static const void * dummydb_idxdbKey(dbi
Bernhard M. Wiedemann 018f1b
 
Bernhard M. Wiedemann 018f1b
 
Bernhard M. Wiedemann 018f1b
 struct rpmdbOps_s dummydb_dbops = {
Bernhard M. Wiedemann 018f1b
+    .name      = "dummy",
Bernhard M. Wiedemann 018f1b
+    .path      = NULL,
Bernhard M. Wiedemann 018f1b
+
Bernhard M. Wiedemann 018f1b
     .open	= dummydb_Open,
Bernhard M. Wiedemann 018f1b
     .close	= dummydb_Close,
Bernhard M. Wiedemann 018f1b
     .verify	= dummydb_Verify,
Bernhard M. Wiedemann 018f1b
--- ./lib/backend/lmdb.c.orig	2020-01-17 11:50:45.808460969 +0000
Bernhard M. Wiedemann 018f1b
+++ ./lib/backend/lmdb.c	2020-01-17 11:58:30.247329459 +0000
Bernhard M. Wiedemann 018f1b
@@ -137,10 +137,6 @@ static int db_init(rpmdb rdb, const char
Bernhard M. Wiedemann 018f1b
     if (rdb->db_dbenv != NULL) {
Bernhard M. Wiedemann 018f1b
 	rdb->db_opens++;
Bernhard M. Wiedemann 018f1b
 	return 0;
Bernhard M. Wiedemann 018f1b
-    } else {
Bernhard M. Wiedemann 018f1b
-	/* On first call, set backend description to something... */
Bernhard M. Wiedemann 018f1b
-	free(rdb->db_descr);
Bernhard M. Wiedemann 018f1b
-	rdb->db_descr = xstrdup("lmdb");
Bernhard M. Wiedemann 018f1b
     }
Bernhard M. Wiedemann 018f1b
 
Bernhard M. Wiedemann 018f1b
     MDB_dbi maxdbs = 32;
Bernhard M. Wiedemann 018f1b
@@ -916,6 +912,9 @@ exit:
Bernhard M. Wiedemann 018f1b
 }
Bernhard M. Wiedemann 018f1b
 
Bernhard M. Wiedemann 018f1b
 struct rpmdbOps_s lmdb_dbops = {
Bernhard M. Wiedemann 018f1b
+    .name   = "lmdb",
Bernhard M. Wiedemann 018f1b
+    .path   = "data.mdb",
Bernhard M. Wiedemann 018f1b
+
Bernhard M. Wiedemann 018f1b
     .open   = lmdb_dbiOpen,
Bernhard M. Wiedemann 018f1b
     .close  = lmdb_dbiClose,
Bernhard M. Wiedemann 018f1b
     .verify = lmdb_dbiVerify,
Bernhard M. Wiedemann 018f1b
--- ./lib/backend/ndb/glue.c.orig	2020-01-17 11:51:09.708402746 +0000
Bernhard M. Wiedemann 018f1b
+++ ./lib/backend/ndb/glue.c	2020-01-17 11:51:56.272289298 +0000
Bernhard M. Wiedemann 018f1b
@@ -482,6 +482,9 @@ static const void * ndb_idxdbKey(dbiInde
Bernhard M. Wiedemann 018f1b
 
Bernhard M. Wiedemann 018f1b
 
Bernhard M. Wiedemann 018f1b
 struct rpmdbOps_s ndb_dbops = {
Bernhard M. Wiedemann 018f1b
+    .name      = "ndb",
Bernhard M. Wiedemann 018f1b
+    .path      = "Packages.db",
Bernhard M. Wiedemann 018f1b
+
Bernhard M. Wiedemann 018f1b
     .open	= ndb_Open,
Bernhard M. Wiedemann 018f1b
     .close	= ndb_Close,
Bernhard M. Wiedemann 018f1b
     .verify	= ndb_Verify,
Bernhard M. Wiedemann 018f1b
--- ./lib/rpmdb.c.orig	2020-01-17 11:59:15.279219743 +0000
Bernhard M. Wiedemann 018f1b
+++ ./lib/rpmdb.c	2020-01-17 12:00:36.495021876 +0000
Bernhard M. Wiedemann 018f1b
@@ -417,7 +417,6 @@ int rpmdbClose(rpmdb db)
Bernhard M. Wiedemann 018f1b
     db->db_fullpath = _free(db->db_fullpath);
Bernhard M. Wiedemann 018f1b
     db->db_checked = dbChkFree(db->db_checked);
Bernhard M. Wiedemann 018f1b
     db->db_indexes = _free(db->db_indexes);
Bernhard M. Wiedemann 018f1b
-    db->db_descr = _free(db->db_descr);
Bernhard M. Wiedemann 018f1b
 
Bernhard M. Wiedemann 018f1b
     if (next) {
Bernhard M. Wiedemann 018f1b
         *prev = next->db_next;
Bernhard M. Wiedemann 018f1b
@@ -482,7 +481,6 @@ static rpmdb newRpmdb(const char * root,
Bernhard M. Wiedemann 018f1b
     db->db_tags = dbiTags;
Bernhard M. Wiedemann 018f1b
     db->db_ndbi = sizeof(dbiTags) / sizeof(rpmDbiTag);
Bernhard M. Wiedemann 018f1b
     db->db_indexes = xcalloc(db->db_ndbi, sizeof(*db->db_indexes));
Bernhard M. Wiedemann 018f1b
-    db->db_descr = xstrdup("unknown db");
Bernhard M. Wiedemann 018f1b
     db->nrefs = 0;
Bernhard M. Wiedemann 018f1b
     return rpmdbLink(db);
Bernhard M. Wiedemann 018f1b
 }
Bernhard M. Wiedemann 018f1b
@@ -517,6 +515,8 @@ static int openDatabase(const char * pre
Bernhard M. Wiedemann 018f1b
 
Bernhard M. Wiedemann 018f1b
 	/* Just the primary Packages database opened here */
Bernhard M. Wiedemann 018f1b
 	rc = pkgdbOpen(db, db->db_flags, NULL);
Bernhard M. Wiedemann 018f1b
+	if (!db->db_descr)
Bernhard M. Wiedemann 018f1b
+	    db->db_descr = "unknown db";
Bernhard M. Wiedemann 018f1b
     }
Bernhard M. Wiedemann 018f1b
 
Bernhard M. Wiedemann 018f1b
     if (rc || justCheck || dbp == NULL)