mirror of https://github.com/djcb/mu.git
* mu-msg-iter: some reimplementation
This commit is contained in:
parent
4f93f7cc05
commit
656004ee9e
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
Loading…
Reference in New Issue