aboutsummaryrefslogtreecommitdiffstats
path: root/enum.c
diff options
context:
space:
mode:
authortilghman <tilghman@f38db490-d61c-443f-a65b-d21fe96a405b>2006-07-15 23:29:28 +0000
committertilghman <tilghman@f38db490-d61c-443f-a65b-d21fe96a405b>2006-07-15 23:29:28 +0000
commit7b6703a5d04a4789c3374480ba41991790d0e7cc (patch)
tree6b83adb84197f7ffb0b965eb73cdec0ed9b0d8c6 /enum.c
parentc08c6e9573ff8bec3d1d0b33842f4c3fe31756ea (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.c81
1 files changed, 45 insertions, 36 deletions
diff --git a/enum.c b/enum.c
index 6c53632d9..f99cad509 100644
--- 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);