From 6fc029a6d3c4de5f0d62b9e7b46cfc36c30e02af Mon Sep 17 00:00:00 2001 From: "Dirk-Jan C. Binnema" Date: Wed, 18 May 2011 23:33:56 +0300 Subject: [PATCH] * mu-msg-iter: implement in terms of mu-msg --- src/mu-msg-iter.cc | 96 +++++++++++++++++++++------------------------- src/mu-msg-iter.h | 4 +- 2 files changed, 46 insertions(+), 54 deletions(-) diff --git a/src/mu-msg-iter.cc b/src/mu-msg-iter.cc index 57e65756..ac37af62 100644 --- a/src/mu-msg-iter.cc +++ b/src/mu-msg-iter.cc @@ -24,40 +24,39 @@ #include #include "mu-util.h" +#include "mu-msg.h" #include "mu-msg-iter.h" #include "mu-msg-iter-priv.hh" + +static gboolean update_msg (MuMsgIter *iter); + struct _MuMsgIter { _MuMsgIter (const Xapian::Enquire &enq, size_t batchsize): - _enq(enq), _batchsize(batchsize), _offset(0) { + _enq(enq), _batchsize(batchsize), _offset(0), _msg(0) { _matches = _enq.get_mset (0, _batchsize); _cursor = _matches.begin(); _is_null = _matches.empty(); - clear_fields (false); + + if (!_matches.empty()) + update_msg (this); } ~_MuMsgIter () { - clear_fields (true); - } - - void clear_fields (bool dofree) { - for (int i = 0; i != MU_MSG_FIELD_ID_NUM; ++i) { - if (dofree) - g_free(_str[i]); - _str[i] = NULL; - } + if (_msg) + mu_msg_unref (_msg); } const Xapian::Enquire _enq; Xapian::MSet _matches; Xapian::MSet::const_iterator _cursor; size_t _batchsize, _offset; - char* _str[MU_MSG_FIELD_ID_NUM]; bool _is_null; - - + + Xapian::Document _doc; + MuMsg *_msg; }; @@ -82,24 +81,11 @@ mu_msg_iter_destroy (MuMsgIter *iter) MuMsg* mu_msg_iter_get_msg (MuMsgIter *iter, GError **err) { - const char *path; - MuMsg *msg; - g_return_val_if_fail (iter, NULL); g_return_val_if_fail (!mu_msg_iter_is_done(iter), NULL); + g_return_val_if_fail (iter->_msg, NULL); - path = mu_msg_iter_get_path (iter); - if (!path) { - g_set_error (err, 0, MU_ERROR_XAPIAN_MISSING_DATA, - "no path for message"); - return NULL; - } - - msg = mu_msg_new_from_file (path, NULL, err); - if (!msg) - return NULL; - - return msg; + return mu_msg_ref (iter->_msg); } @@ -133,6 +119,30 @@ get_next_batch (MuMsgIter *iter) return iter; } + +static gboolean +update_msg (MuMsgIter *iter) +{ + GError *err; + + /* get a new MuMsg based on the current doc */ + if (iter->_msg) + mu_msg_unref (iter->_msg); + + iter->_doc = iter->_cursor.get_document(); + err = NULL; + iter->_msg = mu_msg_new_from_doc ((XapianDocument*)&iter->_doc, &err); + if (!iter->_msg) { + g_warning ("%s: failed to create MuMsg: %s", + __FUNCTION__, err->message ? err->message : "?"); + g_error_free (err); + return FALSE; + } + + return TRUE; +} + + gboolean mu_msg_iter_next (MuMsgIter *iter) { @@ -159,10 +169,9 @@ mu_msg_iter_next (MuMsgIter *iter) * it */ if (!message_is_readable (iter)) return mu_msg_iter_next (iter); - - iter->clear_fields (true); - - return TRUE; + + /* try to get a new MuMsg based on the current doc */ + return update_msg (iter); } MU_XAPIAN_CATCH_BLOCK_RETURN(FALSE); } @@ -178,15 +187,7 @@ mu_msg_iter_is_done (MuMsgIter *iter) static const gchar* get_field (MuMsgIter *iter, MuMsgFieldId mfid) { - if (!iter->_str[mfid]) { /* cache the value */ - try { - const std::string s - (iter->_cursor.get_document().get_value(mfid)); - iter->_str[mfid] = s.empty() ? NULL : g_strdup (s.c_str()); - - } MU_XAPIAN_CATCH_BLOCK_RETURN(NULL); - } - return iter->_str[mfid]; + return mu_msg_get_field_string (iter->_msg, mfid); } const gchar* @@ -204,16 +205,7 @@ mu_msg_iter_get_field (MuMsgIter *iter, MuMsgFieldId mfid) static gint64 get_field_numeric (MuMsgIter *iter, MuMsgFieldId mfid) { - const char* str; - - str = get_field (iter, mfid); - if (!str) - return 0; - - try { - return static_cast(Xapian::sortable_unserialise(str)); - - } MU_XAPIAN_CATCH_BLOCK_RETURN(static_cast(-1)); + return mu_msg_get_field_numeric (iter->_msg, mfid); } diff --git a/src/mu-msg-iter.h b/src/mu-msg-iter.h index 03d64384..cc97ff5e 100644 --- a/src/mu-msg-iter.h +++ b/src/mu-msg-iter.h @@ -78,8 +78,8 @@ void mu_msg_iter_destroy (MuMsgIter *iter); * @param err which receives error info or NULL. err is only filled * when the function returns NULL * - * @return a MuMsgGMime instance, or NULL in case of error. Use - * mu_msg_gmime_destroy when the instance is no longer needed + * @return a MuMsg instance, or NULL in case of error. Use + * mu_msg_unref when the instance is no longer needed */ MuMsg* mu_msg_iter_get_msg (MuMsgIter *iter, GError **err) G_GNUC_MALLOC G_GNUC_WARN_UNUSED_RESULT;