提交 d6374535 authored 作者: Marc Olivier Chouinard's avatar Marc Olivier Chouinard

FS-3029 --resolve

上级 377fb371
...@@ -3516,6 +3516,22 @@ static switch_status_t cmd_profile(char **argv, int argc, switch_stream_handle_t ...@@ -3516,6 +3516,22 @@ static switch_status_t cmd_profile(char **argv, int argc, switch_stream_handle_t
goto done; goto done;
} }
if (!strcasecmp(argv[1], "recover")) {
if (argv[2] && !strcasecmp(argv[2], "flush")) {
sofia_glue_profile_recover(profile, SWITCH_TRUE);
stream->write_function(stream, "Flushing recovery database.\n");
} else {
int x = sofia_glue_profile_recover(profile, SWITCH_FALSE);
if (x) {
stream->write_function(stream, "Recovered %d call(s)\n", x);
} else {
stream->write_function(stream, "No calls to recover.\n");
}
}
goto done;
}
if (!strcasecmp(argv[1], "register")) { if (!strcasecmp(argv[1], "register")) {
char *gname = argv[2]; char *gname = argv[2];
......
...@@ -1120,6 +1120,7 @@ int sofia_sla_supported(sip_t const *sip); ...@@ -1120,6 +1120,7 @@ int sofia_sla_supported(sip_t const *sip);
void sofia_glue_tech_untrack(sofia_profile_t *profile, switch_core_session_t *session, switch_bool_t force); void sofia_glue_tech_untrack(sofia_profile_t *profile, switch_core_session_t *session, switch_bool_t force);
void sofia_glue_tech_track(sofia_profile_t *profile, switch_core_session_t *session); void sofia_glue_tech_track(sofia_profile_t *profile, switch_core_session_t *session);
int sofia_glue_recover(switch_bool_t flush); int sofia_glue_recover(switch_bool_t flush);
int sofia_glue_profile_recover(sofia_profile_t *profile, switch_bool_t flush);
void sofia_profile_destroy(sofia_profile_t *profile); void sofia_profile_destroy(sofia_profile_t *profile);
switch_status_t sip_dig_function(_In_opt_z_ const char *cmd, _In_opt_ switch_core_session_t *session, _In_ switch_stream_handle_t *stream); switch_status_t sip_dig_function(_In_opt_z_ const char *cmd, _In_opt_ switch_core_session_t *session, _In_ switch_stream_handle_t *stream);
const char *sofia_gateway_status_name(sofia_gateway_status_t status); const char *sofia_gateway_status_name(sofia_gateway_status_t status);
......
...@@ -5715,7 +5715,6 @@ static int recover_callback(void *pArg, int argc, char **argv, char **columnName ...@@ -5715,7 +5715,6 @@ static int recover_callback(void *pArg, int argc, char **argv, char **columnName
int sofia_glue_recover(switch_bool_t flush) int sofia_glue_recover(switch_bool_t flush)
{ {
sofia_profile_t *profile; sofia_profile_t *profile;
char *sql;
int r = 0; int r = 0;
switch_console_callback_match_t *matches; switch_console_callback_match_t *matches;
...@@ -5724,34 +5723,44 @@ int sofia_glue_recover(switch_bool_t flush) ...@@ -5724,34 +5723,44 @@ int sofia_glue_recover(switch_bool_t flush)
switch_console_callback_match_node_t *m; switch_console_callback_match_node_t *m;
for (m = matches->head; m; m = m->next) { for (m = matches->head; m; m = m->next) {
if ((profile = sofia_glue_find_profile(m->val))) { if ((profile = sofia_glue_find_profile(m->val))) {
r += sofia_glue_profile_recover(profile, flush);
}
}
switch_console_free_matches(&matches);
}
return r;
}
struct recover_helper h = { 0 }; int sofia_glue_profile_recover(sofia_profile_t *profile, switch_bool_t flush)
h.profile = profile; {
h.total = 0; char *sql;
int r = 0;
sofia_clear_pflag_locked(profile, PFLAG_STANDBY); if (profile) {
struct recover_helper h = { 0 };
h.profile = profile;
h.total = 0;
if (flush) { sofia_clear_pflag_locked(profile, PFLAG_STANDBY);
sql = switch_mprintf("delete from sip_recovery where profile_name='%q'", profile->name);
sofia_glue_execute_sql_now(profile, &sql, SWITCH_TRUE);
} else {
sql = switch_mprintf("select profile_name, hostname, uuid, metadata " if (flush) {
"from sip_recovery where runtime_uuid!='%q' and profile_name='%q'", switch_core_get_uuid(), profile->name); sql = switch_mprintf("delete from sip_recovery where profile_name='%q'", profile->name);
sofia_glue_execute_sql_now(profile, &sql, SWITCH_TRUE);
} else {
sofia_glue_execute_sql_callback(profile, profile->ireg_mutex, sql, recover_callback, &h); sql = switch_mprintf("select profile_name, hostname, uuid, metadata "
r += h.total; "from sip_recovery where runtime_uuid!='%q' and profile_name='%q'", switch_core_get_uuid(), profile->name);
free(sql);
sql = NULL;
sql = switch_mprintf("delete " sofia_glue_execute_sql_callback(profile, profile->ireg_mutex, sql, recover_callback, &h);
"from sip_recovery where runtime_uuid!='%q' and profile_name='%q'", switch_core_get_uuid(), profile->name); r += h.total;
free(sql);
sql = NULL;
sofia_glue_execute_sql_now(profile, &sql, SWITCH_TRUE); sql = switch_mprintf("delete "
} "from sip_recovery where runtime_uuid!='%q' and profile_name='%q'", switch_core_get_uuid(), profile->name);
}
sofia_glue_execute_sql_now(profile, &sql, SWITCH_TRUE);
} }
switch_console_free_matches(&matches);
} }
return r; return r;
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论