You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by tr...@apache.org on 2016/04/20 18:34:17 UTC

qpid-dispatch git commit: DISPATCH-286 - Add delimiter support for slash and backslash in hash-prefix lookups.

Repository: qpid-dispatch
Updated Branches:
  refs/heads/master b99acb85b -> 7eea3ff37


DISPATCH-286 - Add delimiter support for slash and backslash in hash-prefix lookups.


Project: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/commit/7eea3ff3
Tree: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/tree/7eea3ff3
Diff: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/diff/7eea3ff3

Branch: refs/heads/master
Commit: 7eea3ff37e250eefe5cc29cf69137427f310c9f7
Parents: b99acb8
Author: Ted Ross <tr...@redhat.com>
Authored: Wed Apr 20 10:38:02 2016 -0400
Committer: Ted Ross <tr...@redhat.com>
Committed: Wed Apr 20 12:29:45 2016 -0400

----------------------------------------------------------------------
 src/iterator.c     | 23 +++++++---------
 tests/field_test.c | 72 +++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 82 insertions(+), 13 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/7eea3ff3/src/iterator.c
----------------------------------------------------------------------
diff --git a/src/iterator.c b/src/iterator.c
index 45a3234..4af832a 100644
--- a/src/iterator.c
+++ b/src/iterator.c
@@ -87,7 +87,7 @@ typedef enum {
 static char *my_area    = "";
 static char *my_router  = "";
 
-const char SEPARATOR    = '.';
+const char *SEPARATORS  = "./\\";
 
 const uint32_t HASH_INIT = 5381;
 
@@ -166,24 +166,20 @@ static void parse_node_view(qd_field_iterator_t *iter)
 }
 
 
-static void qd_address_iterator_check_trailing_octet(qd_field_iterator_t *iter, char octet)
+static void qd_address_iterator_remove_trailing_separator(qd_field_iterator_t *iter)
 {
     // Save the iterator's pointer so we can apply it back before returning from this function.
     pointer_t save_pointer = iter->pointer;
 
     char current_octet = 0;
-    while(!qd_field_iterator_end(iter)) {
+    while (!qd_field_iterator_end(iter)) {
         current_octet = qd_field_iterator_octet(iter);
     }
 
     // We have the last octet in current_octet
-    if (current_octet == octet) {
-        iter->pointer = save_pointer;
-        iter->pointer.length-- ;
-    }
-    else {
-        iter->pointer = save_pointer;
-    }
+    iter->pointer = save_pointer;
+    if (current_octet && strrchr(SEPARATORS, (int) current_octet))
+        iter->pointer.length--;
 }
 
 
@@ -283,7 +279,7 @@ static void view_initialize(qd_field_iterator_t *iter)
 
     if (iter->view == ITER_VIEW_ADDRESS_HASH) {
         iter->mode = MODE_TO_END;
-        qd_address_iterator_check_trailing_octet(iter, SEPARATOR);
+        qd_address_iterator_remove_trailing_separator(iter);
         parse_address_view(iter);
         return;
     }
@@ -725,14 +721,15 @@ void qd_iterator_hash_segments(qd_field_iterator_t *iter)
         octet = qd_field_iterator_octet(iter);
         segment_length += 1;
 
-        if (octet == SEPARATOR) {
+        if (strrchr(SEPARATORS, (int) octet)) {
             qd_insert_hash_segment(iter, &hash, segment_length-1);
         }
 
         hash = ((hash << 5) + hash) + octet; /* hash * 33 + c */
     }
 
-    // Segments should never end with a separator. see view_initialize which in turn calls qd_address_iterator_check_trailing_octet
+    // Segments should never end with a separator. see view_initialize which in turn calls
+    // qd_address_iterator_remove_trailing_separator
     // Insert the last segment which was not inserted in the previous while loop
     qd_insert_hash_segment(iter, &hash, segment_length);
 

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/7eea3ff3/tests/field_test.c
----------------------------------------------------------------------
diff --git a/tests/field_test.c b/tests/field_test.c
index d320b60..af08fd7 100644
--- a/tests/field_test.c
+++ b/tests/field_test.c
@@ -648,6 +648,77 @@ static char *test_qd_hash_retrieve_prefix_separator_exact_match_dot_at_end_1(voi
 }
 
 
+static char *test_prefix_hash(void *context)
+{
+    static char error[200];
+    char *entries[] = {"an_entry_with_no_separators",   //  0
+                       "dot.separated.pattern.one",     //  1
+                       "dot.separated.pattern.two",     //  2
+                       "dot.separated.",                //  3
+                       "dot",                           //  4
+                       "slash",                         //  5
+                       "slash/delimited",               //  6
+                       "slash/delimited/first",         //  7
+                       "slash/delimited/second",        //  8
+                       "mixed.set/of/delimiters.one",   //  9
+                       "mixed.set/of/delimiters.two",   // 10
+                       "mixed.set/of/delimiters/three", // 11
+                       "mixed.set",                     // 12
+                       "backslash\\windows",            // 13
+                       0};
+    struct { char* pattern; int entry; } patterns[] = {{"an_entry_with_no_separators", 0},
+                                                       {"dot.separated.pattern.one", 1},
+                                                       {"dot.separated.pattern.two", 2},
+                                                       {"dot.separated.pattern.three", 3},
+                                                       {"dot.separated.other.pattern", 3},
+                                                       {"dot.differentiated/other", 4},
+                                                       {"slash/other", 5},
+                                                       {"slash/delimited/first", 7},
+                                                       {"slash/delimited/second", 8},
+                                                       {"slash/delimited/third", 6},
+                                                       {"mixed.other", -1},
+                                                       {"mixed.set/other", 12},
+                                                       {"mixed.set/of/delimiters.one/queue", 9},
+                                                       {"mixed.set/of/delimiters.one.queue", 9},
+                                                       {"mixed.set.of/delimiters.one.queue", 12},
+                                                       {"other.thing.entirely", -1},
+                                                       {"backslash\\windows\\test", 13},
+                                                       {0, 0}};
+
+    qd_hash_t *hash = qd_hash(10, 32, 0);
+    long idx = 0;
+
+    //
+    // Insert the entries into the hash table
+    //
+    while (entries[idx]) {
+        qd_field_iterator_t *iter = qd_address_iterator_string(entries[idx], ITER_VIEW_ADDRESS_HASH);
+        qd_hash_insert(hash, iter, (void*) (idx + 1), 0);
+        qd_field_iterator_free(iter);
+        idx++;
+    }
+
+    //
+    // Test the patterns
+    //
+    idx = 0;
+    while (patterns[idx].pattern) {
+        qd_field_iterator_t *iter = qd_address_iterator_string(patterns[idx].pattern, ITER_VIEW_ADDRESS_HASH);
+        int position;
+        qd_hash_retrieve_prefix(hash, iter, (void*) &position);
+        position--;
+        if (position != patterns[idx].entry) {
+            snprintf(error, 200, "Pattern: '%s', expected %d, got %d",
+                     patterns[idx].pattern, patterns[idx].entry, position);
+            return error;
+        }
+        idx++;
+    }
+
+    return 0;
+}
+
+
 int field_tests(void)
 {
     int result = 0;
@@ -672,6 +743,7 @@ int field_tests(void)
     TEST_CASE(test_qd_hash_retrieve_prefix_separator_exact_match_slashes, 0);
     TEST_CASE(test_qd_hash_retrieve_prefix_separator_exact_match_dot_at_end, 0);
     TEST_CASE(test_qd_hash_retrieve_prefix_separator_exact_match_dot_at_end_1, 0);
+    TEST_CASE(test_prefix_hash, 0);
 
     return result;
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org