mirror of
https://git.notmuchmail.org/git/notmuch
synced 2024-11-25 04:18:08 +01:00
add_message: Pull the thread-stitching portion out into new _notmuch_database_link_message
The function was getting too long-winded before. Add since I'm about to change how we handle the thread linking, it's convenient to have it in an isolated function.
This commit is contained in:
parent
7b227a6bf7
commit
6b20dbff86
1 changed files with 70 additions and 47 deletions
117
database.cc
117
database.cc
|
@ -699,6 +699,70 @@ notmuch_database_get_timestamp (notmuch_database_t *notmuch, const char *key)
|
|||
return ret;
|
||||
}
|
||||
|
||||
/* Given a (mostly empty) 'message' and its corresponding
|
||||
* 'message_file' link it to existing threads in the database.
|
||||
*
|
||||
* We first looke at 'message_file' and its link-relevant headers
|
||||
* (References and In-Reply-To) for message IDs. We also look in the
|
||||
* database for existing message that reference 'message'.p
|
||||
*
|
||||
* The end result is to call _notmuch_message_add_thread_id with one
|
||||
* or more thread IDs to which this message belongs, (including
|
||||
* generating a new thread ID if necessary if the message doesn't
|
||||
* connect to any existing threads).
|
||||
*/
|
||||
static notmuch_status_t
|
||||
_notmuch_database_link_message (notmuch_database_t *notmuch,
|
||||
notmuch_message_t *message,
|
||||
notmuch_message_file_t *message_file)
|
||||
{
|
||||
GPtrArray *parents, *thread_ids;
|
||||
const char *refs, *in_reply_to;
|
||||
const char *message_id = notmuch_message_get_message_id (message);
|
||||
unsigned int i;
|
||||
|
||||
parents = g_ptr_array_new ();
|
||||
|
||||
refs = notmuch_message_file_get_header (message_file, "references");
|
||||
parse_references (parents, refs);
|
||||
|
||||
in_reply_to = notmuch_message_file_get_header (message_file, "in-reply-to");
|
||||
parse_references (parents, in_reply_to);
|
||||
|
||||
for (i = 0; i < parents->len; i++)
|
||||
_notmuch_message_add_term (message, "ref",
|
||||
(char *) g_ptr_array_index (parents, i));
|
||||
|
||||
thread_ids = find_thread_ids (notmuch, parents, message_id);
|
||||
|
||||
for (i = 0; i < parents->len; i++)
|
||||
g_free (g_ptr_array_index (parents, i));
|
||||
g_ptr_array_free (parents, TRUE);
|
||||
|
||||
if (thread_ids->len) {
|
||||
GString *thread_id;
|
||||
char *id;
|
||||
|
||||
for (i = 0; i < thread_ids->len; i++) {
|
||||
id = (char *) thread_ids->pdata[i];
|
||||
_notmuch_message_add_thread_id (message, id);
|
||||
if (i == 0)
|
||||
thread_id = g_string_new (id);
|
||||
else
|
||||
g_string_append_printf (thread_id, ",%s", id);
|
||||
|
||||
free (id);
|
||||
}
|
||||
g_string_free (thread_id, TRUE);
|
||||
} else {
|
||||
_notmuch_message_ensure_thread_id (message);
|
||||
}
|
||||
|
||||
g_ptr_array_free (thread_ids, TRUE);
|
||||
|
||||
return NOTMUCH_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
notmuch_status_t
|
||||
notmuch_database_add_message (notmuch_database_t *notmuch,
|
||||
const char *filename)
|
||||
|
@ -707,14 +771,10 @@ notmuch_database_add_message (notmuch_database_t *notmuch,
|
|||
notmuch_message_t *message;
|
||||
notmuch_status_t ret = NOTMUCH_STATUS_SUCCESS;
|
||||
|
||||
GPtrArray *parents, *thread_ids;
|
||||
|
||||
const char *refs, *in_reply_to, *date, *header;
|
||||
const char *date, *header;
|
||||
const char *from, *to, *subject, *old_filename;
|
||||
char *message_id;
|
||||
|
||||
unsigned int i;
|
||||
|
||||
message_file = notmuch_message_file_open (filename);
|
||||
if (message_file == NULL) {
|
||||
ret = NOTMUCH_STATUS_FILE_ERROR;
|
||||
|
@ -765,6 +825,8 @@ notmuch_database_add_message (notmuch_database_t *notmuch,
|
|||
notmuch,
|
||||
message_id,
|
||||
&ret);
|
||||
free (message_id);
|
||||
|
||||
if (message == NULL)
|
||||
goto DONE;
|
||||
|
||||
|
@ -778,48 +840,9 @@ notmuch_database_add_message (notmuch_database_t *notmuch,
|
|||
_notmuch_message_add_term (message, "type", "mail");
|
||||
}
|
||||
|
||||
/* Next, find the thread(s) to which this message belongs. */
|
||||
parents = g_ptr_array_new ();
|
||||
|
||||
refs = notmuch_message_file_get_header (message_file, "references");
|
||||
parse_references (parents, refs);
|
||||
|
||||
in_reply_to = notmuch_message_file_get_header (message_file, "in-reply-to");
|
||||
parse_references (parents, in_reply_to);
|
||||
|
||||
for (i = 0; i < parents->len; i++)
|
||||
_notmuch_message_add_term (message, "ref",
|
||||
(char *) g_ptr_array_index (parents, i));
|
||||
|
||||
thread_ids = find_thread_ids (notmuch, parents, message_id);
|
||||
|
||||
free (message_id);
|
||||
|
||||
for (i = 0; i < parents->len; i++)
|
||||
g_free (g_ptr_array_index (parents, i));
|
||||
g_ptr_array_free (parents, TRUE);
|
||||
|
||||
if (thread_ids->len) {
|
||||
unsigned int i;
|
||||
GString *thread_id;
|
||||
char *id;
|
||||
|
||||
for (i = 0; i < thread_ids->len; i++) {
|
||||
id = (char *) thread_ids->pdata[i];
|
||||
_notmuch_message_add_thread_id (message, id);
|
||||
if (i == 0)
|
||||
thread_id = g_string_new (id);
|
||||
else
|
||||
g_string_append_printf (thread_id, ",%s", id);
|
||||
|
||||
free (id);
|
||||
}
|
||||
g_string_free (thread_id, TRUE);
|
||||
} else {
|
||||
_notmuch_message_ensure_thread_id (message);
|
||||
}
|
||||
|
||||
g_ptr_array_free (thread_ids, TRUE);
|
||||
ret = _notmuch_database_link_message (notmuch, message, message_file);
|
||||
if (ret)
|
||||
goto DONE;
|
||||
|
||||
date = notmuch_message_file_get_header (message_file, "date");
|
||||
_notmuch_message_set_date (message, date);
|
||||
|
|
Loading…
Reference in a new issue