]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Fix DBDelTree error codes for AMI, CLI and AGI
authorDavid M. Lee <dlee@digium.com>
Thu, 4 Oct 2012 15:37:11 +0000 (15:37 +0000)
committerDavid M. Lee <dlee@digium.com>
Thu, 4 Oct 2012 15:37:11 +0000 (15:37 +0000)
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

git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/10@374427 65c4cc65-6c06-0410-ace0-fbb531ad65f3

main/db.c
res/res_agi.c

index 97cfae3c2634ca194e24e05687ece0a7c6f19416..2ff2e7d2ec270768ae4bc0f68777aba917e788c5 100644 (file)
--- a/main/db.c
+++ b/main/db.c
@@ -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;
 }
index bec8f01a20dbf74b8781727196578ce310ee8a80..3f2464af5f112e56d7c83560790a8ef1b4b39f0e 100644 (file)
@@ -2693,16 +2693,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;
 }