From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from localhost (localhost [127.0.0.1]) by olra.theworths.org (Postfix) with ESMTP id F2694431FDC for ; Tue, 11 Mar 2014 16:03:14 -0700 (PDT) X-Virus-Scanned: Debian amavisd-new at olra.theworths.org X-Spam-Flag: NO X-Spam-Score: 0 X-Spam-Level: X-Spam-Status: No, score=0 tagged_above=-999 required=5 tests=[none] autolearn=disabled Received: from olra.theworths.org ([127.0.0.1]) by localhost (olra.theworths.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id ImtzEESjRaGX for ; Tue, 11 Mar 2014 16:03:12 -0700 (PDT) Received: from yantan.tethera.net (yantan.tethera.net [199.188.72.155]) (using TLSv1 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by olra.theworths.org (Postfix) with ESMTPS id D31B4431FD0 for ; Tue, 11 Mar 2014 16:02:31 -0700 (PDT) Received: from remotemail by yantan.tethera.net with local (Exim 4.80) (envelope-from ) id 1WNVgt-0001w3-9r; Tue, 11 Mar 2014 20:02:31 -0300 Received: (nullmailer pid 25847 invoked by uid 1000); Tue, 11 Mar 2014 23:01:45 -0000 From: David Bremner To: notmuch@notmuchmail.org Subject: [Patch v6 04/14] lib: refactor folder term update after filename removal Date: Tue, 11 Mar 2014 20:01:30 -0300 Message-Id: <1394578900-25618-5-git-send-email-david@tethera.net> X-Mailer: git-send-email 1.8.5.3 In-Reply-To: <1394578900-25618-1-git-send-email-david@tethera.net> References: <1394578900-25618-1-git-send-email-david@tethera.net> X-BeenThere: notmuch@notmuchmail.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: "Use and development of the notmuch mail system." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 11 Mar 2014 23:03:15 -0000 From: Jani Nikula Abstract some blocks of code for reuse. No functional changes. --- lib/message.cc | 135 ++++++++++++++++++++++++++++----------------------------- 1 file changed, 66 insertions(+), 69 deletions(-) diff --git a/lib/message.cc b/lib/message.cc index c91f3a5..7aff4ae 100644 --- a/lib/message.cc +++ b/lib/message.cc @@ -481,6 +481,68 @@ notmuch_message_get_replies (notmuch_message_t *message) return _notmuch_messages_create (message->replies); } +static void +_notmuch_message_remove_terms (notmuch_message_t *message, const char *prefix) +{ + Xapian::TermIterator i; + size_t prefix_len = strlen (prefix); + + while (1) { + i = message->doc.termlist_begin (); + i.skip_to (prefix); + + /* Terminate loop when no terms remain with desired prefix. */ + if (i == message->doc.termlist_end () || + strncmp ((*i).c_str (), prefix, prefix_len)) + break; + + try { + message->doc.remove_term ((*i)); + } catch (const Xapian::InvalidArgumentError) { + /* Ignore failure to remove non-existent term. */ + } + } +} + +/* Add directory based terms for all filenames of the message. */ +static notmuch_status_t +_notmuch_message_add_directory_terms (void *ctx, notmuch_message_t *message) +{ + const char *direntry_prefix = _find_prefix ("file-direntry"); + int direntry_prefix_len = strlen (direntry_prefix); + Xapian::TermIterator i = message->doc.termlist_begin (); + notmuch_status_t status = NOTMUCH_STATUS_SUCCESS; + + for (i.skip_to (direntry_prefix); i != message->doc.termlist_end (); i++) { + unsigned int directory_id; + const char *direntry, *directory; + char *colon; + + /* Terminate loop at first term without desired prefix. */ + if (strncmp ((*i).c_str (), direntry_prefix, direntry_prefix_len)) + break; + + /* Indicate that there are filenames remaining. */ + status = NOTMUCH_STATUS_DUPLICATE_MESSAGE_ID; + + direntry = (*i).c_str (); + direntry += direntry_prefix_len; + + directory_id = strtol (direntry, &colon, 10); + + if (colon == NULL || *colon != ':') + INTERNAL_ERROR ("malformed direntry"); + + directory = _notmuch_database_get_directory_path (ctx, + message->notmuch, + directory_id); + if (strlen (directory)) + _notmuch_message_gen_terms (message, "folder", directory); + } + + return status; +} + /* Add an additional 'filename' for 'message'. * * This change will not be reflected in the database until the next @@ -536,17 +598,12 @@ notmuch_status_t _notmuch_message_remove_filename (notmuch_message_t *message, const char *filename) { - const char *direntry_prefix = _find_prefix ("file-direntry"); - int direntry_prefix_len = strlen (direntry_prefix); - const char *folder_prefix = _find_prefix ("folder"); - int folder_prefix_len = strlen (folder_prefix); void *local = talloc_new (message); + const char *folder_prefix = _find_prefix ("folder"); char *zfolder_prefix = talloc_asprintf(local, "Z%s", folder_prefix); - int zfolder_prefix_len = strlen (zfolder_prefix); char *direntry; notmuch_private_status_t private_status; notmuch_status_t status; - Xapian::TermIterator i, last; status = _notmuch_database_filename_to_direntry ( local, message->notmuch, filename, NOTMUCH_FIND_LOOKUP, &direntry); @@ -567,73 +624,13 @@ _notmuch_message_remove_filename (notmuch_message_t *message, * 3. adding back terms for all remaining filenames of the message. */ /* 1. removing all "folder:" terms */ - while (1) { - i = message->doc.termlist_begin (); - i.skip_to (folder_prefix); - - /* Terminate loop when no terms remain with desired prefix. */ - if (i == message->doc.termlist_end () || - strncmp ((*i).c_str (), folder_prefix, folder_prefix_len)) - { - break; - } - - try { - message->doc.remove_term ((*i)); - } catch (const Xapian::InvalidArgumentError) { - /* Ignore failure to remove non-existent term. */ - } - } + _notmuch_message_remove_terms (message, folder_prefix); /* 2. removing all "folder:" stemmed terms */ - while (1) { - i = message->doc.termlist_begin (); - i.skip_to (zfolder_prefix); - - /* Terminate loop when no terms remain with desired prefix. */ - if (i == message->doc.termlist_end () || - strncmp ((*i).c_str (), zfolder_prefix, zfolder_prefix_len)) - { - break; - } - - try { - message->doc.remove_term ((*i)); - } catch (const Xapian::InvalidArgumentError) { - /* Ignore failure to remove non-existent term. */ - } - } + _notmuch_message_remove_terms (message, zfolder_prefix); /* 3. adding back terms for all remaining filenames of the message. */ - i = message->doc.termlist_begin (); - i.skip_to (direntry_prefix); - - for (; i != message->doc.termlist_end (); i++) { - unsigned int directory_id; - const char *direntry, *directory; - char *colon; - - /* Terminate loop at first term without desired prefix. */ - if (strncmp ((*i).c_str (), direntry_prefix, direntry_prefix_len)) - break; - - /* Indicate that there are filenames remaining. */ - status = NOTMUCH_STATUS_DUPLICATE_MESSAGE_ID; - - direntry = (*i).c_str (); - direntry += direntry_prefix_len; - - directory_id = strtol (direntry, &colon, 10); - - if (colon == NULL || *colon != ':') - INTERNAL_ERROR ("malformed direntry"); - - directory = _notmuch_database_get_directory_path (local, - message->notmuch, - directory_id); - if (strlen (directory)) - _notmuch_message_gen_terms (message, "folder", directory); - } + status = _notmuch_message_add_directory_terms (local, message); talloc_free (local); -- 1.8.5.3