Skip to content

Commit

Permalink
* mu-msg-iter: some reimplementation
Browse files Browse the repository at this point in the history
  • Loading branch information
djcb committed Mar 20, 2011
1 parent 4f93f7c commit 656004e
Show file tree
Hide file tree
Showing 2 changed files with 109 additions and 49 deletions.
136 changes: 90 additions & 46 deletions src/mu-msg-iter.cc
Expand Up @@ -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
Expand Down Expand Up @@ -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));
}


Expand All @@ -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);
}


Expand Down Expand Up @@ -238,91 +257,76 @@ 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);
}


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);
}


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);
}


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));
}


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));
}

Expand All @@ -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;
}
22 changes: 19 additions & 3 deletions src/mu-msg-iter.h
Expand Up @@ -22,6 +22,7 @@

#include <glib.h>
#include <mu-msg.h>
#include <mu-msg-data.h>

G_BEGIN_DECLS

Expand Down Expand Up @@ -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
*
Expand Down Expand Up @@ -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);

Expand Down

0 comments on commit 656004e

Please sign in to comment.