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

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


Author: eliel
Date: Mon Jul 13 11:11:24 2009
New Revision: 206184

URL: http://svn.asterisk.org/svn-view/asterisk?view=rev&rev=206184
Log:
Compare a structure in a "atomic" way.


Modified:
    team/group/data_api_gsoc2009/apps/app_queue.c
    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/apps/app_queue.c
URL: http://svn.asterisk.org/svn-view/asterisk/team/group/data_api_gsoc2009/apps/app_queue.c?view=diff&rev=206184&r1=206183&r2=206184
==============================================================================
--- team/group/data_api_gsoc2009/apps/app_queue.c (original)
+++ team/group/data_api_gsoc2009/apps/app_queue.c Mon Jul 13 11:11:24 2009
@@ -7493,6 +7493,15 @@
 	while ((queue = ao2_iterator_next(&i))) {
 		ao2_lock(queue);
 
+		/* compare the search pattern. */
+		if (ast_data_search_cmp_structure(search, call_queue, queue, "queues/queue")) {
+			/* this doesn't match! continue! */
+			ao2_unlock(queue);
+			queue_unref(queue);
+			continue;
+		}
+
+
 		data_queue = ast_data_add_node(data_root, "queue");
 		if (!data_queue) {
 			ao2_unlock(queue);

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=206184&r1=206183&r2=206184
==============================================================================
--- team/group/data_api_gsoc2009/include/asterisk/data.h (original)
+++ team/group/data_api_gsoc2009/include/asterisk/data.h Mon Jul 13 11:11:24 2009
@@ -112,9 +112,6 @@
 	ast_data_get_cb get;
 	/*! \brief Data put callback implementation. */
 	ast_data_put_cb put;
-	/*! \brief The tokenizer is used to retrieve from the node generator
-	 *         the list of possible attributes in the search string. */
-	ast_data_tokenizer tokenizer;
 };
 
 /*! \brief This entries are for multiple registers. */
@@ -161,10 +158,10 @@
 };
 
 /* Generate the structure and the functions to access the members of a structure. */
-#define AST_DATA_STRUCTURE(__struct, __name)							\
-	__name(__AST_DATA_MAPPING_FUNCTION);							\
-	struct ast_data_mapping_structure __data_mapping_structure_##__struct[] = {		\
-		__name(__AST_DATA_MAPPING_STRUCTURE)						\
+#define AST_DATA_STRUCTURE(__struct, __name)								\
+	__name(__AST_DATA_MAPPING_FUNCTION);								\
+	static const struct ast_data_mapping_structure __data_mapping_structure_##__struct[] = {	\
+		__name(__AST_DATA_MAPPING_STRUCTURE)							\
 	}
 
 /* Generate the structure to access the members and setup the pointer of the getter. */
@@ -280,10 +277,16 @@
  * \param[in] mapping The structure mapping.
  * \param[in] mapping_len The lenght of the structure mapping.
  * \param[in] structure The structure pointer.
- */
-int ast_data_search_cmp_structure(struct ast_data_search *search,
-	struct ast_data_mapping_structure *mapping, size_t mapping_len,
-	void *structure);
+ * \param[in] structure_name The name of the structure to compare.
+ * \retval 0 If the structure matches.
+ * \retval 1 If the structure doesn't match.
+ */
+int __ast_data_search_cmp_structure(const struct ast_data_search *search,
+	const struct ast_data_mapping_structure *mapping, size_t mapping_len,
+	void *structure, const char *structure_name);
+#define ast_data_search_cmp_structure(search, structure_name, structure, structure_name_cmp)		\
+	__ast_data_search_cmp_structure(search, __data_mapping_structure_##structure_name,		\
+	ARRAY_LEN(__data_mapping_structure_##structure_name), structure, structure_name_cmp)
 
 /*!
  * \brief Retrieve a subtree from the asterisk data API.

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=206184&r1=206183&r2=206184
==============================================================================
--- team/group/data_api_gsoc2009/main/data.c (original)
+++ team/group/data_api_gsoc2009/main/data.c Mon Jul 13 11:11:24 2009
@@ -1023,21 +1023,83 @@
 	return data_search_comparison_result(node_value - value, cmp_type);
 }
 
-int ast_data_search_cmp_structure(struct ast_data_search *search,
-	struct ast_data_mapping_structure *mapping, size_t mapping_len,
-	void *structure)
+/*!
+ * \internal
+ * \brief Get the member pointer, from a mapping structure, based on its name.
+ * \XXX We will need to improve performance here!!.
+ * \retval <0 if the member was not found.
+ * \retval >=0 The member position in the mapping structure.
+ */
+static inline int data_search_mapping_find(const struct ast_data_mapping_structure *mapping,
+	size_t mapping_len,
+	const char *member_name)
+{
+	int i;
+
+	for (i = 0; i < mapping_len; i++) {
+		if (!strcmp(mapping[i].name, member_name)) {
+			return i;
+		}
+	}
+
+	return -1;
+}
+
+int __ast_data_search_cmp_structure(const struct ast_data_search *search,
+	const struct ast_data_mapping_structure *mapping, size_t mapping_len,
+	void *structure, const char *structure_name)
 {
 	struct ao2_iterator i;
-	struct ast_data_search *node;
-
-	i = ao2_iterator_init(search->children, 0);
+	struct ast_data_search *node, *struct_children;
+	int member, notmatch = 0;
+
+	if (!search) {
+		return 0;
+	}
+
+	struct_children = data_search_get_node(search, structure_name);
+	if (!struct_children) {
+		return 0;
+	}
+
+	i = ao2_iterator_init(struct_children->children, 0);
 	while ((node = ao2_iterator_next(&i))) {
-		/* XXX compare every member of the structure */
+		member = data_search_mapping_find(mapping, mapping_len, node->name);
+		if (member < 0) {
+			/* the structure member name doesn't match! */
+			ao2_ref(node, -1);
+			return 1;
+		}
+
+		if (mapping[member].type == AST_DATA_CONTAINER) {
+			/* XXX: Compare the internal structure. */
+			ao2_ref(node, -1);
+			continue;
+		}
+
+		notmatch = 0;
+		switch (mapping[member].type) {
+			case AST_DATA_STRING:
+				notmatch = ast_data_search_cmp_string(struct_children, node->name,
+					mapping[member].get.AST_DATA_STRING(structure));
+				break;
+			case AST_DATA_INTEGER:
+				notmatch = ast_data_search_cmp_int(struct_children, node->name,
+					mapping[member].get.AST_DATA_INTEGER(structure));
+				break;
+			case AST_DATA_BOOLEAN:
+			case AST_DATA_UNSIGNED_INTEGER:
+			case AST_DATA_DOUBLE:
+			case AST_DATA_IPADDR:
+			case AST_DATA_POINTER:
+			case AST_DATA_CONTAINER:
+				break;
+		}
 
 		ao2_ref(node, -1);
 	}
 
-	return 0;
+	return notmatch;
 }
 
 /*!

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=206184&r1=206183&r2=206184
==============================================================================
--- team/group/data_api_gsoc2009/tests/test_data.c (original)
+++ team/group/data_api_gsoc2009/tests/test_data.c Mon Jul 13 11:11:24 2009
@@ -215,6 +215,7 @@
 	struct ast_data_query query = {
 		.version = AST_DATA_QUERY_VERSION,
 		.path = "asterisk/application/app_queue",
+		.search = "app_queue/queues/queue/name=cola2"
 	};
 
 	switch (cmd) {




More information about the svn-commits mailing list