[asterisk-commits] eliel: branch group/data_api_gsoc2009 r204981 - in /team/group/data_api_gsoc2...

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Mon Jul 6 14:40:20 CDT 2009


Author: eliel
Date: Mon Jul  6 14:40:14 2009
New Revision: 204981

URL: http://svn.asterisk.org/svn-view/asterisk?view=rev&rev=204981
Log:
Start implementing the search mechanism.


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=204981&r1=204980&r2=204981
==============================================================================
--- team/group/data_api_gsoc2009/include/asterisk/data.h (original)
+++ team/group/data_api_gsoc2009/include/asterisk/data.h Mon Jul  6 14:40:14 2009
@@ -96,6 +96,9 @@
 
 /*! \brief opaque definition of an ast_data_iterator handler. */
 struct ast_data_iterator;
+
+/*! \brief opaque definition of an ast_data_search structure. */
+struct ast_data_search;
 
 typedef struct ast_data *(*ast_data_get_cb)(void);
 typedef int *(*ast_data_put_cb)(void);
@@ -131,14 +134,11 @@
 	AST_DECLARE_STRING_FIELDS(
 		/*! \brief Path to the node to retrieve. */
 		AST_STRING_FIELD(path);
-		/*! \brief Search string, return the nodes that match this conditions.
-		 *         Setting it to NULL will match every node in the specified
-		 *         path. */
-		AST_STRING_FIELD(search);
 		/*! \brief Filter string, return the internal nodes specified here.
 		 *         Setting it to NULL will return every internal node. */
 		AST_STRING_FIELD(filter);
 	);
+	struct ast_data_search *search;
 };
 
 /*!
@@ -186,6 +186,18 @@
 #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=204981&r1=204980&r2=204981
==============================================================================
--- team/group/data_api_gsoc2009/main/data.c (original)
+++ team/group/data_api_gsoc2009/main/data.c Mon Jul  6 14:40:14 2009
@@ -77,6 +77,44 @@
 	struct ao2_container *children;
 };
 
+/*! \brief Type of comparisons allow in the search string. */
+enum data_search_comparison {
+	DATA_CMP_UNKNOWN,
+	DATA_CMP_EQ,	/* =  */
+	DATA_CMP_NEQ,	/* != */
+	DATA_CMP_GT,	/* >  */
+	DATA_CMP_GE,	/* >= */
+	DATA_CMP_LT,	/* <  */
+	DATA_CMP_LE	/* <= */
+};
+
+/*! \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 type of comparison. */
+	enum data_search_comparison cmp_type;
+
+	/*! \brief reference another node. */
+	struct ao2_container *children;
+
+	/*! \brief The name of the node we are trying to compare. */
+	char name[0];
+};
+
 /*! \brief A data container node pointing to the registered handler. */
 struct data_provider {
 	/*! \brief node content handler. */
@@ -519,6 +557,125 @@
 	}
 
 	return ret;
+}
+
+/*!
+ * \internal
+ * \brief Is a char used to specify a comparison?
+ * \param[in] a Character to evaluate.
+ * \retval 1 It is a char used to specify a comparison.
+ * \retval 0 It is NOT a char used to specify a comparison.
+ */
+static int data_search_comparison_char(char a)
+{
+	switch (a) {
+	case '!':
+	case '=':
+	case '<':
+	case '>':
+		return 1;
+	}
+
+	return 0;
+}
+
+/*!
+ * \internal
+ * \brief Get the type of comparison.
+ */
+#if 0
+static enum data_search_comparison data_search_comparison_type(const char *comparison_string)
+{
+	if (!strcmp(comparison_string, "=")) {
+		return DATA_CMP_EQ;
+	} else if (!strcmp(comparison_string, "!=")) {
+		return DATA_CMP_NEQ;
+	} else if (!strcmp(comparison_string, "<")) {
+		return DATA_CMP_LT;
+	} else if (!strcmp(comparison_string, ">")) {
+		return DATA_CMP_GT;
+	} else if (!strcmp(comparison_string, "<=")) {
+		return DATA_CMP_LE;
+	} else if (!strcmp(comparison_string, ">=")) {
+		return DATA_CMP_GE;
+	}
+
+	return DATA_CMP_UNKNOWN;
+}
+#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;
+	int i;
+
+	if (!search_format) {
+		ast_log(LOG_ERROR, "You must pass a valid search string.\n");
+		return NULL;
+	}
+
+	name = ast_str_alloca(64);
+	format = ast_str_alloca(64);
+	comparison = ast_str_alloca(64);
+
+	va_start(values, search_format);
+
+	search_format_dup = ast_strdupa(search_format);
+
+	elements = strtok(search_format_dup, ",");
+
+	while (elements) {
+		/* Parse the name */
+		ast_str_reset(name);
+		for (i = 0; !data_search_comparison_char(elements[i]) &&
+			elements[i]; i++) {
+			ast_str_append(&name, 0, "%c", elements[i]);
+		}
+
+		/* check if the syntax is ok. */
+		if (!data_search_comparison_char(elements[i])) {
+			/* if this is the end of the string, then this is
+			 * an error! */
+			ast_log(LOG_ERROR, "Invalid search string!\n");
+			break;
+		}
+
+		/* parse the comparison string. */
+		ast_str_reset(comparison);
+		for (; 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);
+		for (; elements[i]; i++) {
+			ast_str_append(&format, 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, "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)
+{
+
 }
 
 /*!

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=204981&r1=204980&r2=204981
==============================================================================
--- team/group/data_api_gsoc2009/tests/test_data.c (original)
+++ team/group/data_api_gsoc2009/tests/test_data.c Mon Jul  6 14:40:14 2009
@@ -93,6 +93,7 @@
 	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,




More information about the asterisk-commits mailing list