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>
This commit is contained in:
parent
9c4f6b5dca
commit
ff1f19e199
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -143,23 +143,20 @@ DEFUN(show_subscr_cache,
|
|||
|
||||
DEFUN(sms_send_pend,
|
||||
sms_send_pend_cmd,
|
||||
"sms send pending MIN_ID",
|
||||
"Send all pending SMS starting from MIN_ID")
|
||||
"sms send pending",
|
||||
"Send all pending SMS")
|
||||
{
|
||||
struct gsm_sms *sms;
|
||||
int id = atoi(argv[0]);
|
||||
int id = 0;
|
||||
|
||||
while (1) {
|
||||
sms = db_sms_get_unsent(gsmnet, id++);
|
||||
sms = db_sms_get_unsent_by_subscr(gsmnet, id);
|
||||
if (!sms)
|
||||
return CMD_WARNING;
|
||||
|
||||
if (!sms->receiver) {
|
||||
sms_free(sms);
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
|
||||
gsm411_send_sms_subscr(sms->receiver, sms);
|
||||
|
||||
id = sms->receiver->id + 1;
|
||||
}
|
||||
|
||||
return CMD_SUCCESS;
|
||||
|
|
Loading…
Reference in New Issue