diff options
author | Stefan Sperling <ssperling@sysmocom.de> | 2018-01-22 17:31:20 +0100 |
---|---|---|
committer | Harald Welte <laforge@gnumonks.org> | 2018-01-25 20:30:40 +0000 |
commit | 14e051776fe07cbc7f9c5775ea62f04fe79bd357 (patch) | |
tree | 571c87eeb7957b28018a67fd713898758423e86c | |
parent | 1e67fea7ba5c6336066b78f98a28ab33b05c36c4 (diff) |
Delete expired SMS automatically.
Delete expired SMS whenever we are done processing an SMS-related signal.
In order to minimize additional latency only one SMS is removed at a time.
Change-Id: I56cbe716e52b679c4b94f6cbb4a171306975be2e
Related: OS#2354
-rw-r--r-- | include/osmocom/msc/db.h | 1 | ||||
-rw-r--r-- | src/libmsc/db.c | 58 | ||||
-rw-r--r-- | src/libmsc/sms_queue.c | 3 |
3 files changed, 48 insertions, 14 deletions
diff --git a/include/osmocom/msc/db.h b/include/osmocom/msc/db.h index 2105d38da..a1de7d631 100644 --- a/include/osmocom/msc/db.h +++ b/include/osmocom/msc/db.h @@ -51,6 +51,7 @@ int db_sms_inc_deliver_attempts(struct gsm_sms *sms); int db_sms_delete_by_msisdn(const char *msisdn); int db_sms_delete_sent_message_by_id(unsigned long long sms_id); int db_sms_delete_expired_message_by_id(unsigned long long sms_id); +void db_sms_delete_oldest_expired_message(void); /* Statistics counter storage */ struct osmo_counter; diff --git a/src/libmsc/db.c b/src/libmsc/db.c index c21aa7026..db9989dc8 100644 --- a/src/libmsc/db.c +++ b/src/libmsc/db.c @@ -989,22 +989,11 @@ int db_sms_delete_sent_message_by_id(unsigned long long sms_id) return 0; } -int db_sms_delete_expired_message_by_id(unsigned long long sms_id) + +static int delete_expired_sms(unsigned long long sms_id, time_t created, time_t validity_timestamp) { dbi_result result; - time_t created, validity_timestamp, now, min_created; - - result = dbi_conn_queryf(conn, "SELECT created,valid_until FROM SMS WHERE id = %llu", sms_id); - if (!result) - return -1; - if (!next_row(result)) { - dbi_result_free(result); - return -1; - } - - created = dbi_result_get_datetime(result, "created"); - validity_timestamp = dbi_result_get_datetime(result, "valid_until"); - dbi_result_free(result); + time_t now, min_created; now = time(NULL); if (validity_timestamp > now) @@ -1026,6 +1015,47 @@ int db_sms_delete_expired_message_by_id(unsigned long long sms_id) return 0; } +int db_sms_delete_expired_message_by_id(unsigned long long sms_id) +{ + dbi_result result; + time_t created, validity_timestamp; + + result = dbi_conn_queryf(conn, "SELECT created,valid_until FROM SMS WHERE id = %llu", sms_id); + if (!result) + return -1; + if (!next_row(result)) { + dbi_result_free(result); + return -1; + } + + created = dbi_result_get_datetime(result, "created"); + validity_timestamp = dbi_result_get_datetime(result, "valid_until"); + + dbi_result_free(result); + return delete_expired_sms(sms_id, created, validity_timestamp); +} + +void db_sms_delete_oldest_expired_message(void) +{ + dbi_result result; + + result = dbi_conn_queryf(conn, "SELECT id,created,valid_until FROM SMS ORDER BY created LIMIT 1"); + if (!result) + return; + + if (next_row(result)) { + unsigned long long sms_id; + time_t created, validity_timestamp; + + sms_id = dbi_result_get_ulonglong(result, "id"); + created = dbi_result_get_datetime(result, "created"); + validity_timestamp = dbi_result_get_datetime(result, "valid_until"); + delete_expired_sms(sms_id, created, validity_timestamp); + } + + dbi_result_free(result); +} + int db_store_counter(struct osmo_counter *ctr) { dbi_result result; diff --git a/src/libmsc/sms_queue.c b/src/libmsc/sms_queue.c index 193d0230f..163d4c722 100644 --- a/src/libmsc/sms_queue.c +++ b/src/libmsc/sms_queue.c @@ -529,6 +529,9 @@ static int sms_sms_cb(unsigned int subsys, unsigned int signal, sig_sms->paging_result); } + /* While here, attempt to remove an expired SMS from the DB. */ + db_sms_delete_oldest_expired_message(); + return 0; } |