Return-Path: X-Original-To: notmuch@notmuchmail.org Delivered-To: notmuch@notmuchmail.org Received: from localhost (localhost [127.0.0.1]) by olra.theworths.org (Postfix) with ESMTP id 27BD0431FD6 for ; Sat, 22 Feb 2014 14:26:00 -0800 (PST) X-Virus-Scanned: Debian amavisd-new at olra.theworths.org X-Amavis-Alert: BAD HEADER SECTION, Duplicate header field: "References" X-Spam-Flag: NO X-Spam-Score: -0.7 X-Spam-Level: X-Spam-Status: No, score=-0.7 tagged_above=-999 required=5 tests=[RCVD_IN_DNSWL_LOW=-0.7] 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 oLy3ZEGZthdz for ; Sat, 22 Feb 2014 14:25:52 -0800 (PST) Received: from mail-ee0-f51.google.com (mail-ee0-f51.google.com [74.125.83.51]) (using TLSv1 with cipher RC4-SHA (128/128 bits)) (No client certificate requested) by olra.theworths.org (Postfix) with ESMTPS id 5FDE1431FBF for ; Sat, 22 Feb 2014 14:25:52 -0800 (PST) Received: by mail-ee0-f51.google.com with SMTP id b57so2344143eek.24 for ; Sat, 22 Feb 2014 14:25:51 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:in-reply-to:references; bh=JIJz11q7TnNj/v87BCAhFnqfC2IWT1eeIb5tE7df194=; b=kM8e1SfrM/kZ7hovxSVFBVPziZhV3wfxtsUcM6ODI3j1pGi++39wSD7csQtWvBIxJb IDly4Ale4gj6XEVHMGI1sIFR3h5GzXrrqhIHkwlHzaV9wZOhXpsFiTU7v0bXVtoG86mf Zmmhw8S20JVqeaXvT2yVqZ5eiktotCnywkyMQso+DO/IYE/JFgrSEq8U3NTJDZKcAIvx cb6hYSOvTar/CyvKN0MGdkBurHloP6ymEwF26YvrW0nH8yvkYFNqUk76GTr6WM7eZAjF Zmdxss9LV4AwFj12BlDvfM2qFIZDECmGU236NNNxH5eK92GLAuTybQM9sZg59zXRVbfn CUlw== X-Gm-Message-State: ALoCoQmTi800NKADtgYxoVed15lJkAAPmauQOV7xBp1Z5bgmT+8ue7YwmPckmCGHxE/B9ru7LO3y X-Received: by 10.14.177.135 with SMTP id d7mr4770477eem.33.1393107949666; Sat, 22 Feb 2014 14:25:49 -0800 (PST) Received: from localhost (dsl-hkibrasgw2-58c36f-91.dhcp.inet.fi. [88.195.111.91]) by mx.google.com with ESMTPSA id j41sm43760339eey.15.2014.02.22.14.25.48 for (version=TLSv1.2 cipher=RC4-SHA bits=128/128); Sat, 22 Feb 2014 14:25:49 -0800 (PST) From: Jani Nikula To: notmuch@notmuchmail.org Subject: [PATCH v2 01/13] lib: refactor folder term update after filename removal Date: Sun, 23 Feb 2014 00:25:32 +0200 Message-Id: X-Mailer: git-send-email 1.8.5.3 In-Reply-To: References: In-Reply-To: References: 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: Sat, 22 Feb 2014 22:26:00 -0000 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 c91f3a59836f..7aff4ae5111a 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