* mu-msg-iter: some reimplementation

This commit is contained in:
Dirk-Jan C. Binnema 2011-03-21 01:55:11 +02:00
parent 4f93f7cc05
commit 656004ee9e
2 changed files with 109 additions and 49 deletions

View File

@ -149,7 +149,7 @@ mu_msg_iter_next (MuMsgIter *iter)
iter = get_next_batch (iter); iter = get_next_batch (iter);
if (iter->_cursor == iter->_matches.end()) if (iter->_cursor == iter->_matches.end())
return FALSE; /* no more matches */ return FALSE; /* no more matches */
/* the message may not be readable / existing, e.g., /* the message may not be readable / existing, e.g.,
* because of the database not being fully up to * because of the database not being fully up to
* date. in that case, we ignore the message. it * 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* const gchar*
mu_msg_iter_get_field (MuMsgIter *iter, MuMsgFieldId mfid) 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_iter_is_done(iter), NULL);
g_return_val_if_fail (mu_msg_field_id_is_valid(mfid), 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 { try {
if (!iter->_str[mfid]) { /* cache the value */
Xapian::Document doc (iter->_cursor.get_document()); return static_cast<gint64>(Xapian::sortable_unserialise(str));
iter->_str[mfid] =
g_strdup (doc.get_value(mfid).c_str()); } MU_XAPIAN_CATCH_BLOCK_RETURN(static_cast<gint64>(-1));
}
return iter->_str[mfid];
} MU_XAPIAN_CATCH_BLOCK_RETURN(NULL);
} }
@ -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_iter_is_done(iter), -1);
g_return_val_if_fail (mu_msg_field_is_numeric(mfid), -1); g_return_val_if_fail (mu_msg_field_is_numeric(mfid), -1);
try { return get_field_numeric (iter, mfid);
return static_cast<gint64>(
Xapian::sortable_unserialise(
mu_msg_iter_get_field(iter, mfid)));
} MU_XAPIAN_CATCH_BLOCK_RETURN(static_cast<gint64>(-1));
} }
@ -238,37 +257,35 @@ const char*
mu_msg_iter_get_path (MuMsgIter *iter) mu_msg_iter_get_path (MuMsgIter *iter)
{ {
g_return_val_if_fail (!mu_msg_iter_is_done(iter), NULL); 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* const char*
mu_msg_iter_get_maildir (MuMsgIter *iter) mu_msg_iter_get_maildir (MuMsgIter *iter)
{ {
g_return_val_if_fail (!mu_msg_iter_is_done(iter), NULL); 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* const char*
mu_msg_iter_get_msgid (MuMsgIter *iter) mu_msg_iter_get_msgid (MuMsgIter *iter)
{ {
g_return_val_if_fail (!mu_msg_iter_is_done(iter), NULL); 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* const char*
mu_msg_iter_get_from (MuMsgIter *iter) mu_msg_iter_get_from (MuMsgIter *iter)
{ {
g_return_val_if_fail (!mu_msg_iter_is_done(iter), NULL); 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* const char*
mu_msg_iter_get_to (MuMsgIter *iter) mu_msg_iter_get_to (MuMsgIter *iter)
{ {
g_return_val_if_fail (!mu_msg_iter_is_done(iter), NULL); 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) mu_msg_iter_get_cc (MuMsgIter *iter)
{ {
g_return_val_if_fail (!mu_msg_iter_is_done(iter), NULL); 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) mu_msg_iter_get_subject (MuMsgIter *iter)
{ {
g_return_val_if_fail (!mu_msg_iter_is_done(iter), NULL); 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) mu_msg_iter_get_size (MuMsgIter *iter)
{ {
g_return_val_if_fail (!mu_msg_iter_is_done(iter), 0); g_return_val_if_fail (!mu_msg_iter_is_done(iter), 0);
return static_cast<size_t>(
try { get_field_numeric (iter,MU_MSG_FIELD_ID_SIZE));
return static_cast<size_t>(
Xapian::sortable_unserialise(
mu_msg_iter_get_field
(iter,MU_MSG_FIELD_ID_SIZE)));
} MU_XAPIAN_CATCH_BLOCK_RETURN(0);
} }
@ -307,22 +318,15 @@ time_t
mu_msg_iter_get_date (MuMsgIter *iter) mu_msg_iter_get_date (MuMsgIter *iter)
{ {
g_return_val_if_fail (!mu_msg_iter_is_done(iter), 0); g_return_val_if_fail (!mu_msg_iter_is_done(iter), 0);
return static_cast<time_t>(
try { get_field_numeric (iter,MU_MSG_FIELD_ID_DATE));
return static_cast<time_t>(
Xapian::sortable_unserialise(
mu_msg_iter_get_field
(iter,MU_MSG_FIELD_ID_DATE)));
} MU_XAPIAN_CATCH_BLOCK_RETURN(0);
} }
MuMsgFlags MuMsgFlags
mu_msg_iter_get_flags (MuMsgIter *iter) mu_msg_iter_get_flags (MuMsgIter *iter)
{ {
g_return_val_if_fail (!mu_msg_iter_is_done(iter), MU_MSG_FLAG_NONE); g_return_val_if_fail (!mu_msg_iter_is_done(iter), MU_MSG_FLAG_NONE);
return static_cast<MuMsgFlags>(get_field_numeric
return static_cast<MuMsgFlags>(mu_msg_iter_get_field_numeric
(iter, MU_MSG_FIELD_ID_FLAGS)); (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), g_return_val_if_fail (!mu_msg_iter_is_done(iter),
MU_MSG_PRIO_NONE); MU_MSG_PRIO_NONE);
return static_cast<MuMsgPrio>(get_field_numeric
return static_cast<MuMsgPrio>(mu_msg_iter_get_field_numeric
(iter, MU_MSG_FIELD_ID_PRIO)); (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<size_t>(get_field_numeric
(iter, MU_MSG_FIELD_ID_SIZE));
mdata->date = static_cast<time_t>(get_field_numeric
(iter, MU_MSG_FIELD_ID_DATE));
mdata->flags = static_cast<MuMsgFlags>(get_field_numeric
(iter, MU_MSG_FIELD_ID_FLAGS));
mdata->prio = static_cast<MuMsgPrio>(get_field_numeric
(iter, MU_MSG_FIELD_ID_PRIO));
} MU_XAPIAN_CATCH_BLOCK_RETURN(NULL);
return mdata;
}

View File

@ -22,6 +22,7 @@
#include <glib.h> #include <glib.h>
#include <mu-msg.h> #include <mu-msg.h>
#include <mu-msg-data.h>
G_BEGIN_DECLS G_BEGIN_DECLS
@ -76,7 +77,23 @@ void mu_msg_iter_destroy (MuMsgIter *iter);
*/ */
MuMsg* mu_msg_iter_get_msg (MuMsgIter *iter, GError **err) MuMsg* mu_msg_iter_get_msg (MuMsgIter *iter, GError **err)
G_GNUC_MALLOC G_GNUC_WARN_UNUSED_RESULT; 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 * get the document id for the current message
* *
@ -117,8 +134,7 @@ const char* mu_msg_iter_get_path (MuMsgIter *iter);
* "/foo/bar" * "/foo/bar"
* *
* @param iter a valid MuMsgIter iterator * @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); const char* mu_msg_iter_get_maildir (MuMsgIter *iter);