]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Bug 7513 - ensure that each time we do a query, the results are returned in the
authorTilghman Lesher <tilghman@meg.abyt.es>
Sat, 15 Jul 2006 23:29:28 +0000 (23:29 +0000)
committerTilghman Lesher <tilghman@meg.abyt.es>
Sat, 15 Jul 2006 23:29:28 +0000 (23:29 +0000)
same logical order, so that when we iterate over the list, we get all results,
not some results repeated, due to insufficient sorting.

git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.2@37691 65c4cc65-6c06-0410-ace0-fbb531ad65f3

enum.c

diff --git a/enum.c b/enum.c
index 6c53632d9a0a3deeabd56bc9caccc0e29e973b23..f99cad5096b817205258cbe112f181d8a50215dc 100644 (file)
--- a/enum.c
+++ b/enum.c
@@ -484,42 +484,51 @@ int ast_get_enum(struct ast_channel *chan, const char *number, char *dst, int ds
                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);