X-Git-Url: https://git.notmuchmail.org/git?a=blobdiff_plain;f=lib%2Fmessage.cc;h=bd1795195b361409b918dc5ffdb7ecdc4c1666f8;hb=f11aaa3678ab9d02d4ea98db1164772ed637404b;hp=e0834f1c7816c6c66a9f0f4286ce33ef0b117f3c;hpb=7e02b448e7684a0b5619ccc1d9144441b909b618;p=notmuch diff --git a/lib/message.cc b/lib/message.cc index e0834f1c..bd179519 100644 --- a/lib/message.cc +++ b/lib/message.cc @@ -318,9 +318,9 @@ _notmuch_message_get_in_reply_to (notmuch_message_t *message) in_reply_to = *i; if (i != message->doc.termlist_end () && - strncmp ((*i).c_str (), prefix, prefix_len)) + strncmp ((*i).c_str (), prefix, prefix_len) == 0) { - INTERNAL_ERROR ("Message %s has duplicate In-Reply-To IDs: %s and %s\n" + INTERNAL_ERROR ("Message %s has duplicate In-Reply-To IDs: %s and %s\n", notmuch_message_get_message_id (message), message->in_reply_to, (*i).c_str () + prefix_len); @@ -385,20 +385,17 @@ notmuch_message_get_replies (notmuch_message_t *message) return _notmuch_messages_create (message->replies); } -/* Set the filename for 'message' to 'filename'. - * - * XXX: We should still figure out if we think it's important to store - * multiple filenames for email messages with identical message IDs. +/* Add an additional 'filename' for 'message'. * * This change will not be reflected in the database until the next * call to _notmuch_message_set_sync. */ -void -_notmuch_message_set_filename (notmuch_message_t *message, +notmuch_status_t +_notmuch_message_add_filename (notmuch_message_t *message, const char *filename) { - const char *s; - const char *db_path; - unsigned int db_path_len; + notmuch_status_t status; + void *local = talloc_new (message); + char *direntry; if (message->filename) { talloc_free (message->filename); @@ -408,41 +405,71 @@ _notmuch_message_set_filename (notmuch_message_t *message, if (filename == NULL) INTERNAL_ERROR ("Message filename cannot be NULL."); - s = filename; + status = _notmuch_database_filename_to_direntry (local, + message->notmuch, + filename, &direntry); + if (status) + return status; - db_path = notmuch_database_get_path (message->notmuch); - db_path_len = strlen (db_path); + _notmuch_message_add_term (message, "direntry", direntry); - if (*s == '/' && strlen (s) > db_path_len - && strncmp (s, db_path, db_path_len) == 0) - { - s += db_path_len; - while (*s == '/') s++; + talloc_free (local); - if (!*s) - INTERNAL_ERROR ("Message filename was same as db prefix."); - } - - message->doc.set_data (s); + return NOTMUCH_STATUS_SUCCESS; } const char * notmuch_message_get_filename (notmuch_message_t *message) { - std::string filename_str; - const char *db_path; + const char *prefix = _find_prefix ("direntry"); + int prefix_len = strlen (prefix); + Xapian::TermIterator i; + char *direntry, *colon; + const char *db_path, *directory, *basename; + unsigned int directory_id; + void *local = talloc_new (message); if (message->filename) return message->filename; - filename_str = message->doc.get_data (); + i = message->doc.termlist_begin (); + i.skip_to (prefix); + + if (i != message->doc.termlist_end ()) + direntry = talloc_strdup (local, (*i).c_str ()); + + if (i == message->doc.termlist_end () || + strncmp (direntry, prefix, prefix_len)) + { + INTERNAL_ERROR ("message with no filename"); + } + + direntry += prefix_len; + + directory_id = strtol (direntry, &colon, 10); + + if (colon == NULL || *colon != ':') + INTERNAL_ERROR ("malformed direntry"); + + basename = colon + 1; + + *colon = '\0'; + db_path = notmuch_database_get_path (message->notmuch); - if (filename_str[0] != '/') - message->filename = talloc_asprintf (message, "%s/%s", db_path, - filename_str.c_str ()); + directory = _notmuch_database_get_directory_path (local, + message->notmuch, + directory_id); + + if (strlen (directory)) + message->filename = talloc_asprintf (message, "%s/%s/%s", + db_path, directory, basename); else - message->filename = talloc_strdup (message, filename_str.c_str ()); + message->filename = talloc_asprintf (message, "%s/%s", + db_path, basename); + talloc_free ((void *) directory); + + talloc_free (local); return message->filename; } @@ -482,38 +509,10 @@ notmuch_message_get_date (notmuch_message_t *message) notmuch_tags_t * notmuch_message_get_tags (notmuch_message_t *message) { - const char *prefix = _find_prefix ("tag"); Xapian::TermIterator i, end; - notmuch_tags_t *tags; - std::string tag; - - /* Currently this iteration is written with the assumption that - * "tag" has a single-character prefix. */ - assert (strlen (prefix) == 1); - - tags = _notmuch_tags_create (message); - if (unlikely (tags == NULL)) - return NULL; - - i = message->doc.termlist_begin (); - end = message->doc.termlist_end (); - - i.skip_to (prefix); - - while (i != end) { - tag = *i; - - if (tag.empty () || tag[0] != *prefix) - break; - - _notmuch_tags_add_tag (tags, tag.c_str () + 1); - - i++; - } - - _notmuch_tags_prepare_iterator (tags); - - return tags; + i = message->doc.termlist_begin(); + end = message->doc.termlist_end(); + return _notmuch_convert_tags(message, i, end); } void