diff options
author | tilghman <tilghman@f38db490-d61c-443f-a65b-d21fe96a405b> | 2006-07-15 23:29:28 +0000 |
---|---|---|
committer | tilghman <tilghman@f38db490-d61c-443f-a65b-d21fe96a405b> | 2006-07-15 23:29:28 +0000 |
commit | 7b6703a5d04a4789c3374480ba41991790d0e7cc (patch) | |
tree | 6b83adb84197f7ffb0b965eb73cdec0ed9b0d8c6 /enum.c | |
parent | c08c6e9573ff8bec3d1d0b33842f4c3fe31756ea (diff) |
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.
git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.2@37691 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'enum.c')
-rw-r--r-- | enum.c | 81 |
1 files changed, 45 insertions, 36 deletions
@@ -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); |