mirror of
				https://github.com/asterisk/asterisk.git
				synced 2025-10-31 02:37:10 +00:00 
			
		
		
		
	Add DB_KEYS.
Discussion on #asterisk on 2011-01-19: (02:07:03 PM) boch: i wonder how to cycle all entries in a tree (02:07:11 PM) leifmadsen: use While() (02:07:17 PM) leifmadsen: you need to know the tree structure already though (02:07:36 PM) boch: what you mean? (02:09:02 PM) leifmadsen: you need to know the structure prior to looping, because you can't just return the structure from the dialplan (02:09:43 PM) leifmadsen: the only way I can think of doing that is via something like writing the output of: asterisk -rx "database show" to a file, then looping through that to know the structure of the database and check everything (02:09:59 PM) leifmadsen: but at that point you're better off just using either a relational database or an external script (02:10:13 PM) boch: for example i need to know all entries in the tree (02:10:15 PM) boch: got it (02:10:20 PM) leifmadsen: exactly (02:10:22 PM) leifmadsen: that's the problem (02:10:22 PM) boch: thank you (02:13:09 PM) mateu: yeah, i'm surprised there isn't something from the dialplan like 'database show family' so one can get all keys in a family to loop over. (02:15:35 PM) leifmadsen: database shows everything (02:16:22 PM) mateu: i mean something from the dial plan that mimics 'database show <family>' (02:16:41 PM) leifmadsen: guess no one has found that important enough to program :) (02:16:52 PM) leifmadsen: at that point you should probably just use a relational database... (02:17:10 PM) mateu: i dunno (02:17:16 PM) mateu: seems pretty basic to me. (02:17:16 PM) leifmadsen: me either (02:17:19 PM) leifmadsen: sure does (02:17:24 PM) leifmadsen: no one has programmed it though (02:17:28 PM) ***leifmadsen shrugs (02:17:43 PM) mateu: ok, well at least we know how it currently stands. thanks leifmadsen (02:28:52 PM) Corydon76-home: leifmadsen: something like HASHKEYS() ? (02:30:11 PM) leifmadsen: Corydon76-home: ummm, I was thinking more like DUNDI_QUERY() and DUNDI_RESULT() (02:30:31 PM) leifmadsen: although HASHKEYS() might work (02:30:58 PM) leifmadsen: actually ya, looking at it, similar to HASHKEYS() (02:31:01 PM) leifmadsen: DBKEYS() I guess? (02:31:45 PM) Corydon76-home: So with no argument, retrieves families, with an argument, retrieves keys of that family? (02:34:02 PM) leifmadsen: ya (02:34:16 PM) leifmadsen: how would you iterate through layers of them? (02:34:30 PM) leifmadsen: i.e. family/key/key/key ? (02:34:43 PM) Corydon76-home: Essentially, yes git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@303198 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
		| @@ -81,6 +81,19 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$") | ||||
| 			<ref type="function">DB</ref> | ||||
| 		</see-also> | ||||
| 	</function> | ||||
| 	<function name="DB_KEYS" language="en_US"> | ||||
| 		<synopsis> | ||||
| 			Obtain a list of keys within the Asterisk database. | ||||
| 		</synopsis> | ||||
| 		<syntax> | ||||
| 			<parameter name="prefix" /> | ||||
| 		</syntax> | ||||
| 		<description> | ||||
| 			<para>This function will return a comma-separated list of keys existing | ||||
| 			at the prefix specified within the Asterisk database.  If no argument is | ||||
| 			provided, then a list of key families will be returned.</para> | ||||
| 		</description> | ||||
| 	</function> | ||||
| 	<function name="DB_DELETE" language="en_US"> | ||||
| 		<synopsis> | ||||
| 			Return a value from the database and delete it. | ||||
| @@ -204,6 +217,61 @@ static struct ast_custom_function db_exists_function = { | ||||
| 	.read_max = 2, | ||||
| }; | ||||
|  | ||||
| static int function_db_keys(struct ast_channel *chan, const char *cmd, char *parse, struct ast_str **result, ssize_t maxlen) | ||||
| { | ||||
| 	size_t parselen = strlen(parse); | ||||
| 	struct ast_db_entry *dbe, *orig_dbe; | ||||
| 	struct ast_str *escape_buf = NULL; | ||||
| 	const char *last = ""; | ||||
|  | ||||
| 	/* Remove leading and trailing slashes */ | ||||
| 	while (parse[0] == '/') { | ||||
| 		parse++; | ||||
| 		parselen--; | ||||
| 	} | ||||
| 	while (parse[parselen - 1] == '/') { | ||||
| 		parse[--parselen] = '\0'; | ||||
| 	} | ||||
|  | ||||
| 	ast_str_reset(*result); | ||||
|  | ||||
| 	/* Nothing within the database at that prefix? */ | ||||
| 	if (!(orig_dbe = dbe = ast_db_gettree(parse, NULL))) { | ||||
| 		return 0; | ||||
| 	} | ||||
|  | ||||
| 	for (; dbe; dbe = dbe->next) { | ||||
| 		/* Find the current component */ | ||||
| 		char *curkey = &dbe->key[parselen + 1], *slash; | ||||
| 		if (*curkey == '/') { | ||||
| 			curkey++; | ||||
| 		} | ||||
| 		/* Remove everything after the current component */ | ||||
| 		if ((slash = strchr(curkey, '/'))) { | ||||
| 			*slash = '\0'; | ||||
| 		} | ||||
|  | ||||
| 		/* Skip duplicates */ | ||||
| 		if (!strcasecmp(last, curkey)) { | ||||
| 			continue; | ||||
| 		} | ||||
| 		last = curkey; | ||||
|  | ||||
| 		if (orig_dbe != dbe) { | ||||
| 			ast_str_append(result, maxlen, ","); | ||||
| 		} | ||||
| 		ast_str_append_escapecommas(result, maxlen, curkey, strlen(curkey)); | ||||
| 	} | ||||
| 	ast_db_freetree(orig_dbe); | ||||
| 	ast_free(escape_buf); | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| static struct ast_custom_function db_keys_function = { | ||||
| 	.name = "DB_KEYS", | ||||
| 	.read2 = function_db_keys, | ||||
| }; | ||||
|  | ||||
| static int function_db_delete(struct ast_channel *chan, const char *cmd, | ||||
| 			      char *parse, char *buf, size_t len) | ||||
| { | ||||
| @@ -252,6 +320,7 @@ static int unload_module(void) | ||||
| 	res |= ast_custom_function_unregister(&db_function); | ||||
| 	res |= ast_custom_function_unregister(&db_exists_function); | ||||
| 	res |= ast_custom_function_unregister(&db_delete_function); | ||||
| 	res |= ast_custom_function_unregister(&db_keys_function); | ||||
|  | ||||
| 	return res; | ||||
| } | ||||
| @@ -263,6 +332,7 @@ static int load_module(void) | ||||
| 	res |= ast_custom_function_register(&db_function); | ||||
| 	res |= ast_custom_function_register(&db_exists_function); | ||||
| 	res |= ast_custom_function_register(&db_delete_function); | ||||
| 	res |= ast_custom_function_register(&db_keys_function); | ||||
|  | ||||
| 	return res; | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user