diff --git a/pbx/pbx_realtime.c b/pbx/pbx_realtime.c index 453f336198..5a828f44a6 100755 --- a/pbx/pbx_realtime.c +++ b/pbx/pbx_realtime.c @@ -87,9 +87,24 @@ static struct ast_variable *realtime_switch_common(const char *table, const char { struct ast_variable *var; char pri[20]; + char *ematch; + char rexten[AST_MAX_EXTENSION + 20]=""; snprintf(pri, sizeof(pri), "%d", priority); - printf("%s/%s/%s/%s exists\n", table, context, exten, pri); - var = ast_load_realtime(table, "context", context, "exten", exten, "priority", pri, NULL); + switch(mode) { + case MODE_MATCHMORE: + ematch = "exten LIKE"; + snprintf(rexten, sizeof(rexten), "%s_%%", exten); + break; + case MODE_CANMATCH: + ematch = "exten LIKE"; + snprintf(rexten, sizeof(rexten), "%s%%", exten); + break; + case MODE_MATCH: + default: + ematch = "exten"; + strncpy(rexten, exten, sizeof(rexten) - 1); + } + var = ast_load_realtime(table, "context", context, ematch, rexten, "priority", pri, NULL); return var; } @@ -143,6 +158,8 @@ static int realtime_matchmore(struct ast_channel *chan, const char *context, con { REALTIME_COMMON(MODE_MATCHMORE); if (var) ast_destroy_realtime(var); + if (var) + res = 1; return res > 0 ? res : 0; } diff --git a/res/res_config_odbc.c b/res/res_config_odbc.c index 512ed9f8ed..e6001ae55a 100755 --- a/res/res_config_odbc.c +++ b/res/res_config_odbc.c @@ -31,19 +31,6 @@ 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; @@ -51,7 +38,6 @@ static struct ast_variable *realtime_odbc(const char *database, const char *tabl char sql[1024]; char coltitle[256]; char rowdata[2048]; - char newp[256]; char *op; const char *newparam, *newval; char *stringp; @@ -90,15 +76,14 @@ static struct ast_variable *realtime_odbc(const char *database, const char *tabl return NULL; } newval = va_arg(aq, const char *); - parseop(newp, sizeof(newp), &op, newparam); - snprintf(sql, sizeof(sql), "SELECT * FROM %s WHERE %s %s ?", table, newp, op); + if (!strchr(newparam, ' ')) op = " ="; else op = ""; + snprintf(sql, sizeof(sql), "SELECT * FROM %s WHERE %s%s ?", table, newparam, op); while((newparam = va_arg(aq, const char *))) { - parseop(newp, sizeof(newp), &op, newparam); - snprintf(sql + strlen(sql), sizeof(sql) - strlen(sql), " AND %s %s ?", newparam, op); + if (!strchr(newparam, ' ')) op = " ="; else op = ""; + snprintf(sql + strlen(sql), sizeof(sql) - strlen(sql), " AND %s%s ?", newparam, op); newval = va_arg(aq, const char *); } va_end(aq); - res = SQLPrepare(stmt, sql, SQL_NTS); if ((res != SQL_SUCCESS) && (res != SQL_SUCCESS_WITH_INFO)) { ast_log(LOG_WARNING, "SQL Prepare failed![%s]\n", sql);