mirror of
https://git.notmuchmail.org/git/notmuch
synced 2024-12-22 17:34:54 +01:00
lib: Refactor _notmuch_database_link_message
This moves the code to retrieve and clear the metadata thread ID out of _notmuch_database_link_message into its own function. This will simplify future changes.
This commit is contained in:
parent
54ec8a0fd8
commit
46b1b035a5
1 changed files with 43 additions and 26 deletions
|
@ -1958,6 +1958,37 @@ _notmuch_database_link_message_to_children (notmuch_database_t *notmuch,
|
|||
return ret;
|
||||
}
|
||||
|
||||
/* Fetch and clear the stored thread_id for message, or NULL if none. */
|
||||
static char *
|
||||
_consume_metadata_thread_id (void *ctx, notmuch_database_t *notmuch,
|
||||
notmuch_message_t *message)
|
||||
{
|
||||
const char *message_id;
|
||||
string stored_id;
|
||||
char *metadata_key;
|
||||
|
||||
message_id = notmuch_message_get_message_id (message);
|
||||
metadata_key = _get_metadata_thread_id_key (ctx, message_id);
|
||||
|
||||
/* Check if we have already seen related messages to this one.
|
||||
* If we have then use the thread_id that we stored at that time.
|
||||
*/
|
||||
stored_id = notmuch->xapian_db->get_metadata (metadata_key);
|
||||
if (stored_id.empty ()) {
|
||||
return NULL;
|
||||
} else {
|
||||
Xapian::WritableDatabase *db;
|
||||
|
||||
db = static_cast <Xapian::WritableDatabase *> (notmuch->xapian_db);
|
||||
|
||||
/* Clear the metadata for this message ID. We don't need it
|
||||
* anymore. */
|
||||
db->set_metadata (metadata_key, "");
|
||||
|
||||
return talloc_strdup (ctx, stored_id.c_str ());
|
||||
}
|
||||
}
|
||||
|
||||
/* Given a (mostly empty) 'message' and its corresponding
|
||||
* 'message_file' link it to existing threads in the database.
|
||||
*
|
||||
|
@ -1988,42 +2019,25 @@ _notmuch_database_link_message (notmuch_database_t *notmuch,
|
|||
notmuch_message_t *message,
|
||||
notmuch_message_file_t *message_file)
|
||||
{
|
||||
void *local = talloc_new (NULL);
|
||||
notmuch_status_t status;
|
||||
const char *message_id, *thread_id = NULL;
|
||||
char *metadata_key;
|
||||
string stored_id;
|
||||
|
||||
message_id = notmuch_message_get_message_id (message);
|
||||
metadata_key = _get_metadata_thread_id_key (message, message_id);
|
||||
|
||||
/* Check if we have already seen related messages to this one.
|
||||
* If we have then use the thread_id that we stored at that time.
|
||||
*/
|
||||
stored_id = notmuch->xapian_db->get_metadata (metadata_key);
|
||||
if (! stored_id.empty()) {
|
||||
Xapian::WritableDatabase *db;
|
||||
|
||||
db = static_cast <Xapian::WritableDatabase *> (notmuch->xapian_db);
|
||||
|
||||
/* Clear the metadata for this message ID. We don't need it
|
||||
* anymore. */
|
||||
db->set_metadata (metadata_key, "");
|
||||
thread_id = stored_id.c_str();
|
||||
const char *thread_id;
|
||||
|
||||
/* Check if the message already had a thread ID */
|
||||
thread_id = _consume_metadata_thread_id (local, notmuch, message);
|
||||
if (thread_id)
|
||||
_notmuch_message_add_term (message, "thread", thread_id);
|
||||
}
|
||||
talloc_free (metadata_key);
|
||||
|
||||
status = _notmuch_database_link_message_to_parents (notmuch, message,
|
||||
message_file,
|
||||
&thread_id);
|
||||
if (status)
|
||||
return status;
|
||||
goto DONE;
|
||||
|
||||
status = _notmuch_database_link_message_to_children (notmuch, message,
|
||||
&thread_id);
|
||||
if (status)
|
||||
return status;
|
||||
goto DONE;
|
||||
|
||||
/* If not part of any existing thread, generate a new thread ID. */
|
||||
if (thread_id == NULL) {
|
||||
|
@ -2032,7 +2046,10 @@ _notmuch_database_link_message (notmuch_database_t *notmuch,
|
|||
_notmuch_message_add_term (message, "thread", thread_id);
|
||||
}
|
||||
|
||||
return NOTMUCH_STATUS_SUCCESS;
|
||||
DONE:
|
||||
talloc_free (local);
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
notmuch_status_t
|
||||
|
|
Loading…
Reference in a new issue