Realtime improvements
authorMark Spencer <markster@digium.com>
Mon, 22 Nov 2004 18:39:40 +0000 (18:39 +0000)
committerMark Spencer <markster@digium.com>
Mon, 22 Nov 2004 18:39:40 +0000 (18:39 +0000)
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@4314 65c4cc65-6c06-0410-ace0-fbb531ad65f3

pbx/pbx_realtime.c
res/res_config_odbc.c

index 453f336..5a828f4 100755 (executable)
@@ -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;
 }
 
index 512ed9f..e6001ae 100755 (executable)
@@ -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);