From: David M. Lee Date: Thu, 4 Oct 2012 15:11:06 +0000 (+0000) Subject: Fix DBDelTree error codes for AMI, CLI and AGI X-Git-Tag: certified/1.8.15-cert1-rc1~3^2~15 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=675737e0ad4a04edf09134ac3d15f5a4796304c7;p=thirdparty%2Fasterisk.git Fix DBDelTree error codes for AMI, CLI and AGI The AMI DBDelTree command will return Success/Key tree deleted successfully even if the given key does not exist. The CLI command 'database deltree' had a similar problem, but was saved because it actually responded with '0 database entries removed'. AGI had a slightly different error, where it would return success if the database was unavailable. This came from confusion about the ast_db_deltree retval, which is -1 in the event of a database error, or number of entries deleted (including 0 for deleting nothing). * Adds a Doxygen comment to process_db_keys explaining its retval * Changed some poorly named res variables to num_deleted * Specified specific errors when calling ast_db_deltree (database unavailable vs. entry not found vs. success) * Fixed similar bug in AGI database deltree, where 'Database unavailable' results in successful result (closes issue AST-967) Reported by: John Bigelow Review: https://reviewboard.asterisk.org/r/2138/ git-svn-id: https://origsvn.digium.com/svn/asterisk/certified/branches/1.8.15@374424 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- diff --git a/main/db.c b/main/db.c index cf455b69c6..1c4ad1a2de 100644 --- a/main/db.c +++ b/main/db.c @@ -167,6 +167,16 @@ static inline const char *dbt_data2str_full(DBT *dbt, const char *def) return S_OR(dbt_data2str(dbt), def); } +/*! + * \internal + * \brief Invoke a callback function on all keys, using given data and filter. + * + * \param cb Callback function to invoke (itself returns number of keys it affected). + * \param data Value to pass to cb's data param. + * \param filter Value to pass to cb's filter param. + * \param sync If non-zero, call db_sync() when done. + * \return Number of keys affected by the callback, or -1 if database is unavailable. + */ static int process_db_keys(process_keys_cb cb, void *data, const char *filter, int sync) { DBT key = { 0, }, value = { 0, }, last_key = { 0, }; @@ -427,7 +437,7 @@ static char *handle_cli_database_del(struct ast_cli_entry *e, int cmd, struct as static char *handle_cli_database_deltree(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a) { - int res; + int num_deleted; switch (cmd) { case CLI_INIT: @@ -446,14 +456,16 @@ static char *handle_cli_database_deltree(struct ast_cli_entry *e, int cmd, struc if ((a->argc < 3) || (a->argc > 4)) return CLI_SHOWUSAGE; if (a->argc == 4) { - res = ast_db_deltree(a->argv[2], a->argv[3]); + num_deleted = ast_db_deltree(a->argv[2], a->argv[3]); } else { - res = ast_db_deltree(a->argv[2], NULL); + num_deleted = ast_db_deltree(a->argv[2], NULL); } - if (res < 0) { + if (num_deleted < 0) { + ast_cli(a->fd, "Database unavailable.\n"); + } else if (num_deleted == 0) { ast_cli(a->fd, "Database entries do not exist.\n"); } else { - ast_cli(a->fd, "%d database entries removed.\n",res); + ast_cli(a->fd, "%d database entries removed.\n",num_deleted); } return CLI_SUCCESS; } @@ -718,23 +730,27 @@ static int manager_dbdeltree(struct mansession *s, const struct message *m) { const char *family = astman_get_header(m, "Family"); const char *key = astman_get_header(m, "Key"); - int res; + int num_deleted; if (ast_strlen_zero(family)) { astman_send_error(s, m, "No family specified."); return 0; } - if (!ast_strlen_zero(key)) - res = ast_db_deltree(family, key); - else - res = ast_db_deltree(family, NULL); + if (!ast_strlen_zero(key)) { + num_deleted = ast_db_deltree(family, key); + } else { + num_deleted = ast_db_deltree(family, NULL); + } - if (res < 0) + if (num_deleted < 0) { + astman_send_error(s, m, "Database unavailable"); + } else if (num_deleted == 0) { astman_send_error(s, m, "Database entry not found"); - else + } else { astman_send_ack(s, m, "Key tree deleted successfully"); - + } + return 0; } diff --git a/res/res_agi.c b/res/res_agi.c index a6f8791520..a4e6603496 100644 --- a/res/res_agi.c +++ b/res/res_agi.c @@ -2689,16 +2689,18 @@ static int handle_dbdel(struct ast_channel *chan, AGI *agi, int argc, const char static int handle_dbdeltree(struct ast_channel *chan, AGI *agi, int argc, const char * const argv[]) { - int res; + int num_deleted; - if ((argc < 3) || (argc > 4)) + if ((argc < 3) || (argc > 4)) { return RESULT_SHOWUSAGE; - if (argc == 4) - res = ast_db_deltree(argv[2], argv[3]); - else - res = ast_db_deltree(argv[2], NULL); + } + if (argc == 4) { + num_deleted = ast_db_deltree(argv[2], argv[3]); + } else { + num_deleted = ast_db_deltree(argv[2], NULL); + } - ast_agi_send(agi->fd, chan, "200 result=%c\n", res ? '0' : '1'); + ast_agi_send(agi->fd, chan, "200 result=%c\n", num_deleted > 0 ? '0' : '1'); return RESULT_SUCCESS; }