On deletion, replace with ghost when other active messages in thread

There is no need to add a ghost message upon deletion if there are no
other active messages in the thread.

Also, if the message being deleted was a ghost already, we can just go
ahead and delete it.
This commit is contained in:
Daniel Kahn Gillmor 2016-04-08 22:54:51 -03:00 committed by David Bremner
parent 9eebae3da4
commit 1695415039

View file

@ -1044,10 +1044,13 @@ _notmuch_message_delete (notmuch_message_t *message)
{ {
notmuch_status_t status; notmuch_status_t status;
Xapian::WritableDatabase *db; Xapian::WritableDatabase *db;
const char *mid, *tid; const char *mid, *tid, *query_string;
notmuch_message_t *ghost; notmuch_message_t *ghost;
notmuch_private_status_t private_status; notmuch_private_status_t private_status;
notmuch_database_t *notmuch; notmuch_database_t *notmuch;
notmuch_query_t *query;
unsigned int count = 0;
notmuch_bool_t is_ghost;
mid = notmuch_message_get_message_id (message); mid = notmuch_message_get_message_id (message);
tid = notmuch_message_get_thread_id (message); tid = notmuch_message_get_thread_id (message);
@ -1060,21 +1063,44 @@ _notmuch_message_delete (notmuch_message_t *message)
db = static_cast <Xapian::WritableDatabase *> (notmuch->xapian_db); db = static_cast <Xapian::WritableDatabase *> (notmuch->xapian_db);
db->delete_document (message->doc_id); db->delete_document (message->doc_id);
/* and reintroduce a ghost in its place */ /* if this was a ghost to begin with, we are done */
ghost = _notmuch_message_create_for_message_id (notmuch, mid, &private_status); private_status = _notmuch_message_has_term (message, "type", "ghost", &is_ghost);
if (private_status == NOTMUCH_PRIVATE_STATUS_NO_DOCUMENT_FOUND) { if (private_status)
private_status = _notmuch_message_initialize_ghost (ghost, tid); return COERCE_STATUS (private_status,
if (! private_status) "Error trying to determine whether message was a ghost");
_notmuch_message_sync (ghost); if (is_ghost)
} else if (private_status == NOTMUCH_PRIVATE_STATUS_SUCCESS) { return NOTMUCH_STATUS_SUCCESS;
/* this is deeply weird, and we should not have gotten into
this state. is there a better error message to return query_string = talloc_asprintf (message, "thread:%s", tid);
here? */ query = notmuch_query_create (notmuch, query_string);
return NOTMUCH_STATUS_DUPLICATE_MESSAGE_ID; if (query == NULL)
return NOTMUCH_STATUS_OUT_OF_MEMORY;
status = notmuch_query_count_messages_st (query, &count);
if (status) {
notmuch_query_destroy (query);
return status;
} }
notmuch_message_destroy (ghost); if (count > 0) {
return COERCE_STATUS (private_status, "Error converting to ghost message"); /* reintroduce a ghost in its place because there are still
* other active messages in this thread: */
ghost = _notmuch_message_create_for_message_id (notmuch, mid, &private_status);
if (private_status == NOTMUCH_PRIVATE_STATUS_NO_DOCUMENT_FOUND) {
private_status = _notmuch_message_initialize_ghost (ghost, tid);
if (! private_status)
_notmuch_message_sync (ghost);
} else if (private_status == NOTMUCH_PRIVATE_STATUS_SUCCESS) {
/* this is deeply weird, and we should not have gotten
into this state. is there a better error message to
return here? */
status = NOTMUCH_STATUS_DUPLICATE_MESSAGE_ID;
}
notmuch_message_destroy (ghost);
status = COERCE_STATUS (private_status, "Error converting to ghost message");
}
notmuch_query_destroy (query);
return status;
} }
/* Transform a blank message into a ghost message. The caller must /* Transform a blank message into a ghost message. The caller must