diff options
author | Neels Hofmeyr <neels@hofmeyr.de> | 2019-11-05 02:00:19 +0100 |
---|---|---|
committer | Oliver Smith <osmith@sysmocom.de> | 2019-11-25 13:13:18 +0100 |
commit | 981e126686e1e3e05192b8d34b95be4935dfb8f0 (patch) | |
tree | 7910561e17d5d9184404708821004e941830a5c1 | |
parent | 7143f3a0cbf06a381651450335ac791da714db5a (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.c | 48 | ||||
-rw-r--r-- | tests/db_upgrade/db_upgrade_test.ok | 2 |
2 files changed, 17 insertions, 33 deletions
@@ -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. |