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

SVN commits to the Digium repositories svn-commits at lists.digium.com
Sat Jul 18 16:23:47 CDT 2009


Author: eliel
Date: Sat Jul 18 16:23:41 2009
New Revision: 207349

URL: http://svn.asterisk.org/svn-view/asterisk?view=rev&rev=207349
Log:
Use the data api search mechanism when running the 'queue show' command if an
argument is specified instead of getting every queue and parsing only the needed
nodes.


Modified:
    team/group/data_api_gsoc2009/apps/app_queue.c
    team/group/data_api_gsoc2009/include/asterisk/data.h

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=207349&r1=207348&r2=207349
==============================================================================
--- team/group/data_api_gsoc2009/apps/app_queue.c (original)
+++ team/group/data_api_gsoc2009/apps/app_queue.c Sat Jul 18 16:23:41 2009
@@ -6301,10 +6301,11 @@
 /*! \brief direct ouput to manager or cli with proper terminator */
 static void do_print(struct mansession *s, int fd, const char *str)
 {
-	if (s)
+	if (s) {
 		astman_append(s, "%s\r\n", str);
-	else
+	} else {
 		ast_cli(fd, "%s\n", str);
+	}
 }
 
 /*! 
@@ -6315,7 +6316,7 @@
 */
 static char *__queues_show(struct mansession *s, int fd, int argc, const char * const *argv)
 {
-	struct ast_str *out = ast_str_alloca(240);
+	struct ast_str *out = ast_str_alloca(240), *search = NULL;
 	time_t now = time(NULL);
 	struct ast_data *queues, *queue, *member, *caller;
 	struct ast_data_iterator *iq, *im, *ic;
@@ -6325,17 +6326,27 @@
 	float sl;
 	int callscompleted, has_members, has_callers, penalty, calls;
 	const char *name, *membername, *interface;
+	int found = 0;
 
 	if (argc != 2 && argc != 3) {
 		return CLI_SHOWUSAGE;
 	}
 
 	if (argc == 3)	{ /* specific queue */
+		search = ast_str_create(64);
+		if (search) {
+			ast_str_set(&search, 0, "queues/queue/name=%s", argv[2]);
+			query.search = ast_str_buffer(search);
+		}
 	}
 
 	queues = ast_data_get(&query);
 	if (!queues) {
 		return CLI_FAILURE;
+	}
+
+	if (search) {
+		ast_free(search);
 	}
 
 	iq = ast_data_iterator_init(queues, "queue");
@@ -6350,11 +6361,10 @@
 	}
 
 	while ((queue = ast_data_iterator_next(iq))) {
+		found++;
+
 		/* print queue statistics. */
 		name = ast_data_retrieve_string(queue, "name");
-		if (argc == 3 && strcasecmp(name, argv[2])) {
-			continue;
-		}
 
 		ast_str_set(&out, 0, "%-12.12s has %d calls (max ", name,
 			ast_data_retrieve_int(queue, "count"));
@@ -6448,31 +6458,15 @@
 	}
 	ast_data_iterator_end(iq);
 
-#if 0
-			struct queue_ent *qe;
-			int pos = 1;
-
-			do_print(s, fd, "   Callers: ");
-			for (qe = q->head; qe; qe = qe->next) {
-				ast_str_set(&out, 0, "      %d. %s (wait: %ld:%2.2ld, prio: %d)",
-					pos++, qe->chan->name, (long) (now - qe->start) / 60,
-					(long) (now - qe->start) % 60, qe->prio);
-				do_print(s, fd, ast_str_buffer(out));
-			}
-		}
-		do_print(s, fd, "");	/* blank line between entries */
-		ao2_unlock(q);
-		queue_unref(q); /* Unref the iterator's reference */
-	}
-	ao2_unlock(queues);
 	if (!found) {
-		if (argc == 3)
+		if (argc == 3) {
 			ast_str_set(&out, 0, "No such queue: %s.", argv[2]);
-		else
+		} else {
 			ast_str_set(&out, 0, "No queues.");
+		}
 		do_print(s, fd, ast_str_buffer(out));
 	}
-#endif
+
 	return CLI_SUCCESS;
 }
 
@@ -7543,7 +7537,7 @@
 static void queues_data_provider_get_helper(const struct ast_data_search *search,
 	struct ast_data *data_root, struct call_queue *queue)
 {
-	int member_added = 1;
+	int member_added = 1, member_notmatch = 0, caller_notmatch = 0;
 	struct ao2_iterator im;
 	struct member *member;
 	struct queue_ent *qe;
@@ -7551,7 +7545,7 @@
 	struct ast_data *data_member, *data_callers = NULL, *data_caller, *data_caller_channel;
 
 	/* compare the search pattern. */
-	if (ast_data_search_cmp_structure(search, call_queue, queue, "queues/queue")) {
+	if (ast_data_search_cmp_structure(search, call_queue, queue, "queue")) {
 		/* this doesn't match! continue! */
 		return;
 	}
@@ -7563,8 +7557,9 @@
 		while ((member = ao2_iterator_next(&im))) {
 			/* compare the member structure. */
 			if (ast_data_search_cmp_structure(search, member, member,
-						"queues/queue/members/member")) {
+						"queue/members/member")) {
 				ao2_ref(member, -1);
+				member_notmatch = 1;
 				continue;
 			}
 
@@ -7601,6 +7596,13 @@
 	/* include the callers inside the result. */
 	if (queue->head) {
 		for (qe = queue->head; qe; qe = qe->next) {
+			/* compare the member structure. */
+			if (ast_data_search_cmp_structure(search, queue_ent, qe,
+						"queue/callers/caller")) {
+				caller_notmatch = 1;
+				continue;
+			}
+
 			if (!data_queue) {
 				data_queue = ast_data_add_node(data_root, "queue");
 				if (!data_queue) {
@@ -7633,7 +7635,13 @@
 
 	/* if there was a member added to the tree, then added the following
 	 * queue to the tree. */
-	if (member_added) {
+	if (member_added || (!member_notmatch && !caller_notmatch)) {
+		if (!data_queue) {
+			data_queue = ast_data_add_node(data_root, "queue");
+			if (!data_queue) {
+				return;
+			}
+		}
 		ast_data_add_structure(call_queue, data_queue, 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=207349&r1=207348&r2=207349
==============================================================================
--- team/group/data_api_gsoc2009/include/asterisk/data.h (original)
+++ team/group/data_api_gsoc2009/include/asterisk/data.h Sat Jul 18 16:23:41 2009
@@ -146,15 +146,13 @@
 struct ast_data_query {
 	/*! \brief Data query version. */
 	uint32_t version;
-	AST_DECLARE_STRING_FIELDS(
-		/*! \brief Path to the node to retrieve. */
-		AST_STRING_FIELD(path);
-		/*! \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);
-	);
+	/*! \brief Path to the node to retrieve. */
+	char *path;
+	/*! \brief Filter string, return the internal nodes specified here.
+	 *         Setting it to NULL will return every internal node. */
+	char *filter;
+	/*! \brief Search condition. */
+	char *search;
 };
 
 /*! \brief Map the members of a structure. */




More information about the svn-commits mailing list