aboutsummaryrefslogtreecommitdiffstats
path: root/openbsc/src/libmsc/db.c
diff options
context:
space:
mode:
Diffstat (limited to 'openbsc/src/libmsc/db.c')
-rw-r--r--openbsc/src/libmsc/db.c35
1 files changed, 23 insertions, 12 deletions
diff --git a/openbsc/src/libmsc/db.c b/openbsc/src/libmsc/db.c
index 4808af7ec..84d5cbd52 100644
--- a/openbsc/src/libmsc/db.c
+++ b/openbsc/src/libmsc/db.c
@@ -115,9 +115,11 @@ static const char *create_stmts[] = {
"id INTEGER PRIMARY KEY AUTOINCREMENT, "
"created TIMESTAMP NOT NULL, "
"received TIMESTAMP, "
- "sent TIMESTAMP, "
+ "delivered TIMESTAMP, "
"deliver_attempts INTEGER NOT NULL DEFAULT 0, "
+ "type INTEGER NOT NULL, "
/* data directly copied/derived from SMS */
+ "msg_ref INTEGER NOT NULL, "
"valid_until TIMESTAMP, "
"reply_path_req INTEGER NOT NULL, "
"status_rep_req INTEGER NOT NULL, "
@@ -231,6 +233,9 @@ static struct gsm_sms *sms_from_result_v3(dbi_result result)
if (!sms)
return NULL;
+ /* This is a normal SMS */
+ sms->type = GSM_SMS_DELIVER;
+
sms->id = dbi_result_get_ulonglong(result, "id");
sender_id = dbi_result_get_ulonglong(result, "sender_id");
@@ -1284,6 +1289,7 @@ int db_sms_store(struct gsm_sms *sms)
unsigned char *q_udata;
char received_timestamp[22];
char validity_timestamp[22];
+ char delivered_timestamp[22];
dbi_conn_quote_string_copy(conn, (char *)sms->text, &q_text);
dbi_conn_quote_string_copy(conn, (char *)sms->dst.addr, &q_daddr);
@@ -1294,21 +1300,26 @@ int db_sms_store(struct gsm_sms *sms)
"'%F %T'", gmtime(&sms->received_time));
strftime(validity_timestamp, sizeof(validity_timestamp),
"'%F %T'", gmtime(&sms->valid_until));
+ strftime(delivered_timestamp, sizeof(delivered_timestamp),
+ "'%F %T'", gmtime(&sms->delivered_time));
result = dbi_conn_queryf(conn,
"INSERT INTO SMS "
- "(created, received, valid_until, "
+ "(created, received, msg_ref, valid_until, "
+ "delivered, type, "
"reply_path_req, status_rep_req, protocol_id, "
"data_coding_scheme, ud_hdr_ind, "
"user_data, text, "
"dest_addr, dest_ton, dest_npi, "
"src_addr, src_ton, src_npi) VALUES "
- "(datetime('now'), %s, %s, "
+ "(datetime('now'), %s, %u, %s, "
+ "%s, %u, "
"%u, %u, %u, "
"%u, %u, "
"%s, %s, "
"%s, %u, %u, "
"%s, %u, %u)",
- received_timestamp, validity_timestamp,
+ received_timestamp, sms->msg_ref, validity_timestamp,
+ delivered_timestamp, sms->type,
sms->reply_path_req, sms->status_rep_req, sms->protocol_id,
sms->data_coding_scheme, sms->ud_hdr_ind,
q_udata, q_text,
@@ -1335,6 +1346,7 @@ static struct gsm_sms *sms_from_result(struct gsm_network *net, dbi_result resul
if (!sms)
return NULL;
+ sms->type = dbi_result_get_uint(result, "type");
sms->id = dbi_result_get_ulonglong(result, "id");
/* FIXME: those should all be get_uchar, but sqlite3 is braindead */
@@ -1346,7 +1358,8 @@ static struct gsm_sms *sms_from_result(struct gsm_network *net, dbi_result resul
"data_coding_scheme");
sms->received_time = dbi_result_get_datetime(result, "received");
sms->valid_until = dbi_result_get_datetime(result, "valid_until");
- /* sms->msg_ref is temporary and not stored in DB */
+ sms->delivered_time = dbi_result_get_datetime(result, "delivered");
+ sms->msg_ref = dbi_result_get_uint(result, "msg_ref");
sms->dst.npi = dbi_result_get_uint(result, "dest_npi");
sms->dst.ton = dbi_result_get_uint(result, "dest_ton");
@@ -1411,7 +1424,7 @@ struct gsm_sms *db_sms_get_unsent(struct gsm_network *net, unsigned long long mi
"SELECT SMS.* "
"FROM SMS JOIN Subscriber ON "
"SMS.dest_addr = Subscriber.extension "
- "WHERE SMS.id >= %llu AND SMS.sent IS NULL "
+ "WHERE SMS.id >= %llu "
"AND Subscriber.lac > 0 "
"ORDER BY SMS.id LIMIT 1",
min_id);
@@ -1441,7 +1454,7 @@ struct gsm_sms *db_sms_get_unsent_by_subscr(struct gsm_network *net,
"SELECT SMS.* "
"FROM SMS JOIN Subscriber ON "
"SMS.dest_addr = Subscriber.extension "
- "WHERE Subscriber.id >= %llu AND SMS.sent IS NULL "
+ "WHERE Subscriber.id >= %llu "
"AND Subscriber.lac > 0 AND SMS.deliver_attempts < %u "
"ORDER BY Subscriber.id, SMS.id LIMIT 1",
min_subscr_id, failed);
@@ -1470,7 +1483,7 @@ struct gsm_sms *db_sms_get_unsent_for_subscr(struct gsm_subscriber *subscr)
"SELECT SMS.* "
"FROM SMS JOIN Subscriber ON "
"SMS.dest_addr = Subscriber.extension "
- "WHERE Subscriber.id = %llu AND SMS.sent IS NULL "
+ "WHERE Subscriber.id = %llu "
"AND Subscriber.lac > 0 "
"ORDER BY SMS.id LIMIT 1",
subscr->id);
@@ -1495,11 +1508,9 @@ int db_sms_mark_delivered(struct gsm_sms *sms)
dbi_result result;
result = dbi_conn_queryf(conn,
- "UPDATE SMS "
- "SET sent = datetime('now') "
- "WHERE id = %llu", sms->id);
+ "DELETE FROM SMS WHERE SMS.id = %llu", sms->id);
if (!result) {
- LOGP(DDB, LOGL_ERROR, "Failed to mark SMS %llu as sent.\n", sms->id);
+ LOGP(DDB, LOGL_ERROR, "Failed to remove SMS %llu from DB.\n", sms->id);
return 1;
}