]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
FS-7569 mod_callcenter - Tracking queue strategy changes to avoid stuck members
authorItalo Rossi <italorossib@gmail.com>
Mon, 25 May 2015 17:55:57 +0000 (14:55 -0300)
committerItalo Rossi <italorossib@gmail.com>
Mon, 25 May 2015 18:00:14 +0000 (15:00 -0300)
src/mod/applications/mod_callcenter/mod_callcenter.c

index 6db5f8a2cd9608e7ab2cff893f459faf73a838a4..e33ec98d03d0a1ac855ab532f4d28d3bf7974d6b 100644 (file)
@@ -2108,6 +2108,7 @@ static int members_callback(void *pArg, int argc, char **argv, char **columnName
        agent_callback_t cbt;
        const char *member_state = NULL;
        const char *member_abandoned_epoch = NULL;
+       const char *serving_agent = NULL;
        memset(&cbt, 0, sizeof(cbt));
 
        cbt.queue_name = argv[0];
@@ -2119,6 +2120,7 @@ static int members_callback(void *pArg, int argc, char **argv, char **columnName
        cbt.member_score = argv[6];
        member_state = argv[7];
        member_abandoned_epoch = argv[8];
+       serving_agent = argv[9];
 
        if (!cbt.queue_name || !(queue = get_queue(cbt.queue_name))) {
                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Queue %s not found locally, skip this member\n", cbt.queue_name);
@@ -2153,7 +2155,23 @@ static int members_callback(void *pArg, int argc, char **argv, char **columnName
                }
                /* Skip this member */
                goto end;
-       } 
+       }
+
+       /* Tracking queue strategy changes */
+       /* member is ring-all but not the queue */
+       if (!strcasecmp(serving_agent, "ring-all") && (strcasecmp(queue_strategy, "ring-all") != 0)) {
+               switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Queue '%s' changed strategy, adjusting member parameters", queue_name);
+               sql = switch_mprintf("UPDATE members SET serving_agent = '', state = '%s' WHERE uuid = '%s' AND state = '%s' AND serving_agent = 'ring-all'", cc_member_state2str(CC_MEMBER_STATE_WAITING), cbt.member_uuid, cc_member_state2str(CC_MEMBER_STATE_TRYING));
+               cc_execute_sql(NULL, sql, NULL);
+               switch_safe_free(sql);
+       }
+       /* Queue is now ring-all and not the member */
+       else if (!strcasecmp(queue_strategy, "ring-all") && (strcasecmp(serving_agent, "ring-all") != 0)) {
+               switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Queue '%s' changed strategy, adjusting member parameters", queue_name);
+               sql = switch_mprintf("UPDATE members SET serving_agent = 'ring-all', state = '%s' WHERE uuid = '%s' AND state = '%s' AND serving_agent = ''", cc_member_state2str(CC_MEMBER_STATE_TRYING), cbt.member_uuid, cc_member_state2str(CC_MEMBER_STATE_WAITING));
+               cc_execute_sql(NULL, sql, NULL);
+               switch_safe_free(sql);
+       }
 
        /* Check if member is in the queue waiting */
        if (zstr(cbt.member_session_uuid)) {
@@ -2307,7 +2325,7 @@ void *SWITCH_THREAD_FUNC cc_agent_dispatch_thread_run(switch_thread_t *thread, v
 
        while (globals.running == 1) {
                char *sql = NULL;
-               sql = switch_mprintf("SELECT queue,uuid,session_uuid,cid_number,cid_name,joined_epoch,(%" SWITCH_TIME_T_FMT "-joined_epoch)+base_score+skill_score AS score, state, abandoned_epoch FROM members"
+               sql = switch_mprintf("SELECT queue,uuid,session_uuid,cid_number,cid_name,joined_epoch,(%" SWITCH_TIME_T_FMT "-joined_epoch)+base_score+skill_score AS score, state, abandoned_epoch, serving_agent FROM members"
                                " WHERE state = '%q' OR state = '%q' OR (serving_agent = 'ring-all' AND state = '%q') ORDER BY score DESC",
                                local_epoch_time_now(NULL),
                                cc_member_state2str(CC_MEMBER_STATE_WAITING), cc_member_state2str(CC_MEMBER_STATE_ABANDONED), cc_member_state2str(CC_MEMBER_STATE_TRYING));