diff options
author | Harald Welte <laforge@gnumonks.org> | 2009-08-09 19:03:42 +0200 |
---|---|---|
committer | Harald Welte <laforge@gnumonks.org> | 2009-08-09 19:03:42 +0200 |
commit | d0b7b7719f4173a411a212c7e87f098036323994 (patch) | |
tree | 27f524111fd8c6784925adbbc1af45a3b7a4191c /openbsc/src/db.c | |
parent | 1a6f79818e867e2d9ab684c6352142cb036c6889 (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.c | 54 |
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); |