aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNeels Hofmeyr <neels@hofmeyr.de>2019-10-31 21:23:10 +0100
committerlaforge <laforge@osmocom.org>2019-11-12 16:23:48 +0000
commit7f4dd11682186f6c2426ff9b7f6075b3c409cba1 (patch)
treea404c013b73878b7eff0800f5c834b414e628b86
parenta8045daeef048ee1181f2a3c9bc15e7cd6c1dfca (diff)
db.c: code dup: add db_run_statements() for arrays of statements
The db bootstrap as well as the upgrade code all execute a number of statements, and have massive code dup around each statement execution. Instead have one db_run_statements() that takes an array of strings and runs all. Change-Id: I2721dfc0a9aadcc7f5ac81a1c0fa87452098996f
-rw-r--r--src/db.c108
1 files changed, 34 insertions, 74 deletions
diff --git a/src/db.c b/src/db.c
index d2564e6..75ca889 100644
--- a/src/db.c
+++ b/src/db.c
@@ -201,28 +201,38 @@ void db_close(struct db_context *dbc)
talloc_free(dbc);
}
-static int db_bootstrap(struct db_context *dbc)
+static int db_run_statements(struct db_context *dbc, const char **statements, size_t statements_count)
{
+ int rc;
int i;
- for (i = 0; i < ARRAY_SIZE(stmt_bootstrap_sql); i++) {
- int rc;
+ for (i = 0; i < statements_count; i++) {
+ const char *stmt_str = statements[i];
sqlite3_stmt *stmt;
- rc = sqlite3_prepare_v2(dbc->db, stmt_bootstrap_sql[i], -1, &stmt, NULL);
+
+ rc = sqlite3_prepare_v2(dbc->db, stmt_str, -1, &stmt, NULL);
if (rc != SQLITE_OK) {
- LOGP(DDB, LOGL_ERROR, "Unable to prepare SQL statement '%s'\n", stmt_bootstrap_sql[i]);
+ LOGP(DDB, LOGL_ERROR, "Unable to prepare SQL statement '%s'\n", stmt_str);
return rc;
}
-
rc = sqlite3_step(stmt);
db_remove_reset(stmt);
sqlite3_finalize(stmt);
if (rc != SQLITE_DONE) {
- LOGP(DDB, LOGL_ERROR, "Cannot bootstrap database: SQL error: (%d) %s,"
- " during stmt '%s'",
- rc, sqlite3_errmsg(dbc->db), stmt_bootstrap_sql[i]);
+ LOGP(DDB, LOGL_ERROR, "SQL error: (%d) %s, during stmt '%s'",
+ rc, sqlite3_errmsg(dbc->db), stmt_str);
return rc;
}
}
+ return rc;
+}
+
+static int db_bootstrap(struct db_context *dbc)
+{
+ int rc = db_run_statements(dbc, stmt_bootstrap_sql, ARRAY_SIZE(stmt_bootstrap_sql));
+ if (rc != SQLITE_DONE) {
+ LOGP(DDB, LOGL_ERROR, "Cannot bootstrap database\n");
+ return rc;
+ }
return SQLITE_OK;
}
@@ -263,75 +273,38 @@ static bool db_is_bootstrapped_v0(struct db_context *dbc)
static int
db_upgrade_v1(struct db_context *dbc)
{
- sqlite3_stmt *stmt;
int rc;
- const char *update_stmt_sql = "ALTER TABLE subscriber ADD COLUMN last_lu_seen TIMESTAMP default NULL";
- const char *set_schema_version_sql = "PRAGMA user_version = 1";
+ const char *statements[] = {
+ "ALTER TABLE subscriber ADD COLUMN last_lu_seen TIMESTAMP default NULL",
+ "PRAGMA user_version = 1",
+ };
- rc = sqlite3_prepare_v2(dbc->db, update_stmt_sql, -1, &stmt, NULL);
- if (rc != SQLITE_OK) {
- LOGP(DDB, LOGL_ERROR, "Unable to prepare SQL statement '%s'\n", update_stmt_sql);
- return rc;
- }
- rc = sqlite3_step(stmt);
- db_remove_reset(stmt);
- sqlite3_finalize(stmt);
+ rc = db_run_statements(dbc, statements, ARRAY_SIZE(statements));
if (rc != SQLITE_DONE) {
- LOGP(DDB, LOGL_ERROR, "Unable to update HLR database schema to version %d\n", 1);
+ LOGP(DDB, LOGL_ERROR, "Unable to update HLR database schema to version 1\n");
return rc;
}
-
- rc = sqlite3_prepare_v2(dbc->db, set_schema_version_sql, -1, &stmt, NULL);
- if (rc != SQLITE_OK) {
- LOGP(DDB, LOGL_ERROR, "Unable to prepare SQL statement '%s'\n", set_schema_version_sql);
- return rc;
- }
- rc = sqlite3_step(stmt);
- if (rc != SQLITE_DONE)
- LOGP(DDB, LOGL_ERROR, "Unable to update HLR database schema to version %d\n", 1);
-
- db_remove_reset(stmt);
- sqlite3_finalize(stmt);
return rc;
}
static int db_upgrade_v2(struct db_context *dbc)
{
- sqlite3_stmt *stmt;
int rc;
- const char *update_stmt_sql = "ALTER TABLE subscriber ADD COLUMN imei VARCHAR(14)";
- const char *set_schema_version_sql = "PRAGMA user_version = 2";
+ const char *statements[] = {
+ "ALTER TABLE subscriber ADD COLUMN imei VARCHAR(14)",
+ "PRAGMA user_version = 2",
+ };
- rc = sqlite3_prepare_v2(dbc->db, update_stmt_sql, -1, &stmt, NULL);
- if (rc != SQLITE_OK) {
- LOGP(DDB, LOGL_ERROR, "Unable to prepare SQL statement '%s'\n", update_stmt_sql);
- return rc;
- }
- rc = sqlite3_step(stmt);
- db_remove_reset(stmt);
- sqlite3_finalize(stmt);
+ rc = db_run_statements(dbc, statements, ARRAY_SIZE(statements));
if (rc != SQLITE_DONE) {
LOGP(DDB, LOGL_ERROR, "Unable to update HLR database schema to version 2\n");
return rc;
}
-
- rc = sqlite3_prepare_v2(dbc->db, set_schema_version_sql, -1, &stmt, NULL);
- if (rc != SQLITE_OK) {
- LOGP(DDB, LOGL_ERROR, "Unable to prepare SQL statement '%s'\n", set_schema_version_sql);
- return rc;
- }
- rc = sqlite3_step(stmt);
- if (rc != SQLITE_DONE)
- LOGP(DDB, LOGL_ERROR, "Unable to update HLR database schema to version 2\n");
-
- db_remove_reset(stmt);
- sqlite3_finalize(stmt);
return rc;
}
static int db_upgrade_v3(struct db_context *dbc)
{
- sqlite3_stmt *stmt;
int rc;
/* A newer SQLite version would allow simply 'ATLER TABLE subscriber RENAME COLUMN hlr_number TO msc_number'.
@@ -442,23 +415,10 @@ static int db_upgrade_v3(struct db_context *dbc)
"PRAGMA user_version = 3",
};
- int i;
- for (i = 0; i < ARRAY_SIZE(statements); i++) {
- const char *update_stmt_sql = statements[i];
-
- rc = sqlite3_prepare_v2(dbc->db, update_stmt_sql, -1, &stmt, NULL);
- if (rc != SQLITE_OK) {
- LOGP(DDB, LOGL_ERROR, "Unable to prepare SQL statement '%s'\n", update_stmt_sql);
- return rc;
- }
- rc = sqlite3_step(stmt);
- db_remove_reset(stmt);
- sqlite3_finalize(stmt);
- if (rc != SQLITE_DONE) {
- LOGP(DDB, LOGL_ERROR, "Unable to update HLR database schema to version 3\n");
- return rc;
- }
-
+ rc = db_run_statements(dbc, statements, ARRAY_SIZE(statements));
+ if (rc != SQLITE_DONE) {
+ LOGP(DDB, LOGL_ERROR, "Unable to update HLR database schema to version 3\n");
+ return rc;
}
return rc;
}