diff options
author | David M. Lee <dlee@digium.com> | 2012-10-04 15:48:24 +0000 |
---|---|---|
committer | David M. Lee <dlee@digium.com> | 2012-10-04 15:48:24 +0000 |
commit | c5acf22cec226026b7316a328d0fdd06fa9eb5b8 (patch) | |
tree | 43cd224c6eb424e83341579fbae405bd50d7778b /main/db.c | |
parent | d78f7f92b2afa033ff959e84bf164454ca9a5de8 (diff) |
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).
* 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/
........
Merged revisions 374426 from http://svn.asterisk.org/svn/asterisk/branches/1.8
........
Merged revisions 374427 from http://svn.asterisk.org/svn/asterisk/branches/10
........
Merged revisions 374428 from http://svn.asterisk.org/svn/asterisk/branches/11
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@374429 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'main/db.c')
-rw-r--r-- | main/db.c | 30 |
1 files changed, 18 insertions, 12 deletions
@@ -589,7 +589,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: @@ -608,14 +608,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; } @@ -873,22 +875,26 @@ 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; } |