X-Git-Url: https://git.notmuchmail.org/git?p=notmuch;a=blobdiff_plain;f=lib%2Fdatabase-private.h;h=041602cdc6a8911b33531cfa8e0dbd72307b8242;hp=3fb10f7a408415fc7b22a1ce7cf34fa72cbba5b7;hb=a09293793f43b93b7008dd361b192199ad528fca;hpb=33c8777a967ece2dd4bbda7e83a4e07c195abf51 diff --git a/lib/database-private.h b/lib/database-private.h index 3fb10f7a..041602cd 100644 --- a/lib/database-private.h +++ b/lib/database-private.h @@ -13,7 +13,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see http://www.gnu.org/licenses/ . + * along with this program. If not, see https://www.gnu.org/licenses/ . * * Author: Carl Worth */ @@ -32,9 +32,11 @@ #include "notmuch-private.h" -#include +#ifdef SILENCE_XAPIAN_DEPRECATION_WARNINGS +#define XAPIAN_DEPRECATED(D) D +#endif -#pragma GCC visibility push(hidden) +#include /* Bit masks for _notmuch_database::features. Features are named, * independent aspects of the database schema. @@ -60,7 +62,7 @@ enum _notmuch_features { * unset, file names are stored in document data. * * Introduced: version 1. */ - NOTMUCH_FEATURE_FILE_TERMS = 1 << 0, + NOTMUCH_FEATURE_FILE_TERMS = 1 << 0, /* If set, directory timestamps are stored in documents with * XDIRECTORY terms and relative paths. If unset, directory @@ -68,7 +70,7 @@ enum _notmuch_features { * absolute paths. * * Introduced: version 1. */ - NOTMUCH_FEATURE_DIRECTORY_DOCS = 1 << 1, + NOTMUCH_FEATURE_DIRECTORY_DOCS = 1 << 1, /* If set, the from, subject, and message-id headers are stored in * message document values. If unset, message documents *may* @@ -77,21 +79,21 @@ enum _notmuch_features { * * Introduced: optional in version 1, required as of version 3. */ - NOTMUCH_FEATURE_FROM_SUBJECT_ID_VALUES = 1 << 2, + NOTMUCH_FEATURE_FROM_SUBJECT_ID_VALUES = 1 << 2, /* If set, folder terms are boolean and path terms exist. If * unset, folder terms are probabilistic and stemmed and path * terms do not exist. * * Introduced: version 2. */ - NOTMUCH_FEATURE_BOOL_FOLDER = 1 << 3, + NOTMUCH_FEATURE_BOOL_FOLDER = 1 << 3, /* If set, missing messages are stored in ghost mail documents. * If unset, thread IDs of ghost messages are stored as database * metadata instead of in ghost documents. * * Introduced: version 3. */ - NOTMUCH_FEATURE_GHOSTS = 1 << 4, + NOTMUCH_FEATURE_GHOSTS = 1 << 4, /* If set, then the database was created after the introduction of @@ -99,62 +101,100 @@ enum _notmuch_features { * mixture of messages with indexed and non-indexed mime types. * * Introduced: version 3. */ - NOTMUCH_FEATURE_INDEXED_MIMETYPES = 1 << 5, + NOTMUCH_FEATURE_INDEXED_MIMETYPES = 1 << 5, /* If set, messages store the revision number of the last * modification in NOTMUCH_VALUE_LAST_MOD. * * Introduced: version 3. */ - NOTMUCH_FEATURE_LAST_MOD = 1 << 6, + NOTMUCH_FEATURE_LAST_MOD = 1 << 6, + + /* If set, unprefixed terms are stored only for the message body, + * not for headers. + * + * Introduced: version 3. */ + NOTMUCH_FEATURE_UNPREFIX_BODY_ONLY = 1 << 7, }; /* In C++, a named enum is its own type, so define bitwise operators * on _notmuch_features. */ inline _notmuch_features -operator|(_notmuch_features a, _notmuch_features b) +operator| (_notmuch_features a, _notmuch_features b) { return static_cast<_notmuch_features>( static_cast(a) | static_cast(b)); } inline _notmuch_features -operator&(_notmuch_features a, _notmuch_features b) +operator& (_notmuch_features a, _notmuch_features b) { return static_cast<_notmuch_features>( static_cast(a) & static_cast(b)); } inline _notmuch_features -operator~(_notmuch_features a) +operator~ (_notmuch_features a) { return static_cast<_notmuch_features>(~static_cast(a)); } inline _notmuch_features& -operator|=(_notmuch_features &a, _notmuch_features b) +operator|= (_notmuch_features &a, _notmuch_features b) { a = a | b; return a; } inline _notmuch_features& -operator&=(_notmuch_features &a, _notmuch_features b) +operator&= (_notmuch_features &a, _notmuch_features b) { a = a & b; return a; } +/* + * Configuration options for xapian database fields */ +typedef enum notmuch_field_flags { + NOTMUCH_FIELD_NO_FLAGS = 0, + NOTMUCH_FIELD_EXTERNAL = 1 << 0, + NOTMUCH_FIELD_PROBABILISTIC = 1 << 1, + NOTMUCH_FIELD_PROCESSOR = 1 << 2, +} notmuch_field_flag_t; + +/* + * define bitwise operators to hide casts */ +inline notmuch_field_flag_t +operator| (notmuch_field_flag_t a, notmuch_field_flag_t b) +{ + return static_cast( + static_cast(a) | static_cast(b)); +} + +inline notmuch_field_flag_t +operator& (notmuch_field_flag_t a, notmuch_field_flag_t b) +{ + return static_cast( + static_cast(a) & static_cast(b)); +} + +#define NOTMUCH_QUERY_PARSER_FLAGS (Xapian::QueryParser::FLAG_BOOLEAN | \ + Xapian::QueryParser::FLAG_PHRASE | \ + Xapian::QueryParser::FLAG_LOVEHATE | \ + Xapian::QueryParser::FLAG_BOOLEAN_ANY_CASE | \ + Xapian::QueryParser::FLAG_WILDCARD | \ + Xapian::QueryParser::FLAG_PURE_NOT) + struct _notmuch_database { - notmuch_bool_t exception_reported; + bool exception_reported; char *path; - notmuch_database_mode_t mode; int atomic_nesting; - /* TRUE if changes have been made in this atomic section */ - notmuch_bool_t atomic_dirty; + /* true if changes have been made in this atomic section */ + bool atomic_dirty; Xapian::Database *xapian_db; - + Xapian::WritableDatabase *writable_xapian_db; + bool open; /* Bit mask of features used by this database. This is a * bitwise-OR of NOTMUCH_FEATURE_* values (above). */ enum _notmuch_features features; @@ -172,16 +212,25 @@ struct _notmuch_database { unsigned long revision; const char *uuid; + /* Keep track of the number of times the database has been re-opened + * (or other global invalidations of notmuch's caching) + */ + unsigned long view; Xapian::QueryParser *query_parser; Xapian::TermGenerator *term_gen; - Xapian::ValueRangeProcessor *value_range_processor; - Xapian::ValueRangeProcessor *date_range_processor; - Xapian::ValueRangeProcessor *last_mod_range_processor; + Xapian::RangeProcessor *value_range_processor; + Xapian::RangeProcessor *date_range_processor; + Xapian::RangeProcessor *last_mod_range_processor; + + /* XXX it's slightly gross to use two parallel string->string maps + * here, but at least they are small */ + notmuch_string_map_t *user_prefix; + notmuch_string_map_t *user_header; }; /* Prior to database version 3, features were implied by the database * version number, so hard-code them for earlier versions. */ -#define NOTMUCH_FEATURES_V0 ((enum _notmuch_features)0) +#define NOTMUCH_FEATURES_V0 ((enum _notmuch_features) 0) #define NOTMUCH_FEATURES_V1 (NOTMUCH_FEATURES_V0 | NOTMUCH_FEATURE_FILE_TERMS | \ NOTMUCH_FEATURE_DIRECTORY_DOCS) #define NOTMUCH_FEATURES_V2 (NOTMUCH_FEATURES_V1 | NOTMUCH_FEATURE_BOOL_FOLDER) @@ -208,6 +257,10 @@ _notmuch_database_get_terms_with_prefix (void *ctx, Xapian::TermIterator &i, Xapian::TermIterator &end, const char *prefix); -#pragma GCC visibility pop - +void +_notmuch_database_find_doc_ids (notmuch_database_t *notmuch, + const char *prefix_name, + const char *value, + Xapian::PostingIterator *begin, + Xapian::PostingIterator *end); #endif