* mu-store.cc: support GSList* fields

This commit is contained in:
Dirk-Jan C. Binnema
2011-06-15 23:52:32 +03:00
parent dab245d010
commit 76bef9f984

View File

@ -346,26 +346,15 @@ add_terms_values_number (Xapian::Document& doc, MuMsg *msg, MuMsgFieldId mfid)
} else if (mfid == MU_MSG_FIELD_ID_PRIO) { } else if (mfid == MU_MSG_FIELD_ID_PRIO) {
doc.add_term (prefix(mfid) + std::string(1, doc.add_term (prefix(mfid) + std::string(1,
mu_msg_prio_char((MuMsgPrio)num))); mu_msg_prio_char((MuMsgPrio)num)));
} //else }
// doc.add_term (pfx + numstr);
} }
/* for string and string-list */
static void static void
add_terms_values_string (Xapian::Document& doc, MuMsg *msg, add_terms_values_str (Xapian::Document& doc, char *val,
MuMsgFieldId mfid) MuMsgFieldId mfid)
{ {
const char *orig;
char *val;
size_t len;
if (!(orig = mu_msg_get_field_string (msg, mfid)))
return; /* nothing to do */
/* try stack-allocation, it's much faster*/
len = strlen (orig);
val = (char*)(G_LIKELY(len < 1024)?g_alloca(len+1):g_malloc(len+1));
strcpy (val, orig);
/* the value is what we'll display; the unchanged original */ /* the value is what we'll display; the unchanged original */
if (mu_msg_field_xapian_value(mfid)) if (mu_msg_field_xapian_value(mfid))
doc.add_value ((Xapian::valueno)mfid, val); doc.add_value ((Xapian::valueno)mfid, val);
@ -385,6 +374,46 @@ add_terms_values_string (Xapian::Document& doc, MuMsg *msg,
if (mu_msg_field_xapian_term(mfid)) if (mu_msg_field_xapian_term(mfid))
doc.add_term (prefix(mfid) + doc.add_term (prefix(mfid) +
std::string(val, 0, MU_STORE_MAX_TERM_LENGTH)); std::string(val, 0, MU_STORE_MAX_TERM_LENGTH));
}
static void
add_terms_values_string_list (Xapian::Document& doc, MuMsg *msg,
MuMsgFieldId mfid)
{
const GSList *lst;
gchar *str;
lst = mu_msg_get_field_string_list (msg, mfid);
if (!lst)
return; /* nothing to do */
str = mu_str_from_list (lst, ',');
if (!str)
return; /* nothing to do */
add_terms_values_str (doc, str, mfid);
}
static void
add_terms_values_string (Xapian::Document& doc, MuMsg *msg,
MuMsgFieldId mfid)
{
const char *orig;
char *val;
size_t len;
if (!(orig = mu_msg_get_field_string (msg, mfid)))
return; /* nothing to do */
/* try stack-allocation, it's much faster*/
len = strlen (orig);
val = (char*)(G_LIKELY(len < 1024)?g_alloca(len+1):g_malloc(len+1));
strcpy (val, orig);
add_terms_values_str (doc, val, mfid);
if (!(G_LIKELY(len < 1024))) if (!(G_LIKELY(len < 1024)))
g_free (val); g_free (val);
@ -483,10 +512,14 @@ add_terms_values (MuMsgFieldId mfid, MsgDoc* msgdoc)
if (mu_msg_field_is_numeric (mfid)) if (mu_msg_field_is_numeric (mfid))
add_terms_values_number (*msgdoc->_doc, msgdoc->_msg, add_terms_values_number (*msgdoc->_doc, msgdoc->_msg,
mfid); mfid);
else if (mu_msg_field_type (mfid) == MU_MSG_FIELD_TYPE_STRING) else if (mu_msg_field_is_string (mfid))
add_terms_values_string (*msgdoc->_doc, add_terms_values_string (*msgdoc->_doc,
msgdoc->_msg, msgdoc->_msg,
mfid); mfid);
else if (mu_msg_field_is_string_list(mfid))
add_terms_values_string_list (*msgdoc->_doc,
msgdoc->_msg,
mfid);
else else
g_return_if_reached (); g_return_if_reached ();
} }