[PATCH 06/10] cli: Introduce "notmuch address" command
[notmuch-archives.git] / 27 / bf5b689b518935729b752e0f642d626aa29d45
1 Return-Path: <amdragon@mit.edu>\r
2 X-Original-To: notmuch@notmuchmail.org\r
3 Delivered-To: notmuch@notmuchmail.org\r
4 Received: from localhost (localhost [127.0.0.1])\r
5         by olra.theworths.org (Postfix) with ESMTP id 11453431FC7\r
6         for <notmuch@notmuchmail.org>; Sat, 26 Jul 2014 20:53:32 -0700 (PDT)\r
7 X-Virus-Scanned: Debian amavisd-new at olra.theworths.org\r
8 X-Spam-Flag: NO\r
9 X-Spam-Score: -2.3\r
10 X-Spam-Level: \r
11 X-Spam-Status: No, score=-2.3 tagged_above=-999 required=5\r
12         tests=[RCVD_IN_DNSWL_MED=-2.3] autolearn=disabled\r
13 Received: from olra.theworths.org ([127.0.0.1])\r
14         by localhost (olra.theworths.org [127.0.0.1]) (amavisd-new, port 10024)\r
15         with ESMTP id Sbjh1W7WjSco for <notmuch@notmuchmail.org>;\r
16         Sat, 26 Jul 2014 20:53:26 -0700 (PDT)\r
17 Received: from dmz-mailsec-scanner-8.mit.edu (dmz-mailsec-scanner-8.mit.edu\r
18         [18.7.68.37])\r
19         (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits))\r
20         (No client certificate requested)\r
21         by olra.theworths.org (Postfix) with ESMTPS id B5A3E431FCF\r
22         for <notmuch@notmuchmail.org>; Sat, 26 Jul 2014 20:53:08 -0700 (PDT)\r
23 X-AuditID: 12074425-f79766d000006da8-c5-53d477a1f1d2\r
24 Received: from mailhub-auth-3.mit.edu ( [18.9.21.43])\r
25         (using TLS with cipher AES256-SHA (256/256 bits))\r
26         (Client did not present a certificate)\r
27         by dmz-mailsec-scanner-8.mit.edu (Symantec Messaging Gateway) with SMTP\r
28         id F0.5E.28072.1A774D35; Sat, 26 Jul 2014 23:53:05 -0400 (EDT)\r
29 Received: from outgoing.mit.edu (outgoing-auth-1.mit.edu [18.9.28.11])\r
30         by mailhub-auth-3.mit.edu (8.13.8/8.9.2) with ESMTP id s6R3r2xj004147; \r
31         Sat, 26 Jul 2014 23:53:02 -0400\r
32 Received: from drake.dyndns.org\r
33         (216-15-114-40.c3-0.arl-ubr1.sbo-arl.ma.cable.rcn.com\r
34         [216.15.114.40]) (authenticated bits=0)\r
35         (User authenticated as amdragon@ATHENA.MIT.EDU)\r
36         by outgoing.mit.edu (8.13.8/8.12.4) with ESMTP id s6R3r0Se016410\r
37         (version=TLSv1/SSLv3 cipher=AES256-SHA bits=256 verify=NOT);\r
38         Sat, 26 Jul 2014 23:53:01 -0400\r
39 Received: from amthrax by drake.dyndns.org with local (Exim 4.77)\r
40         (envelope-from <amdragon@mit.edu>)\r
41         id 1XBFW8-00051e-Fw; Sat, 26 Jul 2014 23:53:00 -0400\r
42 From: Austin Clements <amdragon@MIT.EDU>\r
43 To: notmuch@notmuchmail.org\r
44 Subject: [PATCH 12/14] lib: Support empty header values in database\r
45 Date: Sat, 26 Jul 2014 23:52:51 -0400\r
46 Message-Id: <1406433173-19169-13-git-send-email-amdragon@mit.edu>\r
47 X-Mailer: git-send-email 2.0.0\r
48 In-Reply-To: <1406433173-19169-1-git-send-email-amdragon@mit.edu>\r
49 References: <1406433173-19169-1-git-send-email-amdragon@mit.edu>\r
50 X-Brightmail-Tracker:\r
51  H4sIAAAAAAAAA+NgFtrIIsWRmVeSWpSXmKPExsUixCmqrbuw/EqwwZJpEhbXb85kdmD0eLbq\r
52         FnMAYxSXTUpqTmZZapG+XQJXxt2zT5gKXotXnF2wk7mBsV24i5GTQ0LARGLf5g5GCFtM4sK9\r
53         9WxdjFwcQgKzmSQWL/4KlhAS2MgoMWdjHUTiDpPEgXPfmSGcuYwSJ54dYAGpYhPQkNi2fzlY\r
54         h4iAtMTOu7NZuxg5OJgF1CT+dKmAhIUFnCW2HukAK2cRUJV40HGHGcTmFXCUeL38CivEFXIS\r
55         DTc+sYHYnEDx489OsIGMERJwkLh1KXECI/8CRoZVjLIpuVW6uYmZOcWpybrFyYl5ealFuhZ6\r
56         uZkleqkppZsYQSHD7qK6g3HCIaVDjAIcjEo8vAIsV4KFWBPLiitzDzFKcjApifLuNwMK8SXl\r
57         p1RmJBZnxBeV5qQWH2KU4GBWEuEVKgbK8aYkVlalFuXDpKQ5WJTEed9aWwULCaQnlqRmp6YW\r
58         pBbBZGU4OJQkeL+WAjUKFqWmp1akZeaUIKSZODhBhvMADd8AUsNbXJCYW5yZDpE/xagoJc77\r
59         CyQhAJLIKM2D64XF9CtGcaBXhHlZy4CqeIDpAK77FdBgJqDBLP6XQQaXJCKkpBoYYwxv5k0y\r
60         WjN/vvAphUfTLLbcd1onGnOEvZZJxt2xkeN/nuyMV0G/GLVWnE9/q6Bld21h3poGK1UhH8tF\r
61         st0mckdenRX88+K/V/6Lnmtcn55uC8kRW3zsc30ts1tfw7UrK07WLNX9f8XTqO7uFr6DDsoJ\r
62         wrVMb8qSFBJmnHh6d1UFj0mXUclmJZbijERDLeai4kQAc0HKvMQCAAA=\r
63 X-BeenThere: notmuch@notmuchmail.org\r
64 X-Mailman-Version: 2.1.13\r
65 Precedence: list\r
66 List-Id: "Use and development of the notmuch mail system."\r
67         <notmuch.notmuchmail.org>\r
68 List-Unsubscribe: <http://notmuchmail.org/mailman/options/notmuch>,\r
69         <mailto:notmuch-request@notmuchmail.org?subject=unsubscribe>\r
70 List-Archive: <http://notmuchmail.org/pipermail/notmuch>\r
71 List-Post: <mailto:notmuch@notmuchmail.org>\r
72 List-Help: <mailto:notmuch-request@notmuchmail.org?subject=help>\r
73 List-Subscribe: <http://notmuchmail.org/mailman/listinfo/notmuch>,\r
74         <mailto:notmuch-request@notmuchmail.org?subject=subscribe>\r
75 X-List-Received-Date: Sun, 27 Jul 2014 03:53:32 -0000\r
76 \r
77 Commit 567bcbc2 introduced support for storing various headers in\r
78 document values.  However, doing so in a backwards-compatible way\r
79 meant that genuinely empty header values could not be distinguished\r
80 from the old behavior of not storing the headers at all, so these\r
81 required parsing the original message.\r
82 \r
83 Now that we have database features, new databases can declare that all\r
84 messages have header values, so if we have this feature flag, we can\r
85 use the stored header value even if it's the empty string.\r
86 \r
87 This requires slight cleanup to notmuch_message_get_header, since the\r
88 code previously couldn't distinguish between empty headers and headers\r
89 that are never stored in the database (previously this distinction\r
90 didn't matter).\r
91 ---\r
92  lib/message.cc | 45 +++++++++++++++++++++++++++------------------\r
93  1 file changed, 27 insertions(+), 18 deletions(-)\r
94 \r
95 diff --git a/lib/message.cc b/lib/message.cc\r
96 index e6a5a5a..4fc427f 100644\r
97 --- a/lib/message.cc\r
98 +++ b/lib/message.cc\r
99 @@ -412,26 +412,35 @@ _notmuch_message_ensure_message_file (notmuch_message_t *message)\r
100  const char *\r
101  notmuch_message_get_header (notmuch_message_t *message, const char *header)\r
102  {\r
103 -    try {\r
104 -           std::string value;\r
105 -\r
106 -           /* Fetch header from the appropriate xapian value field if\r
107 -            * available */\r
108 -           if (strcasecmp (header, "from") == 0)\r
109 -               value = message->doc.get_value (NOTMUCH_VALUE_FROM);\r
110 -           else if (strcasecmp (header, "subject") == 0)\r
111 -               value = message->doc.get_value (NOTMUCH_VALUE_SUBJECT);\r
112 -           else if (strcasecmp (header, "message-id") == 0)\r
113 -               value = message->doc.get_value (NOTMUCH_VALUE_MESSAGE_ID);\r
114 -\r
115 -           if (!value.empty())\r
116 +    Xapian::valueno slot = Xapian::BAD_VALUENO;\r
117 +\r
118 +    /* Fetch header from the appropriate xapian value field if\r
119 +     * available */\r
120 +    if (strcasecmp (header, "from") == 0)\r
121 +       slot = NOTMUCH_VALUE_FROM;\r
122 +    else if (strcasecmp (header, "subject") == 0)\r
123 +       slot = NOTMUCH_VALUE_SUBJECT;\r
124 +    else if (strcasecmp (header, "message-id") == 0)\r
125 +       slot = NOTMUCH_VALUE_MESSAGE_ID;\r
126 +\r
127 +    if (slot != Xapian::BAD_VALUENO) {\r
128 +       try {\r
129 +           std::string value = message->doc.get_value (slot);\r
130 +\r
131 +           /* If we have NOTMUCH_FEATURE_FROM_SUBJECT_ID_VALUES, then\r
132 +            * empty values indicate empty headers.  If we don't, then\r
133 +            * it could just mean we didn't record the header. */\r
134 +           if ((message->notmuch->features &\r
135 +                NOTMUCH_FEATURE_FROM_SUBJECT_ID_VALUES) ||\r
136 +               ! value.empty())\r
137                 return talloc_strdup (message, value.c_str ());\r
138  \r
139 -    } catch (Xapian::Error &error) {\r
140 -       fprintf (stderr, "A Xapian exception occurred when reading header: %s\n",\r
141 -                error.get_msg().c_str());\r
142 -       message->notmuch->exception_reported = TRUE;\r
143 -       return NULL;\r
144 +       } catch (Xapian::Error &error) {\r
145 +           fprintf (stderr, "A Xapian exception occurred when reading header: %s\n",\r
146 +                    error.get_msg().c_str());\r
147 +           message->notmuch->exception_reported = TRUE;\r
148 +           return NULL;\r
149 +       }\r
150      }\r
151  \r
152      /* Otherwise fall back to parsing the file */\r
153 -- \r
154 2.0.0\r
155 \r