/* Remove all terms generated by indexing, i.e. not tags or
* properties, along with any automatic tags*/
+/* According to Xapian API docs, none of these calls throw
+ * exceptions */
notmuch_private_status_t
_notmuch_message_remove_indexed_terms (notmuch_message_t *message)
{
tag_prefix = _find_prefix ("tag"),
type_prefix = _find_prefix ("type");
- for (i = message->doc.termlist_begin ();
- i != message->doc.termlist_end (); i++) {
+ /* Make sure we have the data to restore to Xapian*/
+ _notmuch_message_ensure_metadata (message,NULL);
- const std::string term = *i;
+ /* Empirically, it turns out to be faster to remove all the terms,
+ * and add back the ones we want. */
+ message->doc.clear_terms ();
+ message->modified = true;
- if (term.compare (0, type_prefix.size (), type_prefix) == 0)
- continue;
+ /* still a mail message */
+ message->doc.add_term (type_prefix + "mail");
- if (term.compare (0, id_prefix.size (), id_prefix) == 0)
- continue;
+ /* Put back message-id */
+ message->doc.add_term (id_prefix + message->message_id);
- if (term.compare (0, property_prefix.size (), property_prefix) == 0)
- continue;
-
- if (term.compare (0, tag_prefix.size (), tag_prefix) == 0 &&
- term.compare (1, strlen("encrypted"), "encrypted") != 0 &&
- term.compare (1, strlen("signed"), "signed") != 0 &&
- term.compare (1, strlen("attachment"), "attachment") != 0)
- continue;
+ /* Put back non-automatic tags */
+ for (notmuch_tags_t *tags = notmuch_message_get_tags (message);
+ notmuch_tags_valid (tags);
+ notmuch_tags_move_to_next (tags)) {
- try {
- message->doc.remove_term ((*i));
- message->modified = true;
- } catch (const Xapian::InvalidArgumentError) {
- /* Ignore failure to remove non-existent term. */
- } catch (const Xapian::Error &error) {
- notmuch_database_t *notmuch = message->notmuch;
+ const char *tag = notmuch_tags_get (tags);
- if (!notmuch->exception_reported) {
- _notmuch_database_log(notmuch_message_get_database (message), "A Xapian exception occurred creating message: %s\n",
- error.get_msg().c_str());
- notmuch->exception_reported = true;
- }
- return NOTMUCH_PRIVATE_STATUS_XAPIAN_EXCEPTION;
+ if (STRNCMP_LITERAL (tag, "encrypted") != 0 &&
+ STRNCMP_LITERAL (tag, "signed") != 0 &&
+ STRNCMP_LITERAL (tag, "attachment") != 0) {
+ std::string term = tag_prefix + tag;
+ message->doc.add_term(term);
}
}
+
+ /* Put back properties */
+ notmuch_message_properties_t *list;
+
+ for (list = notmuch_message_get_properties (message, "", false);
+ notmuch_message_properties_valid (list); notmuch_message_properties_move_to_next (list)) {
+ std::string term = property_prefix +
+ notmuch_message_properties_key(list) + "=" +
+ notmuch_message_properties_value(list);
+
+ message->doc.add_term(term);
+ }
+
+ notmuch_message_properties_destroy (list);
+
return NOTMUCH_PRIVATE_STATUS_SUCCESS;
}
+
/* Return true if p points at "new" or "cur". */
static bool is_maildir (const char *p)
{
message->modified = true;
}
+void
+_notmuch_message_update_subject (notmuch_message_t *message,
+ const char *subject)
+{
+ message->doc.add_value (NOTMUCH_VALUE_SUBJECT, subject);
+ message->modified = true;
+}
+
/* Upgrade a message to support NOTMUCH_FEATURE_LAST_MOD. The caller
* must call _notmuch_message_sync. */
void
term_gen->set_termpos (message->termpos);
if (prefix_name) {
+ const char *prefix = _notmuch_database_prefix (message->notmuch, prefix_name);
+ if (prefix == NULL)
+ return NOTMUCH_PRIVATE_STATUS_BAD_PREFIX;
+
_notmuch_message_invalidate_metadata (message, prefix_name);
- term_gen->index_text (text, 1, _find_prefix (prefix_name));
+ term_gen->index_text (text, 1, prefix);
} else {
term_gen->index_text (text);
}