aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNeels Hofmeyr <neels@hofmeyr.de>2019-11-05 02:00:19 +0100
committerOliver Smith <osmith@sysmocom.de>2019-11-25 13:13:18 +0100
commit981e126686e1e3e05192b8d34b95be4935dfb8f0 (patch)
tree7910561e17d5d9184404708821004e941830a5c1
parent7143f3a0cbf06a381651450335ac791da714db5a (diff)
db upgrade: remove some code dup
Instead of a switch() for each version number with identical switch cases except for the function name, use an array of function pointers and loop. Also print a success message after each individual version upgrade, instead of only one in the end (see change in db_upgrade_test.ok). Change-Id: I1736af3d9a3f02e29db836966ac15ce49f94737b
-rw-r--r--src/db.c48
-rw-r--r--tests/db_upgrade/db_upgrade_test.ok2
2 files changed, 17 insertions, 33 deletions
diff --git a/src/db.c b/src/db.c
index ed2e568..992dbad 100644
--- a/src/db.c
+++ b/src/db.c
@@ -423,6 +423,13 @@ static int db_upgrade_v3(struct db_context *dbc)
return rc;
}
+typedef int (*db_upgrade_func_t)(struct db_context *dbc);
+static db_upgrade_func_t db_upgrade_path[] = {
+ db_upgrade_v1,
+ db_upgrade_v2,
+ db_upgrade_v3,
+};
+
static int db_get_user_version(struct db_context *dbc)
{
const char *user_version_sql = "PRAGMA user_version";
@@ -533,41 +540,16 @@ struct db_context *db_open(void *ctx, const char *fname, bool enable_sqlite_logg
LOGP(DDB, LOGL_NOTICE, "Database '%s' has HLR DB schema version %d\n", dbc->fname, version);
- if (version < CURRENT_SCHEMA_VERSION && allow_upgrade) {
- switch (version) {
- case 0:
- rc = db_upgrade_v1(dbc);
- if (rc != SQLITE_DONE) {
- LOGP(DDB, LOGL_ERROR, "Failed to upgrade HLR DB schema to version 1: (rc=%d) %s\n",
- rc, sqlite3_errmsg(dbc->db));
- goto out_free;
- }
- version = 1;
- /* fall through */
- case 1:
- rc = db_upgrade_v2(dbc);
- if (rc != SQLITE_DONE) {
- LOGP(DDB, LOGL_ERROR, "Failed to upgrade HLR DB schema to version 2: (rc=%d) %s\n",
- rc, sqlite3_errmsg(dbc->db));
- goto out_free;
- }
- version = 2;
- /* fall through */
- case 2:
- rc = db_upgrade_v3(dbc);
- if (rc != SQLITE_DONE) {
- LOGP(DDB, LOGL_ERROR, "Failed to upgrade HLR DB schema to version 3: (rc=%d) %s\n",
- rc, sqlite3_errmsg(dbc->db));
- goto out_free;
- }
- version = 3;
- /* fall through */
- /* case N: ... */
- default:
- break;
+ for (; allow_upgrade && (version < ARRAY_SIZE(db_upgrade_path)); version++) {
+ db_upgrade_func_t upgrade_func = db_upgrade_path[version];
+ rc = upgrade_func(dbc);
+ if (rc != SQLITE_DONE) {
+ LOGP(DDB, LOGL_ERROR, "Failed to upgrade HLR DB schema to version %d: (rc=%d) %s\n",
+ version+1, rc, sqlite3_errmsg(dbc->db));
+ goto out_free;
}
LOGP(DDB, LOGL_NOTICE, "Database '%s' has been upgraded to HLR DB schema version %d\n",
- dbc->fname, version);
+ dbc->fname, version+1);
}
if (version != CURRENT_SCHEMA_VERSION) {
diff --git a/tests/db_upgrade/db_upgrade_test.ok b/tests/db_upgrade/db_upgrade_test.ok
index c1f0f9d..49e7151 100644
--- a/tests/db_upgrade/db_upgrade_test.ok
+++ b/tests/db_upgrade/db_upgrade_test.ok
@@ -80,6 +80,8 @@ rc = 0
DMAIN hlr starting
DDB using database: <PATH>test.db
DDB Database <PATH>test.db' has HLR DB schema version 0
+DDB Database <PATH>test.db' has been upgraded to HLR DB schema version 1
+DDB Database <PATH>test.db' has been upgraded to HLR DB schema version 2
DDB Database <PATH>test.db' has been upgraded to HLR DB schema version 3
DMAIN Cmdline option --db-check: Database was opened successfully, quitting.