[asterisk-commits] branch 1.2 r37691 - /branches/1.2/enum.c

asterisk-commits at lists.digium.com asterisk-commits at lists.digium.com
Sat Jul 15 16:29:29 MST 2006


Author: tilghman
Date: Sat Jul 15 18:29:28 2006
New Revision: 37691

URL: http://svn.digium.com/view/asterisk?rev=37691&view=rev
Log:
Bug 7513 - ensure that each time we do a query, the results are returned in the
same logical order, so that when we iterate over the list, we get all results,
not some results repeated, due to insufficient sorting.

Modified:
    branches/1.2/enum.c

Modified: branches/1.2/enum.c
URL: http://svn.digium.com/view/asterisk/branches/1.2/enum.c?rev=37691&r1=37690&r2=37691&view=diff
==============================================================================
--- branches/1.2/enum.c (original)
+++ branches/1.2/enum.c Sat Jul 15 18:29:28 2006
@@ -484,42 +484,51 @@
 		ret = 0;
 	}
 
-       if (context.naptr_rrs_count >= context.position && ! (context.options & ENUMLOOKUP_OPTIONS_COUNT)) {
-               /* sort array by NAPTR order/preference */
-               for (k=0; k<context.naptr_rrs_count; k++) {
-                       for (i=0; i<context.naptr_rrs_count; i++) {
-                               /* use order first and then preference to compare */
-                               if ((ntohs(context.naptr_rrs[k].naptr.order) < ntohs(context.naptr_rrs[i].naptr.order)
-                                               && context.naptr_rrs[k].sort_pos > context.naptr_rrs[i].sort_pos)
-                                       || (ntohs(context.naptr_rrs[k].naptr.order) > ntohs(context.naptr_rrs[i].naptr.order)
-                                               && context.naptr_rrs[k].sort_pos < context.naptr_rrs[i].sort_pos)){
-                                       z = context.naptr_rrs[k].sort_pos;
-                                       context.naptr_rrs[k].sort_pos = context.naptr_rrs[i].sort_pos;
-                                       context.naptr_rrs[i].sort_pos = z;
-                                       continue;
-                               }
-                               if (ntohs(context.naptr_rrs[k].naptr.order) == ntohs(context.naptr_rrs[i].naptr.order)) {
-                                       if ((ntohs(context.naptr_rrs[k].naptr.pref) < ntohs(context.naptr_rrs[i].naptr.pref)
-                                                       && context.naptr_rrs[k].sort_pos > context.naptr_rrs[i].sort_pos)
-                                               || (ntohs(context.naptr_rrs[k].naptr.pref) > ntohs(context.naptr_rrs[i].naptr.pref)
-                                                       && context.naptr_rrs[k].sort_pos < context.naptr_rrs[i].sort_pos)){
-                                               z = context.naptr_rrs[k].sort_pos;
-                                               context.naptr_rrs[k].sort_pos = context.naptr_rrs[i].sort_pos;
-                                               context.naptr_rrs[i].sort_pos = z;
-                                       }
-                               }
-                       }
-               }
-               for (k=0; k<context.naptr_rrs_count; k++) {
-                       if (context.naptr_rrs[k].sort_pos == context.position-1) {
-                               ast_copy_string(context.dst, context.naptr_rrs[k].result, dstlen);
-                               ast_copy_string(context.tech, context.naptr_rrs[k].tech, techlen);
-                               break;
-                       }
-               }
-       } else if (!(context.options & ENUMLOOKUP_OPTIONS_COUNT)) {
-               context.dst[0] = 0;
-       }
+	if (context.naptr_rrs_count >= context.position && ! (context.options & ENUMLOOKUP_OPTIONS_COUNT)) {
+		/* sort array by NAPTR order/preference/tech */
+		for (k = 0; k < context.naptr_rrs_count; k++) {
+			for (i = 0; i < context.naptr_rrs_count; i++) {
+				/* Compare by order first. */
+				if ((ntohs(context.naptr_rrs[k].naptr.order) < ntohs(context.naptr_rrs[i].naptr.order)
+						&& context.naptr_rrs[k].sort_pos > context.naptr_rrs[i].sort_pos)
+					|| (ntohs(context.naptr_rrs[k].naptr.order) > ntohs(context.naptr_rrs[i].naptr.order)
+						&& context.naptr_rrs[k].sort_pos < context.naptr_rrs[i].sort_pos)){
+					z = context.naptr_rrs[k].sort_pos;
+					context.naptr_rrs[k].sort_pos = context.naptr_rrs[i].sort_pos;
+					context.naptr_rrs[i].sort_pos = z;
+				} else if (ntohs(context.naptr_rrs[k].naptr.order) == ntohs(context.naptr_rrs[i].naptr.order)) {
+					/* Order is the same, so sort by preference next */
+					if (ntohs(context.naptr_rrs[k].naptr.pref) == ntohs(context.naptr_rrs[i].naptr.pref)) {
+						/* Preference is the same, so sort by tech */
+						if ((strcmp(context.naptr_rrs[k].tech, context.naptr_rrs[i].tech) < 0
+								&& context.naptr_rrs[k].sort_pos > context.naptr_rrs[i].sort_pos)
+							|| (strcmp(context.naptr_rrs[k].tech, context.naptr_rrs[i].tech) > 0
+								&& context.naptr_rrs[k].sort_pos < context.naptr_rrs[i].sort_pos)) {
+							z = context.naptr_rrs[k].sort_pos;
+							context.naptr_rrs[k].sort_pos = context.naptr_rrs[i].sort_pos;
+							context.naptr_rrs[i].sort_pos = z;
+						}
+					} else if ((ntohs(context.naptr_rrs[k].naptr.pref) < ntohs(context.naptr_rrs[i].naptr.pref)
+							&& context.naptr_rrs[k].sort_pos > context.naptr_rrs[i].sort_pos)
+						|| (ntohs(context.naptr_rrs[k].naptr.pref) > ntohs(context.naptr_rrs[i].naptr.pref)
+							&& context.naptr_rrs[k].sort_pos < context.naptr_rrs[i].sort_pos)){
+						z = context.naptr_rrs[k].sort_pos;
+						context.naptr_rrs[k].sort_pos = context.naptr_rrs[i].sort_pos;
+						context.naptr_rrs[i].sort_pos = z;
+					}
+				}
+			}
+		}
+		for (k = 0; k < context.naptr_rrs_count; k++) {
+			if (context.naptr_rrs[k].sort_pos == context.position - 1) {
+				ast_copy_string(context.dst, context.naptr_rrs[k].result, dstlen);
+				ast_copy_string(context.tech, context.naptr_rrs[k].tech, techlen);
+				break;
+			}
+		}
+	} else if (!(context.options & ENUMLOOKUP_OPTIONS_COUNT)) {
+		context.dst[0] = 0;
+	}
 
 	if (chan)
 		ret |= ast_autoservice_stop(chan);



More information about the asterisk-commits mailing list