]> git.cworth.org Git - notmuch/blob - lib/notmuch.h
emacs: Add new option notmuch-search-hide-excluded
[notmuch] / lib / notmuch.h
1 /* notmuch - Not much of an email library, (just index and search)
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 https://www.gnu.org/licenses/ .
17  *
18  * Author: Carl Worth <cworth@cworth.org>
19  */
20
21 /**
22  * @defgroup notmuch The notmuch API
23  *
24  * Not much of an email library, (just index and search)
25  *
26  * @{
27  */
28
29 #ifndef NOTMUCH_H
30 #define NOTMUCH_H
31
32 #ifndef __DOXYGEN__
33
34 #ifdef  __cplusplus
35 # define NOTMUCH_BEGIN_DECLS  extern "C" {
36 # define NOTMUCH_END_DECLS    }
37 #else
38 # define NOTMUCH_BEGIN_DECLS
39 # define NOTMUCH_END_DECLS
40 #endif
41
42 NOTMUCH_BEGIN_DECLS
43
44 #include <time.h>
45
46 #pragma GCC visibility push(default)
47
48 #ifndef FALSE
49 #define FALSE 0
50 #endif
51
52 #ifndef TRUE
53 #define TRUE 1
54 #endif
55
56 /*
57  * The library version number.  This must agree with the soname
58  * version in Makefile.local.
59  */
60 #define LIBNOTMUCH_MAJOR_VERSION        5
61 #define LIBNOTMUCH_MINOR_VERSION        6
62 #define LIBNOTMUCH_MICRO_VERSION        0
63
64
65 #if defined (__clang_major__) && __clang_major__ >= 3 \
66     || defined (__GNUC__) && __GNUC__ >= 5 \
67     || defined (__GNUC__) && __GNUC__ == 4 && __GNUC_MINOR__ >= 5
68 #define NOTMUCH_DEPRECATED(major, minor) \
69     __attribute__ ((deprecated ("function deprecated as of libnotmuch " #major "." #minor)))
70 #else
71 #define NOTMUCH_DEPRECATED(major, minor) __attribute__ ((deprecated))
72 #endif
73
74
75 #endif /* __DOXYGEN__ */
76
77 /**
78  * Check the version of the notmuch library being compiled against.
79  *
80  * Return true if the library being compiled against is of the
81  * specified version or above. For example:
82  *
83  * @code
84  * #if LIBNOTMUCH_CHECK_VERSION(3, 1, 0)
85  *     (code requiring libnotmuch 3.1.0 or above)
86  * #endif
87  * @endcode
88  *
89  * LIBNOTMUCH_CHECK_VERSION has been defined since version 3.1.0; to
90  * check for versions prior to that, use:
91  *
92  * @code
93  * #if !defined(NOTMUCH_CHECK_VERSION)
94  *     (code requiring libnotmuch prior to 3.1.0)
95  * #endif
96  * @endcode
97  */
98 #define LIBNOTMUCH_CHECK_VERSION(major, minor, micro)                   \
99     (LIBNOTMUCH_MAJOR_VERSION > (major) ||                                      \
100      (LIBNOTMUCH_MAJOR_VERSION == (major) && LIBNOTMUCH_MINOR_VERSION > (minor)) || \
101      (LIBNOTMUCH_MAJOR_VERSION == (major) && LIBNOTMUCH_MINOR_VERSION == (minor) && \
102       LIBNOTMUCH_MICRO_VERSION >= (micro)))
103
104 /**
105  * Notmuch boolean type.
106  */
107 typedef int notmuch_bool_t;
108
109 /**
110  * Status codes used for the return values of most functions.
111  *
112  * A zero value (NOTMUCH_STATUS_SUCCESS) indicates that the function
113  * completed without error. Any other value indicates an error.
114  */
115 typedef enum {
116     /**
117      * No error occurred.
118      */
119     NOTMUCH_STATUS_SUCCESS = 0,
120     /**
121      * Out of memory.
122      */
123     NOTMUCH_STATUS_OUT_OF_MEMORY,
124     /**
125      * An attempt was made to write to a database opened in read-only
126      * mode.
127      */
128     NOTMUCH_STATUS_READ_ONLY_DATABASE,
129     /**
130      * A Xapian exception occurred.
131      *
132      * @todo We don't really want to expose this lame XAPIAN_EXCEPTION
133      * value. Instead we should map to things like DATABASE_LOCKED or
134      * whatever.
135      */
136     NOTMUCH_STATUS_XAPIAN_EXCEPTION,
137     /**
138      * An error occurred trying to read or write to a file (this could
139      * be file not found, permission denied, etc.)
140      */
141     NOTMUCH_STATUS_FILE_ERROR,
142     /**
143      * A file was presented that doesn't appear to be an email
144      * message.
145      */
146     NOTMUCH_STATUS_FILE_NOT_EMAIL,
147     /**
148      * A file contains a message ID that is identical to a message
149      * already in the database.
150      */
151     NOTMUCH_STATUS_DUPLICATE_MESSAGE_ID,
152     /**
153      * The user erroneously passed a NULL pointer to a notmuch
154      * function.
155      */
156     NOTMUCH_STATUS_NULL_POINTER,
157     /**
158      * A tag value is too long (exceeds NOTMUCH_TAG_MAX).
159      */
160     NOTMUCH_STATUS_TAG_TOO_LONG,
161     /**
162      * The notmuch_message_thaw function has been called more times
163      * than notmuch_message_freeze.
164      */
165     NOTMUCH_STATUS_UNBALANCED_FREEZE_THAW,
166     /**
167      * notmuch_database_end_atomic has been called more times than
168      * notmuch_database_begin_atomic.
169      */
170     NOTMUCH_STATUS_UNBALANCED_ATOMIC,
171     /**
172      * The operation is not supported.
173      */
174     NOTMUCH_STATUS_UNSUPPORTED_OPERATION,
175     /**
176      * The operation requires a database upgrade.
177      */
178     NOTMUCH_STATUS_UPGRADE_REQUIRED,
179     /**
180      * There is a problem with the proposed path, e.g. a relative path
181      * passed to a function expecting an absolute path.
182      */
183     NOTMUCH_STATUS_PATH_ERROR,
184     /**
185      * The requested operation was ignored. Depending on the function,
186      * this may not be an actual error.
187      */
188     NOTMUCH_STATUS_IGNORED,
189     /**
190      * One of the arguments violates the preconditions for the
191      * function, in a way not covered by a more specific argument.
192      */
193     NOTMUCH_STATUS_ILLEGAL_ARGUMENT,
194     /**
195      * A MIME object claimed to have cryptographic protection which
196      * notmuch tried to handle, but the protocol was not specified in
197      * an intelligible way.
198      */
199     NOTMUCH_STATUS_MALFORMED_CRYPTO_PROTOCOL,
200     /**
201      * Notmuch attempted to do crypto processing, but could not
202      * initialize the engine needed to do so.
203      */
204     NOTMUCH_STATUS_FAILED_CRYPTO_CONTEXT_CREATION,
205     /**
206      * A MIME object claimed to have cryptographic protection, and
207      * notmuch attempted to process it, but the specific protocol was
208      * something that notmuch doesn't know how to handle.
209      */
210     NOTMUCH_STATUS_UNKNOWN_CRYPTO_PROTOCOL,
211     /**
212      * Unable to load a config file
213      */
214     NOTMUCH_STATUS_NO_CONFIG,
215     /**
216      * Unable to load a database
217      */
218     NOTMUCH_STATUS_NO_DATABASE,
219     /**
220      * Database exists, so not (re)-created
221      */
222     NOTMUCH_STATUS_DATABASE_EXISTS,
223     /**
224      * Syntax error in query
225      */
226     NOTMUCH_STATUS_BAD_QUERY_SYNTAX,
227     /**
228      * No mail root could be deduced from parameters and environment
229      */
230     NOTMUCH_STATUS_NO_MAIL_ROOT,
231     /**
232      * Not an actual status value. Just a way to find out how many
233      * valid status values there are.
234      */
235     NOTMUCH_STATUS_LAST_STATUS
236 } notmuch_status_t;
237
238 /**
239  * Get a string representation of a notmuch_status_t value.
240  *
241  * The result is read-only.
242  */
243 const char *
244 notmuch_status_to_string (notmuch_status_t status);
245
246 /* Various opaque data types. For each notmuch_<foo>_t see the various
247  * notmuch_<foo> functions below. */
248 #ifndef __DOXYGEN__
249 typedef struct _notmuch_database notmuch_database_t;
250 typedef struct _notmuch_query notmuch_query_t;
251 typedef struct _notmuch_threads notmuch_threads_t;
252 typedef struct _notmuch_thread notmuch_thread_t;
253 typedef struct _notmuch_messages notmuch_messages_t;
254 typedef struct _notmuch_message notmuch_message_t;
255 typedef struct _notmuch_tags notmuch_tags_t;
256 typedef struct _notmuch_directory notmuch_directory_t;
257 typedef struct _notmuch_filenames notmuch_filenames_t;
258 typedef struct _notmuch_config_list notmuch_config_list_t;
259 typedef struct _notmuch_config_values notmuch_config_values_t;
260 typedef struct _notmuch_config_pairs notmuch_config_pairs_t;
261 typedef struct _notmuch_indexopts notmuch_indexopts_t;
262 #endif /* __DOXYGEN__ */
263
264 /**
265  * Create a new, empty notmuch database located at 'path'.
266  *
267  * The path should be a top-level directory to a collection of
268  * plain-text email messages (one message per file). This call will
269  * create a new ".notmuch" directory within 'path' where notmuch will
270  * store its data.
271  *
272  * After a successful call to notmuch_database_create, the returned
273  * database will be open so the caller should call
274  * notmuch_database_destroy when finished with it.
275  *
276  * The database will not yet have any data in it
277  * (notmuch_database_create itself is a very cheap function). Messages
278  * contained within 'path' can be added to the database by calling
279  * notmuch_database_index_file.
280  *
281  * In case of any failure, this function returns an error status and
282  * sets *database to NULL (after printing an error message on stderr).
283  *
284  * Return value:
285  *
286  * NOTMUCH_STATUS_SUCCESS: Successfully created the database.
287  *
288  * NOTMUCH_STATUS_NULL_POINTER: The given 'path' argument is NULL.
289  *
290  * NOTMUCH_STATUS_OUT_OF_MEMORY: Out of memory.
291  *
292  * NOTMUCH_STATUS_FILE_ERROR: An error occurred trying to create the
293  *      database file (such as permission denied, or file not found,
294  *      etc.), or the database already exists.
295  *
296  * NOTMUCH_STATUS_XAPIAN_EXCEPTION: A Xapian exception occurred.
297  */
298 notmuch_status_t
299 notmuch_database_create (const char *path, notmuch_database_t **database);
300
301 /**
302  * Like notmuch_database_create, except optionally return an error
303  * message. This message is allocated by malloc and should be freed by
304  * the caller.
305  */
306 notmuch_status_t
307 notmuch_database_create_verbose (const char *path,
308                                  notmuch_database_t **database,
309                                  char **error_message);
310
311 /**
312  * Database open mode for notmuch_database_open.
313  */
314 typedef enum {
315     /**
316      * Open database for reading only.
317      */
318     NOTMUCH_DATABASE_MODE_READ_ONLY = 0,
319     /**
320      * Open database for reading and writing.
321      */
322     NOTMUCH_DATABASE_MODE_READ_WRITE
323 } notmuch_database_mode_t;
324
325 /**
326  * Deprecated alias for notmuch_database_open_with_config with
327  * config_path="" and error_message=NULL
328  * @deprecated Deprecated as of libnotmuch 5.4 (notmuch 0.32)
329  */
330 NOTMUCH_DEPRECATED(5, 4)
331 notmuch_status_t
332 notmuch_database_open (const char *path,
333                        notmuch_database_mode_t mode,
334                        notmuch_database_t **database);
335 /**
336  * Deprecated alias for notmuch_database_open_with_config with
337  * config_path=""
338  *
339  * @deprecated Deprecated as of libnotmuch 5.4 (notmuch 0.32)
340  *
341  */
342 NOTMUCH_DEPRECATED(5, 4)
343 notmuch_status_t
344 notmuch_database_open_verbose (const char *path,
345                                notmuch_database_mode_t mode,
346                                notmuch_database_t **database,
347                                char **error_message);
348
349 /**
350  * Open an existing notmuch database located at 'database_path', using
351  * configuration in 'config_path'.
352  *
353  * @param[in]   database_path
354  * @parblock
355  * Path to existing database.
356  *
357  * A notmuch database is a Xapian database containing appropriate
358  * metadata.
359  *
360  * The database should have been created at some time in the past,
361  * (not necessarily by this process), by calling
362  * notmuch_database_create.
363  *
364  * If 'database_path' is NULL, use the location specified
365  *
366  * - in the environment variable NOTMUCH_DATABASE, if non-empty
367  *
368  * - in a configuration file, located as described under 'config_path'
369  *
370  * - by $XDG_DATA_HOME/notmuch/$PROFILE where XDG_DATA_HOME defaults
371  *   to "$HOME/.local/share" and PROFILE as as discussed in
372  *   'profile'
373  *
374  * If 'database_path' is non-NULL, but does not appear to be a Xapian
375  * database, check for a directory '.notmuch/xapian' below
376  * 'database_path' (this is the behavior of
377  * notmuch_database_open_verbose pre-0.32).
378  *
379  * @endparblock
380  * @param[in]   mode
381  * @parblock
382  * Mode to open database. Use one of #NOTMUCH_DATABASE_MODE_READ_WRITE
383  * or #NOTMUCH_DATABASE_MODE_READ_ONLY
384  *
385  * @endparblock
386  * @param[in]  config_path
387  * @parblock
388  * Path to config file.
389  *
390  * Config file is key-value, with mandatory sections. See
391  * <em>notmuch-config(5)</em> for more information. The key-value pair
392  * overrides the corresponding configuration data stored in the
393  * database (see <em>notmuch_database_get_config</em>)
394  *
395  * If <em>config_path</em> is NULL use the path specified
396  *
397  * - in environment variable <em>NOTMUCH_CONFIG</em>, if non-empty
398  *
399  * - by  <em>XDG_CONFIG_HOME</em>/notmuch/ where
400  *   XDG_CONFIG_HOME defaults to "$HOME/.config".
401  *
402  * - by $HOME/.notmuch-config
403  *
404  * If <em>config_path</em> is "" (empty string) then do not
405  * open any configuration file.
406  * @endparblock
407  * @param[in] profile:
408  * @parblock
409  * Name of profile (configuration/database variant).
410  *
411  * If non-NULL, append to the directory / file path determined for
412  * <em>config_path</em> and <em>database_path</em>.
413  *
414  * If NULL then use
415  * - environment variable NOTMUCH_PROFILE if defined,
416  * - otherwise "default" for directories and "" (empty string) for paths.
417  *
418  * @endparblock
419  * @param[out] database
420  * @parblock
421  * Pointer to database object. May not be NULL.
422  *
423  * The caller should call notmuch_database_destroy when finished with
424  * this database.
425  *
426  * In case of any failure, this function returns an error status and
427  * sets *database to NULL.
428  *
429  * @endparblock
430  * @param[out] error_message
431  * If non-NULL, store error message from opening the database.
432  * Any such message is allocated by \a malloc(3) and should be freed
433  * by the caller.
434  *
435  * @retval NOTMUCH_STATUS_SUCCESS: Successfully opened the database.
436  *
437  * @retval NOTMUCH_STATUS_NULL_POINTER: The given \a database
438  * argument is NULL.
439  *
440  * @retval NOTMUCH_STATUS_NO_CONFIG: No config file was found. Fatal.
441  *
442  * @retval NOTMUCH_STATUS_OUT_OF_MEMORY: Out of memory.
443  *
444  * @retval NOTMUCH_STATUS_FILE_ERROR: An error occurred trying to open the
445  *      database or config file (such as permission denied, or file not found,
446  *      etc.), or the database version is unknown.
447  *
448  * @retval NOTMUCH_STATUS_XAPIAN_EXCEPTION: A Xapian exception occurred.
449  *
450  * @since libnotmuch 5.4 (notmuch 0.32)
451  */
452
453 notmuch_status_t
454 notmuch_database_open_with_config (const char *database_path,
455                                    notmuch_database_mode_t mode,
456                                    const char *config_path,
457                                    const char *profile,
458                                    notmuch_database_t **database,
459                                    char **error_message);
460
461
462 /**
463  * Loads configuration from config file, database, and/or defaults
464  *
465  * For description of arguments, @see notmuch_database_open_with_config
466  *
467  * For errors other then NO_DATABASE and NO_CONFIG, *database is set to
468  * NULL.
469  *
470  * @retval NOTMUCH_STATUS_SUCCESS: Successfully loaded configuration.
471  *
472  * @retval NOTMUCH_STATUS_NO_CONFIG: No config file was loaded. Not fatal.
473  *
474  * @retval NOTMUCH_STATUS_NO_DATABASE: No config information was
475  *      loaded from a database. Not fatal.
476  *
477  * @retval NOTMUCH_STATUS_OUT_OF_MEMORY: Out of memory.
478  *
479  * @retval NOTMUCH_STATUS_FILE_ERROR: An error occurred trying to open the
480  *      database or config file (such as permission denied, or file not found,
481  *      etc.)
482  *
483  * @retval NOTMUCH_STATUS_XAPIAN_EXCEPTION: A Xapian exception occurred.
484  *
485  * @since libnotmuch 5.4 (notmuch 0.32)
486  */
487
488 notmuch_status_t
489 notmuch_database_load_config (const char *database_path,
490                               const char *config_path,
491                               const char *profile,
492                               notmuch_database_t **database,
493                               char **error_message);
494
495 /**
496  * Create a new notmuch database located at 'database_path', using
497  * configuration in 'config_path'.
498  *
499  * For description of arguments, @see notmuch_database_open_with_config
500  *
501  * In case of any failure, this function returns an error status and
502  * sets *database to NULL.
503  *
504  * @retval NOTMUCH_STATUS_SUCCESS: Successfully created the database.
505  *
506  * @retval NOTMUCH_STATUS_DATABASE_EXISTS: Database already exists, not created
507  *
508  * @retval NOTMUCH_STATUS_OUT_OF_MEMORY: Out of memory.
509  *
510  * @retval NOTMUCH_STATUS_FILE_ERROR: An error occurred trying to open the
511  *      database or config file (such as permission denied, or file not found,
512  *      etc.)
513  *
514  * @retval NOTMUCH_STATUS_XAPIAN_EXCEPTION: A Xapian exception occurred.
515  *
516  * @since libnotmuch 5.4 (notmuch 0.32)
517  */
518
519 notmuch_status_t
520 notmuch_database_create_with_config (const char *database_path,
521                                      const char *config_path,
522                                      const char *profile,
523                                      notmuch_database_t **database,
524                                      char **error_message);
525
526 /**
527  * Retrieve last status string for given database.
528  *
529  */
530 const char *
531 notmuch_database_status_string (const notmuch_database_t *notmuch);
532
533 /**
534  * Commit changes and close the given notmuch database.
535  *
536  * After notmuch_database_close has been called, calls to other
537  * functions on objects derived from this database may either behave
538  * as if the database had not been closed (e.g., if the required data
539  * has been cached) or may fail with a
540  * NOTMUCH_STATUS_XAPIAN_EXCEPTION. The only further operation
541  * permitted on the database itself is to call
542  * notmuch_database_destroy.
543  *
544  * notmuch_database_close can be called multiple times.  Later calls
545  * have no effect.
546  *
547  * For writable databases, notmuch_database_close commits all changes
548  * to disk before closing the database, unless the caller is currently
549  * in an atomic section (there was a notmuch_database_begin_atomic
550  * without a matching notmuch_database_end_atomic). In this case
551  * changes since the last commit are discarded. @see
552  * notmuch_database_end_atomic for more information.
553  *
554  * Return value:
555  *
556  * NOTMUCH_STATUS_SUCCESS: Successfully closed the database.
557  *
558  * NOTMUCH_STATUS_XAPIAN_EXCEPTION: A Xapian exception occurred; the
559  *      database has been closed but there are no guarantees the
560  *      changes to the database, if any, have been flushed to disk.
561  */
562 notmuch_status_t
563 notmuch_database_close (notmuch_database_t *database);
564
565 /**
566  * A callback invoked by notmuch_database_compact to notify the user
567  * of the progress of the compaction process.
568  */
569 typedef void (*notmuch_compact_status_cb_t)(const char *message, void *closure);
570
571 /**
572  * Compact a notmuch database, backing up the original database to the
573  * given path.
574  *
575  * The database will be opened with NOTMUCH_DATABASE_MODE_READ_WRITE
576  * during the compaction process to ensure no writes are made.
577  *
578  * If the optional callback function 'status_cb' is non-NULL, it will
579  * be called with diagnostic and informational messages. The argument
580  * 'closure' is passed verbatim to any callback invoked.
581  */
582 notmuch_status_t
583 notmuch_database_compact (const char *path,
584                           const char *backup_path,
585                           notmuch_compact_status_cb_t status_cb,
586                           void *closure);
587
588 /**
589  * Like notmuch_database_compact, but take an open database as a
590  * parameter.
591  *
592  * @since libnnotmuch 5.4 (notmuch 0.32)
593  */
594 notmuch_status_t
595 notmuch_database_compact_db (notmuch_database_t *database,
596                              const char *backup_path,
597                              notmuch_compact_status_cb_t status_cb,
598                              void *closure);
599
600 /**
601  * Destroy the notmuch database, closing it if necessary and freeing
602  * all associated resources.
603  *
604  * Return value as in notmuch_database_close if the database was open;
605  * notmuch_database_destroy itself has no failure modes.
606  */
607 notmuch_status_t
608 notmuch_database_destroy (notmuch_database_t *database);
609
610 /**
611  * Return the database path of the given database.
612  *
613  * The return value is a string owned by notmuch so should not be
614  * modified nor freed by the caller.
615  */
616 const char *
617 notmuch_database_get_path (notmuch_database_t *database);
618
619 /**
620  * Return the database format version of the given database.
621  *
622  * @retval 0 on error
623  */
624 unsigned int
625 notmuch_database_get_version (notmuch_database_t *database);
626
627 /**
628  * Can the database be upgraded to a newer database version?
629  *
630  * If this function returns TRUE, then the caller may call
631  * notmuch_database_upgrade to upgrade the database.  If the caller
632  * does not upgrade an out-of-date database, then some functions may
633  * fail with NOTMUCH_STATUS_UPGRADE_REQUIRED.  This always returns
634  * FALSE for a read-only database because there's no way to upgrade a
635  * read-only database.
636  *
637  * Also returns FALSE if an error occurs accessing the database.
638  *
639  */
640 notmuch_bool_t
641 notmuch_database_needs_upgrade (notmuch_database_t *database);
642
643 /**
644  * Upgrade the current database to the latest supported version.
645  *
646  * This ensures that all current notmuch functionality will be
647  * available on the database.  After opening a database in read-write
648  * mode, it is recommended that clients check if an upgrade is needed
649  * (notmuch_database_needs_upgrade) and if so, upgrade with this
650  * function before making any modifications.  If
651  * notmuch_database_needs_upgrade returns FALSE, this will be a no-op.
652  *
653  * The optional progress_notify callback can be used by the caller to
654  * provide progress indication to the user. If non-NULL it will be
655  * called periodically with 'progress' as a floating-point value in
656  * the range of [0.0 .. 1.0] indicating the progress made so far in
657  * the upgrade process.  The argument 'closure' is passed verbatim to
658  * any callback invoked.
659  */
660 notmuch_status_t
661 notmuch_database_upgrade (notmuch_database_t *database,
662                           void (*progress_notify)(void *closure,
663                                                   double progress),
664                           void *closure);
665
666 /**
667  * Begin an atomic database operation.
668  *
669  * Any modifications performed between a successful begin and a
670  * notmuch_database_end_atomic will be applied to the database
671  * atomically.  Note that, unlike a typical database transaction, this
672  * only ensures atomicity, not durability; neither begin nor end
673  * necessarily flush modifications to disk.
674  *
675  * Atomic sections may be nested.  begin_atomic and end_atomic must
676  * always be called in pairs.
677  *
678  * Return value:
679  *
680  * NOTMUCH_STATUS_SUCCESS: Successfully entered atomic section.
681  *
682  * NOTMUCH_STATUS_XAPIAN_EXCEPTION: A Xapian exception occurred;
683  *      atomic section not entered.
684  */
685 notmuch_status_t
686 notmuch_database_begin_atomic (notmuch_database_t *notmuch);
687
688 /**
689  * Indicate the end of an atomic database operation.  If repeated
690  * (with matching notmuch_database_begin_atomic) "database.autocommit"
691  * times, commit the the transaction and all previous (non-cancelled)
692  * transactions to the database.
693  *
694  * Return value:
695  *
696  * NOTMUCH_STATUS_SUCCESS: Successfully completed atomic section.
697  *
698  * NOTMUCH_STATUS_XAPIAN_EXCEPTION: A Xapian exception occurred;
699  *      atomic section not ended.
700  *
701  * NOTMUCH_STATUS_UNBALANCED_ATOMIC: The database is not currently in
702  *      an atomic section.
703  */
704 notmuch_status_t
705 notmuch_database_end_atomic (notmuch_database_t *notmuch);
706
707 /**
708  * Return the committed database revision and UUID.
709  *
710  * The database revision number increases monotonically with each
711  * commit to the database.  Hence, all messages and message changes
712  * committed to the database (that is, visible to readers) have a last
713  * modification revision <= the committed database revision.  Any
714  * messages committed in the future will be assigned a modification
715  * revision > the committed database revision.
716  *
717  * The UUID is a NUL-terminated opaque string that uniquely identifies
718  * this database.  Two revision numbers are only comparable if they
719  * have the same database UUID.
720  */
721 unsigned long
722 notmuch_database_get_revision (notmuch_database_t *notmuch,
723                                const char **uuid);
724
725 /**
726  * Retrieve a directory object from the database for 'path'.
727  *
728  * Here, 'path' should be a path relative to the path of 'database'
729  * (see notmuch_database_get_path), or else should be an absolute path
730  * with initial components that match the path of 'database'.
731  *
732  * If this directory object does not exist in the database, this
733  * returns NOTMUCH_STATUS_SUCCESS and sets *directory to NULL.
734  *
735  * Otherwise the returned directory object is owned by the database
736  * and as such, will only be valid until notmuch_database_destroy is
737  * called.
738  *
739  * Return value:
740  *
741  * NOTMUCH_STATUS_SUCCESS: Successfully retrieved directory.
742  *
743  * NOTMUCH_STATUS_NULL_POINTER: The given 'directory' argument is NULL.
744  *
745  * NOTMUCH_STATUS_XAPIAN_EXCEPTION: A Xapian exception occurred;
746  *      directory not retrieved.
747  *
748  * NOTMUCH_STATUS_UPGRADE_REQUIRED: The caller must upgrade the
749  *      database to use this function.
750  */
751 notmuch_status_t
752 notmuch_database_get_directory (notmuch_database_t *database,
753                                 const char *path,
754                                 notmuch_directory_t **directory);
755
756 /**
757  * Add a message file to a database, indexing it for retrieval by
758  * future searches.  If a message already exists with the same message
759  * ID as the specified file, their indexes will be merged, and this
760  * new filename will also be associated with the existing message.
761  *
762  * Here, 'filename' should be a path relative to the path of
763  * 'database' (see notmuch_database_get_path), or else should be an
764  * absolute filename with initial components that match the path of
765  * 'database'.
766  *
767  * The file should be a single mail message (not a multi-message mbox)
768  * that is expected to remain at its current location, (since the
769  * notmuch database will reference the filename, and will not copy the
770  * entire contents of the file.
771  *
772  * If another message with the same message ID already exists in the
773  * database, rather than creating a new message, this adds the search
774  * terms from the identified file to the existing message's index, and
775  * adds 'filename' to the list of filenames known for the message.
776  *
777  * The 'indexopts' parameter can be NULL (meaning, use the indexing
778  * defaults from the database), or can be an explicit choice of
779  * indexing options that should govern the indexing of this specific
780  * 'filename'.
781  *
782  * If 'message' is not NULL, then, on successful return
783  * (NOTMUCH_STATUS_SUCCESS or NOTMUCH_STATUS_DUPLICATE_MESSAGE_ID) '*message'
784  * will be initialized to a message object that can be used for things
785  * such as adding tags to the just-added message. The user should call
786  * notmuch_message_destroy when done with the message. On any failure
787  * '*message' will be set to NULL.
788  *
789  * Return value:
790  *
791  * NOTMUCH_STATUS_SUCCESS: Message successfully added to database.
792  *
793  * NOTMUCH_STATUS_XAPIAN_EXCEPTION: A Xapian exception occurred,
794  *      message not added.
795  *
796  * NOTMUCH_STATUS_DUPLICATE_MESSAGE_ID: Message has the same message
797  *      ID as another message already in the database. The new
798  *      filename was successfully added to the message in the database
799  *      (if not already present) and the existing message is returned.
800  *
801  * NOTMUCH_STATUS_FILE_ERROR: an error occurred trying to open the
802  *      file, (such as permission denied, or file not found,
803  *      etc.). Nothing added to the database.
804  *
805  * NOTMUCH_STATUS_FILE_NOT_EMAIL: the contents of filename don't look
806  *      like an email message. Nothing added to the database.
807  *
808  * NOTMUCH_STATUS_READ_ONLY_DATABASE: Database was opened in read-only
809  *      mode so no message can be added.
810  *
811  * NOTMUCH_STATUS_UPGRADE_REQUIRED: The caller must upgrade the
812  *      database to use this function.
813  *
814  * @since libnotmuch 5.1 (notmuch 0.26)
815  */
816 notmuch_status_t
817 notmuch_database_index_file (notmuch_database_t *database,
818                              const char *filename,
819                              notmuch_indexopts_t *indexopts,
820                              notmuch_message_t **message);
821
822 /**
823  * Deprecated alias for notmuch_database_index_file called with
824  * NULL indexopts.
825  *
826  * @deprecated Deprecated as of libnotmuch 5.1 (notmuch 0.26). Please
827  * use notmuch_database_index_file instead.
828  *
829  */
830 NOTMUCH_DEPRECATED (5, 1)
831 notmuch_status_t
832 notmuch_database_add_message (notmuch_database_t *database,
833                               const char *filename,
834                               notmuch_message_t **message);
835
836 /**
837  * Remove a message filename from the given notmuch database. If the
838  * message has no more filenames, remove the message.
839  *
840  * If the same message (as determined by the message ID) is still
841  * available via other filenames, then the message will persist in the
842  * database for those filenames. When the last filename is removed for
843  * a particular message, the database content for that message will be
844  * entirely removed.
845  *
846  * Return value:
847  *
848  * NOTMUCH_STATUS_SUCCESS: The last filename was removed and the
849  *      message was removed from the database.
850  *
851  * NOTMUCH_STATUS_XAPIAN_EXCEPTION: A Xapian exception occurred,
852  *      message not removed.
853  *
854  * NOTMUCH_STATUS_DUPLICATE_MESSAGE_ID: This filename was removed but
855  *      the message persists in the database with at least one other
856  *      filename.
857  *
858  * NOTMUCH_STATUS_READ_ONLY_DATABASE: Database was opened in read-only
859  *      mode so no message can be removed.
860  *
861  * NOTMUCH_STATUS_UPGRADE_REQUIRED: The caller must upgrade the
862  *      database to use this function.
863  */
864 notmuch_status_t
865 notmuch_database_remove_message (notmuch_database_t *database,
866                                  const char *filename);
867
868 /**
869  * Find a message with the given message_id.
870  *
871  * If a message with the given message_id is found then, on successful return
872  * (NOTMUCH_STATUS_SUCCESS) '*message' will be initialized to a message
873  * object.  The caller should call notmuch_message_destroy when done with the
874  * message.
875  *
876  * On any failure or when the message is not found, this function initializes
877  * '*message' to NULL. This means, when NOTMUCH_STATUS_SUCCESS is returned, the
878  * caller is supposed to check '*message' for NULL to find out whether the
879  * message with the given message_id was found.
880  *
881  * Return value:
882  *
883  * NOTMUCH_STATUS_SUCCESS: Successful return, check '*message'.
884  *
885  * NOTMUCH_STATUS_NULL_POINTER: The given 'message' argument is NULL
886  *
887  * NOTMUCH_STATUS_OUT_OF_MEMORY: Out of memory, creating message object
888  *
889  * NOTMUCH_STATUS_XAPIAN_EXCEPTION: A Xapian exception occurred
890  */
891 notmuch_status_t
892 notmuch_database_find_message (notmuch_database_t *database,
893                                const char *message_id,
894                                notmuch_message_t **message);
895
896 /**
897  * Find a message with the given filename.
898  *
899  * If the database contains a message with the given filename then, on
900  * successful return (NOTMUCH_STATUS_SUCCESS) '*message' will be initialized to
901  * a message object. The caller should call notmuch_message_destroy when done
902  * with the message.
903  *
904  * On any failure or when the message is not found, this function initializes
905  * '*message' to NULL. This means, when NOTMUCH_STATUS_SUCCESS is returned, the
906  * caller is supposed to check '*message' for NULL to find out whether the
907  * message with the given filename is found.
908  *
909  * Return value:
910  *
911  * NOTMUCH_STATUS_SUCCESS: Successful return, check '*message'
912  *
913  * NOTMUCH_STATUS_NULL_POINTER: The given 'message' argument is NULL
914  *
915  * NOTMUCH_STATUS_OUT_OF_MEMORY: Out of memory, creating the message object
916  *
917  * NOTMUCH_STATUS_XAPIAN_EXCEPTION: A Xapian exception occurred
918  *
919  * NOTMUCH_STATUS_UPGRADE_REQUIRED: The caller must upgrade the
920  *      database to use this function.
921  */
922 notmuch_status_t
923 notmuch_database_find_message_by_filename (notmuch_database_t *notmuch,
924                                            const char *filename,
925                                            notmuch_message_t **message);
926
927 /**
928  * Return a list of all tags found in the database.
929  *
930  * This function creates a list of all tags found in the database. The
931  * resulting list contains all tags from all messages found in the database.
932  *
933  * On error this function returns NULL.
934  */
935 notmuch_tags_t *
936 notmuch_database_get_all_tags (notmuch_database_t *db);
937
938 /**
939  * Reopen an open notmuch database.
940  *
941  * @param [in] db       open notmuch database
942  * @param [in] mode     mode (read only or read-write) for reopened database.
943  *
944  * @retval #NOTMUCH_STATUS_SUCCESS
945  * @retval #NOTMUCH_STATUS_ILLEGAL_ARGUMENT     The passed database was not open.
946  * @retval #NOTMUCH_STATUS_XAPIAN_EXCEPTION     A Xapian exception occured
947  */
948 notmuch_status_t
949 notmuch_database_reopen (notmuch_database_t *db, notmuch_database_mode_t mode);
950
951 /**
952  * Create a new query for 'database'.
953  *
954  * Here, 'database' should be an open database, (see
955  * notmuch_database_open and notmuch_database_create).
956  *
957  * For the query string, we'll document the syntax here more
958  * completely in the future, but it's likely to be a specialized
959  * version of the general Xapian query syntax:
960  *
961  * https://xapian.org/docs/queryparser.html
962  *
963  * As a special case, passing either a length-zero string, (that is ""),
964  * or a string consisting of a single asterisk (that is "*"), will
965  * result in a query that returns all messages in the database.
966  *
967  * See notmuch_query_set_sort for controlling the order of results.
968  * See notmuch_query_search_messages and notmuch_query_search_threads
969  * to actually execute the query.
970  *
971  * User should call notmuch_query_destroy when finished with this
972  * query.
973  *
974  * Will return NULL if insufficient memory is available.
975  */
976 notmuch_query_t *
977 notmuch_query_create (notmuch_database_t *database,
978                       const char *query_string);
979
980 typedef enum {
981     NOTMUCH_QUERY_SYNTAX_XAPIAN,
982     NOTMUCH_QUERY_SYNTAX_SEXP
983 } notmuch_query_syntax_t;
984
985 notmuch_status_t
986 notmuch_query_create_with_syntax (notmuch_database_t *database,
987                                   const char *query_string,
988                                   notmuch_query_syntax_t syntax,
989                                   notmuch_query_t **output);
990 /**
991  * Sort values for notmuch_query_set_sort.
992  */
993 typedef enum {
994     /**
995      * Oldest first.
996      */
997     NOTMUCH_SORT_OLDEST_FIRST,
998     /**
999      * Newest first.
1000      */
1001     NOTMUCH_SORT_NEWEST_FIRST,
1002     /**
1003      * Sort by message-id.
1004      */
1005     NOTMUCH_SORT_MESSAGE_ID,
1006     /**
1007      * Do not sort.
1008      */
1009     NOTMUCH_SORT_UNSORTED
1010 } notmuch_sort_t;
1011
1012 /**
1013  * Return the query_string of this query. See notmuch_query_create.
1014  */
1015 const char *
1016 notmuch_query_get_query_string (const notmuch_query_t *query);
1017
1018 /**
1019  * Return the notmuch database of this query. See notmuch_query_create.
1020  */
1021 notmuch_database_t *
1022 notmuch_query_get_database (const notmuch_query_t *query);
1023
1024 /**
1025  * Exclude values for notmuch_query_set_omit_excluded. The strange
1026  * order is to maintain backward compatibility: the old FALSE/TRUE
1027  * options correspond to the new
1028  * NOTMUCH_EXCLUDE_FLAG/NOTMUCH_EXCLUDE_TRUE options.
1029  */
1030 typedef enum {
1031     NOTMUCH_EXCLUDE_FLAG,
1032     NOTMUCH_EXCLUDE_TRUE,
1033     NOTMUCH_EXCLUDE_FALSE,
1034     NOTMUCH_EXCLUDE_ALL
1035 } notmuch_exclude_t;
1036
1037 /**
1038  * Specify whether to omit excluded results or simply flag them.  By
1039  * default, this is set to TRUE.
1040  *
1041  * If set to TRUE or ALL, notmuch_query_search_messages will omit excluded
1042  * messages from the results, and notmuch_query_search_threads will omit
1043  * threads that match only in excluded messages.  If set to TRUE,
1044  * notmuch_query_search_threads will include all messages in threads that
1045  * match in at least one non-excluded message.  Otherwise, if set to ALL,
1046  * notmuch_query_search_threads will omit excluded messages from all threads.
1047  *
1048  * If set to FALSE or FLAG then both notmuch_query_search_messages and
1049  * notmuch_query_search_threads will return all matching
1050  * messages/threads regardless of exclude status. If set to FLAG then
1051  * the exclude flag will be set for any excluded message that is
1052  * returned by notmuch_query_search_messages, and the thread counts
1053  * for threads returned by notmuch_query_search_threads will be the
1054  * number of non-excluded messages/matches. Otherwise, if set to
1055  * FALSE, then the exclude status is completely ignored.
1056  *
1057  * The performance difference when calling
1058  * notmuch_query_search_messages should be relatively small (and both
1059  * should be very fast).  However, in some cases,
1060  * notmuch_query_search_threads is very much faster when omitting
1061  * excluded messages as it does not need to construct the threads that
1062  * only match in excluded messages.
1063  */
1064 void
1065 notmuch_query_set_omit_excluded (notmuch_query_t *query,
1066                                  notmuch_exclude_t omit_excluded);
1067
1068 /**
1069  * Specify the sorting desired for this query.
1070  */
1071 void
1072 notmuch_query_set_sort (notmuch_query_t *query, notmuch_sort_t sort);
1073
1074 /**
1075  * Return the sort specified for this query. See
1076  * notmuch_query_set_sort.
1077  */
1078 notmuch_sort_t
1079 notmuch_query_get_sort (const notmuch_query_t *query);
1080
1081 /**
1082  * Add a tag that will be excluded from the query results by default.
1083  * This exclusion will be ignored if this tag appears explicitly in
1084  * the query.
1085  *
1086  * @returns
1087  *
1088  * NOTMUCH_STATUS_SUCCESS: excluded was added successfully.
1089  *
1090  * NOTMUCH_STATUS_XAPIAN_EXCEPTION: a Xapian exception occurred.
1091  *      Most likely a problem lazily parsing the query string.
1092  *
1093  * NOTMUCH_STATUS_IGNORED: tag is explicitly present in the query, so
1094  *              not excluded.
1095  */
1096 notmuch_status_t
1097 notmuch_query_add_tag_exclude (notmuch_query_t *query, const char *tag);
1098
1099 /**
1100  * Execute a query for threads, returning a notmuch_threads_t object
1101  * which can be used to iterate over the results. The returned threads
1102  * object is owned by the query and as such, will only be valid until
1103  * notmuch_query_destroy.
1104  *
1105  * Typical usage might be:
1106  *
1107  *     notmuch_query_t *query;
1108  *     notmuch_threads_t *threads;
1109  *     notmuch_thread_t *thread;
1110  *     notmuch_status_t stat;
1111  *
1112  *     query = notmuch_query_create (database, query_string);
1113  *
1114  *     for (stat = notmuch_query_search_threads (query, &threads);
1115  *          stat == NOTMUCH_STATUS_SUCCESS &&
1116  *          notmuch_threads_valid (threads);
1117  *          notmuch_threads_move_to_next (threads))
1118  *     {
1119  *         thread = notmuch_threads_get (threads);
1120  *         ....
1121  *         notmuch_thread_destroy (thread);
1122  *     }
1123  *
1124  *     notmuch_query_destroy (query);
1125  *
1126  * Note: If you are finished with a thread before its containing
1127  * query, you can call notmuch_thread_destroy to clean up some memory
1128  * sooner (as in the above example). Otherwise, if your thread objects
1129  * are long-lived, then you don't need to call notmuch_thread_destroy
1130  * and all the memory will still be reclaimed when the query is
1131  * destroyed.
1132  *
1133  * Note that there's no explicit destructor needed for the
1134  * notmuch_threads_t object. (For consistency, we do provide a
1135  * notmuch_threads_destroy function, but there's no good reason
1136  * to call it if the query is about to be destroyed).
1137  *
1138  * @since libnotmuch 5.0 (notmuch 0.25)
1139  */
1140 notmuch_status_t
1141 notmuch_query_search_threads (notmuch_query_t *query,
1142                               notmuch_threads_t **out);
1143
1144 /**
1145  * Deprecated alias for notmuch_query_search_threads.
1146  *
1147  * @deprecated Deprecated as of libnotmuch 5 (notmuch 0.25). Please
1148  * use notmuch_query_search_threads instead.
1149  *
1150  */
1151 NOTMUCH_DEPRECATED (5, 0)
1152 notmuch_status_t
1153 notmuch_query_search_threads_st (notmuch_query_t *query, notmuch_threads_t **out);
1154
1155 /**
1156  * Execute a query for messages, returning a notmuch_messages_t object
1157  * which can be used to iterate over the results. The returned
1158  * messages object is owned by the query and as such, will only be
1159  * valid until notmuch_query_destroy.
1160  *
1161  * Typical usage might be:
1162  *
1163  *     notmuch_query_t *query;
1164  *     notmuch_messages_t *messages;
1165  *     notmuch_message_t *message;
1166  *
1167  *     query = notmuch_query_create (database, query_string);
1168  *
1169  *     for (messages = notmuch_query_search_messages (query);
1170  *          notmuch_messages_valid (messages);
1171  *          notmuch_messages_move_to_next (messages))
1172  *     {
1173  *         message = notmuch_messages_get (messages);
1174  *         ....
1175  *         notmuch_message_destroy (message);
1176  *     }
1177  *
1178  *     notmuch_query_destroy (query);
1179  *
1180  * Note: If you are finished with a message before its containing
1181  * query, you can call notmuch_message_destroy to clean up some memory
1182  * sooner (as in the above example). Otherwise, if your message
1183  * objects are long-lived, then you don't need to call
1184  * notmuch_message_destroy and all the memory will still be reclaimed
1185  * when the query is destroyed.
1186  *
1187  * Note that there's no explicit destructor needed for the
1188  * notmuch_messages_t object. (For consistency, we do provide a
1189  * notmuch_messages_destroy function, but there's no good
1190  * reason to call it if the query is about to be destroyed).
1191  *
1192  * If a Xapian exception occurs this function will return NULL.
1193  *
1194  * @since libnotmuch 5 (notmuch 0.25)
1195  */
1196 notmuch_status_t
1197 notmuch_query_search_messages (notmuch_query_t *query,
1198                                notmuch_messages_t **out);
1199 /**
1200  * Deprecated alias for notmuch_query_search_messages
1201  *
1202  * @deprecated Deprecated as of libnotmuch 5 (notmuch 0.25). Please use
1203  * notmuch_query_search_messages instead.
1204  *
1205  */
1206
1207 NOTMUCH_DEPRECATED (5, 0)
1208 notmuch_status_t
1209 notmuch_query_search_messages_st (notmuch_query_t *query,
1210                                   notmuch_messages_t **out);
1211
1212 /**
1213  * Destroy a notmuch_query_t along with any associated resources.
1214  *
1215  * This will in turn destroy any notmuch_threads_t and
1216  * notmuch_messages_t objects generated by this query, (and in
1217  * turn any notmuch_thread_t and notmuch_message_t objects generated
1218  * from those results, etc.), if such objects haven't already been
1219  * destroyed.
1220  */
1221 void
1222 notmuch_query_destroy (notmuch_query_t *query);
1223
1224 /**
1225  * Is the given 'threads' iterator pointing at a valid thread.
1226  *
1227  * When this function returns TRUE, notmuch_threads_get will return a
1228  * valid object. Whereas when this function returns FALSE,
1229  * notmuch_threads_get will return NULL.
1230  *
1231  * If passed a NULL pointer, this function returns FALSE
1232  *
1233  * See the documentation of notmuch_query_search_threads for example
1234  * code showing how to iterate over a notmuch_threads_t object.
1235  */
1236 notmuch_bool_t
1237 notmuch_threads_valid (notmuch_threads_t *threads);
1238
1239 /**
1240  * Get the current thread from 'threads' as a notmuch_thread_t.
1241  *
1242  * Note: The returned thread belongs to 'threads' and has a lifetime
1243  * identical to it (and the query to which it belongs).
1244  *
1245  * See the documentation of notmuch_query_search_threads for example
1246  * code showing how to iterate over a notmuch_threads_t object.
1247  *
1248  * If an out-of-memory situation occurs, this function will return
1249  * NULL.
1250  */
1251 notmuch_thread_t *
1252 notmuch_threads_get (notmuch_threads_t *threads);
1253
1254 /**
1255  * Move the 'threads' iterator to the next thread.
1256  *
1257  * If 'threads' is already pointing at the last thread then the
1258  * iterator will be moved to a point just beyond that last thread,
1259  * (where notmuch_threads_valid will return FALSE and
1260  * notmuch_threads_get will return NULL).
1261  *
1262  * See the documentation of notmuch_query_search_threads for example
1263  * code showing how to iterate over a notmuch_threads_t object.
1264  */
1265 void
1266 notmuch_threads_move_to_next (notmuch_threads_t *threads);
1267
1268 /**
1269  * Destroy a notmuch_threads_t object.
1270  *
1271  * It's not strictly necessary to call this function. All memory from
1272  * the notmuch_threads_t object will be reclaimed when the
1273  * containing query object is destroyed.
1274  */
1275 void
1276 notmuch_threads_destroy (notmuch_threads_t *threads);
1277
1278 /**
1279  * Return the number of messages matching a search.
1280  *
1281  * This function performs a search and returns the number of matching
1282  * messages.
1283  *
1284  * @returns
1285  *
1286  * NOTMUCH_STATUS_SUCCESS: query completed successfully.
1287  *
1288  * NOTMUCH_STATUS_XAPIAN_EXCEPTION: a Xapian exception occurred. The
1289  *      value of *count is not defined.
1290  *
1291  * @since libnotmuch 5 (notmuch 0.25)
1292  */
1293 notmuch_status_t
1294 notmuch_query_count_messages (notmuch_query_t *query, unsigned int *count);
1295
1296 /**
1297  * Deprecated alias for notmuch_query_count_messages
1298  *
1299  *
1300  * @deprecated Deprecated since libnotmuch 5.0 (notmuch 0.25). Please
1301  * use notmuch_query_count_messages instead.
1302  */
1303 NOTMUCH_DEPRECATED (5, 0)
1304 notmuch_status_t
1305 notmuch_query_count_messages_st (notmuch_query_t *query, unsigned int *count);
1306
1307 /**
1308  * Return the number of threads matching a search.
1309  *
1310  * This function performs a search and returns the number of unique thread IDs
1311  * in the matching messages. This is the same as number of threads matching a
1312  * search.
1313  *
1314  * Note that this is a significantly heavier operation than
1315  * notmuch_query_count_messages{_st}().
1316  *
1317  * @returns
1318  *
1319  * NOTMUCH_STATUS_OUT_OF_MEMORY: Memory allocation failed. The value
1320  *      of *count is not defined
1321  *
1322  * NOTMUCH_STATUS_SUCCESS: query completed successfully.
1323  *
1324  * NOTMUCH_STATUS_XAPIAN_EXCEPTION: a Xapian exception occurred. The
1325  *      value of *count is not defined.
1326  *
1327  * @since libnotmuch 5 (notmuch 0.25)
1328  */
1329 notmuch_status_t
1330 notmuch_query_count_threads (notmuch_query_t *query, unsigned *count);
1331
1332 /**
1333  * Deprecated alias for notmuch_query_count_threads
1334  *
1335  * @deprecated Deprecated as of libnotmuch 5.0 (notmuch 0.25). Please
1336  * use notmuch_query_count_threads_st instead.
1337  */
1338 NOTMUCH_DEPRECATED (5, 0)
1339 notmuch_status_t
1340 notmuch_query_count_threads_st (notmuch_query_t *query, unsigned *count);
1341
1342 /**
1343  * Get the thread ID of 'thread'.
1344  *
1345  * The returned string belongs to 'thread' and as such, should not be
1346  * modified by the caller and will only be valid for as long as the
1347  * thread is valid, (which is until notmuch_thread_destroy or until
1348  * the query from which it derived is destroyed).
1349  */
1350 const char *
1351 notmuch_thread_get_thread_id (notmuch_thread_t *thread);
1352
1353 /**
1354  * Get the total number of messages in 'thread'.
1355  *
1356  * This count consists of all messages in the database belonging to
1357  * this thread. Contrast with notmuch_thread_get_matched_messages() .
1358  */
1359 int
1360 notmuch_thread_get_total_messages (notmuch_thread_t *thread);
1361
1362 /**
1363  * Get the total number of files in 'thread'.
1364  *
1365  * This sums notmuch_message_count_files over all messages in the
1366  * thread
1367  * @returns Non-negative integer
1368  * @since libnotmuch 5.0 (notmuch 0.25)
1369  */
1370
1371 int
1372 notmuch_thread_get_total_files (notmuch_thread_t *thread);
1373
1374 /**
1375  * Get a notmuch_messages_t iterator for the top-level messages in
1376  * 'thread' in oldest-first order.
1377  *
1378  * This iterator will not necessarily iterate over all of the messages
1379  * in the thread. It will only iterate over the messages in the thread
1380  * which are not replies to other messages in the thread.
1381  *
1382  * The returned list will be destroyed when the thread is destroyed.
1383  */
1384 notmuch_messages_t *
1385 notmuch_thread_get_toplevel_messages (notmuch_thread_t *thread);
1386
1387 /**
1388  * Get a notmuch_thread_t iterator for all messages in 'thread' in
1389  * oldest-first order.
1390  *
1391  * The returned list will be destroyed when the thread is destroyed.
1392  */
1393 notmuch_messages_t *
1394 notmuch_thread_get_messages (notmuch_thread_t *thread);
1395
1396 /**
1397  * Get the number of messages in 'thread' that matched the search.
1398  *
1399  * This count includes only the messages in this thread that were
1400  * matched by the search from which the thread was created and were
1401  * not excluded by any exclude tags passed in with the query (see
1402  * notmuch_query_add_tag_exclude). Contrast with
1403  * notmuch_thread_get_total_messages() .
1404  */
1405 int
1406 notmuch_thread_get_matched_messages (notmuch_thread_t *thread);
1407
1408 /**
1409  * Get the authors of 'thread' as a UTF-8 string.
1410  *
1411  * The returned string is a comma-separated list of the names of the
1412  * authors of mail messages in the query results that belong to this
1413  * thread.
1414  *
1415  * The string contains authors of messages matching the query first, then
1416  * non-matched authors (with the two groups separated by '|'). Within
1417  * each group, authors are ordered by date.
1418  *
1419  * The returned string belongs to 'thread' and as such, should not be
1420  * modified by the caller and will only be valid for as long as the
1421  * thread is valid, (which is until notmuch_thread_destroy or until
1422  * the query from which it derived is destroyed).
1423  */
1424 const char *
1425 notmuch_thread_get_authors (notmuch_thread_t *thread);
1426
1427 /**
1428  * Get the subject of 'thread' as a UTF-8 string.
1429  *
1430  * The subject is taken from the first message (according to the query
1431  * order---see notmuch_query_set_sort) in the query results that
1432  * belongs to this thread.
1433  *
1434  * The returned string belongs to 'thread' and as such, should not be
1435  * modified by the caller and will only be valid for as long as the
1436  * thread is valid, (which is until notmuch_thread_destroy or until
1437  * the query from which it derived is destroyed).
1438  */
1439 const char *
1440 notmuch_thread_get_subject (notmuch_thread_t *thread);
1441
1442 /**
1443  * Get the date of the oldest message in 'thread' as a time_t value.
1444  */
1445 time_t
1446 notmuch_thread_get_oldest_date (notmuch_thread_t *thread);
1447
1448 /**
1449  * Get the date of the newest message in 'thread' as a time_t value.
1450  */
1451 time_t
1452 notmuch_thread_get_newest_date (notmuch_thread_t *thread);
1453
1454 /**
1455  * Get the tags for 'thread', returning a notmuch_tags_t object which
1456  * can be used to iterate over all tags.
1457  *
1458  * Note: In the Notmuch database, tags are stored on individual
1459  * messages, not on threads. So the tags returned here will be all
1460  * tags of the messages which matched the search and which belong to
1461  * this thread.
1462  *
1463  * The tags object is owned by the thread and as such, will only be
1464  * valid for as long as the thread is valid, (for example, until
1465  * notmuch_thread_destroy or until the query from which it derived is
1466  * destroyed).
1467  *
1468  * Typical usage might be:
1469  *
1470  *     notmuch_thread_t *thread;
1471  *     notmuch_tags_t *tags;
1472  *     const char *tag;
1473  *
1474  *     thread = notmuch_threads_get (threads);
1475  *
1476  *     for (tags = notmuch_thread_get_tags (thread);
1477  *          notmuch_tags_valid (tags);
1478  *          notmuch_tags_move_to_next (tags))
1479  *     {
1480  *         tag = notmuch_tags_get (tags);
1481  *         ....
1482  *     }
1483  *
1484  *     notmuch_thread_destroy (thread);
1485  *
1486  * Note that there's no explicit destructor needed for the
1487  * notmuch_tags_t object. (For consistency, we do provide a
1488  * notmuch_tags_destroy function, but there's no good reason to call
1489  * it if the message is about to be destroyed).
1490  */
1491 notmuch_tags_t *
1492 notmuch_thread_get_tags (notmuch_thread_t *thread);
1493
1494 /**
1495  * Destroy a notmuch_thread_t object.
1496  */
1497 void
1498 notmuch_thread_destroy (notmuch_thread_t *thread);
1499
1500 /**
1501  * Is the given 'messages' iterator pointing at a valid message.
1502  *
1503  * When this function returns TRUE, notmuch_messages_get will return a
1504  * valid object. Whereas when this function returns FALSE,
1505  * notmuch_messages_get will return NULL.
1506  *
1507  * See the documentation of notmuch_query_search_messages for example
1508  * code showing how to iterate over a notmuch_messages_t object.
1509  */
1510 notmuch_bool_t
1511 notmuch_messages_valid (notmuch_messages_t *messages);
1512
1513 /**
1514  * Get the current message from 'messages' as a notmuch_message_t.
1515  *
1516  * Note: The returned message belongs to 'messages' and has a lifetime
1517  * identical to it (and the query to which it belongs).
1518  *
1519  * See the documentation of notmuch_query_search_messages for example
1520  * code showing how to iterate over a notmuch_messages_t object.
1521  *
1522  * If an out-of-memory situation occurs, this function will return
1523  * NULL.
1524  */
1525 notmuch_message_t *
1526 notmuch_messages_get (notmuch_messages_t *messages);
1527
1528 /**
1529  * Move the 'messages' iterator to the next message.
1530  *
1531  * If 'messages' is already pointing at the last message then the
1532  * iterator will be moved to a point just beyond that last message,
1533  * (where notmuch_messages_valid will return FALSE and
1534  * notmuch_messages_get will return NULL).
1535  *
1536  * See the documentation of notmuch_query_search_messages for example
1537  * code showing how to iterate over a notmuch_messages_t object.
1538  */
1539 void
1540 notmuch_messages_move_to_next (notmuch_messages_t *messages);
1541
1542 /**
1543  * Destroy a notmuch_messages_t object.
1544  *
1545  * It's not strictly necessary to call this function. All memory from
1546  * the notmuch_messages_t object will be reclaimed when the containing
1547  * query object is destroyed.
1548  */
1549 void
1550 notmuch_messages_destroy (notmuch_messages_t *messages);
1551
1552 /**
1553  * Return a list of tags from all messages.
1554  *
1555  * The resulting list is guaranteed not to contain duplicated tags.
1556  *
1557  * WARNING: You can no longer iterate over messages after calling this
1558  * function, because the iterator will point at the end of the list.
1559  * We do not have a function to reset the iterator yet and the only
1560  * way how you can iterate over the list again is to recreate the
1561  * message list.
1562  *
1563  * The function returns NULL on error.
1564  */
1565 notmuch_tags_t *
1566 notmuch_messages_collect_tags (notmuch_messages_t *messages);
1567
1568 /**
1569  * Get the database associated with this message.
1570  *
1571  * @since libnotmuch 5.2 (notmuch 0.27)
1572  */
1573 notmuch_database_t *
1574 notmuch_message_get_database (const notmuch_message_t *message);
1575
1576 /**
1577  * Get the message ID of 'message'.
1578  *
1579  * The returned string belongs to 'message' and as such, should not be
1580  * modified by the caller and will only be valid for as long as the
1581  * message is valid, (which is until the query from which it derived
1582  * is destroyed).
1583  *
1584  * This function will return NULL if triggers an unhandled Xapian
1585  * exception.
1586  */
1587 const char *
1588 notmuch_message_get_message_id (notmuch_message_t *message);
1589
1590 /**
1591  * Get the thread ID of 'message'.
1592  *
1593  * The returned string belongs to 'message' and as such, should not be
1594  * modified by the caller and will only be valid for as long as the
1595  * message is valid, (for example, until the user calls
1596  * notmuch_message_destroy on 'message' or until a query from which it
1597  * derived is destroyed).
1598  *
1599  * This function will return NULL if triggers an unhandled Xapian
1600  * exception.
1601  */
1602 const char *
1603 notmuch_message_get_thread_id (notmuch_message_t *message);
1604
1605 /**
1606  * Get a notmuch_messages_t iterator for all of the replies to
1607  * 'message'.
1608  *
1609  * Note: This call only makes sense if 'message' was ultimately
1610  * obtained from a notmuch_thread_t object, (such as by coming
1611  * directly from the result of calling notmuch_thread_get_
1612  * toplevel_messages or by any number of subsequent
1613  * calls to notmuch_message_get_replies).
1614  *
1615  * If 'message' was obtained through some non-thread means, (such as
1616  * by a call to notmuch_query_search_messages), then this function
1617  * will return NULL.
1618  *
1619  * If there are no replies to 'message', this function will return
1620  * NULL. (Note that notmuch_messages_valid will accept that NULL
1621  * value as legitimate, and simply return FALSE for it.)
1622  *
1623  * This function also returns NULL if it triggers a Xapian exception.
1624  *
1625  * The returned list will be destroyed when the thread is
1626  * destroyed.
1627  */
1628 notmuch_messages_t *
1629 notmuch_message_get_replies (notmuch_message_t *message);
1630
1631 /**
1632  * Get the total number of files associated with a message.
1633  * @returns Non-negative integer for file count.
1634  * @returns Negative integer for error.
1635  * @since libnotmuch 5.0 (notmuch 0.25)
1636  */
1637 int
1638 notmuch_message_count_files (notmuch_message_t *message);
1639
1640 /**
1641  * Get a filename for the email corresponding to 'message'.
1642  *
1643  * The returned filename is an absolute filename, (the initial
1644  * component will match notmuch_database_get_path() ).
1645  *
1646  * The returned string belongs to the message so should not be
1647  * modified or freed by the caller (nor should it be referenced after
1648  * the message is destroyed).
1649  *
1650  * Note: If this message corresponds to multiple files in the mail
1651  * store, (that is, multiple files contain identical message IDs),
1652  * this function will arbitrarily return a single one of those
1653  * filenames. See notmuch_message_get_filenames for returning the
1654  * complete list of filenames.
1655  *
1656  * This function returns NULL if it triggers a Xapian exception.
1657  */
1658 const char *
1659 notmuch_message_get_filename (notmuch_message_t *message);
1660
1661 /**
1662  * Get all filenames for the email corresponding to 'message'.
1663  *
1664  * Returns a notmuch_filenames_t iterator listing all the filenames
1665  * associated with 'message'. These files may not have identical
1666  * content, but each will have the identical Message-ID.
1667  *
1668  * Each filename in the iterator is an absolute filename, (the initial
1669  * component will match notmuch_database_get_path() ).
1670  *
1671  * This function returns NULL if it triggers a Xapian exception.
1672  */
1673 notmuch_filenames_t *
1674 notmuch_message_get_filenames (notmuch_message_t *message);
1675
1676 /**
1677  * Re-index the e-mail corresponding to 'message' using the supplied index options
1678  *
1679  * Returns the status of the re-index operation.  (see the return
1680  * codes documented in notmuch_database_index_file)
1681  *
1682  * After reindexing, the user should discard the message object passed
1683  * in here by calling notmuch_message_destroy, since it refers to the
1684  * original message, not to the reindexed message.
1685  */
1686 notmuch_status_t
1687 notmuch_message_reindex (notmuch_message_t *message,
1688                          notmuch_indexopts_t *indexopts);
1689
1690 /**
1691  * Message flags.
1692  */
1693 typedef enum {
1694     NOTMUCH_MESSAGE_FLAG_MATCH,
1695     NOTMUCH_MESSAGE_FLAG_EXCLUDED,
1696
1697     /* This message is a "ghost message", meaning it has no filenames
1698      * or content, but we know it exists because it was referenced by
1699      * some other message.  A ghost message has only a message ID and
1700      * thread ID.
1701      */
1702     NOTMUCH_MESSAGE_FLAG_GHOST,
1703 } notmuch_message_flag_t;
1704
1705 /**
1706  * Get a value of a flag for the email corresponding to 'message'.
1707  *
1708  * returns FALSE in case of errors.
1709  *
1710  * @deprecated Deprecated as of libnotmuch 5.3 (notmuch 0.31). Please
1711  * use notmuch_message_get_flag_st instead.
1712  */
1713 NOTMUCH_DEPRECATED (5, 3)
1714 notmuch_bool_t
1715 notmuch_message_get_flag (notmuch_message_t *message,
1716                           notmuch_message_flag_t flag);
1717
1718 /**
1719  * Get a value of a flag for the email corresponding to 'message'.
1720  *
1721  * @param message a message object
1722  * @param flag flag to check
1723  * @param is_set pointer to boolean to store flag value.
1724  *
1725  * @retval #NOTMUCH_STATUS_SUCCESS
1726  * @retval #NOTMUCH_STATUS_NULL_POINTER is_set is NULL
1727  * @retval #NOTMUCH_STATUS_XAPIAN_EXCEPTION Accessing the database
1728  * triggered an exception.
1729  *
1730  * @since libnotmuch 5.3 (notmuch 0.31)
1731  */
1732 notmuch_status_t
1733 notmuch_message_get_flag_st (notmuch_message_t *message,
1734                              notmuch_message_flag_t flag,
1735                              notmuch_bool_t *is_set);
1736
1737 /**
1738  * Set a value of a flag for the email corresponding to 'message'.
1739  */
1740 void
1741 notmuch_message_set_flag (notmuch_message_t *message,
1742                           notmuch_message_flag_t flag, notmuch_bool_t value);
1743
1744 /**
1745  * Get the date of 'message' as a time_t value.
1746  *
1747  * For the original textual representation of the Date header from the
1748  * message call notmuch_message_get_header() with a header value of
1749  * "date".
1750  *
1751  * Returns 0 in case of error.
1752  */
1753 time_t
1754 notmuch_message_get_date (notmuch_message_t *message);
1755
1756 /**
1757  * Get the value of the specified header from 'message' as a UTF-8 string.
1758  *
1759  * Common headers are stored in the database when the message is
1760  * indexed and will be returned from the database.  Other headers will
1761  * be read from the actual message file.
1762  *
1763  * The header name is case insensitive.
1764  *
1765  * The returned string belongs to the message so should not be
1766  * modified or freed by the caller (nor should it be referenced after
1767  * the message is destroyed).
1768  *
1769  * Returns an empty string ("") if the message does not contain a
1770  * header line matching 'header'. Returns NULL if any error occurs.
1771  */
1772 const char *
1773 notmuch_message_get_header (notmuch_message_t *message, const char *header);
1774
1775 /**
1776  * Get the tags for 'message', returning a notmuch_tags_t object which
1777  * can be used to iterate over all tags.
1778  *
1779  * The tags object is owned by the message and as such, will only be
1780  * valid for as long as the message is valid, (which is until the
1781  * query from which it derived is destroyed).
1782  *
1783  * Typical usage might be:
1784  *
1785  *     notmuch_message_t *message;
1786  *     notmuch_tags_t *tags;
1787  *     const char *tag;
1788  *
1789  *     message = notmuch_database_find_message (database, message_id);
1790  *
1791  *     for (tags = notmuch_message_get_tags (message);
1792  *          notmuch_tags_valid (tags);
1793  *          notmuch_tags_move_to_next (tags))
1794  *     {
1795  *         tag = notmuch_tags_get (tags);
1796  *         ....
1797  *     }
1798  *
1799  *     notmuch_message_destroy (message);
1800  *
1801  * Note that there's no explicit destructor needed for the
1802  * notmuch_tags_t object. (For consistency, we do provide a
1803  * notmuch_tags_destroy function, but there's no good reason to call
1804  * it if the message is about to be destroyed).
1805  */
1806 notmuch_tags_t *
1807 notmuch_message_get_tags (notmuch_message_t *message);
1808
1809 /**
1810  * The longest possible tag value.
1811  */
1812 #define NOTMUCH_TAG_MAX 200
1813
1814 /**
1815  * Add a tag to the given message.
1816  *
1817  * Return value:
1818  *
1819  * NOTMUCH_STATUS_SUCCESS: Tag successfully added to message
1820  *
1821  * NOTMUCH_STATUS_NULL_POINTER: The 'tag' argument is NULL
1822  *
1823  * NOTMUCH_STATUS_TAG_TOO_LONG: The length of 'tag' is too long
1824  *      (exceeds NOTMUCH_TAG_MAX)
1825  *
1826  * NOTMUCH_STATUS_READ_ONLY_DATABASE: Database was opened in read-only
1827  *      mode so message cannot be modified.
1828  */
1829 notmuch_status_t
1830 notmuch_message_add_tag (notmuch_message_t *message, const char *tag);
1831
1832 /**
1833  * Remove a tag from the given message.
1834  *
1835  * Return value:
1836  *
1837  * NOTMUCH_STATUS_SUCCESS: Tag successfully removed from message
1838  *
1839  * NOTMUCH_STATUS_NULL_POINTER: The 'tag' argument is NULL
1840  *
1841  * NOTMUCH_STATUS_TAG_TOO_LONG: The length of 'tag' is too long
1842  *      (exceeds NOTMUCH_TAG_MAX)
1843  *
1844  * NOTMUCH_STATUS_READ_ONLY_DATABASE: Database was opened in read-only
1845  *      mode so message cannot be modified.
1846  */
1847 notmuch_status_t
1848 notmuch_message_remove_tag (notmuch_message_t *message, const char *tag);
1849
1850 /**
1851  * Remove all tags from the given message.
1852  *
1853  * See notmuch_message_freeze for an example showing how to safely
1854  * replace tag values.
1855  *
1856  * @retval #NOTMUCH_STATUS_READ_ONLY_DATABASE: Database was opened in
1857  *      read-only mode so message cannot be modified.
1858  * @retval #NOTMUCH_STATUS_XAPIAN_EXCEPTION: an exception was thrown
1859  *      accessing the database.
1860  */
1861 notmuch_status_t
1862 notmuch_message_remove_all_tags (notmuch_message_t *message);
1863
1864 /**
1865  * Add/remove tags according to maildir flags in the message filename(s).
1866  *
1867  * This function examines the filenames of 'message' for maildir
1868  * flags, and adds or removes tags on 'message' as follows when these
1869  * flags are present:
1870  *
1871  *      Flag    Action if present
1872  *      ----    -----------------
1873  *      'D'     Adds the "draft" tag to the message
1874  *      'F'     Adds the "flagged" tag to the message
1875  *      'P'     Adds the "passed" tag to the message
1876  *      'R'     Adds the "replied" tag to the message
1877  *      'S'     Removes the "unread" tag from the message
1878  *
1879  * For each flag that is not present, the opposite action (add/remove)
1880  * is performed for the corresponding tags.
1881  *
1882  * Flags are identified as trailing components of the filename after a
1883  * sequence of ":2,".
1884  *
1885  * If there are multiple filenames associated with this message, the
1886  * flag is considered present if it appears in one or more
1887  * filenames. (That is, the flags from the multiple filenames are
1888  * combined with the logical OR operator.)
1889  *
1890  * A client can ensure that notmuch database tags remain synchronized
1891  * with maildir flags by calling this function after each call to
1892  * notmuch_database_index_file. See also
1893  * notmuch_message_tags_to_maildir_flags for synchronizing tag changes
1894  * back to maildir flags.
1895  */
1896 notmuch_status_t
1897 notmuch_message_maildir_flags_to_tags (notmuch_message_t *message);
1898
1899 /**
1900  * return TRUE if any filename of 'message' has maildir flag 'flag',
1901  * FALSE otherwise.
1902  *
1903  * Deprecated wrapper for notmuch_message_has_maildir_flag_st
1904  *
1905  * @returns FALSE in case of error
1906  * @deprecated libnotmuch 5.3 (notmuch 0.31)
1907  */
1908 NOTMUCH_DEPRECATED (5, 3)
1909 notmuch_bool_t
1910 notmuch_message_has_maildir_flag (notmuch_message_t *message, char flag);
1911
1912 /**
1913  * check message for maildir flag
1914  *
1915  * @param [in,out]      message message to check
1916  * @param [in] flag     flag to check for
1917  * @param [out] is_set  pointer to boolean
1918  *
1919  * @retval #NOTMUCH_STATUS_SUCCESS
1920  * @retval #NOTMUCH_STATUS_NULL_POINTER is_set is NULL
1921  * @retval #NOTMUCH_STATUS_XAPIAN_EXCEPTION Accessing the database
1922  * triggered an exception.
1923  */
1924 notmuch_status_t
1925 notmuch_message_has_maildir_flag_st (notmuch_message_t *message,
1926                                      char flag,
1927                                      notmuch_bool_t *is_set);
1928
1929 /**
1930  * Rename message filename(s) to encode tags as maildir flags.
1931  *
1932  * Specifically, for each filename corresponding to this message:
1933  *
1934  * If the filename is not in a maildir directory, do nothing.  (A
1935  * maildir directory is determined as a directory named "new" or
1936  * "cur".) Similarly, if the filename has invalid maildir info,
1937  * (repeated or outof-ASCII-order flag characters after ":2,"), then
1938  * do nothing.
1939  *
1940  * If the filename is in a maildir directory, rename the file so that
1941  * its filename ends with the sequence ":2," followed by zero or more
1942  * of the following single-character flags (in ASCII order):
1943  *
1944  *   * flag 'D' iff the message has the "draft" tag
1945  *   * flag 'F' iff the message has the "flagged" tag
1946  *   * flag 'P' iff the message has the "passed" tag
1947  *   * flag 'R' iff the message has the "replied" tag
1948  *   * flag 'S' iff the message does not have the "unread" tag
1949  *
1950  * Any existing flags unmentioned in the list above will be preserved
1951  * in the renaming.
1952  *
1953  * Also, if this filename is in a directory named "new", rename it to
1954  * be within the neighboring directory named "cur".
1955  *
1956  * A client can ensure that maildir filename flags remain synchronized
1957  * with notmuch database tags by calling this function after changing
1958  * tags, (after calls to notmuch_message_add_tag,
1959  * notmuch_message_remove_tag, or notmuch_message_freeze/
1960  * notmuch_message_thaw). See also notmuch_message_maildir_flags_to_tags
1961  * for synchronizing maildir flag changes back to tags.
1962  */
1963 notmuch_status_t
1964 notmuch_message_tags_to_maildir_flags (notmuch_message_t *message);
1965
1966 /**
1967  * Freeze the current state of 'message' within the database.
1968  *
1969  * This means that changes to the message state, (via
1970  * notmuch_message_add_tag, notmuch_message_remove_tag, and
1971  * notmuch_message_remove_all_tags), will not be committed to the
1972  * database until the message is thawed with notmuch_message_thaw.
1973  *
1974  * Multiple calls to freeze/thaw are valid and these calls will
1975  * "stack". That is there must be as many calls to thaw as to freeze
1976  * before a message is actually thawed.
1977  *
1978  * The ability to do freeze/thaw allows for safe transactions to
1979  * change tag values. For example, explicitly setting a message to
1980  * have a given set of tags might look like this:
1981  *
1982  *    notmuch_message_freeze (message);
1983  *
1984  *    notmuch_message_remove_all_tags (message);
1985  *
1986  *    for (i = 0; i < NUM_TAGS; i++)
1987  *        notmuch_message_add_tag (message, tags[i]);
1988  *
1989  *    notmuch_message_thaw (message);
1990  *
1991  * With freeze/thaw used like this, the message in the database is
1992  * guaranteed to have either the full set of original tag values, or
1993  * the full set of new tag values, but nothing in between.
1994  *
1995  * Imagine the example above without freeze/thaw and the operation
1996  * somehow getting interrupted. This could result in the message being
1997  * left with no tags if the interruption happened after
1998  * notmuch_message_remove_all_tags but before notmuch_message_add_tag.
1999  *
2000  * Return value:
2001  *
2002  * NOTMUCH_STATUS_SUCCESS: Message successfully frozen.
2003  *
2004  * NOTMUCH_STATUS_READ_ONLY_DATABASE: Database was opened in read-only
2005  *      mode so message cannot be modified.
2006  */
2007 notmuch_status_t
2008 notmuch_message_freeze (notmuch_message_t *message);
2009
2010 /**
2011  * Thaw the current 'message', synchronizing any changes that may have
2012  * occurred while 'message' was frozen into the notmuch database.
2013  *
2014  * See notmuch_message_freeze for an example of how to use this
2015  * function to safely provide tag changes.
2016  *
2017  * Multiple calls to freeze/thaw are valid and these calls with
2018  * "stack". That is there must be as many calls to thaw as to freeze
2019  * before a message is actually thawed.
2020  *
2021  * Return value:
2022  *
2023  * NOTMUCH_STATUS_SUCCESS: Message successfully thawed, (or at least
2024  *      its frozen count has successfully been reduced by 1).
2025  *
2026  * NOTMUCH_STATUS_UNBALANCED_FREEZE_THAW: An attempt was made to thaw
2027  *      an unfrozen message. That is, there have been an unbalanced
2028  *      number of calls to notmuch_message_freeze and
2029  *      notmuch_message_thaw.
2030  */
2031 notmuch_status_t
2032 notmuch_message_thaw (notmuch_message_t *message);
2033
2034 /**
2035  * Destroy a notmuch_message_t object.
2036  *
2037  * It can be useful to call this function in the case of a single
2038  * query object with many messages in the result, (such as iterating
2039  * over the entire database). Otherwise, it's fine to never call this
2040  * function and there will still be no memory leaks. (The memory from
2041  * the messages get reclaimed when the containing query is destroyed.)
2042  */
2043 void
2044 notmuch_message_destroy (notmuch_message_t *message);
2045
2046 /**
2047  * @name Message Properties
2048  *
2049  * This interface provides the ability to attach arbitrary (key,value)
2050  * string pairs to a message, to remove such pairs, and to iterate
2051  * over them.  The caller should take some care as to what keys they
2052  * add or delete values for, as other subsystems or extensions may
2053  * depend on these properties.
2054  *
2055  * Please see notmuch-properties(7) for more details about specific
2056  * properties and conventions around their use.
2057  *
2058  */
2059 /**@{*/
2060 /**
2061  * Retrieve the value for a single property key
2062  *
2063  * *value* is set to a string owned by the message or NULL if there is
2064  * no such key. In the case of multiple values for the given key, the
2065  * first one is retrieved.
2066  *
2067  * @returns
2068  * - NOTMUCH_STATUS_NULL_POINTER: *value* may not be NULL.
2069  * - NOTMUCH_STATUS_SUCCESS: No error occurred.
2070  * @since libnotmuch 4.4 (notmuch 0.23)
2071  */
2072 notmuch_status_t
2073 notmuch_message_get_property (notmuch_message_t *message, const char *key, const char **value);
2074
2075 /**
2076  * Add a (key,value) pair to a message
2077  *
2078  * @returns
2079  * - NOTMUCH_STATUS_ILLEGAL_ARGUMENT: *key* may not contain an '=' character.
2080  * - NOTMUCH_STATUS_NULL_POINTER: Neither *key* nor *value* may be NULL.
2081  * - NOTMUCH_STATUS_SUCCESS: No error occurred.
2082  * @since libnotmuch 4.4 (notmuch 0.23)
2083  */
2084 notmuch_status_t
2085 notmuch_message_add_property (notmuch_message_t *message, const char *key, const char *value);
2086
2087 /**
2088  * Remove a (key,value) pair from a message.
2089  *
2090  * It is not an error to remove a non-existent (key,value) pair
2091  *
2092  * @returns
2093  * - NOTMUCH_STATUS_ILLEGAL_ARGUMENT: *key* may not contain an '=' character.
2094  * - NOTMUCH_STATUS_NULL_POINTER: Neither *key* nor *value* may be NULL.
2095  * - NOTMUCH_STATUS_SUCCESS: No error occurred.
2096  * @since libnotmuch 4.4 (notmuch 0.23)
2097  */
2098 notmuch_status_t
2099 notmuch_message_remove_property (notmuch_message_t *message, const char *key, const char *value);
2100
2101 /**
2102  * Remove all (key,value) pairs from the given message.
2103  *
2104  * @param[in,out] message  message to operate on.
2105  * @param[in]     key      key to delete properties for. If NULL, delete
2106  *                         properties for all keys
2107  * @returns
2108  * - NOTMUCH_STATUS_READ_ONLY_DATABASE: Database was opened in
2109  *   read-only mode so message cannot be modified.
2110  * - NOTMUCH_STATUS_SUCCESS: No error occurred.
2111  *
2112  * @since libnotmuch 4.4 (notmuch 0.23)
2113  */
2114 notmuch_status_t
2115 notmuch_message_remove_all_properties (notmuch_message_t *message, const char *key);
2116
2117 /**
2118  * Remove all (prefix*,value) pairs from the given message
2119  *
2120  * @param[in,out] message  message to operate on.
2121  * @param[in]     prefix   delete properties with keys that start with prefix.
2122  *                         If NULL, delete all properties
2123  * @returns
2124  * - NOTMUCH_STATUS_READ_ONLY_DATABASE: Database was opened in
2125  *   read-only mode so message cannot be modified.
2126  * - NOTMUCH_STATUS_SUCCESS: No error occurred.
2127  *
2128  * @since libnotmuch 5.1 (notmuch 0.26)
2129  */
2130 notmuch_status_t
2131 notmuch_message_remove_all_properties_with_prefix (notmuch_message_t *message, const char *prefix);
2132
2133 /**
2134  * Opaque message property iterator
2135  */
2136 typedef struct _notmuch_string_map_iterator notmuch_message_properties_t;
2137
2138 /**
2139  * Get the properties for *message*, returning a
2140  * notmuch_message_properties_t object which can be used to iterate
2141  * over all properties.
2142  *
2143  * The notmuch_message_properties_t object is owned by the message and
2144  * as such, will only be valid for as long as the message is valid,
2145  * (which is until the query from which it derived is destroyed).
2146  *
2147  * @param[in] message  The message to examine
2148  * @param[in] key      key or key prefix
2149  * @param[in] exact    if TRUE, require exact match with key. Otherwise
2150  *                     treat as prefix.
2151  *
2152  * Typical usage might be:
2153  *
2154  *     notmuch_message_properties_t *list;
2155  *
2156  *     for (list = notmuch_message_get_properties (message, "testkey1", TRUE);
2157  *          notmuch_message_properties_valid (list); notmuch_message_properties_move_to_next (list)) {
2158  *        printf("%s\n", notmuch_message_properties_value(list));
2159  *     }
2160  *
2161  *     notmuch_message_properties_destroy (list);
2162  *
2163  * Note that there's no explicit destructor needed for the
2164  * notmuch_message_properties_t object. (For consistency, we do
2165  * provide a notmuch_message_properities_destroy function, but there's
2166  * no good reason to call it if the message is about to be destroyed).
2167  *
2168  * @since libnotmuch 4.4 (notmuch 0.23)
2169  */
2170 notmuch_message_properties_t *
2171 notmuch_message_get_properties (notmuch_message_t *message, const char *key, notmuch_bool_t exact);
2172
2173 /**
2174  * Return the number of properties named "key" belonging to the specific message.
2175  *
2176  * @param[in] message  The message to examine
2177  * @param[in] key      key to count
2178  * @param[out] count   The number of matching properties associated with this message.
2179  *
2180  * @returns
2181  *
2182  * NOTMUCH_STATUS_SUCCESS: successful count, possibly some other error.
2183  *
2184  * @since libnotmuch 5.2 (notmuch 0.27)
2185  */
2186 notmuch_status_t
2187 notmuch_message_count_properties (notmuch_message_t *message, const char *key, unsigned int *count);
2188
2189 /**
2190  * Is the given *properties* iterator pointing at a valid (key,value)
2191  * pair.
2192  *
2193  * When this function returns TRUE,
2194  * notmuch_message_properties_{key,value} will return a valid string,
2195  * and notmuch_message_properties_move_to_next will do what it
2196  * says. Whereas when this function returns FALSE, calling any of
2197  * these functions results in undefined behaviour.
2198  *
2199  * See the documentation of notmuch_message_get_properties for example
2200  * code showing how to iterate over a notmuch_message_properties_t
2201  * object.
2202  *
2203  * @since libnotmuch 4.4 (notmuch 0.23)
2204  */
2205 notmuch_bool_t
2206 notmuch_message_properties_valid (notmuch_message_properties_t *properties);
2207
2208 /**
2209  * Move the *properties* iterator to the next (key,value) pair
2210  *
2211  * If *properties* is already pointing at the last pair then the iterator
2212  * will be moved to a point just beyond that last pair, (where
2213  * notmuch_message_properties_valid will return FALSE).
2214  *
2215  * See the documentation of notmuch_message_get_properties for example
2216  * code showing how to iterate over a notmuch_message_properties_t object.
2217  *
2218  * @since libnotmuch 4.4 (notmuch 0.23)
2219  */
2220 void
2221 notmuch_message_properties_move_to_next (notmuch_message_properties_t *properties);
2222
2223 /**
2224  * Return the key from the current (key,value) pair.
2225  *
2226  * this could be useful if iterating for a prefix
2227  *
2228  * @since libnotmuch 4.4 (notmuch 0.23)
2229  */
2230 const char *
2231 notmuch_message_properties_key (notmuch_message_properties_t *properties);
2232
2233 /**
2234  * Return the value from the current (key,value) pair.
2235  *
2236  * This could be useful if iterating for a prefix.
2237  *
2238  * @since libnotmuch 4.4 (notmuch 0.23)
2239  */
2240 const char *
2241 notmuch_message_properties_value (notmuch_message_properties_t *properties);
2242
2243
2244 /**
2245  * Destroy a notmuch_message_properties_t object.
2246  *
2247  * It's not strictly necessary to call this function. All memory from
2248  * the notmuch_message_properties_t object will be reclaimed when the
2249  * containing message object is destroyed.
2250  *
2251  * @since libnotmuch 4.4 (notmuch 0.23)
2252  */
2253 void
2254 notmuch_message_properties_destroy (notmuch_message_properties_t *properties);
2255
2256 /**@}*/
2257
2258 /**
2259  * Is the given 'tags' iterator pointing at a valid tag.
2260  *
2261  * When this function returns TRUE, notmuch_tags_get will return a
2262  * valid string. Whereas when this function returns FALSE,
2263  * notmuch_tags_get will return NULL.
2264  *
2265  * See the documentation of notmuch_message_get_tags for example code
2266  * showing how to iterate over a notmuch_tags_t object.
2267  */
2268 notmuch_bool_t
2269 notmuch_tags_valid (notmuch_tags_t *tags);
2270
2271 /**
2272  * Get the current tag from 'tags' as a string.
2273  *
2274  * Note: The returned string belongs to 'tags' and has a lifetime
2275  * identical to it (and the query to which it ultimately belongs).
2276  *
2277  * See the documentation of notmuch_message_get_tags for example code
2278  * showing how to iterate over a notmuch_tags_t object.
2279  */
2280 const char *
2281 notmuch_tags_get (notmuch_tags_t *tags);
2282
2283 /**
2284  * Move the 'tags' iterator to the next tag.
2285  *
2286  * If 'tags' is already pointing at the last tag then the iterator
2287  * will be moved to a point just beyond that last tag, (where
2288  * notmuch_tags_valid will return FALSE and notmuch_tags_get will
2289  * return NULL).
2290  *
2291  * See the documentation of notmuch_message_get_tags for example code
2292  * showing how to iterate over a notmuch_tags_t object.
2293  */
2294 void
2295 notmuch_tags_move_to_next (notmuch_tags_t *tags);
2296
2297 /**
2298  * Destroy a notmuch_tags_t object.
2299  *
2300  * It's not strictly necessary to call this function. All memory from
2301  * the notmuch_tags_t object will be reclaimed when the containing
2302  * message or query objects are destroyed.
2303  */
2304 void
2305 notmuch_tags_destroy (notmuch_tags_t *tags);
2306
2307 /**
2308  * Store an mtime within the database for 'directory'.
2309  *
2310  * The 'directory' should be an object retrieved from the database
2311  * with notmuch_database_get_directory for a particular path.
2312  *
2313  * The intention is for the caller to use the mtime to allow efficient
2314  * identification of new messages to be added to the database. The
2315  * recommended usage is as follows:
2316  *
2317  *   o Read the mtime of a directory from the filesystem
2318  *
2319  *   o Call index_file for all mail files in the directory
2320  *
2321  *   o Call notmuch_directory_set_mtime with the mtime read from the
2322  *     filesystem.
2323  *
2324  * Then, when wanting to check for updates to the directory in the
2325  * future, the client can call notmuch_directory_get_mtime and know
2326  * that it only needs to add files if the mtime of the directory and
2327  * files are newer than the stored timestamp.
2328  *
2329  * Note: The notmuch_directory_get_mtime function does not allow the
2330  * caller to distinguish a timestamp of 0 from a non-existent
2331  * timestamp. So don't store a timestamp of 0 unless you are
2332  * comfortable with that.
2333  *
2334  * Return value:
2335  *
2336  * NOTMUCH_STATUS_SUCCESS: mtime successfully stored in database.
2337  *
2338  * NOTMUCH_STATUS_XAPIAN_EXCEPTION: A Xapian exception
2339  *      occurred, mtime not stored.
2340  *
2341  * NOTMUCH_STATUS_READ_ONLY_DATABASE: Database was opened in read-only
2342  *      mode so directory mtime cannot be modified.
2343  */
2344 notmuch_status_t
2345 notmuch_directory_set_mtime (notmuch_directory_t *directory,
2346                              time_t mtime);
2347
2348 /**
2349  * Get the mtime of a directory, (as previously stored with
2350  * notmuch_directory_set_mtime).
2351  *
2352  * Returns 0 if no mtime has previously been stored for this
2353  * directory.
2354  */
2355 time_t
2356 notmuch_directory_get_mtime (notmuch_directory_t *directory);
2357
2358 /**
2359  * Get a notmuch_filenames_t iterator listing all the filenames of
2360  * messages in the database within the given directory.
2361  *
2362  * The returned filenames will be the basename-entries only (not
2363  * complete paths).
2364  *
2365  * Returns NULL if it triggers a Xapian exception
2366  */
2367 notmuch_filenames_t *
2368 notmuch_directory_get_child_files (notmuch_directory_t *directory);
2369
2370 /**
2371  * Get a notmuch_filenames_t iterator listing all the filenames of
2372  * sub-directories in the database within the given directory.
2373  *
2374  * The returned filenames will be the basename-entries only (not
2375  * complete paths).
2376  *
2377  * Returns NULL if it triggers a Xapian exception
2378  */
2379 notmuch_filenames_t *
2380 notmuch_directory_get_child_directories (notmuch_directory_t *directory);
2381
2382 /**
2383  * Delete directory document from the database, and destroy the
2384  * notmuch_directory_t object. Assumes any child directories and files
2385  * have been deleted by the caller.
2386  *
2387  * @since libnotmuch 4.3 (notmuch 0.21)
2388  */
2389 notmuch_status_t
2390 notmuch_directory_delete (notmuch_directory_t *directory);
2391
2392 /**
2393  * Destroy a notmuch_directory_t object.
2394  */
2395 void
2396 notmuch_directory_destroy (notmuch_directory_t *directory);
2397
2398 /**
2399  * Is the given 'filenames' iterator pointing at a valid filename.
2400  *
2401  * When this function returns TRUE, notmuch_filenames_get will return
2402  * a valid string. Whereas when this function returns FALSE,
2403  * notmuch_filenames_get will return NULL.
2404  *
2405  * It is acceptable to pass NULL for 'filenames', in which case this
2406  * function will always return FALSE.
2407  */
2408 notmuch_bool_t
2409 notmuch_filenames_valid (notmuch_filenames_t *filenames);
2410
2411 /**
2412  * Get the current filename from 'filenames' as a string.
2413  *
2414  * Note: The returned string belongs to 'filenames' and has a lifetime
2415  * identical to it (and the directory to which it ultimately belongs).
2416  *
2417  * It is acceptable to pass NULL for 'filenames', in which case this
2418  * function will always return NULL.
2419  */
2420 const char *
2421 notmuch_filenames_get (notmuch_filenames_t *filenames);
2422
2423 /**
2424  * Move the 'filenames' iterator to the next filename.
2425  *
2426  * If 'filenames' is already pointing at the last filename then the
2427  * iterator will be moved to a point just beyond that last filename,
2428  * (where notmuch_filenames_valid will return FALSE and
2429  * notmuch_filenames_get will return NULL).
2430  *
2431  * It is acceptable to pass NULL for 'filenames', in which case this
2432  * function will do nothing.
2433  */
2434 void
2435 notmuch_filenames_move_to_next (notmuch_filenames_t *filenames);
2436
2437 /**
2438  * Destroy a notmuch_filenames_t object.
2439  *
2440  * It's not strictly necessary to call this function. All memory from
2441  * the notmuch_filenames_t object will be reclaimed when the
2442  * containing directory object is destroyed.
2443  *
2444  * It is acceptable to pass NULL for 'filenames', in which case this
2445  * function will do nothing.
2446  */
2447 void
2448 notmuch_filenames_destroy (notmuch_filenames_t *filenames);
2449
2450
2451 /**
2452  * set config 'key' to 'value'
2453  *
2454  * @since libnotmuch 4.4 (notmuch 0.23)
2455  * @retval #NOTMUCH_STATUS_READ_ONLY_DATABASE: Database was opened in
2456  *      read-only mode so message cannot be modified.
2457  * @retval #NOTMUCH_STATUS_XAPIAN_EXCEPTION: an exception was thrown
2458  *      accessing the database.
2459  * @retval #NOTMUCH_STATUS_SUCCESS
2460  */
2461 notmuch_status_t
2462 notmuch_database_set_config (notmuch_database_t *db, const char *key, const char *value);
2463
2464 /**
2465  * retrieve config item 'key', assign to  'value'
2466  *
2467  * keys which have not been previously set with n_d_set_config will
2468  * return an empty string.
2469  *
2470  * return value is allocated by malloc and should be freed by the
2471  * caller.
2472  *
2473  * @since libnotmuch 4.4 (notmuch 0.23)
2474  *
2475  */
2476 notmuch_status_t
2477 notmuch_database_get_config (notmuch_database_t *db, const char *key, char **value);
2478
2479 /**
2480  * Create an iterator for all config items with keys matching a given prefix
2481  *
2482  * @since libnotmuch 4.4 (notmuch 0.23)
2483  */
2484 notmuch_status_t
2485 notmuch_database_get_config_list (notmuch_database_t *db, const char *prefix,
2486                                   notmuch_config_list_t **out);
2487
2488 /**
2489  * Is 'config_list' iterator valid (i.e. _key, _value, _move_to_next can be called).
2490  *
2491  * @since libnotmuch 4.4 (notmuch 0.23)
2492  */
2493 notmuch_bool_t
2494 notmuch_config_list_valid (notmuch_config_list_t *config_list);
2495
2496 /**
2497  * return key for current config pair
2498  *
2499  * return value is owned by the iterator, and will be destroyed by the
2500  * next call to notmuch_config_list_key or notmuch_config_list_destroy.
2501  *
2502  * @since libnotmuch 4.4 (notmuch 0.23)
2503  */
2504 const char *
2505 notmuch_config_list_key (notmuch_config_list_t *config_list);
2506
2507 /**
2508  * return 'value' for current config pair
2509  *
2510  * return value is owned by the iterator, and will be destroyed by the
2511  * next call to notmuch_config_list_value or notmuch config_list_destroy
2512  *
2513  * @since libnotmuch 4.4 (notmuch 0.23)
2514  * @retval NULL for errors
2515  */
2516 const char *
2517 notmuch_config_list_value (notmuch_config_list_t *config_list);
2518
2519
2520 /**
2521  * move 'config_list' iterator to the next pair
2522  *
2523  * @since libnotmuch 4.4 (notmuch 0.23)
2524  */
2525 void
2526 notmuch_config_list_move_to_next (notmuch_config_list_t *config_list);
2527
2528 /**
2529  * free any resources held by 'config_list'
2530  *
2531  * @since libnotmuch 4.4 (notmuch 0.23)
2532  */
2533 void
2534 notmuch_config_list_destroy (notmuch_config_list_t *config_list);
2535
2536 /**
2537  * Configuration keys known to libnotmuch
2538  */
2539 typedef enum {
2540     NOTMUCH_CONFIG_FIRST,
2541     NOTMUCH_CONFIG_DATABASE_PATH = NOTMUCH_CONFIG_FIRST,
2542     NOTMUCH_CONFIG_MAIL_ROOT,
2543     NOTMUCH_CONFIG_HOOK_DIR,
2544     NOTMUCH_CONFIG_BACKUP_DIR,
2545     NOTMUCH_CONFIG_EXCLUDE_TAGS,
2546     NOTMUCH_CONFIG_NEW_TAGS,
2547     NOTMUCH_CONFIG_NEW_IGNORE,
2548     NOTMUCH_CONFIG_SYNC_MAILDIR_FLAGS,
2549     NOTMUCH_CONFIG_PRIMARY_EMAIL,
2550     NOTMUCH_CONFIG_OTHER_EMAIL,
2551     NOTMUCH_CONFIG_USER_NAME,
2552     NOTMUCH_CONFIG_AUTOCOMMIT,
2553     NOTMUCH_CONFIG_EXTRA_HEADERS,
2554     NOTMUCH_CONFIG_LAST
2555 } notmuch_config_key_t;
2556
2557 /**
2558  * get a configuration value from an open database.
2559  *
2560  * This value reflects all configuration information given at the time
2561  * the database was opened.
2562  *
2563  * @param[in] notmuch database
2564  * @param[in] key configuration key
2565  *
2566  * @since libnotmuch 5.4 (notmuch 0.32)
2567  *
2568  * @retval NULL if 'key' unknown or if no value is known for
2569  *         'key'.  Otherwise returns a string owned by notmuch which should
2570  *         not be modified nor freed by the caller.
2571  */
2572 const char *
2573 notmuch_config_get (notmuch_database_t *notmuch, notmuch_config_key_t key);
2574
2575 /**
2576  * set a configuration value from in an open database.
2577  *
2578  * This value reflects all configuration information given at the time
2579  * the database was opened.
2580  *
2581  * @param[in,out] notmuch database open read/write
2582  * @param[in] key configuration key
2583  * @param[in] val configuration value
2584  *
2585  * @since libnotmuch 5.4 (notmuch 0.32)
2586  *
2587  * @retval returns any return value for notmuch_database_set_config.
2588  */
2589 notmuch_status_t
2590 notmuch_config_set (notmuch_database_t *notmuch, notmuch_config_key_t key, const char *val);
2591
2592 /**
2593  * Returns an iterator for a ';'-delimited list of configuration values
2594  *
2595  * These values reflect all configuration information given at the
2596  * time the database was opened.
2597  *
2598  * @param[in] notmuch database
2599  * @param[in] key configuration key
2600  *
2601  * @since libnotmuch 5.4 (notmuch 0.32)
2602  *
2603  * @retval NULL in case of error.
2604  */
2605 notmuch_config_values_t *
2606 notmuch_config_get_values (notmuch_database_t *notmuch, notmuch_config_key_t key);
2607
2608 /**
2609  * Returns an iterator for a ';'-delimited list of configuration values
2610  *
2611  * These values reflect all configuration information given at the
2612  * time the database was opened.
2613  *
2614  * @param[in] notmuch database
2615  * @param[in] key configuration key
2616  *
2617  * @since libnotmuch 5.4 (notmuch 0.32)
2618  *
2619  * @retval NULL in case of error.
2620  */
2621 notmuch_config_values_t *
2622 notmuch_config_get_values_string (notmuch_database_t *notmuch, const char *key);
2623
2624 /**
2625  * Is the given 'config_values' iterator pointing at a valid element.
2626  *
2627  * @param[in] values iterator
2628  *
2629  * @since libnotmuch 5.4 (notmuch 0.32)
2630  *
2631  * @retval FALSE if passed a NULL pointer, or the iterator is exhausted.
2632  *
2633  */
2634 notmuch_bool_t
2635 notmuch_config_values_valid (notmuch_config_values_t *values);
2636
2637 /**
2638  * Get the current value from the 'values' iterator
2639  *
2640  * @param[in] values iterator
2641  *
2642  * @since libnotmuch 5.4 (notmuch 0.32)
2643  *
2644  * @retval a string with the same lifetime as the iterator
2645  */
2646 const char *
2647 notmuch_config_values_get (notmuch_config_values_t *values);
2648
2649 /**
2650  * Move the 'values' iterator to the next element
2651  *
2652  * @param[in,out] values iterator
2653  *
2654  * @since libnotmuch 5.4 (notmuch 0.32)
2655  *
2656  */
2657 void
2658 notmuch_config_values_move_to_next (notmuch_config_values_t *values);
2659
2660
2661 /**
2662  * reset the 'values' iterator to the first element
2663  *
2664  * @param[in,out] values iterator. A NULL value is ignored.
2665  *
2666  * @since libnotmuch 5.4 (notmuch 0.32)
2667  *
2668  */
2669 void
2670 notmuch_config_values_start (notmuch_config_values_t *values);
2671
2672 /**
2673  * Destroy a config values iterator, along with any associated
2674  * resources.
2675  *
2676  * @param[in,out] values iterator
2677  *
2678  * @since libnotmuch 5.4 (notmuch 0.32)
2679  */
2680 void
2681 notmuch_config_values_destroy (notmuch_config_values_t *values);
2682
2683
2684 /**
2685  * Returns an iterator for a (key, value) configuration pairs
2686  *
2687  * @param[in] notmuch database
2688  * @param[in] prefix prefix for keys. Pass "" for all keys.
2689  *
2690  * @since libnotmuch 5.4 (notmuch 0.32)
2691  *
2692  * @retval NULL in case of error.
2693  */
2694 notmuch_config_pairs_t *
2695 notmuch_config_get_pairs (notmuch_database_t *notmuch,
2696                           const char *prefix);
2697
2698 /**
2699  * Is the given 'config_pairs' iterator pointing at a valid element.
2700  *
2701  * @param[in] pairs iterator
2702  *
2703  * @since libnotmuch 5.4 (notmuch 0.32)
2704  *
2705  * @retval FALSE if passed a NULL pointer, or the iterator is exhausted.
2706  *
2707  */
2708 notmuch_bool_t
2709 notmuch_config_pairs_valid (notmuch_config_pairs_t *pairs);
2710
2711 /**
2712  * Move the 'config_pairs' iterator to the next element
2713  *
2714  * @param[in,out] pairs iterator
2715  *
2716  * @since libnotmuch 5.4 (notmuch 0.32)
2717  *
2718  */
2719 void
2720 notmuch_config_pairs_move_to_next (notmuch_config_pairs_t *pairs);
2721
2722 /**
2723  * Get the current key from the 'config_pairs' iterator
2724  *
2725  * @param[in] pairs iterator
2726  *
2727  * @since libnotmuch 5.4 (notmuch 0.32)
2728  *
2729  * @retval a string with the same lifetime as the iterator
2730  */
2731 const char *
2732 notmuch_config_pairs_key (notmuch_config_pairs_t *pairs);
2733
2734 /**
2735  * Get the current value from the 'config_pairs' iterator
2736  *
2737  * @param[in] pairs iterator
2738  *
2739  * @since libnotmuch 5.4 (notmuch 0.32)
2740  *
2741  * @retval a string with the same lifetime as the iterator
2742  */
2743 const char *
2744 notmuch_config_pairs_value (notmuch_config_pairs_t *pairs);
2745
2746 /**
2747  * Destroy a config_pairs iterator, along with any associated
2748  * resources.
2749  *
2750  * @param[in,out] pairs iterator
2751  *
2752  * @since libnotmuch 5.4 (notmuch 0.32)
2753  */
2754 void
2755 notmuch_config_pairs_destroy (notmuch_config_pairs_t *pairs);
2756
2757 /**
2758  * get a configuration value from an open database as Boolean
2759  *
2760  * This value reflects all configuration information given at the time
2761  * the database was opened.
2762  *
2763  * @param[in] notmuch database
2764  * @param[in] key configuration key
2765  * @param[out] val configuration value, converted to Boolean
2766  *
2767  * @since libnotmuch 5.4 (notmuch 0.32)
2768  *
2769  * @retval #NOTMUCH_STATUS_ILLEGAL_ARGUMENT if either key is unknown
2770  * or the corresponding value does not convert to Boolean.
2771  */
2772 notmuch_status_t
2773 notmuch_config_get_bool (notmuch_database_t *notmuch,
2774                          notmuch_config_key_t key,
2775                          notmuch_bool_t *val);
2776
2777 /**
2778  * return the path of the config file loaded, if any
2779  *
2780  * @retval NULL if no config file was loaded
2781  */
2782 const char *
2783 notmuch_config_path (notmuch_database_t *notmuch);
2784
2785 /**
2786  * get the current default indexing options for a given database.
2787  *
2788  * This object will survive until the database itself is destroyed,
2789  * but the caller may also release it earlier with
2790  * notmuch_indexopts_destroy.
2791  *
2792  * This object represents a set of options on how a message can be
2793  * added to the index.  At the moment it is a featureless stub.
2794  *
2795  * @since libnotmuch 5.1 (notmuch 0.26)
2796  * @retval NULL in case of error
2797  */
2798 notmuch_indexopts_t *
2799 notmuch_database_get_default_indexopts (notmuch_database_t *db);
2800
2801 /**
2802  * Stating a policy about how to decrypt messages.
2803  *
2804  * See index.decrypt in notmuch-config(1) for more details.
2805  */
2806 typedef enum {
2807     NOTMUCH_DECRYPT_FALSE,
2808     NOTMUCH_DECRYPT_TRUE,
2809     NOTMUCH_DECRYPT_AUTO,
2810     NOTMUCH_DECRYPT_NOSTASH,
2811 } notmuch_decryption_policy_t;
2812
2813 /**
2814  * Specify whether to decrypt encrypted parts while indexing.
2815  *
2816  * Be aware that the index is likely sufficient to reconstruct the
2817  * cleartext of the message itself, so please ensure that the notmuch
2818  * message index is adequately protected. DO NOT SET THIS FLAG TO TRUE
2819  * without considering the security of your index.
2820  *
2821  * @since libnotmuch 5.1 (notmuch 0.26)
2822  */
2823 notmuch_status_t
2824 notmuch_indexopts_set_decrypt_policy (notmuch_indexopts_t *indexopts,
2825                                       notmuch_decryption_policy_t decrypt_policy);
2826
2827 /**
2828  * Return whether to decrypt encrypted parts while indexing.
2829  * see notmuch_indexopts_set_decrypt_policy.
2830  *
2831  * @since libnotmuch 5.1 (notmuch 0.26)
2832  */
2833 notmuch_decryption_policy_t
2834 notmuch_indexopts_get_decrypt_policy (const notmuch_indexopts_t *indexopts);
2835
2836 /**
2837  * Destroy a notmuch_indexopts_t object.
2838  *
2839  * @since libnotmuch 5.1 (notmuch 0.26)
2840  */
2841 void
2842 notmuch_indexopts_destroy (notmuch_indexopts_t *options);
2843
2844
2845 /**
2846  * interrogate the library for compile time features
2847  *
2848  * @since libnotmuch 4.4 (notmuch 0.23)
2849  */
2850 notmuch_bool_t
2851 notmuch_built_with (const char *name);
2852 /**@}*/
2853
2854 #pragma GCC visibility pop
2855
2856 NOTMUCH_END_DECLS
2857
2858 #endif