From 536d9d370e8c3bf371e0e0b82645c08f4165ba89 Mon Sep 17 00:00:00 2001 From: Mark Spencer Date: Mon, 22 Nov 2004 05:03:03 +0000 Subject: [PATCH] Minor realtime improvements git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@4311 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- channels/chan_sip.c | 1 + pbx/pbx_realtime.c | 14 +++++++------- res/res_config_odbc.c | 24 ++++++++++++++++++++---- 3 files changed, 28 insertions(+), 11 deletions(-) diff --git a/channels/chan_sip.c b/channels/chan_sip.c index 6d9b85d..77ef881 100755 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -692,6 +692,7 @@ static int retrans_pkt(void *data) ast_mutex_lock(&pkt->owner->lock); } if (pkt->owner->owner) { + pkt->owner->alreadygone=1; ast_queue_hangup(pkt->owner->owner); ast_mutex_unlock(&pkt->owner->owner->lock); } else { diff --git a/pbx/pbx_realtime.c b/pbx/pbx_realtime.c index 6b1e630..4b70da1 100755 --- a/pbx/pbx_realtime.c +++ b/pbx/pbx_realtime.c @@ -50,13 +50,13 @@ static char *tdesc = "Realtime Switch"; */ -#define REALTIME_COMMON \ +#define REALTIME_COMMON(mode) \ char *buf; \ char *opts; \ const char *cxt; \ char *table; \ int res=-1; \ - struct ast_variable *var; \ + struct ast_variable *var=NULL; \ buf = ast_strdupa(data); \ if (buf) { \ opts = strchr(buf, '/'); \ @@ -75,9 +75,9 @@ static char *tdesc = "Realtime Switch"; cxt = context;\ if (!table || ast_strlen_zero(table)) \ table = "extensions"; \ - var = realtime_switch_common(table, cxt, exten, priority); \ + var = realtime_switch_common(table, cxt, exten, priority, mode); \ } else \ - return -1; + res = -1; static struct ast_variable *realtime_switch_common(const char *table, const char *context, const char *exten, int priority) { @@ -104,7 +104,7 @@ static int realtime_canmatch(struct ast_channel *chan, const char *context, cons if (var) ast_destroy_realtime(var); if (var) res = 1; - return res; + return res > 0 ? res : 0; } static int realtime_exec(struct ast_channel *chan, const char *context, const char *exten, int priority, const char *callerid, int newstack, const char *data) @@ -123,6 +123,7 @@ static int realtime_exec(struct ast_channel *chan, const char *context, const ch appdata = ast_strdupa(v->value); v = v->next; } + ast_destroy_realtime(var); if (!ast_strlen_zero(app)) { a = pbx_findapp(app); if (a) { @@ -130,7 +131,6 @@ static int realtime_exec(struct ast_channel *chan, const char *context, const ch } else ast_log(LOG_NOTICE, "No such application '%s' for extension '%s' in context '%s'\n", app, exten, context); } - ast_destroy_realtime(var); } return res; } @@ -139,7 +139,7 @@ static int realtime_matchmore(struct ast_channel *chan, const char *context, con { REALTIME_COMMON; if (var) ast_destroy_realtime(var); - return res; + return res > 0 ? res : 0; } static struct ast_switch realtime_switch = diff --git a/res/res_config_odbc.c b/res/res_config_odbc.c index 7d2cd8e..512ed9f 100755 --- a/res/res_config_odbc.c +++ b/res/res_config_odbc.c @@ -31,13 +31,28 @@ STANDARD_LOCAL_USER; LOCAL_USER_DECL; +static void parseop(char *newp, int newplen, char **opo, const char *newparam) +{ + char *op; + strncpy(newp, newparam, newplen - 1); + op = strchr(newp, ' '); + if (op) { + *op = '\0'; + op++; + } else + op = "="; + *opo = op; +} + static struct ast_variable *realtime_odbc(const char *database, const char *table, va_list ap) { odbc_obj *obj; SQLHSTMT stmt; - char sql[256]; + char sql[1024]; char coltitle[256]; char rowdata[2048]; + char newp[256]; + char *op; const char *newparam, *newval; char *stringp; char *chunk; @@ -75,10 +90,11 @@ static struct ast_variable *realtime_odbc(const char *database, const char *tabl return NULL; } newval = va_arg(aq, const char *); - - snprintf(sql, sizeof(sql), "SELECT * FROM %s WHERE %s=?", table, newparam); + parseop(newp, sizeof(newp), &op, newparam); + snprintf(sql, sizeof(sql), "SELECT * FROM %s WHERE %s %s ?", table, newp, op); while((newparam = va_arg(aq, const char *))) { - snprintf(sql + strlen(sql), sizeof(sql) - strlen(sql), " AND %s=?", newparam); + parseop(newp, sizeof(newp), &op, newparam); + snprintf(sql + strlen(sql), sizeof(sql) - strlen(sql), " AND %s %s ?", newparam, op); newval = va_arg(aq, const char *); } va_end(aq); -- 1.7.9.5