1 /* database-private.h - For peeking into the internals of notmuch_database_t
3 * Copyright © 2009 Carl Worth
5 * This program is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation, either version 3 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program. If not, see https://www.gnu.org/licenses/ .
18 * Author: Carl Worth <cworth@cworth.org>
21 #ifndef NOTMUCH_DATABASE_PRIVATE_H
22 #define NOTMUCH_DATABASE_PRIVATE_H
24 /* According to WG14/N1124, a C++ implementation won't provide us a
25 * macro like PRIx64 (which gives a printf format string for
26 * formatting a uint64_t as hexadecimal) unless we define
27 * __STDC_FORMAT_MACROS before including inttypes.h. That's annoying,
30 #define __STDC_FORMAT_MACROS
33 #include "notmuch-private.h"
35 #ifdef SILENCE_XAPIAN_DEPRECATION_WARNINGS
36 #define XAPIAN_DEPRECATED(D) D
41 /* Bit masks for _notmuch_database::features. Features are named,
42 * independent aspects of the database schema.
44 * A database stores the set of features that it "uses" (implicitly
45 * before database version 3 and explicitly as of version 3).
47 * A given library version will "recognize" a particular set of
48 * features; if a database uses a feature that the library does not
49 * recognize, the library will refuse to open it. It is assumed the
50 * set of recognized features grows monotonically over time. A
51 * library version will "implement" some subset of the recognized
52 * features: some operations may require that the database use (or not
53 * use) some feature, while other operations may support both
54 * databases that use and that don't use some feature.
56 * On disk, the database stores string names for these features (see
57 * the feature_names array). These enum bit values are never
58 * persisted to disk and may change freely.
60 enum _notmuch_features {
61 /* If set, file names are stored in "file-direntry" terms. If
62 * unset, file names are stored in document data.
64 * Introduced: version 1. */
65 NOTMUCH_FEATURE_FILE_TERMS = 1 << 0,
67 /* If set, directory timestamps are stored in documents with
68 * XDIRECTORY terms and relative paths. If unset, directory
69 * timestamps are stored in documents with XTIMESTAMP terms and
72 * Introduced: version 1. */
73 NOTMUCH_FEATURE_DIRECTORY_DOCS = 1 << 1,
75 /* If set, the from, subject, and message-id headers are stored in
76 * message document values. If unset, message documents *may*
77 * have these values, but if the value is empty, it must be
78 * retrieved from the message file.
80 * Introduced: optional in version 1, required as of version 3.
82 NOTMUCH_FEATURE_FROM_SUBJECT_ID_VALUES = 1 << 2,
84 /* If set, folder terms are boolean and path terms exist. If
85 * unset, folder terms are probabilistic and stemmed and path
88 * Introduced: version 2. */
89 NOTMUCH_FEATURE_BOOL_FOLDER = 1 << 3,
91 /* If set, missing messages are stored in ghost mail documents.
92 * If unset, thread IDs of ghost messages are stored as database
93 * metadata instead of in ghost documents.
95 * Introduced: version 3. */
96 NOTMUCH_FEATURE_GHOSTS = 1 << 4,
99 /* If set, then the database was created after the introduction of
100 * indexed mime types. If unset, then the database may contain a
101 * mixture of messages with indexed and non-indexed mime types.
103 * Introduced: version 3. */
104 NOTMUCH_FEATURE_INDEXED_MIMETYPES = 1 << 5,
106 /* If set, messages store the revision number of the last
107 * modification in NOTMUCH_VALUE_LAST_MOD.
109 * Introduced: version 3. */
110 NOTMUCH_FEATURE_LAST_MOD = 1 << 6,
113 /* In C++, a named enum is its own type, so define bitwise operators
114 * on _notmuch_features. */
115 inline _notmuch_features
116 operator|(_notmuch_features a, _notmuch_features b)
118 return static_cast<_notmuch_features>(
119 static_cast<unsigned>(a) | static_cast<unsigned>(b));
122 inline _notmuch_features
123 operator&(_notmuch_features a, _notmuch_features b)
125 return static_cast<_notmuch_features>(
126 static_cast<unsigned>(a) & static_cast<unsigned>(b));
129 inline _notmuch_features
130 operator~(_notmuch_features a)
132 return static_cast<_notmuch_features>(~static_cast<unsigned>(a));
135 inline _notmuch_features&
136 operator|=(_notmuch_features &a, _notmuch_features b)
142 inline _notmuch_features&
143 operator&=(_notmuch_features &a, _notmuch_features b)
150 * Configuration options for xapian database fields */
151 typedef enum notmuch_field_flags {
152 NOTMUCH_FIELD_NO_FLAGS = 0,
153 NOTMUCH_FIELD_EXTERNAL = 1 << 0,
154 NOTMUCH_FIELD_PROBABILISTIC = 1 << 1,
155 NOTMUCH_FIELD_PROCESSOR = 1 << 2,
156 } notmuch_field_flag_t;
159 * define bitwise operators to hide casts */
160 inline notmuch_field_flag_t
161 operator|(notmuch_field_flag_t a, notmuch_field_flag_t b)
163 return static_cast<notmuch_field_flag_t>(
164 static_cast<unsigned>(a) | static_cast<unsigned>(b));
167 inline notmuch_field_flag_t
168 operator&(notmuch_field_flag_t a, notmuch_field_flag_t b)
170 return static_cast<notmuch_field_flag_t>(
171 static_cast<unsigned>(a) & static_cast<unsigned>(b));
174 #define NOTMUCH_QUERY_PARSER_FLAGS (Xapian::QueryParser::FLAG_BOOLEAN | \
175 Xapian::QueryParser::FLAG_PHRASE | \
176 Xapian::QueryParser::FLAG_LOVEHATE | \
177 Xapian::QueryParser::FLAG_BOOLEAN_ANY_CASE | \
178 Xapian::QueryParser::FLAG_WILDCARD | \
179 Xapian::QueryParser::FLAG_PURE_NOT)
181 struct _notmuch_database {
182 bool exception_reported;
186 notmuch_database_mode_t mode;
188 /* true if changes have been made in this atomic section */
190 Xapian::Database *xapian_db;
192 /* Bit mask of features used by this database. This is a
193 * bitwise-OR of NOTMUCH_FEATURE_* values (above). */
194 enum _notmuch_features features;
196 unsigned int last_doc_id;
197 uint64_t last_thread_id;
199 /* error reporting; this value persists only until the
200 * next library call. May be NULL */
203 /* Highest committed revision number. Modifications are recorded
204 * under a higher revision number, which can be generated with
205 * notmuch_database_new_revision. */
206 unsigned long revision;
209 /* Keep track of the number of times the database has been re-opened
210 * (or other global invalidations of notmuch's caching)
213 Xapian::QueryParser *query_parser;
214 Xapian::TermGenerator *term_gen;
215 Xapian::ValueRangeProcessor *value_range_processor;
216 Xapian::ValueRangeProcessor *date_range_processor;
217 Xapian::ValueRangeProcessor *last_mod_range_processor;
220 /* Prior to database version 3, features were implied by the database
221 * version number, so hard-code them for earlier versions. */
222 #define NOTMUCH_FEATURES_V0 ((enum _notmuch_features)0)
223 #define NOTMUCH_FEATURES_V1 (NOTMUCH_FEATURES_V0 | NOTMUCH_FEATURE_FILE_TERMS | \
224 NOTMUCH_FEATURE_DIRECTORY_DOCS)
225 #define NOTMUCH_FEATURES_V2 (NOTMUCH_FEATURES_V1 | NOTMUCH_FEATURE_BOOL_FOLDER)
227 /* Current database features. If any of these are missing from a
228 * database, request an upgrade.
229 * NOTMUCH_FEATURE_FROM_SUBJECT_ID_VALUES and
230 * NOTMUCH_FEATURE_INDEXED_MIMETYPES are not included because upgrade
231 * doesn't currently introduce the features (though brand new databases
233 #define NOTMUCH_FEATURES_CURRENT \
234 (NOTMUCH_FEATURE_FILE_TERMS | NOTMUCH_FEATURE_DIRECTORY_DOCS | \
235 NOTMUCH_FEATURE_BOOL_FOLDER | NOTMUCH_FEATURE_GHOSTS | \
236 NOTMUCH_FEATURE_LAST_MOD)
238 /* Return the list of terms from the given iterator matching a prefix.
239 * The prefix will be stripped from the strings in the returned list.
240 * The list will be allocated using ctx as the talloc context.
242 * The function returns NULL on failure.
244 notmuch_string_list_t *
245 _notmuch_database_get_terms_with_prefix (void *ctx, Xapian::TermIterator &i,
246 Xapian::TermIterator &end,
250 _notmuch_database_find_doc_ids (notmuch_database_t *notmuch,
251 const char *prefix_name,
253 Xapian::PostingIterator *begin,
254 Xapian::PostingIterator *end);