[svn-commits] eliel: branch group/data_api_gsoc2009 r204985 - in /team/group/data_api_gsoc2...

SVN commits to the Digium repositories svn-commits at lists.digium.com
Mon Jul 6 16:29:11 CDT 2009


Author: eliel
Date: Mon Jul  6 16:29:08 2009
New Revision: 204985

URL: http://svn.asterisk.org/svn-view/asterisk?view=rev&rev=204985
Log:
Generate the search tree once and pass it to the callback, then
release it inside the data api.


Modified:
    team/group/data_api_gsoc2009/include/asterisk/data.h
    team/group/data_api_gsoc2009/main/data.c
    team/group/data_api_gsoc2009/tests/test_data.c

Modified: team/group/data_api_gsoc2009/include/asterisk/data.h
URL: http://svn.asterisk.org/svn-view/asterisk/team/group/data_api_gsoc2009/include/asterisk/data.h?view=diff&rev=204985&r1=204984&r2=204985
==============================================================================
--- team/group/data_api_gsoc2009/include/asterisk/data.h (original)
+++ team/group/data_api_gsoc2009/include/asterisk/data.h Mon Jul  6 16:29:08 2009
@@ -100,7 +100,7 @@
 /*! \brief opaque definition of an ast_data_search structure. */
 struct ast_data_search;
 
-typedef struct ast_data *(*ast_data_get_cb)(void);
+typedef struct ast_data *(*ast_data_get_cb)(const struct ast_data_search *search);
 typedef int *(*ast_data_put_cb)(void);
 typedef char **(*ast_data_tokenizer)(void);
 
@@ -137,8 +137,9 @@
 		/*! \brief Filter string, return the internal nodes specified here.
 		 *         Setting it to NULL will return every internal node. */
 		AST_STRING_FIELD(filter);
+		/*! \brief Search condition. */
+		AST_STRING_FIELD(search);
 	);
-	struct ast_data_search *search;
 };
 
 /*!
@@ -186,18 +187,6 @@
 #define ast_data_unregister(path) __ast_data_unregister(path, __FILE__)
 
 /*!
- * \brief Generate a search structure.
- * XXX
- */
-struct ast_data_search *ast_data_search_create(const char *search_format, ...);
-
-/*!
- * \brief Release a search structure.
- * XXX
- */
-void ast_data_search_release(struct ast_data_search *search_query);
-
-/*!
  * \brief Retrieve a subtree from the asterisk data API.
  * \param[in] query The query structure specifying what nodes to retrieve.
  * \retval NULL on error.

Modified: team/group/data_api_gsoc2009/main/data.c
URL: http://svn.asterisk.org/svn-view/asterisk/team/group/data_api_gsoc2009/main/data.c?view=diff&rev=204985&r1=204984&r2=204985
==============================================================================
--- team/group/data_api_gsoc2009/main/data.c (original)
+++ team/group/data_api_gsoc2009/main/data.c Mon Jul  6 16:29:08 2009
@@ -90,20 +90,8 @@
 
 /*! \brief The list of nodes with their search requirement. */
 struct ast_data_search {
-	/*! \brief The data type we are trying to
-	 * compare. */
-	enum ast_data_type value_type;
-
-	/* The value we are trying to compare. */
-	union {
-		int32_t sint;
-		uint32_t uint;
-		double dbl;
-		unsigned int boolean:1;
-		char *str;
-		struct in_addr ipaddr;
-		void *ptr;
-	} value;
+	/*! \brief The value of the comparison. */
+	void *value;
 
 	/*! \brief The type of comparison. */
 	enum data_search_comparison cmp_type;
@@ -604,27 +592,29 @@
 }
 #endif
 
-struct ast_data_search *ast_data_search_create(const char *search_format, ...)
-{
-	va_list values;
-	struct ast_str *name, *format, *comparison;
-	char *elements, *search_format_dup;
+/*!
+ * \internal
+ * \brief Allocate a tree with the search string parsed.
+ * \TODO complete documentation.
+ */
+static struct ast_data_search *data_search_parse(const char *search_string)
+{
+	struct ast_str *name, *value, *comparison;
+	char *elements, *search_string_dup;
 	int i;
 
-	if (!search_format) {
+	if (!search_string) {
 		ast_log(LOG_ERROR, "You must pass a valid search string.\n");
 		return NULL;
 	}
 
 	name = ast_str_alloca(64);
-	format = ast_str_alloca(64);
+	value = ast_str_alloca(256);
 	comparison = ast_str_alloca(64);
 
-	va_start(values, search_format);
-
-	search_format_dup = ast_strdupa(search_format);
-
-	elements = strtok(search_format_dup, ",");
+	search_string_dup = ast_strdupa(search_string);
+
+	elements = strtok(search_string_dup, ",");
 
 	while (elements) {
 		/* Parse the name */
@@ -644,36 +634,34 @@
 
 		/* parse the comparison string. */
 		ast_str_reset(comparison);
-		for (; elements[i] != '%' && elements[i]; i++) {
+		for (; data_search_comparison_char(elements[i]) && elements[i]; i++) {
 			ast_str_append(&comparison, 0, "%c", elements[i]);
 		}
 
-		/* check if the syntax is ok. */
-		if (elements[i] != '%') {
-			ast_log(LOG_ERROR, "Invalid search string!\n");
-			break;
-		}
-
-		/* parse the format string. */
-		ast_str_reset(format);
+		/* parse the value string. */
+		ast_str_reset(value);
 		for (; elements[i]; i++) {
-			ast_str_append(&format, 0, "%c", elements[i]);
+			ast_str_append(&value, 0, "%c", elements[i]);
 		}
 
 		ast_log(LOG_ERROR, "NAME = %s\n", ast_str_buffer(name));
-		ast_log(LOG_ERROR, "FORMAT = %s\n", ast_str_buffer(format));
+		ast_log(LOG_ERROR, "VALUE = %s\n", ast_str_buffer(value));
 		ast_log(LOG_ERROR, "CMP = %s\n", ast_str_buffer(comparison));
 
 		/* add this node to the tree. */
 
 		elements = strtok(NULL, ",");
 	}
-	va_end(values);
 
 	return NULL;
 }
 
-void ast_data_search_release(struct ast_data_search *search)
+/*!
+ * \internal
+ * \brief
+ * \TODO complete documentation.
+ */
+static void data_search_release(struct ast_data_search *search)
 {
 
 }
@@ -809,7 +797,8 @@
 static struct ast_data *__data_result_generate_node(const struct ast_data_query *query,
 	const struct data_provider *root_provider,
 	const char *parent_node_name,
-	struct data_filter *filter)
+	struct data_filter *filter,
+	const struct ast_data_search *search)
 {
 	struct ast_data *generated, *node;
 	struct ao2_iterator i;
@@ -827,7 +816,7 @@
 
 	/* if this is a terminal node, just run the callback function. */
 	if (root_provider->handler && root_provider->handler->get) {
-		generated = root_provider->handler->get();
+		generated = root_provider->handler->get(search);
 		if (generated) {
 			data_result_add_child(node, generated);
 			ao2_ref(generated, -1);
@@ -844,7 +833,7 @@
 	/* if this is not a terminal node, generate every child node. */
 	i = ao2_iterator_init(root_provider->children, 0);
 	while ((provider = ao2_iterator_next(&i))) {
-		generated = __data_result_generate_node(query, provider, provider->name, filter);
+		generated = __data_result_generate_node(query, provider, provider->name, filter, search);
 		if (generated) {
 			data_result_add_child(node, generated);
 			ao2_ref(generated, -1);
@@ -861,14 +850,16 @@
  * \param[in] query The query executed.
  * \param[in] root_provider The provider specified in the path of the query.
  * \param[in] parent_node_name The root node name.
+ * \param[in] search
  * \retval NULL on error.
  * \retval non-NULL The generated result tree.
  */
 static struct ast_data *data_result_generate_node(const struct ast_data_query *query,
 	const struct data_provider *root_provider,
-	const char *parent_node_name)
-{
-	return __data_result_generate_node(query, root_provider, parent_node_name, NULL);
+	const char *parent_node_name,
+	const struct ast_data_search *search)
+{
+	return __data_result_generate_node(query, root_provider, parent_node_name, NULL, search);
 }
 
 /*!
@@ -885,6 +876,7 @@
 	char *node_name, *tmp_path;
 	struct data_provider *provider_child, *tmp_provider_child;
 	struct ast_data *result;
+	struct ast_data_search *search = NULL;
 
 	if (!search_path) {
 		/* generate all the trees?. */
@@ -919,9 +911,17 @@
 		return NULL;
 	}
 
-	result = data_result_generate_node(query, provider_child, provider_child->name);
+	if (query->search) {
+		search = data_search_parse(query->search);
+	}
+
+	result = data_result_generate_node(query, provider_child, provider_child->name, search);
 
 	ao2_ref(provider_child, -1);
+
+	if (search) {
+		data_search_release(search);
+	}
 
 	return result;
 }

Modified: team/group/data_api_gsoc2009/tests/test_data.c
URL: http://svn.asterisk.org/svn-view/asterisk/team/group/data_api_gsoc2009/tests/test_data.c?view=diff&rev=204985&r1=204984&r2=204985
==============================================================================
--- team/group/data_api_gsoc2009/tests/test_data.c (original)
+++ team/group/data_api_gsoc2009/tests/test_data.c Mon Jul  6 16:29:08 2009
@@ -39,7 +39,7 @@
 #include "asterisk/cli.h"
 #include "asterisk/data.h"
 
-static struct ast_data *test_data_full_provider(void)
+static struct ast_data *test_data_full_provider(const struct ast_data_search *search)
 {
 	struct ast_data *res, *internal;
 
@@ -62,7 +62,7 @@
 	return res;
 }
 
-static struct ast_data *test_data_null_provider(void)
+static struct ast_data *test_data_null_provider(const struct ast_data_search *search)
 {
 	return NULL;
 }
@@ -93,7 +93,6 @@
 	struct ast_data_query query_null = {
 		.version = AST_DATA_QUERY_VERSION,
 		.path = "test/null",
-		.search = ast_data_search_create("test/prueba=%d,test/otraprueba=%d", cmd, cmd)
 	};
 	struct ast_data_query query_full = {
 		.version = AST_DATA_QUERY_VERSION,
@@ -138,7 +137,8 @@
 	struct ast_data_iterator *i;
 	struct ast_data_query query = {
 		.version = AST_DATA_QUERY_VERSION,
-		.path = "test",
+		.path = "test/node1/node11/node111",
+		.search = "node111/root_test/data1=10"
 	};
 
 	switch (cmd) {




More information about the svn-commits mailing list