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 http://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"
37 #pragma GCC visibility push(hidden)
39 /* Bit masks for _notmuch_database::features. Features are named,
40 * independent aspects of the database schema.
42 * A database stores the set of features that it "uses" (implicitly
43 * before database version 3 and explicitly as of version 3).
45 * A given library version will "recognize" a particular set of
46 * features; if a database uses a feature that the library does not
47 * recognize, the library will refuse to open it. It is assumed the
48 * set of recognized features grows monotonically over time. A
49 * library version will "implement" some subset of the recognized
50 * features: some operations may require that the database use (or not
51 * use) some feature, while other operations may support both
52 * databases that use and that don't use some feature.
54 * On disk, the database stores string names for these features (see
55 * the feature_names array). These enum bit values are never
56 * persisted to disk and may change freely.
58 enum _notmuch_features {
59 /* If set, file names are stored in "file-direntry" terms. If
60 * unset, file names are stored in document data.
62 * Introduced: version 1. */
63 NOTMUCH_FEATURE_FILE_TERMS = 1 << 0,
65 /* If set, directory timestamps are stored in documents with
66 * XDIRECTORY terms and relative paths. If unset, directory
67 * timestamps are stored in documents with XTIMESTAMP terms and
70 * Introduced: version 1. */
71 NOTMUCH_FEATURE_DIRECTORY_DOCS = 1 << 1,
73 /* If set, the from, subject, and message-id headers are stored in
74 * message document values. If unset, message documents *may*
75 * have these values, but if the value is empty, it must be
76 * retrieved from the message file.
78 * Introduced: optional in version 1, required as of version 3.
80 NOTMUCH_FEATURE_FROM_SUBJECT_ID_VALUES = 1 << 2,
82 /* If set, folder terms are boolean and path terms exist. If
83 * unset, folder terms are probabilistic and stemmed and path
86 * Introduced: version 2. */
87 NOTMUCH_FEATURE_BOOL_FOLDER = 1 << 3,
90 /* In C++, a named enum is its own type, so define bitwise operators
91 * on _notmuch_features. */
92 inline _notmuch_features
93 operator|(_notmuch_features a, _notmuch_features b)
95 return static_cast<_notmuch_features>(
96 static_cast<unsigned>(a) | static_cast<unsigned>(b));
99 inline _notmuch_features
100 operator&(_notmuch_features a, _notmuch_features b)
102 return static_cast<_notmuch_features>(
103 static_cast<unsigned>(a) & static_cast<unsigned>(b));
106 inline _notmuch_features
107 operator~(_notmuch_features a)
109 return static_cast<_notmuch_features>(~static_cast<unsigned>(a));
112 inline _notmuch_features&
113 operator|=(_notmuch_features &a, _notmuch_features b)
119 inline _notmuch_features&
120 operator&=(_notmuch_features &a, _notmuch_features b)
126 struct _notmuch_database {
127 notmuch_bool_t exception_reported;
131 notmuch_database_mode_t mode;
133 Xapian::Database *xapian_db;
135 /* Bit mask of features used by this database. This is a
136 * bitwise-OR of NOTMUCH_FEATURE_* values (above). */
137 enum _notmuch_features features;
139 unsigned int last_doc_id;
140 uint64_t last_thread_id;
142 Xapian::QueryParser *query_parser;
143 Xapian::TermGenerator *term_gen;
144 Xapian::ValueRangeProcessor *value_range_processor;
145 Xapian::ValueRangeProcessor *date_range_processor;
148 /* Prior to database version 3, features were implied by the database
149 * version number, so hard-code them for earlier versions. */
150 #define NOTMUCH_FEATURES_V0 ((enum _notmuch_features)0)
151 #define NOTMUCH_FEATURES_V1 (NOTMUCH_FEATURES_V0 | NOTMUCH_FEATURE_FILE_TERMS | \
152 NOTMUCH_FEATURE_DIRECTORY_DOCS)
153 #define NOTMUCH_FEATURES_V2 (NOTMUCH_FEATURES_V1 | NOTMUCH_FEATURE_BOOL_FOLDER)
155 /* Current database features. If any of these are missing from a
156 * database, request an upgrade.
157 * NOTMUCH_FEATURE_FROM_SUBJECT_ID_VALUES is not included because
158 * upgrade doesn't currently introduce the feature (though brand new
159 * databases will have it). */
160 #define NOTMUCH_FEATURES_CURRENT \
161 (NOTMUCH_FEATURE_FILE_TERMS | NOTMUCH_FEATURE_DIRECTORY_DOCS | \
162 NOTMUCH_FEATURE_BOOL_FOLDER)
164 /* Return the list of terms from the given iterator matching a prefix.
165 * The prefix will be stripped from the strings in the returned list.
166 * The list will be allocated using ctx as the talloc context.
168 * The function returns NULL on failure.
170 notmuch_string_list_t *
171 _notmuch_database_get_terms_with_prefix (void *ctx, Xapian::TermIterator &i,
172 Xapian::TermIterator &end,
175 #pragma GCC visibility pop