X-Git-Url: https://git.notmuchmail.org/git?p=notmuch;a=blobdiff_plain;f=notmuch-index-message.cc;h=02f250b419f01dd5d643f4f8d98d61fa13531567;hp=4585a3b98905d03d44252f7a88d55b2c06f76f23;hb=8f3ccda00fc79cdd518277852496d88be4c7d4a9;hpb=bae1ce09a37071cdf592048938319c72653e96e0 diff --git a/notmuch-index-message.cc b/notmuch-index-message.cc index 4585a3b9..02f250b4 100644 --- a/notmuch-index-message.cc +++ b/notmuch-index-message.cc @@ -54,6 +54,7 @@ #include #include #include +#include #include @@ -170,30 +171,44 @@ gen_terms_address_name (Xapian::TermGenerator term_gen, InternetAddress *address, const char *prefix_name) { - const char *name; - int own_name = 0; - - name = internet_address_get_name (address); - - /* In the absence of a name, we'll strip the part before the @ - * from the address. */ - if (! name) { - InternetAddressMailbox *mailbox = INTERNET_ADDRESS_MAILBOX (address); - const char *addr = internet_address_mailbox_get_addr (mailbox); - const char *at; + if (INTERNET_ADDRESS_IS_MAILBOX(address)) { + const char *name; + int own_name = 0; + + name = internet_address_get_name (address); + + /* In the absence of a name, we'll strip the part before the @ + * from the address. */ + if (! name) { + InternetAddressMailbox *mailbox = INTERNET_ADDRESS_MAILBOX (address); + const char *addr = internet_address_mailbox_get_addr (mailbox); + const char *at; + + at = strchr (addr, '@'); + if (at) { + name = strndup (addr, at - addr); + own_name = 1; + } + } - at = strchr (addr, '@'); - if (at) { - name = strndup (addr, at - addr); - own_name = 1; + if (name) + gen_terms (term_gen, prefix_name, name); + + if (own_name) + free ((void *) name); + } else if (INTERNET_ADDRESS_IS_GROUP (address)) { + InternetAddressGroup *group = INTERNET_ADDRESS_GROUP (address); + InternetAddressList *list = internet_address_group_get_members(group); + if (list) { + int length = internet_address_list_length(list); + int i; + + for (i = 0; i < length; i++) + gen_terms_address_name(term_gen, + internet_address_list_get_address(list, i), + prefix_name); } } - - if (name) - gen_terms (term_gen, prefix_name, name); - - if (own_name) - free ((void *) name); } static void @@ -204,6 +219,9 @@ gen_terms_address_names (Xapian::TermGenerator term_gen, int i; InternetAddress *address; + if (addresses == NULL) + return; + for (i = 0; i < internet_address_list_length (addresses); i++) { address = internet_address_list_get_address (addresses, i); gen_terms_address_name (term_gen, address, address_type); @@ -217,13 +235,27 @@ add_term_address_addr (Xapian::Document doc, InternetAddress *address, const char *prefix_name) { - InternetAddressMailbox *mailbox = INTERNET_ADDRESS_MAILBOX (address); - const char *addr; - - addr = internet_address_mailbox_get_addr (mailbox); - - if (addr) - add_term (doc, prefix_name, addr); + if (INTERNET_ADDRESS_IS_MAILBOX(address)) { + InternetAddressMailbox *mailbox = INTERNET_ADDRESS_MAILBOX (address); + const char *addr; + + addr = internet_address_mailbox_get_addr (mailbox); + + if (addr) + add_term (doc, prefix_name, addr); + } else if (INTERNET_ADDRESS_IS_GROUP (address)) { + InternetAddressGroup *group = INTERNET_ADDRESS_GROUP (address); + InternetAddressList *list = internet_address_group_get_members(group); + if (list) { + int length = internet_address_list_length(list); + int i; + + for (i = 0; i < length; i++) + add_term_address_addr(doc, + internet_address_list_get_address(list, i), + prefix_name); + } + } } static void @@ -234,6 +266,9 @@ add_terms_address_addrs (Xapian::Document doc, int i; InternetAddress *address; + if (addresses == NULL) + return; + for (i = 0; i < internet_address_list_length (addresses); i++) { address = internet_address_list_get_address (addresses, i); add_term_address_addr (doc, address, address_type); @@ -246,6 +281,9 @@ skip_re_in_subject (const char *subject) { const char *s = subject; + if (subject == NULL) + return NULL; + while (*s) { while (*s && isspace (*s)) s++; @@ -465,7 +503,17 @@ gen_terms_part (Xapian::TermGenerator term_gen, return; } - if (! GMIME_IS_PART (part)) { + if (GMIME_IS_MESSAGE_PART (part)) { + GMimeMessage *message; + + message = g_mime_message_part_get_message (GMIME_MESSAGE_PART (part)); + + gen_terms_part (term_gen, g_mime_message_get_mime_part (message)); + + return; + } + + if (! (GMIME_IS_PART (part))) { fprintf (stderr, "Warning: Not indexing unknown mime part: %s.\n", g_type_name (G_OBJECT_TYPE (part))); return; @@ -497,7 +545,8 @@ gen_terms_part (Xapian::TermGenerator term_gen, stream = g_mime_stream_mem_new_with_byte_array (byte_array); g_mime_stream_mem_set_owner (GMIME_STREAM_MEM (stream), FALSE); wrapper = g_mime_part_get_content_object (GMIME_PART (part)); - g_mime_data_wrapper_write_to_stream (wrapper, stream); + if (wrapper) + g_mime_data_wrapper_write_to_stream (wrapper, stream); g_object_unref (stream); @@ -670,6 +719,8 @@ main (int argc, char **argv) GIOChannel *channel; GIOStatus gio_status; GError *error = NULL; + int count; + struct timeval tv_start, tv_now; if (argc < 2) { usage (argv[0]); @@ -691,6 +742,10 @@ main (int argc, char **argv) channel = g_io_channel_unix_new (fileno (stdin)); + count = 0; + + gettimeofday (&tv_start, NULL); + while (1) { gio_status = g_io_channel_read_line (channel, &filename, NULL, NULL, &error); @@ -706,6 +761,14 @@ main (int argc, char **argv) index_file (db, term_gen, filename); g_free (filename); + + count++; + if (count % 1000 == 0) { + gettimeofday (&tv_now, NULL); + printf ("Indexed %d messages (%g messages/second)\n", + count, count / ((tv_now.tv_sec - tv_start.tv_sec) + + (tv_now.tv_usec - tv_start.tv_usec) / 1e6)); + } } } catch (const Xapian::Error &error) {