diff --git a/src/mu-msg-iter.cc b/src/mu-msg-iter.cc index e239599f..a60d31ad 100644 --- a/src/mu-msg-iter.cc +++ b/src/mu-msg-iter.cc @@ -124,6 +124,21 @@ update_msg (MuMsgIter *iter) } +gboolean +mu_msg_iter_reset (MuMsgIter *iter) +{ + g_return_val_if_fail (iter, FALSE); + + try { + iter->_cursor = iter->_matches.begin(); + + } MU_XAPIAN_CATCH_BLOCK_RETURN (FALSE); + + return TRUE; +} + + + gboolean mu_msg_iter_next (MuMsgIter *iter) { diff --git a/src/mu-msg-iter.h b/src/mu-msg-iter.h index 42098f8c..94675c8f 100644 --- a/src/mu-msg-iter.h +++ b/src/mu-msg-iter.h @@ -62,6 +62,16 @@ MuMsgIter *mu_msg_iter_new (XapianEnquire *enq, gboolean mu_msg_iter_next (MuMsgIter *iter); + +/** + * reset the iterator to the beginning + * + * @param iter a valid MuMsgIter iterator + * + * @return TRUE if it succeeded, FALSE otherwise + */ +gboolean mu_msg_iter_reset (MuMsgIter *iter); + /** * does this iterator point past the end of the list? * diff --git a/src/tests/test-mu-query.c b/src/tests/test-mu-query.c index fc3d36de..86ec4306 100644 --- a/src/tests/test-mu-query.c +++ b/src/tests/test-mu-query.c @@ -65,7 +65,7 @@ run_and_count_matches (const char *xpath, const char *query) { MuQuery *mquery; MuMsgIter *iter; - guint count; + guint count1, count2; mquery = mu_query_new (xpath, NULL); g_assert (query); @@ -85,12 +85,20 @@ run_and_count_matches (const char *xpath, const char *query) mu_query_destroy (mquery); g_assert (iter); - for (count = 0; !mu_msg_iter_is_done(iter); - mu_msg_iter_next(iter), ++count); + /* run query twice, to test mu_msg_iter_reset */ + for (count1 = 0; !mu_msg_iter_is_done(iter); + mu_msg_iter_next(iter), ++count1); + + g_assert(mu_msg_iter_reset (iter)); + + for (count2 = 0; !mu_msg_iter_is_done(iter); + mu_msg_iter_next(iter), ++count2); mu_msg_iter_destroy (iter); + + g_assert_cmpuint (count1, ==, count2); - return count; + return count1; }