[Freeswitch-svn] [commit] r8172 - in freeswitch/trunk/src: . mod/applications/mod_commands
Freeswitch SVN
anthm at freeswitch.org
Tue Apr 22 16:49:40 EDT 2008
Author: anthm
Date: Tue Apr 22 16:49:39 2008
New Revision: 8172
Modified:
freeswitch/trunk/src/mod/applications/mod_commands/mod_commands.c
freeswitch/trunk/src/switch_console.c
freeswitch/trunk/src/switch_core_sqldb.c
Log:
clean up some console goodies
Modified: freeswitch/trunk/src/mod/applications/mod_commands/mod_commands.c
==============================================================================
--- freeswitch/trunk/src/mod/applications/mod_commands/mod_commands.c (original)
+++ freeswitch/trunk/src/mod/applications/mod_commands/mod_commands.c Tue Apr 22 16:49:39 2008
@@ -1885,6 +1885,50 @@
return 0;
}
+#define COMPLETE_SYNTAX "add <word>|del [<word>|all]"
+SWITCH_STANDARD_API(complete_function)
+{
+ char *mydata = NULL, *argv[2] = {0};
+ int fail = 1, argc;
+ char sql[1024] = "";
+
+ if (cmd && (mydata = strdup(cmd))) {
+ if ((argc = switch_separate_string(mydata, ' ', argv, (sizeof(argv) / sizeof(argv[0]))))) {
+ switch_core_db_t *db = switch_core_db_handle();
+
+ if (!strcasecmp(argv[0], "add")) {
+ switch_snprintf(sql, sizeof(sql), "delete from complete where name = '%s'", argv[1]);
+ switch_core_db_persistant_execute(db, sql, 1);
+ switch_snprintf(sql, sizeof(sql), "insert into complete values ('%s')", argv[1]);
+ switch_core_db_persistant_execute(db, sql, 1);
+ stream->write_function(stream, "+OK\n");
+ fail = 0;
+ } else if (!strcasecmp(argv[0], "del")) {
+ char *what = argv[1];
+ if (!strcasecmp(what, "*")) {
+ switch_snprintf(sql, sizeof(sql), "delete from complete");
+ } else {
+ switch_snprintf(sql, sizeof(sql), "delete from complete where name = '%s'", what);
+ }
+ switch_core_db_persistant_execute(db, sql, 1);
+ stream->write_function(stream, "+OK\n");
+ fail = 0;
+ }
+
+ switch_core_db_close(db);
+ }
+ }
+
+ switch_safe_free(mydata);
+
+ if (fail) {
+ stream->write_function(stream, "-USAGE: %s\n", COMPLETE_SYNTAX);
+ }
+
+ return SWITCH_STATUS_SUCCESS;
+
+}
+
#define SHOW_SYNTAX "codec|application|api|dialplan|file|timer|calls|channels"
SWITCH_STANDARD_API(show_function)
{
@@ -1927,15 +1971,15 @@
stream->write_function(stream, "-USAGE: %s\n", SHOW_SYNTAX);
return SWITCH_STATUS_SUCCESS;
} else if (!strcasecmp(command, "codec") || !strcasecmp(command, "dialplan") || !strcasecmp(command, "file") || !strcasecmp(command, "timer")) {
- sprintf(sql, "select type, name from interfaces where type = '%s'", command);
+ sprintf(sql, "select type, name from interfaces where type = '%s' order by type,name", command);
} else if (!strcasecmp(command, "tasks")) {
sprintf(sql, "select * from %s", command);
} else if (!strcasecmp(command, "application") || !strcasecmp(command, "api")) {
- sprintf(sql, "select name, description, syntax from interfaces where type = '%s' and description != ''", command);
+ sprintf(sql, "select name, description, syntax from interfaces where type = '%s' and description != '' order by type,name", command);
} else if (!strcasecmp(command, "calls")) {
- sprintf(sql, "select * from calls");
+ sprintf(sql, "select * from calls order by created_epoch");
} else if (!strcasecmp(command, "channels")) {
- sprintf(sql, "select * from channels");
+ sprintf(sql, "select * from channels order by created_epoch");
} else if (!strncasecmp(command, "help", 4)) {
char *cmdname = NULL;
@@ -1943,9 +1987,9 @@
holder.print_title = 0;
if ((cmdname = strchr(command, ' ')) != 0) {
*cmdname++ = '\0';
- switch_snprintf(sql, sizeof(sql) - 1, "select name, syntax, description from interfaces where type = 'api' and name = '%s'", cmdname);
+ switch_snprintf(sql, sizeof(sql) - 1, "select name, syntax, description from interfaces where type = 'api' and name = '%s' order by name", cmdname);
} else {
- switch_snprintf(sql, sizeof(sql) - 1, "select name, syntax, description from interfaces where type = 'api'");
+ switch_snprintf(sql, sizeof(sql) - 1, "select name, syntax, description from interfaces where type = 'api' order by name");
}
} else {
stream->write_function(stream, "-USAGE: %s\n", SHOW_SYNTAX);
@@ -2264,6 +2308,7 @@
SWITCH_ADD_API(commands_api_interface, "pause", "Pause", pause_function, PAUSE_SYNTAX);
SWITCH_ADD_API(commands_api_interface, "break", "Break", break_function, BREAK_SYNTAX);
SWITCH_ADD_API(commands_api_interface, "show", "Show", show_function, SHOW_SYNTAX);
+ SWITCH_ADD_API(commands_api_interface, "complete", "Complete", complete_function, COMPLETE_SYNTAX);
SWITCH_ADD_API(commands_api_interface, "status", "status", status_function, "");
SWITCH_ADD_API(commands_api_interface, "uuid_bridge", "uuid_bridge", uuid_bridge_function, "");
SWITCH_ADD_API(commands_api_interface, "uuid_setvar", "uuid_setvar", uuid_setvar_function, SETVAR_SYNTAX);
Modified: freeswitch/trunk/src/switch_console.c
==============================================================================
--- freeswitch/trunk/src/switch_console.c (original)
+++ freeswitch/trunk/src/switch_console.c Tue Apr 22 16:49:39 2008
@@ -346,13 +346,16 @@
if (!switch_strlen_zero(line)) {
char *cmd = strdup(line);
char *p;
-
+ const LineInfo *lf = el_line(el);
+ char *foo = (char *)lf->buffer;
if ((p = strrchr(cmd, '\r')) || (p = strrchr(cmd, '\n'))) {
*p = '\0';
}
assert(cmd != NULL);
history(myhistory, &ev, H_ENTER, line);
running = switch_console_process(cmd);
+ el_deletestr(el, strlen(foo)+1);
+ memset(foo, 0, strlen(foo));
free(cmd);
}
}
@@ -364,6 +367,115 @@
}
+struct helper {
+ EditLine *el;
+ int len;
+ int hits;
+ char last[512];
+ FILE *out;
+};
+
+static int comp_callback(void *pArg, int argc, char **argv, char **columnNames)
+{
+ struct helper *h = (struct helper *) pArg;
+
+ fprintf(h->out, "%20s\t", argv[0]);
+
+ switch_copy_string(h->last, argv[0], sizeof(h->last));
+
+ if ((++h->hits % 4) == 0) {
+ fprintf(h->out, "\n");
+ }
+
+ return 0;
+}
+
+static unsigned char complete(EditLine *el, int ch)
+{
+ switch_core_db_t *db = switch_core_db_handle();
+ char *sql;
+ const LineInfo *lf = el_line(el);
+ char *dup = strdup(lf->buffer);
+ char *buf = dup;
+ char *p, *lp = NULL;
+ char *errmsg = NULL;
+ struct helper h = { el };
+ int words = 0;
+ unsigned char ret = CC_REDISPLAY;
+
+ h.out = switch_core_get_console();
+
+ if ((p = strchr(buf, '\r')) || (p = strchr(buf, '\n'))) {
+ *p = '\0';
+ }
+
+ while(*buf == ' ') {
+ buf++;
+ }
+
+ for(p = buf; p && *p; p++) {
+ if (*p == ' ') {
+ lp = p;
+ words++;
+ }
+ }
+
+ if (lp) {
+ buf = lp + 1;
+ }
+
+ h.len = strlen(buf);
+
+ fprintf(h.out, "\n\n");
+
+ if (words == 0) {
+ sql = switch_mprintf("select distinct name from interfaces where type='api' and name like '%s%%' order by name", buf);
+ } else {
+ sql = switch_mprintf("select distinct uuid from channels where uuid like '%s%%' order by uuid", buf);
+ }
+
+ switch_core_db_exec(db, sql, comp_callback, &h, &errmsg);
+
+ if (errmsg) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "error [%s][%s]\n", sql, errmsg);
+ free(errmsg);
+ ret = CC_ERROR;
+ goto end;
+ }
+
+ if (h.hits != 1) {
+ switch_safe_free(sql);
+ sql = switch_mprintf("select distinct name from complete where name like '%s%%' order by name", buf);
+ switch_core_db_exec(db, sql, comp_callback, &h, &errmsg);
+
+ if (errmsg) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "error [%s][%s]\n", sql, errmsg);
+ free(errmsg);
+ ret = CC_ERROR;
+ goto end;
+ }
+ }
+
+ fprintf(h.out, "\n\n");
+
+ if (h.hits == 1) {
+ el_deletestr(el, h.len);
+ el_insertstr(el, h.last);
+ el_insertstr(el, " ");
+ }
+
+ end:
+
+ fflush(h.out);
+
+ switch_safe_free(sql);
+ switch_safe_free(dup);
+
+ switch_core_db_close(db);
+
+ return (ret);
+}
+
SWITCH_DECLARE(void) switch_console_loop(void)
{
switch_thread_t *thread;
@@ -417,6 +529,10 @@
el_set(el, EL_BIND, "\033[23~", "f11-key", NULL);
el_set(el, EL_BIND, "\033[24~", "f12-key", NULL);
+
+ el_set(el, EL_ADDFN, "ed-complete", "Complete argument", complete);
+ el_set(el, EL_BIND, "^I", "ed-complete", NULL);
+
myhistory = history_init();
if (myhistory == 0) {
fprintf(stderr, "history could not be initialized\n");
Modified: freeswitch/trunk/src/switch_core_sqldb.c
==============================================================================
--- freeswitch/trunk/src/switch_core_sqldb.c (original)
+++ freeswitch/trunk/src/switch_core_sqldb.c Tue Apr 22 16:49:39 2008
@@ -254,10 +254,12 @@
sql = switch_mprintf("delete from channels where uuid='%q'", switch_event_get_header(event, "unique-id"));
break;
case SWITCH_EVENT_CHANNEL_CREATE:
- sql = switch_mprintf("insert into channels (uuid,created,name,state) values('%q','%q','%q','%q')",
+ sql = switch_mprintf("insert into channels (uuid,created,created_epoch, name,state) values('%q','%q','%ld','%q','%q')",
switch_event_get_header(event, "unique-id"),
switch_event_get_header(event, "event-date-local"),
- switch_event_get_header(event, "channel-name"), switch_event_get_header(event, "channel-state")
+ (long)switch_timestamp(NULL),
+ switch_event_get_header(event, "channel-name"),
+ switch_event_get_header(event, "channel-state")
);
break;
case SWITCH_EVENT_CODEC:
@@ -305,7 +307,9 @@
}
break;
case SWITCH_EVENT_CHANNEL_BRIDGE:
- sql = switch_mprintf("insert into calls values ('%s','%q','%q','%q','%q','%s','%q','%q','%q','%q','%s')",
+ sql = switch_mprintf("insert into calls values ('%s', '%ld', '%s','%q','%q','%q','%q','%s','%q','%q','%q','%q','%s')",
+ switch_event_get_header(event, "event-date-local"),
+ (long)switch_timestamp(NULL),
switch_event_get_header(event, "event-calling-function"),
switch_event_get_header(event, "caller-caller-id-name"),
switch_event_get_header(event, "caller-caller-id-number"),
@@ -362,10 +366,16 @@
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error Opening DB!\n");
switch_clear_flag((&runtime), SCF_USE_SQL);
} else {
+ char create_complete_sql[] =
+ "CREATE TABLE complete (\n"
+ " name VARCHAR(255)\n"
+ ");\n";
+
char create_channels_sql[] =
"CREATE TABLE channels (\n"
" uuid VARCHAR(255),\n"
" created VARCHAR(255),\n"
+ " created_epoch INTEGER,\n"
" name VARCHAR(255),\n"
" state VARCHAR(255),\n"
" cid_name VARCHAR(255),\n"
@@ -374,10 +384,16 @@
" dest VARCHAR(255),\n"
" application VARCHAR(255),\n"
" application_data VARCHAR(255),\n"
- " read_codec VARCHAR(255),\n" " read_rate VARCHAR(255),\n" " write_codec VARCHAR(255),\n" " write_rate VARCHAR(255)\n" ");\n";
+ " read_codec VARCHAR(255),\n"
+ " read_rate VARCHAR(255),\n"
+ " write_codec VARCHAR(255),\n"
+ " write_rate VARCHAR(255)\n"
+ ");\n";
char create_calls_sql[] =
"CREATE TABLE calls (\n"
" function VARCHAR(255),\n"
+ " created VARCHAR(255),\n"
+ " created_epoch INTEGER,\n"
" caller_cid_name VARCHAR(255),\n"
" caller_cid_num VARCHAR(255),\n"
" caller_dest_num VARCHAR(255),\n"
@@ -385,15 +401,24 @@
" caller_uuid VARCHAR(255),\n"
" callee_cid_name VARCHAR(255),\n"
" callee_cid_num VARCHAR(255),\n"
- " callee_dest_num VARCHAR(255),\n" " callee_chan_name VARCHAR(255),\n" " callee_uuid VARCHAR(255)\n" ");\n";
+ " callee_dest_num VARCHAR(255),\n"
+ " callee_chan_name VARCHAR(255),\n"
+ " callee_uuid VARCHAR(255)\n"
+ ");\n";
char create_interfaces_sql[] =
"CREATE TABLE interfaces (\n"
" type VARCHAR(255),\n"
- " name VARCHAR(255),\n" " description VARCHAR(255),\n" " syntax VARCHAR(255)\n" ");\n";
+ " name VARCHAR(255),\n"
+ " description VARCHAR(255),\n"
+ " syntax VARCHAR(255)\n"
+ ");\n";
char create_tasks_sql[] =
"CREATE TABLE tasks (\n"
" task_id INTEGER(4),\n"
- " task_desc VARCHAR(255),\n" " task_group VARCHAR(255),\n" " task_sql_manager INTEGER(8)\n" ");\n";
+ " task_desc VARCHAR(255),\n"
+ " task_group VARCHAR(255),\n"
+ " task_sql_manager INTEGER(8)\n"
+ ");\n";
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Opening DB\n");
switch_core_db_exec(sql_manager.db, "drop table channels", NULL, NULL, NULL);
@@ -405,6 +430,7 @@
switch_core_db_exec(sql_manager.db, "PRAGMA cache_size=8000", NULL, NULL, NULL);
switch_core_db_exec(sql_manager.db, "PRAGMA temp_store=MEMORY;", NULL, NULL, NULL);
+ switch_core_db_exec(sql_manager.db, create_complete_sql, NULL, NULL, NULL);
switch_core_db_exec(sql_manager.db, create_channels_sql, NULL, NULL, NULL);
switch_core_db_exec(sql_manager.db, create_calls_sql, NULL, NULL, NULL);
switch_core_db_exec(sql_manager.db, create_interfaces_sql, NULL, NULL, NULL);
More information about the Freeswitch-svn
mailing list