]> git.notmuchmail.org Git - notmuch/blob - lib/database-private.h
e2e4bc8721744a91d2b06cfadef8c959f5d48de7
[notmuch] / lib / database-private.h
1 /* database-private.h - For peeking into the internals of notmuch_database_t
2  *
3  * Copyright © 2009 Carl Worth
4  *
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.
9  *
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.
14  *
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/ .
17  *
18  * Author: Carl Worth <cworth@cworth.org>
19  */
20
21 #ifndef NOTMUCH_DATABASE_PRIVATE_H
22 #define NOTMUCH_DATABASE_PRIVATE_H
23
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,
28  * but there it is.
29  */
30 #define __STDC_FORMAT_MACROS
31 #include <inttypes.h>
32
33 #include "notmuch-private.h"
34
35 #include <xapian.h>
36
37 #pragma GCC visibility push(hidden)
38
39 /* Bit masks for _notmuch_database::features.  Features are named,
40  * independent aspects of the database schema.
41  *
42  * A database stores the set of features that it "uses" (implicitly
43  * before database version 3 and explicitly as of version 3).
44  *
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.
53  *
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.
57  */
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.
61      *
62      * Introduced: version 1. */
63     NOTMUCH_FEATURE_FILE_TERMS = 1 << 0,
64
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
68      * absolute paths.
69      *
70      * Introduced: version 1. */
71     NOTMUCH_FEATURE_DIRECTORY_DOCS = 1 << 1,
72
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.
77      *
78      * Introduced: optional in version 1, required as of version 3.
79      */
80     NOTMUCH_FEATURE_FROM_SUBJECT_ID_VALUES = 1 << 2,
81
82     /* If set, folder terms are boolean and path terms exist.  If
83      * unset, folder terms are probabilistic and stemmed and path
84      * terms do not exist.
85      *
86      * Introduced: version 2. */
87     NOTMUCH_FEATURE_BOOL_FOLDER = 1 << 3,
88
89     /* If set, missing messages are stored in ghost mail documents.
90      * If unset, thread IDs of ghost messages are stored as database
91      * metadata instead of in ghost documents.
92      *
93      * Introduced: version 3. */
94     NOTMUCH_FEATURE_GHOSTS = 1 << 4,
95 };
96
97 /* In C++, a named enum is its own type, so define bitwise operators
98  * on _notmuch_features. */
99 inline _notmuch_features
100 operator|(_notmuch_features a, _notmuch_features b)
101 {
102     return static_cast<_notmuch_features>(
103         static_cast<unsigned>(a) | static_cast<unsigned>(b));
104 }
105
106 inline _notmuch_features
107 operator&(_notmuch_features a, _notmuch_features b)
108 {
109     return static_cast<_notmuch_features>(
110         static_cast<unsigned>(a) & static_cast<unsigned>(b));
111 }
112
113 inline _notmuch_features
114 operator~(_notmuch_features a)
115 {
116     return static_cast<_notmuch_features>(~static_cast<unsigned>(a));
117 }
118
119 inline _notmuch_features&
120 operator|=(_notmuch_features &a, _notmuch_features b)
121 {
122     a = a | b;
123     return a;
124 }
125
126 inline _notmuch_features&
127 operator&=(_notmuch_features &a, _notmuch_features b)
128 {
129     a = a & b;
130     return a;
131 }
132
133 struct _notmuch_database {
134     notmuch_bool_t exception_reported;
135
136     char *path;
137
138     notmuch_database_mode_t mode;
139     int atomic_nesting;
140     Xapian::Database *xapian_db;
141
142     /* Bit mask of features used by this database.  This is a
143      * bitwise-OR of NOTMUCH_FEATURE_* values (above). */
144     enum _notmuch_features features;
145
146     unsigned int last_doc_id;
147     uint64_t last_thread_id;
148
149     Xapian::QueryParser *query_parser;
150     Xapian::TermGenerator *term_gen;
151     Xapian::ValueRangeProcessor *value_range_processor;
152     Xapian::ValueRangeProcessor *date_range_processor;
153 };
154
155 /* Prior to database version 3, features were implied by the database
156  * version number, so hard-code them for earlier versions. */
157 #define NOTMUCH_FEATURES_V0 ((enum _notmuch_features)0)
158 #define NOTMUCH_FEATURES_V1 (NOTMUCH_FEATURES_V0 | NOTMUCH_FEATURE_FILE_TERMS | \
159                              NOTMUCH_FEATURE_DIRECTORY_DOCS)
160 #define NOTMUCH_FEATURES_V2 (NOTMUCH_FEATURES_V1 | NOTMUCH_FEATURE_BOOL_FOLDER)
161
162 /* Current database features.  If any of these are missing from a
163  * database, request an upgrade.
164  * NOTMUCH_FEATURE_FROM_SUBJECT_ID_VALUES is not included because
165  * upgrade doesn't currently introduce the feature (though brand new
166  * databases will have it). */
167 #define NOTMUCH_FEATURES_CURRENT \
168     (NOTMUCH_FEATURE_FILE_TERMS | NOTMUCH_FEATURE_DIRECTORY_DOCS | \
169      NOTMUCH_FEATURE_BOOL_FOLDER)
170
171 /* Return the list of terms from the given iterator matching a prefix.
172  * The prefix will be stripped from the strings in the returned list.
173  * The list will be allocated using ctx as the talloc context.
174  *
175  * The function returns NULL on failure.
176  */
177 notmuch_string_list_t *
178 _notmuch_database_get_terms_with_prefix (void *ctx, Xapian::TermIterator &i,
179                                          Xapian::TermIterator &end,
180                                          const char *prefix);
181
182 #pragma GCC visibility pop
183
184 #endif