diff --git a/src/mu-msg-iter.cc b/src/mu-msg-iter.cc index 02d782eaf..ba21cb383 100644 --- a/src/mu-msg-iter.cc +++ b/src/mu-msg-iter.cc @@ -149,7 +149,7 @@ mu_msg_iter_next (MuMsgIter *iter) iter = get_next_batch (iter); if (iter->_cursor == iter->_matches.end()) return FALSE; /* no more matches */ - + /* the message may not be readable / existing, e.g., * because of the database not being fully up to * date. in that case, we ignore the message. it @@ -178,22 +178,46 @@ 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]; +} + const gchar* mu_msg_iter_get_field (MuMsgIter *iter, MuMsgFieldId mfid) { g_return_val_if_fail (!mu_msg_iter_is_done(iter), NULL); g_return_val_if_fail (mu_msg_field_id_is_valid(mfid), NULL); + return get_field (iter, mfid); +} + + + + +static gint64 +get_field_numeric (MuMsgIter *iter, MuMsgFieldId mfid) +{ + const char* str; + + str = get_field (iter, mfid); + if (!str) + return 0; + try { - if (!iter->_str[mfid]) { /* cache the value */ - Xapian::Document doc (iter->_cursor.get_document()); - iter->_str[mfid] = - g_strdup (doc.get_value(mfid).c_str()); - } - - return iter->_str[mfid]; - - } MU_XAPIAN_CATCH_BLOCK_RETURN(NULL); + + return static_cast(Xapian::sortable_unserialise(str)); + + } MU_XAPIAN_CATCH_BLOCK_RETURN(static_cast(-1)); } @@ -203,12 +227,7 @@ mu_msg_iter_get_field_numeric (MuMsgIter *iter, MuMsgFieldId mfid) g_return_val_if_fail (!mu_msg_iter_is_done(iter), -1); g_return_val_if_fail (mu_msg_field_is_numeric(mfid), -1); - try { - return static_cast( - Xapian::sortable_unserialise( - mu_msg_iter_get_field(iter, mfid))); - - } MU_XAPIAN_CATCH_BLOCK_RETURN(static_cast(-1)); + return get_field_numeric (iter, mfid); } @@ -238,37 +257,35 @@ const char* mu_msg_iter_get_path (MuMsgIter *iter) { g_return_val_if_fail (!mu_msg_iter_is_done(iter), NULL); - return mu_msg_iter_get_field (iter, MU_MSG_FIELD_ID_PATH); + return get_field (iter, MU_MSG_FIELD_ID_PATH); } const char* mu_msg_iter_get_maildir (MuMsgIter *iter) { g_return_val_if_fail (!mu_msg_iter_is_done(iter), NULL); - return mu_msg_iter_get_field (iter, MU_MSG_FIELD_ID_MAILDIR); + return get_field (iter, MU_MSG_FIELD_ID_MAILDIR); } const char* mu_msg_iter_get_msgid (MuMsgIter *iter) { g_return_val_if_fail (!mu_msg_iter_is_done(iter), NULL); - return mu_msg_iter_get_field (iter, MU_MSG_FIELD_ID_MSGID); + return get_field (iter, MU_MSG_FIELD_ID_MSGID); } - - const char* mu_msg_iter_get_from (MuMsgIter *iter) { g_return_val_if_fail (!mu_msg_iter_is_done(iter), NULL); - return mu_msg_iter_get_field (iter, MU_MSG_FIELD_ID_FROM); + return get_field (iter, MU_MSG_FIELD_ID_FROM); } const char* mu_msg_iter_get_to (MuMsgIter *iter) { g_return_val_if_fail (!mu_msg_iter_is_done(iter), NULL); - return mu_msg_iter_get_field (iter, MU_MSG_FIELD_ID_TO); + return get_field (iter, MU_MSG_FIELD_ID_TO); } @@ -276,7 +293,7 @@ const char* mu_msg_iter_get_cc (MuMsgIter *iter) { g_return_val_if_fail (!mu_msg_iter_is_done(iter), NULL); - return mu_msg_iter_get_field (iter, MU_MSG_FIELD_ID_CC); + return get_field (iter, MU_MSG_FIELD_ID_CC); } @@ -284,7 +301,7 @@ const char* mu_msg_iter_get_subject (MuMsgIter *iter) { g_return_val_if_fail (!mu_msg_iter_is_done(iter), NULL); - return mu_msg_iter_get_field (iter, MU_MSG_FIELD_ID_SUBJECT); + return get_field (iter, MU_MSG_FIELD_ID_SUBJECT); } @@ -292,14 +309,8 @@ size_t mu_msg_iter_get_size (MuMsgIter *iter) { g_return_val_if_fail (!mu_msg_iter_is_done(iter), 0); - - try { - return static_cast( - Xapian::sortable_unserialise( - mu_msg_iter_get_field - (iter,MU_MSG_FIELD_ID_SIZE))); - - } MU_XAPIAN_CATCH_BLOCK_RETURN(0); + return static_cast( + get_field_numeric (iter,MU_MSG_FIELD_ID_SIZE)); } @@ -307,22 +318,15 @@ time_t mu_msg_iter_get_date (MuMsgIter *iter) { g_return_val_if_fail (!mu_msg_iter_is_done(iter), 0); - - try { - return static_cast( - Xapian::sortable_unserialise( - mu_msg_iter_get_field - (iter,MU_MSG_FIELD_ID_DATE))); - - } MU_XAPIAN_CATCH_BLOCK_RETURN(0); + return static_cast( + get_field_numeric (iter,MU_MSG_FIELD_ID_DATE)); } MuMsgFlags mu_msg_iter_get_flags (MuMsgIter *iter) { g_return_val_if_fail (!mu_msg_iter_is_done(iter), MU_MSG_FLAG_NONE); - - return static_cast(mu_msg_iter_get_field_numeric + return static_cast(get_field_numeric (iter, MU_MSG_FIELD_ID_FLAGS)); } @@ -331,7 +335,47 @@ mu_msg_iter_get_prio (MuMsgIter *iter) { g_return_val_if_fail (!mu_msg_iter_is_done(iter), MU_MSG_PRIO_NONE); - - return static_cast(mu_msg_iter_get_field_numeric + return static_cast(get_field_numeric (iter, MU_MSG_FIELD_ID_PRIO)); -} +} + + +static gchar* +get_field_copy (MuMsgIter *iter, MuMsgFieldId mfid) +{ + const char *s; + + s = get_field (iter, mfid); + return s ? g_strdup (s) : NULL; +} + +MuMsgData* +mu_msg_iter_get_msgdata (MuMsgIter *iter) +{ + MuMsgData *mdata; + g_return_val_if_fail (!mu_msg_iter_is_done(iter), + NULL); + mdata = mu_msg_data_new (); + + try { + mdata->cc = get_field_copy (iter, MU_MSG_FIELD_ID_CC); + mdata->from = get_field_copy (iter, MU_MSG_FIELD_ID_FROM); + mdata->maildir = get_field_copy (iter, MU_MSG_FIELD_ID_MAILDIR); + mdata->msgid = get_field_copy (iter, MU_MSG_FIELD_ID_MSGID); + mdata->path = get_field_copy (iter, MU_MSG_FIELD_ID_PATH); + mdata->subject = get_field_copy (iter, MU_MSG_FIELD_ID_SUBJECT); + mdata->to = get_field_copy (iter, MU_MSG_FIELD_ID_TO); + + mdata->size = static_cast(get_field_numeric + (iter, MU_MSG_FIELD_ID_SIZE)); + mdata->date = static_cast(get_field_numeric + (iter, MU_MSG_FIELD_ID_DATE)); + mdata->flags = static_cast(get_field_numeric + (iter, MU_MSG_FIELD_ID_FLAGS)); + mdata->prio = static_cast(get_field_numeric + (iter, MU_MSG_FIELD_ID_PRIO)); + + } MU_XAPIAN_CATCH_BLOCK_RETURN(NULL); + + return mdata; +} diff --git a/src/mu-msg-iter.h b/src/mu-msg-iter.h index 7c2d9bb91..228dc7801 100644 --- a/src/mu-msg-iter.h +++ b/src/mu-msg-iter.h @@ -22,6 +22,7 @@ #include #include +#include G_BEGIN_DECLS @@ -76,7 +77,23 @@ void mu_msg_iter_destroy (MuMsgIter *iter); */ MuMsg* mu_msg_iter_get_msg (MuMsgIter *iter, GError **err) G_GNUC_MALLOC G_GNUC_WARN_UNUSED_RESULT; - + + +/** + * get a structure with information about this iter; this struct is + * newly allocated, can be used to keep an in-memory record of a + * message + * + * @param iter a valid msg iterator + * + * @return a newly allocate MuMsgData struct (free with + * mu_msg_data_destroy), or NULL in case of error + */ +MuMsgData* mu_msg_iter_get_msgdata (MuMsgIter *iter) + G_GNUC_MALLOC G_GNUC_WARN_UNUSED_RESULT; + + + /** * get the document id for the current message * @@ -117,8 +134,7 @@ const char* mu_msg_iter_get_path (MuMsgIter *iter); * "/foo/bar" * * @param iter a valid MuMsgIter iterator - * - * @return the path, or NULL in case of error + * * @return the path, or NULL in case of error */ const char* mu_msg_iter_get_maildir (MuMsgIter *iter);