diff options
author | Sylvain Munaut <246tnt@gmail.com> | 2009-12-22 13:22:29 +0100 |
---|---|---|
committer | Harald Welte <laforge@gnumonks.org> | 2009-12-22 13:22:29 +0100 |
commit | ff1f19e199bbb0cb9da55e0994d9b1443bba85f7 (patch) | |
tree | 7cecfe2fc2f8104999c9db0ab2c11a3909389f44 /openbsc/src/db.c | |
parent | 9c4f6b5dca610bce313911bb81b3d3081f662d31 (diff) |
Implement a better sending of pending SMS
The previous implementation had some shortcomings:
- If the MIN ID given was not the exact id of the first unsent SMS,
it would try to submit the same sms several time until id++ finally
made id go to the next one.
- If a subscriber had several SMS pending it would try to submit
them individually (only to get rejected because a paging for that
subscriber was already in progress)
Signed-off-by: Sylvain Munaut <tnt@246tNt.com>
Diffstat (limited to 'openbsc/src/db.c')
-rw-r--r-- | openbsc/src/db.c | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/openbsc/src/db.c b/openbsc/src/db.c index d85386548..707d877bb 100644 --- a/openbsc/src/db.c +++ b/openbsc/src/db.c @@ -788,6 +788,33 @@ struct gsm_sms *db_sms_get_unsent(struct gsm_network *net, int min_id) return sms; } +struct gsm_sms *db_sms_get_unsent_by_subscr(struct gsm_network *net, int min_subscr_id) +{ + dbi_result result; + struct gsm_sms *sms; + + result = dbi_conn_queryf(conn, + "SELECT * FROM SMS,Subscriber " + "WHERE sms.receiver_id >= %llu AND sms.sent is NULL " + "AND sms.receiver_id = subscriber.id " + "AND subscriber.lac > 0 " + "ORDER BY sms.receiver_id, id LIMIT 1", + min_subscr_id); + if (!result) + return NULL; + + if (!dbi_result_next_row(result)) { + dbi_result_free(result); + return NULL; + } + + sms = sms_from_result(net, result); + + dbi_result_free(result); + + return sms; +} + /* retrieve the next unsent SMS for a given subscriber */ struct gsm_sms *db_sms_get_unsent_for_subscr(struct gsm_subscriber *subscr) { |