[Freeswitch-users] "show channels" command with duration - patch included

freeswitch-users at lists.freeswitch.org freeswitch-users at lists.freeswitch.org
Thu Jul 16 07:02:46 PDT 2009


Hi,

I usually find it very useful when I can retrieve a list of the currents 
calls along with durations. I noticed that the 'show channels' format 
does not include the duration (or the answered timestamp - so that one 
can extract it from there). So, I made a patch that includes the 
answered timestamp, the answered timestamp in epoch, and the duration in 
seconds. Of course these fields remain empty when the call hasn't been
answered yet.

I don't know if anyone else finds this functionality useful, so I am 
posting this patch here first (instead of JIRA) in order to get feedback 
from the users. If many of you (or the maintainers) find it interesting 
I can then proceed in posting it to JIRA.

-- 
-------------------------------------------
Apostolos Pantsiopoulos
Kinetix Tele.com R & D
email: regs at kinetix.gr
-------------------------------------------
-------------- next part --------------
Index: src/mod/applications/mod_commands/mod_commands.c
===================================================================
--- src/mod/applications/mod_commands/mod_commands.c	(revision 14256)
+++ src/mod/applications/mod_commands/mod_commands.c	(working copy)
@@ -2827,10 +2827,10 @@
 				}
 			}
 			if (strchr(argv[2], '%')) {
-				sprintf(sql, "select * from channels where uuid like '%s' or name like '%s' or cid_name like '%s' or cid_num like '%s' order by created_epoch",
+				sprintf(sql, "select *,strftime('%%s',DATETIME('NOW'))-answered_epoch as duration from channels where uuid like '%s' or name like '%s' or cid_name like '%s' or cid_num like '%s' order by created_epoch",
 						argv[2], argv[2], argv[2], argv[2]);
 			} else {
-				sprintf(sql, "select * from channels where uuid like '%%%s%%' or name like '%%%s%%' or cid_name like '%%%s%%' or cid_num like '%%%s%%' order by created_epoch",
+				sprintf(sql, "select *,strftime('%%s',DATETIME('NOW'))-answered_epoch as duration from channels where uuid like '%%%s%%' or name like '%%%s%%' or cid_name like '%%%s%%' or cid_num like '%%%s%%' order by created_epoch",
 						argv[2], argv[2], argv[2], argv[2]);
 
 			}
@@ -2839,10 +2839,10 @@
 				as = argv[4];
 		    }
 		} else {
-			sprintf(sql, "select * from channels order by created_epoch");
+			sprintf(sql, "select *,strftime('%%s',DATETIME('NOW'))-answered_epoch as duration from channels order by created_epoch");
 		}
 	} else if (!strcasecmp(command, "channels")) {
-		sprintf(sql, "select * from channels order by created_epoch");
+		sprintf(sql, "select *,strftime('%%s',DATETIME('NOW'))-answered_epoch as duration from channels order by created_epoch");
 		if (argv[1] && !strcasecmp(argv[1],"count")) {
 		    holder.justcount = 1;
 		    if (argv[3] && !strcasecmp(argv[2], "as")) {
@@ -2850,7 +2850,7 @@
 		    }
 		}
 	} else if (!strcasecmp(command, "distinct_channels")) {
-		sprintf(sql, "select * from channels left join calls on "
+		sprintf(sql, "select *,strftime('%%s',DATETIME('NOW'))-answered_epoch as duration from channels left join calls on "
 				"channels.uuid=calls.caller_uuid where channels.uuid not in (select callee_uuid from calls) order by created_epoch");
 		if (argv[2] && !strcasecmp(argv[1], "as")) {
 			as = argv[2];
Index: src/switch_core_sqldb.c
===================================================================
--- src/switch_core_sqldb.c	(revision 14256)
+++ src/switch_core_sqldb.c	(working copy)
@@ -309,9 +309,21 @@
 							 );
 
 		break;
+	case SWITCH_EVENT_CHANNEL_ANSWER:
+		{
+
+			sql = switch_mprintf("update channels set answered='%s',answered_epoch='%ld' where uuid='%s'",
+                                                         switch_event_get_header_nil(event, "event-date-local"),
+							 (long)switch_epoch_time_now(NULL),
+							 switch_event_get_header_nil(event, "unique-id")
+                                                         );
+
+		}
+		break;
 	case SWITCH_EVENT_CHANNEL_STATE:
 		{
 			char *state = switch_event_get_header_nil(event, "channel-state-number");
+
 			switch_channel_state_t state_i = CS_DESTROY;
 
 			if (!switch_strlen_zero(state)) {
@@ -492,7 +504,9 @@
 			"   read_rate  VARCHAR(255),\n" 
 			"   write_codec  VARCHAR(255),\n" 
 			"   write_rate  VARCHAR(255),\n" 
-			"   secure VARCHAR(255)\n"
+			"   secure VARCHAR(255),\n"
+			"   answered  VARCHAR(255),\n"
+                        "   answered_epoch  INTEGER\n"
 			");\ncreate index uuindex on channels (uuid);\n";
 		char create_calls_sql[] =
 			"CREATE TABLE calls (\n"


More information about the FreeSWITCH-users mailing list