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 /src/libmsc/db.c | |
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
Diffstat (limited to 'src/libmsc/db.c')
-rw-r--r-- | src/libmsc/db.c | 58 |
1 files changed, 44 insertions, 14 deletions
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; |