From d6374535526b6f9deb05a3fc9c220b530402f31a Mon Sep 17 00:00:00 2001 From: Marc Olivier Chouinard Date: Fri, 23 Dec 2011 16:07:33 -0500 Subject: [PATCH] FS-3029 --resolve --- src/mod/endpoints/mod_sofia/mod_sofia.c | 16 +++++++ src/mod/endpoints/mod_sofia/mod_sofia.h | 1 + src/mod/endpoints/mod_sofia/sofia_glue.c | 61 ++++++++++++++---------- 3 files changed, 52 insertions(+), 26 deletions(-) diff --git a/src/mod/endpoints/mod_sofia/mod_sofia.c b/src/mod/endpoints/mod_sofia/mod_sofia.c index b748e6147e..c02f1f8ee1 100644 --- a/src/mod/endpoints/mod_sofia/mod_sofia.c +++ b/src/mod/endpoints/mod_sofia/mod_sofia.c @@ -3516,6 +3516,22 @@ static switch_status_t cmd_profile(char **argv, int argc, switch_stream_handle_t 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")) { char *gname = argv[2]; diff --git a/src/mod/endpoints/mod_sofia/mod_sofia.h b/src/mod/endpoints/mod_sofia/mod_sofia.h index 984c80f39f..490fe1a9d4 100644 --- a/src/mod/endpoints/mod_sofia/mod_sofia.h +++ b/src/mod/endpoints/mod_sofia/mod_sofia.h @@ -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_track(sofia_profile_t *profile, switch_core_session_t *session); 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); 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); diff --git a/src/mod/endpoints/mod_sofia/sofia_glue.c b/src/mod/endpoints/mod_sofia/sofia_glue.c index 472efe9003..a2b2580f1f 100644 --- a/src/mod/endpoints/mod_sofia/sofia_glue.c +++ b/src/mod/endpoints/mod_sofia/sofia_glue.c @@ -5715,7 +5715,6 @@ static int recover_callback(void *pArg, int argc, char **argv, char **columnName int sofia_glue_recover(switch_bool_t flush) { sofia_profile_t *profile; - char *sql; int r = 0; switch_console_callback_match_t *matches; @@ -5724,35 +5723,45 @@ int sofia_glue_recover(switch_bool_t flush) switch_console_callback_match_node_t *m; for (m = matches->head; m; m = m->next) { if ((profile = sofia_glue_find_profile(m->val))) { - - struct recover_helper h = { 0 }; - h.profile = profile; - h.total = 0; - - sofia_clear_pflag_locked(profile, PFLAG_STANDBY); - - if (flush) { - 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 " - "from sip_recovery where runtime_uuid!='%q' and profile_name='%q'", switch_core_get_uuid(), profile->name); - - sofia_glue_execute_sql_callback(profile, profile->ireg_mutex, sql, recover_callback, &h); - r += h.total; - free(sql); - sql = NULL; - - 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); - } + r += sofia_glue_profile_recover(profile, flush); } } switch_console_free_matches(&matches); } + return r; +} + +int sofia_glue_profile_recover(sofia_profile_t *profile, switch_bool_t flush) +{ + char *sql; + int r = 0; + + if (profile) { + struct recover_helper h = { 0 }; + h.profile = profile; + h.total = 0; + + sofia_clear_pflag_locked(profile, PFLAG_STANDBY); + + if (flush) { + 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 " + "from sip_recovery where runtime_uuid!='%q' and profile_name='%q'", switch_core_get_uuid(), profile->name); + + sofia_glue_execute_sql_callback(profile, profile->ireg_mutex, sql, recover_callback, &h); + r += h.total; + free(sql); + sql = NULL; + + 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); + } + } return r; }