[asterisk-commits] tilghman: trunk r303198 - in /trunk: CHANGES funcs/func_db.c

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Fri Jan 21 02:13:23 CST 2011


Author: tilghman
Date: Fri Jan 21 02:13:18 2011
New Revision: 303198

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=303198
Log:
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

Modified:
    trunk/CHANGES
    trunk/funcs/func_db.c

Modified: trunk/CHANGES
URL: http://svnview.digium.com/svn/asterisk/trunk/CHANGES?view=diff&rev=303198&r1=303197&r2=303198
==============================================================================
--- trunk/CHANGES (original)
+++ trunk/CHANGES Fri Jan 21 02:13:18 2011
@@ -39,6 +39,11 @@
  * Added ASTETCDIR, ASTMODDIR, ASTVARLIBDIR, ASTDBDIR, ASTKEYDIR, ASTDATADIR,
    ASTAGIDIR, ASTSPOOLDIR, ASTRUNDIR, ASTLOGDIR which hold the equivalent
    variables from asterisk.conf.
+
+Dialplan Functions
+------------------
+ * Added DB_KEYS, which lists the next set of keys in the Asterisk database
+   hierarchy.
 
 libpri channel driver (chan_dahdi) DAHDI changes
 --------------------------

Modified: trunk/funcs/func_db.c
URL: http://svnview.digium.com/svn/asterisk/trunk/funcs/func_db.c?view=diff&rev=303198&r1=303197&r2=303198
==============================================================================
--- trunk/funcs/func_db.c (original)
+++ trunk/funcs/func_db.c Fri Jan 21 02:13:18 2011
@@ -81,6 +81,19 @@
 			<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 @@
 	.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 @@
 	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 @@
 	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;
 }




More information about the asterisk-commits mailing list