From 3af63597b0913edda5ca7441c0e7bbcd15d6e7d2 Mon Sep 17 00:00:00 2001 From: Andreas Granig Date: Fri, 4 Jul 2014 13:40:38 +0200 Subject: [PATCH] MT#7955 Find voicemail user by alias. --- apps/app_voicemail.c | 45 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) diff --git a/apps/app_voicemail.c b/apps/app_voicemail.c index 0a9fdff..b42dd0f 100644 --- a/apps/app_voicemail.c +++ b/apps/app_voicemail.c @@ -785,6 +785,46 @@ static struct ast_vm_user *find_user_realtime(struct ast_vm_user *ivm, const cha return retval; } +static struct ast_vm_user *find_user_realtime_by_alias(struct ast_vm_user *ivm, const char *context, const char *alias) +{ + int res; + char mailbox[256] = ""; + char *argv[] = { alias }; + char *sql = "select distinct(vmusers.mailbox) from kamailio.voicemail_users vmusers " \ + "left join provisioning.voip_subscribers pvs on vmusers.customer_id = pvs.uuid " \ + "left join provisioning.voip_dbaliases vda on pvs.id = vda.subscriber_id " \ + "where vda.username = ?"; + struct generic_prepare_struct gps = { .sql = sql, .argc = 1, .argv = argv }; + struct odbc_obj *obj = NULL; + SQLHSTMT stmt = NULL; + + obj = ast_odbc_request_obj(odbc_database, 0); + stmt = ast_odbc_prepare_and_execute(obj, generic_prepare, &gps); + if (!stmt) { + ast_log(LOG_WARNING, "SQL Execute error!\n[%s]\n\n", sql); + ast_odbc_release_obj(obj); + return NULL; + } + res = SQLFetch(stmt); + if ((res != SQL_SUCCESS) && (res != SQL_SUCCESS_WITH_INFO)) { + ast_log(LOG_WARNING, "SQL Fetch error!\n[%s]\n\n", sql); + SQLFreeHandle (SQL_HANDLE_STMT, stmt); + ast_odbc_release_obj(obj); + return NULL; + } + res = SQLGetData(stmt, 1, SQL_CHAR, mailbox, sizeof(mailbox), NULL); + if ((res != SQL_SUCCESS) && (res != SQL_SUCCESS_WITH_INFO)) { + ast_log(LOG_WARNING, "SQL Get Data error!\n[%s]\n\n", sql); + SQLFreeHandle (SQL_HANDLE_STMT, stmt); + ast_odbc_release_obj(obj); + return NULL; + } + SQLFreeHandle(SQL_HANDLE_STMT, stmt); + ast_odbc_release_obj(obj); + + return find_user_realtime(ivm, context, mailbox); +} + static struct ast_vm_user *find_user(struct ast_vm_user *ivm, const char *context, const char *mailbox) { /* This function could be made to generate one from a database, too */ @@ -810,7 +850,10 @@ static struct ast_vm_user *find_user(struct ast_vm_user *ivm, const char *contex } else { ast_log (LOG_DEBUG,"call find_user_realtime for '%s@%s'\n", mailbox, context); - vmu = find_user_realtime(ivm, context, mailbox); + + // vmu = find_user_realtime(ivm, context, mailbox); + // agranig: always find user by alias + vmu = find_user_realtime_by_alias(ivm, context, mailbox); } AST_LIST_UNLOCK(&users); return vmu;