* 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);
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<gint64>(Xapian::sortable_unserialise(str));
} MU_XAPIAN_CATCH_BLOCK_RETURN(static_cast<gint64>(-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<gint64>(
Xapian::sortable_unserialise(
mu_msg_iter_get_field(iter, mfid)));
} MU_XAPIAN_CATCH_BLOCK_RETURN(static_cast<gint64>(-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<size_t>(
Xapian::sortable_unserialise(
mu_msg_iter_get_field
(iter,MU_MSG_FIELD_ID_SIZE)));
} MU_XAPIAN_CATCH_BLOCK_RETURN(0);
return static_cast<size_t>(
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<time_t>(
Xapian::sortable_unserialise(
mu_msg_iter_get_field
(iter,MU_MSG_FIELD_ID_DATE)));
} MU_XAPIAN_CATCH_BLOCK_RETURN(0);
return static_cast<time_t>(
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<MuMsgFlags>(mu_msg_iter_get_field_numeric
return static_cast<MuMsgFlags>(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<MuMsgPrio>(mu_msg_iter_get_field_numeric
return static_cast<MuMsgPrio>(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<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 <mu-msg.h>
#include <mu-msg-data.h>
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);