* mu-store.cc: support GSList* fields
This commit is contained in:
@ -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 ();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user