mirror of
				https://github.com/asterisk/asterisk.git
				synced 2025-10-31 02:37:10 +00: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). * 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
This commit is contained in:
		
							
								
								
									
										30
									
								
								main/db.c
									
									
									
									
									
								
							
							
						
						
									
										30
									
								
								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; | ||||
| } | ||||
|   | ||||
| @@ -2785,16 +2785,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