Minor realtime improvements
authorMark Spencer <markster@digium.com>
Mon, 22 Nov 2004 05:03:03 +0000 (05:03 +0000)
committerMark Spencer <markster@digium.com>
Mon, 22 Nov 2004 05:03:03 +0000 (05:03 +0000)
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@4311 65c4cc65-6c06-0410-ace0-fbb531ad65f3

channels/chan_sip.c
pbx/pbx_realtime.c
res/res_config_odbc.c

index 6d9b85d..77ef881 100755 (executable)
@@ -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 {
index 6b1e630..4b70da1 100755 (executable)
@@ -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 =
index 7d2cd8e..512ed9f 100755 (executable)
@@ -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);