From 2ebabca32a6626a43f22b3b268f04b44f8d1d397 Mon Sep 17 00:00:00 2001 From: Harald Welte Date: Sun, 9 Aug 2009 19:05:21 +0200 Subject: new db_sms_get_unsent_for_subscr() function The function retrieves the oldest not-yet-sent SM for the given subscriber --- openbsc/include/openbsc/db.h | 1 + openbsc/src/db.c | 68 ++++++++++++++++++++++++++++++++------------ 2 files changed, 51 insertions(+), 18 deletions(-) diff --git a/openbsc/include/openbsc/db.h b/openbsc/include/openbsc/db.h index c9b72659e..eef42f6fb 100644 --- a/openbsc/include/openbsc/db.h +++ b/openbsc/include/openbsc/db.h @@ -43,5 +43,6 @@ int db_subscriber_assoc_imei(struct gsm_subscriber* subscriber, char *imei); /* SMS store-and-forward */ int db_sms_store(struct gsm_sms *sms); struct gsm_sms *db_sms_get_unsent(struct gsm_network *net, int min_id); +struct gsm_sms *db_sms_get_unsent_for_subscr(struct gsm_subscriber *subscr); int db_sms_mark_sent(struct gsm_sms *sms); #endif /* _DB_H */ diff --git a/openbsc/src/db.c b/openbsc/src/db.c index 514e13832..51f94b654 100644 --- a/openbsc/src/db.c +++ b/openbsc/src/db.c @@ -532,32 +532,16 @@ int db_sms_store(struct gsm_sms *sms) return 0; } -/* retrieve the next unsent SMS with ID >= min_id */ -struct gsm_sms *db_sms_get_unsent(struct gsm_network *net, int min_id) +static struct gsm_sms *sms_from_result(struct gsm_network *net, dbi_result result) { - dbi_result result; - long long unsigned int sender_id, receiver_id; struct gsm_sms *sms = sms_alloc(); + long long unsigned int sender_id, receiver_id; const char *text, *daddr; const unsigned char *user_data; if (!sms) return NULL; - result = dbi_conn_queryf(conn, - "SELECT * FROM SMS " - "WHERE id >= %llu AND sent is NULL ORDER BY id", - min_id); - if (!result) { - sms_free(sms); - return NULL; - } - if (!dbi_result_next_row(result)) { - printf("DB: Failed to find any SMS.\n"); - dbi_result_free(result); - sms_free(sms); - return NULL; - } sms->id = dbi_result_get_ulonglong(result, "id"); sender_id = dbi_result_get_ulonglong(result, "sender_id"); @@ -593,8 +577,56 @@ struct gsm_sms *db_sms_get_unsent(struct gsm_network *net, int min_id) strncpy(sms->text, text, sizeof(sms->text)); sms->text[sizeof(sms->text)-1] = '\0'; } + return sms; +} + +/* retrieve the next unsent SMS with ID >= min_id */ +struct gsm_sms *db_sms_get_unsent(struct gsm_network *net, int min_id) +{ + dbi_result result; + struct gsm_sms *sms; + + result = dbi_conn_queryf(conn, + "SELECT * FROM SMS " + "WHERE id >= %llu AND sent is NULL ORDER BY id", + min_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 with ID >= min_id */ +struct gsm_sms *db_sms_get_unsent_for_subscr(struct gsm_subscriber *subscr) +{ + dbi_result result; + struct gsm_sms *sms; + + result = dbi_conn_queryf(conn, + "SELECT * FROM SMS " + "WHERE receiver_id = %llu AND sent is NULL ORDER BY id", + subscr->id); + if (!result) + return NULL; + + if (!dbi_result_next_row(result)) { + dbi_result_free(result); + return NULL; + } + + sms = sms_from_result(subscr->net, result); dbi_result_free(result); + return sms; } -- cgit v1.2.3