aboutsummaryrefslogtreecommitdiffstats
path: root/openbsc/src/db.c
diff options
context:
space:
mode:
authorHarald Welte <laforge@gnumonks.org>2009-08-09 19:03:42 +0200
committerHarald Welte <laforge@gnumonks.org>2009-08-09 19:03:42 +0200
commitd0b7b7719f4173a411a212c7e87f098036323994 (patch)
tree27f524111fd8c6784925adbbc1af45a3b7a4191c /openbsc/src/db.c
parent1a6f79818e867e2d9ab684c6352142cb036c6889 (diff)
add ud_hdr_ind to SMS table
we also implement verification of the database schema number by using the 'Meta' table.
Diffstat (limited to 'openbsc/src/db.c')
-rw-r--r--openbsc/src/db.c54
1 files changed, 45 insertions, 9 deletions
diff --git a/openbsc/src/db.c b/openbsc/src/db.c
index 7bb3c31ec..514e13832 100644
--- a/openbsc/src/db.c
+++ b/openbsc/src/db.c
@@ -44,7 +44,7 @@ static char *create_stmts[] = {
"INSERT OR IGNORE INTO Meta "
"(key, value) "
"VALUES "
- "('revision', '1')",
+ "('revision', '2')",
"CREATE TABLE IF NOT EXISTS Subscriber ("
"id INTEGER PRIMARY KEY AUTOINCREMENT, "
"created TIMESTAMP NOT NULL, "
@@ -87,6 +87,7 @@ static char *create_stmts[] = {
"status_rep_req INTEGER NOT NULL, "
"protocol_id INTEGER NOT NULL, "
"data_coding_scheme INTEGER NOT NULL, "
+ "ud_hdr_ind INTEGER NOT NULL, "
"dest_addr TEXT, "
"user_data BLOB, " /* TP-UD */
/* additional data, interpreted from SMS */
@@ -108,6 +109,30 @@ void db_error_func(dbi_conn conn, void* data) {
printf("DBI: %s\n", msg);
}
+static int check_db_revision(void)
+{
+ dbi_result result;
+ const char *rev;
+
+ result = dbi_conn_query(conn,
+ "SELECT value FROM Meta WHERE key='revision'");
+ if (!result)
+ return -EINVAL;
+
+ if (!dbi_result_next_row(result)) {
+ dbi_result_free(result);
+ return -EINVAL;
+ }
+ rev = dbi_result_get_string(result, "value");
+ if (!rev || atoi(rev) != 2) {
+ dbi_result_free(result);
+ return -EINVAL;
+ }
+
+ dbi_result_free(result);
+ return 0;
+}
+
int db_init(const char *name) {
dbi_initialize(NULL);
conn = dbi_conn_new("sqlite3");
@@ -132,16 +157,25 @@ int db_init(const char *name) {
dbi_conn_set_option(conn, "sqlite3_dbdir", dirname(db_dirname));
dbi_conn_set_option(conn, "dbname", basename(db_basename));
- if (dbi_conn_connect(conn) < 0) {
- free(db_dirname);
- free(db_basename);
- db_dirname = db_basename = NULL;
- return 1;
+ if (dbi_conn_connect(conn) < 0)
+ goto out_err;
+
+ if (check_db_revision() < 0) {
+ fprintf(stderr, "Database schema revision invalid, "
+ "please update your database schema\n");
+ goto out_err;
}
return 0;
+
+out_err:
+ free(db_dirname);
+ free(db_basename);
+ db_dirname = db_basename = NULL;
+ return -1;
}
+
int db_prepare() {
dbi_result result;
int i;
@@ -478,13 +512,15 @@ int db_sms_store(struct gsm_sms *sms)
"INSERT INTO SMS "
"(created, sender_id, receiver_id, valid_until, "
"reply_path_req, status_rep_req, protocol_id, "
- "data_coding_scheme, dest_addr, user_data, text) VALUES "
+ "data_coding_scheme, ud_hdr_ind, dest_addr, "
+ "user_data, text) VALUES "
"(datetime('now'), %llu, %llu, %u, "
- "%u, %u, %u, %u, %s, %s, %s)",
+ "%u, %u, %u, %u, %u, %s, %s, %s)",
sms->sender->id,
sms->receiver ? sms->receiver->id : 0, validity_timestamp,
sms->reply_path_req, sms->status_rep_req, sms->protocol_id,
- sms->data_coding_scheme, q_daddr, q_udata, q_text);
+ sms->data_coding_scheme, sms->ud_hdr_ind,
+ q_daddr, q_udata, q_text);
free(q_text);
free(q_daddr);
free(q_udata);