mirror of
https://github.com/asterisk/asterisk.git
synced 2026-07-04 05:55:58 -07:00
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/branches/1.8@374426 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
@@ -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, };
|
||||
@@ -460,7 +470,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:
|
||||
@@ -479,14 +489,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;
|
||||
}
|
||||
@@ -751,23 +763,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;
|
||||
}
|
||||
|
||||
|
||||
+9
-7
@@ -2692,16 +2692,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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user