notmuch(3)
๐ NAME ๐
okay so welcome to notmuch(3), the Library Functions Manual bestie for the notmuch library. notmuch is The notmuch API โ literally that. The iconic tagline? "Not much of an email library, (just index and search)." periodt. ๐
๐งพ SYNOPSIS ๐งพ
This is the top-of-page vibe check: the macros, typedefs, and enumerations that make up the notmuch API surface. Keep the names, values, and spellings exactly as they are โ no creative edits, bestie. ๐
โจ Macros โจ
LIBNOTMUCH_CHECK_VERSION(major, minor, micro)โ checks the version of the notmuch library you're compiling against. Compile-time compatibility check, iykyk. Exact declaration:
#define LIBNOTMUCH_CHECK_VERSION(major, minor, micro)
NOTMUCH_TAG_MAXโ the longest possible tag value. This is the tag-length ceiling, fr fr. Exact declaration:
#define NOTMUCH_TAG_MAX 200
๐ฆ Typedefs ๐ฆ
notmuch_bool_tโ the notmuch boolean type. Exact typedef:
typedef int notmuch_bool_t
notmuch_compact_status_cb_tโ a callback invoked bynotmuch_database_compactto notify the user of the progress of the compaction process. Exact typedef:
typedef void(* notmuch_compact_status_cb_t) (const char *message, void *closure)
๐ Enumerations ๐
These enums are the status codes, modes, sort values, flags, config keys, and crypto-policy choices. All values stay exactly as written. ๐
notmuch_status_tโ status codes used for the return values of most functions. If a call has something to say, this is how it says it. Exact enum:
enum notmuch_status_t { NOTMUCH_STATUS_SUCCESS = 0,
NOTMUCH_STATUS_OUT_OF_MEMORY, NOTMUCH_STATUS_READ_ONLY_DATABASE,
NOTMUCH_STATUS_XAPIAN_EXCEPTION, NOTMUCH_STATUS_FILE_ERROR,
NOTMUCH_STATUS_FILE_NOT_EMAIL, NOTMUCH_STATUS_DUPLICATE_MESSAGE_ID,
NOTMUCH_STATUS_NULL_POINTER, NOTMUCH_STATUS_TAG_TOO_LONG,
NOTMUCH_STATUS_UNBALANCED_FREEZE_THAW,
NOTMUCH_STATUS_UNBALANCED_ATOMIC,
NOTMUCH_STATUS_UNSUPPORTED_OPERATION,
NOTMUCH_STATUS_UPGRADE_REQUIRED, NOTMUCH_STATUS_PATH_ERROR,
NOTMUCH_STATUS_IGNORED, NOTMUCH_STATUS_ILLEGAL_ARGUMENT,
NOTMUCH_STATUS_MALFORMED_CRYPTO_PROTOCOL,
NOTMUCH_STATUS_FAILED_CRYPTO_CONTEXT_CREATION,
NOTMUCH_STATUS_UNKNOWN_CRYPTO_PROTOCOL, NOTMUCH_STATUS_NO_CONFIG,
NOTMUCH_STATUS_NO_DATABASE, NOTMUCH_STATUS_DATABASE_EXISTS,
NOTMUCH_STATUS_BAD_QUERY_SYNTAX, NOTMUCH_STATUS_NO_MAIL_ROOT,
NOTMUCH_STATUS_CLOSED_DATABASE, NOTMUCH_STATUS_ITERATOR_EXHAUSTED,
NOTMUCH_STATUS_OPERATION_INVALIDATED, NOTMUCH_STATUS_LAST_STATUS }
notmuch_database_mode_tโ database open mode fornotmuch_database_open. Exact enum:
enum notmuch_database_mode_t { NOTMUCH_DATABASE_MODE_READ_ONLY = 0,
NOTMUCH_DATABASE_MODE_READ_WRITE }
notmuch_query_syntax_tโ query syntax enum. The original gives these values and no extra description, so here they are, untouched. Exact enum:
enum notmuch_query_syntax_t { NOTMUCH_QUERY_SYNTAX_XAPIAN,
NOTMUCH_QUERY_SYNTAX_SEXP }
notmuch_sort_tโ sort values fornotmuch_query_set_sort. Exact enum:
enum notmuch_sort_t { NOTMUCH_SORT_OLDEST_FIRST,
NOTMUCH_SORT_NEWEST_FIRST, NOTMUCH_SORT_MESSAGE_ID,
NOTMUCH_SORT_UNSORTED }
notmuch_exclude_tโ exclude values fornotmuch_query_set_omit_excluded. Exact enum:
enum notmuch_exclude_t { NOTMUCH_EXCLUDE_FLAG, NOTMUCH_EXCLUDE_TRUE,
NOTMUCH_EXCLUDE_FALSE, NOTMUCH_EXCLUDE_ALL }
notmuch_message_flag_tโ message flags. Exact enum:
enum notmuch_message_flag_t { NOTMUCH_MESSAGE_FLAG_MATCH,
NOTMUCH_MESSAGE_FLAG_EXCLUDED, NOTMUCH_MESSAGE_FLAG_GHOST }
notmuch_config_key_tโ configuration keys known to libnotmuch. Exact enum:
enum notmuch_config_key_t { NOTMUCH_CONFIG_FIRST,
NOTMUCH_CONFIG_DATABASE_PATH = NOTMUCH_CONFIG_FIRST,
NOTMUCH_CONFIG_MAIL_ROOT, NOTMUCH_CONFIG_HOOK_DIR,
NOTMUCH_CONFIG_BACKUP_DIR, NOTMUCH_CONFIG_EXCLUDE_TAGS,
NOTMUCH_CONFIG_NEW_TAGS, NOTMUCH_CONFIG_NEW_IGNORE,
NOTMUCH_CONFIG_SYNC_MAILDIR_FLAGS, NOTMUCH_CONFIG_PRIMARY_EMAIL,
NOTMUCH_CONFIG_OTHER_EMAIL, NOTMUCH_CONFIG_USER_NAME,
NOTMUCH_CONFIG_AUTOCOMMIT, NOTMUCH_CONFIG_EXTRA_HEADERS,
NOTMUCH_CONFIG_INDEX_AS_TEXT, NOTMUCH_CONFIG_AUTHORS_SEPARATOR,
NOTMUCH_CONFIG_AUTHORS_MATCHED_SEPARATOR, NOTMUCH_CONFIG_LAST }
notmuch_decryption_policy_tโ stating a policy about how to decrypt messages. Exact enum:
enum notmuch_decryption_policy_t { NOTMUCH_DECRYPT_FALSE,
NOTMUCH_DECRYPT_TRUE, NOTMUCH_DECRYPT_AUTO, NOTMUCH_DECRYPT_NOSTASH
}
โจ Functions โจ
Okay bestie, this is the motherlode โ every single function in the C API, in order, nothing skipped. Buckle up, hydrate, and let's go ๐
const char * notmuch_status_to_string (notmuch_status_t status)โ hands you a string version of anotmuch_status_tvalue. So when something returns a status code you can actually read it like a human instead of squinting at an int ๐notmuch_status_t notmuch_database_create (const char *path, notmuch_database_t **database)โ creates a brand-new, empty notmuch database living at path. Fresh start energy โจnotmuch_status_t notmuch_database_create_verbose (const char *path, notmuch_database_t **database, char **error_message)โ literallynotmuch_database_create, except it optionally hands back an error message too. Same vibe, more receipts ๐ซถnotmuch_status_t notmuch_database_open (const char *path, notmuch_database_mode_t mode, notmuch_database_t **database)โ deprecated alias fornotmuch_database_open_with_configwithconfig_path="anderror_message=NULL. It's giving "still works, but go use the new one" ๐notmuch_status_t notmuch_database_open_verbose (const char *path, notmuch_database_mode_t mode, notmuch_database_t **database, char **error_message)โ deprecated alias fornotmuch_database_open_with_configwithconfig_path=". Same deal, move along, nothing new here ๐notmuch_status_t notmuch_database_open_with_config (const char *database_path, notmuch_database_mode_t mode, const char *config_path, const char *profile, notmuch_database_t **database, char **error_message)โ opens an existing notmuch database at database_path, pulling its configuration from config_path. The main character of openers ๐notmuch_status_t notmuch_database_load_config (const char *database_path, const char *config_path, const char *profile, notmuch_database_t **database, char **error_message)โ loads configuration from the config file, the database, and/or the defaults. A little bit of everything, a pick-and-mix ๐notmuch_status_t notmuch_database_create_with_config (const char *database_path, const char *config_path, const char *profile, notmuch_database_t **database, char **error_message)โ creates a new notmuch database at database_path, using the configuration in config_path. Creation, but make it config-aware โจconst char * notmuch_database_status_string (const notmuch_database_t *notmuch)โ retrieves the last status string for the given database. The receipts from last time ๐notmuch_status_t notmuch_database_close (notmuch_database_t *database)โ commits changes and closes the given notmuch database. Say bye, but save your work first ๐พnotmuch_status_t notmuch_database_compact (const char *path, const char *backup_path, notmuch_compact_status_cb_t status_cb, void *closure)โ compacts a notmuch database, backing the original up to the given backup_path. Glow-up for your db, with a safety copy ๐notmuch_status_t notmuch_database_compact_db (notmuch_database_t *database, const char *backup_path, notmuch_compact_status_cb_t status_cb, void *closure)โ just likenotmuch_database_compact, but it takes an already-open database as its parameter instead of a path ๐ฆnotmuch_status_t notmuch_database_destroy (notmuch_database_t *database)โ destroys the notmuch database, closing it if that's still necessary, and frees all the associated resources. Cleanup queen โ free everything, leave no crumbs ๐ธconst char * notmuch_database_get_path (notmuch_database_t *database)โ returns the database path of the given database. Where does it live? Right here ๐unsigned int notmuch_database_get_version (notmuch_database_t *database)โ returns the database format version of the given database. Version check, but for the db ๐งnotmuch_bool_t notmuch_database_needs_upgrade (notmuch_database_t *database)โ can the database be upgraded to a newer database version? A yes/no vibe check on whether it's time ๐notmuch_status_t notmuch_database_upgrade (notmuch_database_t *database, void(*progress_notify)(void *closure, double progress), void *closure)โ upgrades the current database to the latest supported version. You even get aprogress_notifycallback so you can watch the progress happen โ obsessed ๐ฅnotmuch_status_t notmuch_database_begin_atomic (notmuch_database_t *notmuch)โ begins an atomic database operation. All-or-nothing, iykyk โญnotmuch_status_t notmuch_database_end_atomic (notmuch_database_t *notmuch)โ signals the end of an atomic database operation. Bookend to the one above ๐ซถunsigned long notmuch_database_get_revision (notmuch_database_t *notmuch, const char **uuid)โ returns the committed database revision and the UUID. Two-for-one, we love to see it ๐notmuch_status_t notmuch_database_get_directory (notmuch_database_t *database, const char *path, notmuch_directory_t **directory)โ retrieves a directory object from the database for path. Directory era ๐notmuch_status_t notmuch_database_index_file (notmuch_database_t *database, const char *filename, notmuch_indexopts_t *indexopts, notmuch_message_t **message)โ adds a message file to a database and indexes it so future searches can actually find it. This is the whole point of the thing, no cap ๐notmuch_status_t notmuch_database_add_message (notmuch_database_t *database, const char *filename, notmuch_message_t **message)โ deprecated alias fornotmuch_database_index_filecalled withNULLindexopts. The old faithful, on its way out ๐notmuch_status_t notmuch_database_remove_message (notmuch_database_t *database, const char *filename)โ removes a message filename from the given notmuch database. Exit, stage left ๐notmuch_status_t notmuch_database_find_message (notmuch_database_t *database, const char *message_id, notmuch_message_t **message)โ finds a message with the given message_id. ID in, message out ๐notmuch_status_t notmuch_database_find_message_by_filename (notmuch_database_t *notmuch, const char *filename, notmuch_message_t **message)โ finds a message with the given filename. Same hunt, different clue ๐ต๏ธnotmuch_tags_t * notmuch_database_get_all_tags (notmuch_database_t *db)โ returns a list of every tag found in the database. All the tags, every last one ๐notmuch_status_t notmuch_database_reopen (notmuch_database_t *db, notmuch_database_mode_t mode)โ reopens an already-open notmuch database. Close the loop, reopen the vibe ๐
โจ Query era โจ
notmuch_query_t * notmuch_query_create (notmuch_database_t *database, const char *query_string)โ creates a new query for database. Your search starts here ๐notmuch_status_t notmuch_query_create_with_syntax (notmuch_database_t *database, const char *query_string, notmuch_query_syntax_t syntax, notmuch_query_t **output)โ the source page gives this one no little description at all, bestie. Iconic mysterious behaviour, but that's genuinely all it says ๐const char * notmuch_query_get_query_string (const notmuch_query_t *query)โ returns thequery_stringof this query. What did we even search for? Here's the receipt ๐notmuch_database_t * notmuch_query_get_database (const notmuch_query_t *query)โ returns the notmuch database of this query. Every query knows where it came from ๐ซถvoid notmuch_query_set_omit_excluded (notmuch_query_t *query, notmuch_exclude_t omit_excluded)โ says whether to omit excluded results entirely or simply flag them. Your call, babe ๐void notmuch_query_set_sort (notmuch_query_t *query, notmuch_sort_t sort)โ specifies the sorting you want for this query. Aesthetic order matters โจnotmuch_sort_t notmuch_query_get_sort (const notmuch_query_t *query)โ returns the sort specified for this query. What order are we in again? ๐ธnotmuch_status_t notmuch_query_add_tag_exclude (notmuch_query_t *query, const char *tag)โ adds a tag that'll be excluded from the query results by default. Not invited to the party ๐ซnotmuch_status_t notmuch_query_search_threads (notmuch_query_t *query, notmuch_threads_t **out)โ executes a query for threads and returns anotmuch_threads_tobject you can use to iterate over the results. Threads, iterated, immaculate ๐งตnotmuch_status_t notmuch_query_search_threads_st (notmuch_query_t *query, notmuch_threads_t **out)โ deprecated alias fornotmuch_query_search_threads. The_stera is cooked ๐notmuch_status_t notmuch_query_search_messages (notmuch_query_t *query, notmuch_messages_t **out)โ executes a query for messages and returns anotmuch_messages_tobject you can iterate over. Same energy, message flavoured โ๏ธnotmuch_status_t notmuch_query_search_messages_st (notmuch_query_t *query, notmuch_messages_t **out)โ deprecated alias fornotmuch_query_search_messages. Bye bestie ๐void notmuch_query_destroy (notmuch_query_t *query)โ destroys anotmuch_query_talong with any associated resources. Clean up after yourself, always ๐
โจ Iterating threads โจ
notmuch_bool_t notmuch_threads_valid (notmuch_threads_t *threads)โ is the given threads iterator pointing at a valid thread? Yes/no, vibe check โnotmuch_status_t notmuch_threads_status (notmuch_threads_t *threads)โ gets the status of the given threads iterator. How's it doing? ๐ซnotmuch_thread_t * notmuch_threads_get (notmuch_threads_t *threads)โ gets the current thread from threads as anotmuch_thread_t. Grab it ๐ซณvoid notmuch_threads_move_to_next (notmuch_threads_t *threads)โ moves the threads iterator to the next thread. Next ๐void notmuch_threads_destroy (notmuch_threads_t *threads)โ destroys anotmuch_threads_tobject. Free it and go ๐
โจ Counting things โจ
notmuch_status_t notmuch_query_count_messages (notmuch_query_t *query, unsigned int *count)โ returns the number of messages matching a search. Numbers, but make it mail ๐ขnotmuch_status_t notmuch_query_count_messages_st (notmuch_query_t *query, unsigned int *count)โ deprecated alias fornotmuch_query_count_messages. The_stcurse strikes again ๐notmuch_status_t notmuch_query_count_threads (notmuch_query_t *query, unsigned *count)โ returns the number of threads matching a search. Thread tally, slay ๐งตnotmuch_status_t notmuch_query_count_threads_st (notmuch_query_t *query, unsigned *count)โ deprecated alias fornotmuch_query_count_threads. Same old story ๐
โจ All about a thread โจ
const char * notmuch_thread_get_thread_id (notmuch_thread_t *thread)โ gets the thread ID of thread. Its name tag ๐int notmuch_thread_get_total_messages (notmuch_thread_t *thread)โ gets the total number of messages in thread. The whole count ๐int notmuch_thread_get_total_files (notmuch_thread_t *thread)โ gets the total number of files in thread. Files counted too, we don't forget ๐๏ธnotmuch_messages_t * notmuch_thread_get_toplevel_messages (notmuch_thread_t *thread)โ gets anotmuch_messages_titerator for the top-level messages in thread, in oldest-first order. Top level only, and the oldest goes first โณnotmuch_messages_t * notmuch_thread_get_messages (notmuch_thread_t *thread)โ gets anotmuch_thread_titerator for all the messages in thread, in oldest-first order. (Yep, that's genuinely what the page says โnotmuch_thread_titerator, that's the wording, not me โจ) All the messages, oldest-first ๐ธint notmuch_thread_get_matched_messages (notmuch_thread_t *thread)โ gets the number of messages in thread that matched the search. Only the ones that made the cut ๐const char * notmuch_thread_get_authors (notmuch_thread_t *thread)โ gets the authors of thread as a UTF-8 string. Who's in the group chat ๐ฅconst char * notmuch_thread_get_subject (notmuch_thread_t *thread)โ gets the subject of thread as a UTF-8 string. The subject line, decoded and gorgeous ๐time_t notmuch_thread_get_oldest_date (notmuch_thread_t *thread)โ gets the date of the oldest message in thread as atime_tvalue. Ancient history โฐtime_t notmuch_thread_get_newest_date (notmuch_thread_t *thread)โ gets the date of the newest message in thread as atime_tvalue. Fresh off the wire โจnotmuch_tags_t * notmuch_thread_get_tags (notmuch_thread_t *thread)โ gets the tags for thread, returning anotmuch_tags_tobject you can use to iterate over all of them. Tag haul ๐ท๏ธvoid notmuch_thread_destroy (notmuch_thread_t *thread)โ destroys anotmuch_thread_tobject. Release the thread ๐ฆ
โจ Iterating messages โจ
notmuch_bool_t notmuch_messages_valid (notmuch_messages_t *messages)โ is the given messages iterator pointing at a valid message? Another vibe check โnotmuch_status_t notmuch_messages_status (notmuch_messages_t *messages)โ gets the status of the given messages iterator. Status report incoming ๐notmuch_message_t * notmuch_messages_get (notmuch_messages_t *messages)โ gets the current message from messages as anotmuch_message_t. Grab the message ๐ซณvoid notmuch_messages_move_to_next (notmuch_messages_t *messages)โ moves the messages iterator to the next message. Onward ๐ซvoid notmuch_messages_destroy (notmuch_messages_t *messages)โ bestie, when you're done with anotmuch_messages_tobject, this is the lil cleanup crew that destroys it. bye bye memory leak ๐notmuch_tags_t * notmuch_messages_collect_tags (notmuch_messages_t *messages)โ scoops up a list of tags from all the messages, like collecting every sticker from every notebook and putting them in one pile โจnotmuch_database_t * notmuch_message_get_database (const notmuch_message_t *message)โ hands you the database that this message is living in ๐const char * notmuch_message_get_message_id (notmuch_message_t *message)โ the message ID of message, served fresh ๐const char * notmuch_message_get_thread_id (notmuch_message_t *message)โ the thread ID of message, so you know which convo it belongs to ๐งตnotmuch_messages_t * notmuch_message_get_replies (notmuch_message_t *message)โ gives you anotmuch_messages_titerator over all the replies to message. the whole group chat under one text, basically ๐ฌint notmuch_message_count_files (notmuch_message_t *message)โ how many files are associated with a message, total. yes it counts for you, we love a math moment ๐ขconst char * notmuch_message_get_filename (notmuch_message_t *message)โ gets a filename for the email matching message (just one, not the whole set) ๐notmuch_filenames_t * notmuch_message_get_filenames (notmuch_message_t *message)โ and this one gets all the filenames for the email matching message. the full collection ๐๏ธnotmuch_status_t notmuch_message_reindex (notmuch_message_t *message, notmuch_indexopts_t *indexopts)โ re-indexes the e-mail for message using the index options you supply. glow-up era for that message ๐notmuch_bool_t notmuch_message_get_flag (notmuch_message_t *message, notmuch_message_flag_t flag)โ peeks at the value of a flag for the email matching message ๐ฉnotmuch_status_t notmuch_message_get_flag_st (notmuch_message_t *message, notmuch_message_flag_t flag, notmuch_bool_t *is_set)โ same mission, flag value for the email matching message, but status-flavoured ๐ฉโจvoid notmuch_message_set_flag (notmuch_message_t *message, notmuch_message_flag_t flag, notmuch_bool_t value)โ sets a flag value for the email matching message. you pick the flag, you pick the value ๐time_t notmuch_message_get_date (notmuch_message_t *message)โ the date of message as atime_tvalue. timestamped ๐ฐ๏ธconst char * notmuch_message_get_header (notmuch_message_t *message, const char *header)โ grabs the value of whichever header you asked for from message, returned as a UTF-8 string ๐notmuch_tags_t * notmuch_message_get_tags (notmuch_message_t *message)โ the tags for message, handed back as anotmuch_tags_tobject that you can iterate over to see all of them ๐ท๏ธnotmuch_status_t notmuch_message_add_tag (notmuch_message_t *message, const char *tag)โ slaps a tag onto the given message ๐notmuch_status_t notmuch_message_remove_tag (notmuch_message_t *message, const char *tag)โ takes that tag back off the given message. we're un-labeling ๐notmuch_status_t notmuch_message_remove_all_tags (notmuch_message_t *message)โ nukes every tag from the given message. clean slate, no cap ๐งนnotmuch_status_t notmuch_message_maildir_flags_to_tags (notmuch_message_t *message)โ adds/removes tags based on the maildir flags sitting in the message's filename(s) ๐notmuch_bool_t notmuch_message_has_maildir_flag (notmuch_message_t *message, char flag)โ returnsTRUEif any filename of message has maildir flag flag, andFALSEotherwise โnotmuch_status_t notmuch_message_has_maildir_flag_st (notmuch_message_t *message, char flag, notmuch_bool_t *is_set)โ checks the message for maildir flag flag, status-style ๐ต๏ธnotmuch_status_t notmuch_message_tags_to_maildir_flags (notmuch_message_t *message)โ renames the message filename(s) so the tags get encoded as maildir flags. tags โ filenames, the remix ๐notmuch_status_t notmuch_message_freeze (notmuch_message_t *message)โ freezes the current state of message inside the database โ๏ธnotmuch_status_t notmuch_message_thaw (notmuch_message_t *message)โ thaws the frozen message, syncing up any changes that happened while it was frozen into the notmuch database ๐void notmuch_message_destroy (notmuch_message_t *message)โ destroys anotmuch_message_tobject. bye bestie ๐ซถ
notmuch_bool_t notmuch_tags_valid (notmuch_tags_t *tags)โ is this tags iterator pointing at a valid tag? yes/no moment ๐คconst char * notmuch_tags_get (notmuch_tags_t *tags)โ the current tag from tags, as a string ๐void notmuch_tags_move_to_next (notmuch_tags_t *tags)โ nudges the tags iterator along to the next tag โก๏ธvoid notmuch_tags_destroy (notmuch_tags_t *tags)โ destroys anotmuch_tags_tobject โจ
notmuch_status_t notmuch_directory_set_mtime (notmuch_directory_t *directory, time_t mtime)โ stores an mtime in the database for directory ๐ฐ๏ธtime_t notmuch_directory_get_mtime (notmuch_directory_t *directory)โ gets the mtime of a directory, as previously stored withnotmuch_directory_set_mtime. look at us, remembering things ๐ญnotmuch_filenames_t * notmuch_directory_get_child_files (notmuch_directory_t *directory)โ anotmuch_filenames_titerator listing all the filenames of messages in the database inside the given directory ๐notmuch_filenames_t * notmuch_directory_get_child_directories (notmuch_directory_t *directory)โ same energy, but it lists all the filenames of sub-directories in the database inside the given directory ๐ณnotmuch_status_t notmuch_directory_delete (notmuch_directory_t *directory)โ deletes the directory document from the database and destroys thenotmuch_directory_tobject. two birds, one slay ๐void notmuch_directory_destroy (notmuch_directory_t *directory)โ destroys anotmuch_directory_tobject ๐
notmuch_bool_t notmuch_filenames_valid (notmuch_filenames_t *filenames)โ is the filenames iterator pointing at a valid filename? vibe check ๐ฆconst char * notmuch_filenames_get (notmuch_filenames_t *filenames)โ the current filename from filenames, as a string ๐void notmuch_filenames_move_to_next (notmuch_filenames_t *filenames)โ moves the filenames iterator to the next filename โก๏ธvoid notmuch_filenames_destroy (notmuch_filenames_t *filenames)โ destroys anotmuch_filenames_tobject โญ
notmuch_status_t notmuch_database_set_config (notmuch_database_t *db, const char *key, const char *value)โ sets config key to value โ๏ธnotmuch_status_t notmuch_database_get_config (notmuch_database_t *db, const char *key, char **value)โ retrieves config item key and assigns it to value ๐ฅnotmuch_status_t notmuch_database_get_config_list (notmuch_database_t *db, const char *prefix, notmuch_config_list_t **out)โ creates an iterator for all config items whose keys match a given prefix ๐๏ธnotmuch_bool_t notmuch_config_list_valid (notmuch_config_list_t *config_list)โ is the config_list iterator valid (i.e. ...and yeah, the original literally drops off mid-sentence there, bestie ๐ญ that's just how the page is, I'm not making up the rest)const char * notmuch_config_list_key (notmuch_config_list_t *config_list)โ returns the key for the current config pair ๐const char * notmuch_config_list_value (notmuch_config_list_t *config_list)โ returns the value for the current config pair ๐ซvoid notmuch_config_list_move_to_next (notmuch_config_list_t *config_list)โ moves the config_list iterator to the next pair โก๏ธvoid notmuch_config_list_destroy (notmuch_config_list_t *config_list)โ frees any resources held by config_list ๐งน
const char * notmuch_config_get (notmuch_database_t *notmuch, notmuch_config_key_t key)โ gets a configuration value from an open database ๐notmuch_status_t notmuch_config_set (notmuch_database_t *notmuch, notmuch_config_key_t key, const char *val)โ sets a configuration value in an open database โ๏ธnotmuch_config_values_t * notmuch_config_get_values (notmuch_database_t *notmuch, notmuch_config_key_t key)โ returns an iterator for a';'-delimited list of configuration values ๐notmuch_config_values_t * notmuch_config_get_values_string (notmuch_database_t *notmuch, const char *key)โ same thing, iterator for a';'-delimited list of configuration values, but you pass the key as a string ๐งตnotmuch_bool_t notmuch_config_values_valid (notmuch_config_values_t *values)โ is the given config_values iterator pointing at a valid element? ๐const char * notmuch_config_values_get (notmuch_config_values_t *values)โ gets the current value from the values iterator ๐void notmuch_config_values_move_to_next (notmuch_config_values_t *values)โ moves the values iterator to the next element โก๏ธvoid notmuch_config_values_start (notmuch_config_values_t *values)โ resets the values iterator back to the first element. rewind time โชvoid notmuch_config_values_destroy (notmuch_config_values_t *values)โ destroys a config values iterator, along with any associated resources ๐ซถ
notmuch_config_pairs_t * notmuch_config_get_pairs (notmuch_database_t *notmuch, const char *prefix)โ returns an iterator for (key, value) configuration pairs ๐๏ธnotmuch_bool_t notmuch_config_pairs_valid (notmuch_config_pairs_t *pairs)โ is the given config_pairs iterator pointing at a valid element? โvoid notmuch_config_pairs_move_to_next (notmuch_config_pairs_t *pairs)โ moves the config_pairs iterator to the next element โก๏ธconst char * notmuch_config_pairs_key (notmuch_config_pairs_t *pairs)โ gets the current key from the config_pairs iterator ๐const char * notmuch_config_pairs_value (notmuch_config_pairs_t *pairs)โ gets the current value from the config_pairs iterator ๐void notmuch_config_pairs_destroy (notmuch_config_pairs_t *pairs)โ destroys a config_pairs iterator, along with any associated resources ๐ง
notmuch_status_t notmuch_config_get_bool (notmuch_database_t *notmuch, notmuch_config_key_t key, notmuch_bool_t *val)โ gets a configuration value from an open database, but as a Boolean. true/false girlie ๐const char * notmuch_config_path (notmuch_database_t *notmuch)โ returns the path of the config file that got loaded, if any ๐
notmuch_indexopts_t * notmuch_database_get_default_indexopts (notmuch_database_t *db)โ gets the current default indexing options for a given database โ๏ธnotmuch_status_t notmuch_indexopts_set_decrypt_policy (notmuch_indexopts_t *indexopts, notmuch_decryption_policy_t decrypt_policy)โ specifies whether to decrypt encrypted parts while indexing ๐notmuch_decryption_policy_t notmuch_indexopts_get_decrypt_policy (const notmuch_indexopts_t *indexopts)โ returns whether to decrypt encrypted parts while indexing ๐void notmuch_indexopts_destroy (notmuch_indexopts_t *options)โ destroys anotmuch_indexopts_tobject ๐ธ
notmuch_bool_t notmuch_built_with (const char *name)โ interrogates the library about its compile-time features. putting it under the spotlight ๐ค
๐ท๏ธ Message Properties ๐ซ
Okay so this interface is the whole ~attach arbitrary (key,value) string pairs to a message~ situation โ it lets you add those pairs, remove them, and iterate over them. like lil sticky notes on a message, iykyk ๐๏ธ
โ ๏ธ heads up bestie: the caller should take some care as to what keys they add or delete values for, because other subsystems or extensions may depend on these properties. not me casually breaking someone else's extension ๐
Also, bestie, pls see notmuch-properties(7) for more details about specific properties and the conventions around their use. ๐
typedef struct _notmuch_string_map_iterator notmuch_message_properties_tโ opaque message property iterator. Itโs giving โmystery box you can walk through,โ iykyk. โจnotmuch_status_t notmuch_message_get_property (notmuch_message_t *message, const char *key, const char **value)โ retrieve the value for a single propertykey. Simple, clean, iconic.notmuch_status_t notmuch_message_add_property (notmuch_message_t *message, const char *key, const char *value)โ add a(key,value)pair to a message. Slay.notmuch_status_t notmuch_message_remove_property (notmuch_message_t *message, const char *key, const char *value)โ remove a(key,value)pair from a message. Bye bestie ๐notmuch_status_t notmuch_message_remove_all_properties (notmuch_message_t *message, const char *key)โ remove all(key,value)pairs from the given message. Full reset energy.notmuch_status_t notmuch_message_remove_all_properties_with_prefix (notmuch_message_t *message, const char *prefix)โ remove all(prefix*,value)pairs from the given message. Prefix-coded cleanup ๐notmuch_message_properties_t * notmuch_message_get_properties (notmuch_message_t *message, const char *key, notmuch_bool_t exact)โ get the properties formessage, returning anotmuch_message_properties_tobject which can be used to iterate over all properties.notmuch_status_t notmuch_message_count_properties (notmuch_message_t *message, const char *key, unsigned int *count)โ return the number of properties namedkeybelonging to the specific message.notmuch_bool_t notmuch_message_properties_valid (notmuch_message_properties_t *properties)โ is the given properties iterator pointing at a valid(key,value)pair?void notmuch_message_properties_move_to_next (notmuch_message_properties_t *properties)โ move the properties iterator to the next(key,value)pair.const char * notmuch_message_properties_key (notmuch_message_properties_t *properties)โ return the key from the current(key,value)pair.const char * notmuch_message_properties_value (notmuch_message_properties_t *properties)โ return the value from the current(key,value)pair.void notmuch_message_properties_destroy (notmuch_message_properties_t *properties)โ destroy anotmuch_message_properties_tobject. Clean up after yourself, bestie ๐ซถ
โจ Detailed Description โจ
Not much of an email library, (just index and search). Thatโs the whole vibe, no cap. ๐
๐ธ Macro Definition Documentation ๐ธ
#define LIBNOTMUCH_CHECK_VERSION( major, minor, micro)
Value:
(LIBNOTMUCH_MAJOR_VERSION > (major) || \
(LIBNOTMUCH_MAJOR_VERSION == (major) && LIBNOTMUCH_MINOR_VERSION > (minor)) || \
(LIBNOTMUCH_MAJOR_VERSION == (major) && LIBNOTMUCH_MINOR_VERSION == (minor) && \
LIBNOTMUCH_MICRO_VERSION >= (micro)))
Check the version of the notmuch library being compiled against. Return true if the library being compiled against is of the specified version or above. For example:
#if LIBNOTMUCH_CHECK_VERSION(3, 1, 0)
(code requiring libnotmuch 3.1.0 or above)
#endif
LIBNOTMUCH_CHECK_VERSION has been defined since version 3.1.0; to check for versions prior to that, use:
#if !defined(NOTMUCH_CHECK_VERSION)
(code requiring libnotmuch prior to 3.1.0)
#endif
๐ฆ Enumeration Type Documentation ๐ฆ
enum notmuch_status_t
Status codes used for the return values of most functions. A zero value (NOTMUCH_STATUS_SUCCESS) indicates that the function completed without error. Any other value indicates an error.
The lineup ๐ :
NOTMUCH_STATUS_SUCCESSโ no error occurred.NOTMUCH_STATUS_OUT_OF_MEMORYโ out of memory.NOTMUCH_STATUS_READ_ONLY_DATABASEโ an attempt was made to write to a database opened in read-only mode.NOTMUCH_STATUS_XAPIAN_EXCEPTIONโ a Xapian exception occurred.NOTMUCH_STATUS_FILE_ERRORโ an error occurred trying to read or write to a file (this could be file not found, permission denied, etc.).NOTMUCH_STATUS_FILE_NOT_EMAILโ a file was presented that doesnโt appear to be an email message.NOTMUCH_STATUS_DUPLICATE_MESSAGE_IDโ a file contains a message ID that is identical to a message already in the database.NOTMUCH_STATUS_NULL_POINTERโ the user erroneously passed aNULLpointer to a notmuch function.NOTMUCH_STATUS_TAG_TOO_LONGโ a tag value is too long (exceedsNOTMUCH_TAG_MAX).NOTMUCH_STATUS_UNBALANCED_FREEZE_THAWโ thenotmuch_message_thawfunction has been called more times thannotmuch_message_freeze.NOTMUCH_STATUS_UNBALANCED_ATOMICโnotmuch_database_end_atomichas been called more times thannotmuch_database_begin_atomic.NOTMUCH_STATUS_UNSUPPORTED_OPERATIONโ the operation is not supported.NOTMUCH_STATUS_UPGRADE_REQUIREDโ the operation requires a database upgrade.NOTMUCH_STATUS_PATH_ERRORโ there is a problem with the proposed path, e.g. a relative path passed to a function expecting an absolute path.NOTMUCH_STATUS_IGNOREDโ the requested operation was ignored. Depending on the function, this may not be an actual error.NOTMUCH_STATUS_ILLEGAL_ARGUMENTโ one of the arguments violates the preconditions for the function, in a way not covered by a more specific argument.NOTMUCH_STATUS_MALFORMED_CRYPTO_PROTOCOLโ a MIME object claimed to have cryptographic protection which notmuch tried to handle, but the protocol was not specified in an intelligible way.NOTMUCH_STATUS_FAILED_CRYPTO_CONTEXT_CREATIONโ notmuch attempted to do crypto processing, but could not initialize the engine needed to do so.NOTMUCH_STATUS_UNKNOWN_CRYPTO_PROTOCOLโ a MIME object claimed to have cryptographic protection, and notmuch attempted to process it, but the specific protocol was something that notmuch doesnโt know how to handle.NOTMUCH_STATUS_NO_CONFIGโ unable to load a config file.NOTMUCH_STATUS_NO_DATABASEโ unable to load a database.NOTMUCH_STATUS_DATABASE_EXISTSโ database exists, so not (re)-created.NOTMUCH_STATUS_BAD_QUERY_SYNTAXโ syntax error in query.NOTMUCH_STATUS_NO_MAIL_ROOTโ no mail root could be deduced from parameters and environment.NOTMUCH_STATUS_CLOSED_DATABASEโ database is not fully opened, or has been closed.NOTMUCH_STATUS_ITERATOR_EXHAUSTEDโ the iterator being examined has been exhausted and contains no more items.NOTMUCH_STATUS_OPERATION_INVALIDATEDโ an operation that was being performed on the database has been invalidated while in progress, and must be re-executed. This will typically happen while iterating over query results and the underlying Xapian database is modified by another process so that the currently open version cannot be read anymore.NOTMUCH_STATUS_LAST_STATUSโ not an actual status value. Just a way to find out how many valid status values there are.
enum notmuch_database_mode_t
Database open mode for notmuch_database_open.
NOTMUCH_DATABASE_MODE_READ_ONLYโ open database for reading only.NOTMUCH_DATABASE_MODE_READ_WRITEโ open database for reading and writing.
enum notmuch_sort_t
Sort values for notmuch_query_set_sort.
NOTMUCH_SORT_OLDEST_FIRSTโ oldest first.NOTMUCH_SORT_NEWEST_FIRSTโ newest first.NOTMUCH_SORT_MESSAGE_IDโ sort by message-id.NOTMUCH_SORT_UNSORTEDโ do not sort.
enum notmuch_exclude_t
Exclude values for notmuch_query_set_omit_excluded. The strange order is to maintain backward compatibility: the old FALSE/TRUE options correspond to the new NOTMUCH_EXCLUDE_FLAG/NOTMUCH_EXCLUDE_TRUE options.
enum notmuch_decryption_policy_t
Stating a policy about how to decrypt messages. See index.decrypt in notmuch-config(1) for more details.
๐ Function Documentation ๐
const char * notmuch_status_to_string (notmuch_status_t status)
Get a string representation of a notmuch_status_t value. The result is read-only. Cute and to the point.
notmuch_status_t notmuch_database_create (const char * path, notmuch_database_t ** database)
Create a new, empty notmuch database located at path. The path should be a top-level directory to a collection of plain-text email messages (one message per file). This call will create a new .notmuch directory within path where notmuch will store its data.
After a successful call to notmuch_database_create, the returned database will be open so the caller should call notmuch_database_destroy when finished with it.
The database will not yet have any data in it (notmuch_database_create itself is a very cheap function). Messages contained within path can be added to the database by calling notmuch_database_index_file.
In case of any failure, this function returns an error status and sets *database to NULL (after printing an error message on stderr).
Return value ๐:
NOTMUCH_STATUS_SUCCESS: successfully created the database.NOTMUCH_STATUS_NULL_POINTER: the givenpathargument isNULL.NOTMUCH_STATUS_OUT_OF_MEMORY: out of memory.NOTMUCH_STATUS_PATH_ERROR: filename is too long.NOTMUCH_STATUS_FILE_ERROR: an error occurred trying to create the database file (such as permission denied, or file not found, etc.), or the database already exists.NOTMUCH_STATUS_XAPIAN_EXCEPTION: a Xapian exception occurred.
notmuch_status_t notmuch_database_create_verbose (const char * path, notmuch_database_t ** database, char ** error_message)
Like notmuch_database_create, except optionally return an error message. This message is allocated by malloc and should be freed by the caller. Very โyou break it, you bought itโ but make it C.
notmuch_status_t notmuch_database_open (const char * path, notmuch_database_mode_t mode, notmuch_database_t ** database)
Deprecated alias for notmuch_database_open_with_config with config_path="" and error_message=NULL.
โ ๏ธ Deprecated: deprecated as of libnotmuch 5.4 (notmuch 0.32).
notmuch_status_t notmuch_database_open_verbose (const char * path, notmuch_database_mode_t mode, notmuch_database_t ** database, char ** error_message)
Deprecated alias for notmuch_database_open_with_config with config_path="".
โ ๏ธ Deprecated: deprecated as of libnotmuch 5.4 (notmuch 0.32).
notmuch_status_t notmuch_database_open_with_config (const char * database_path, notmuch_database_mode_t mode, const char * config_path, const char * profile, notmuch_database_t ** database, char ** error_message)
Open an existing notmuch database located at database_path, using configuration in config_path.
Parameters
database_pathโ path to existing database.
...so, continuing the argument deets from where we left off ๐:
database_pathโ a notmuch database is literally just a Xapian database holding the appropriate metadata ๐๏ธ. It should've been created at some point in the past (not necessarily by this process, ngl) by callingnotmuch_database_create.
If database_path is NULL, then we use the location specified:
- in the environment variable
NOTMUCH_DATABASE, if it's non-empty - in a configuration file, located as described under
config_path - by
$XDG_DATA_HOME/notmuch/$PROFILE, whereXDG_DATA_HOMEdefaults to"$HOME/.local/share"andPROFILEis as discussed inprofile
If database_path is non-NULL but doesn't look like a Xapian database, bestie, we check for a directory .notmuch/xapian below database_path โ that's the behavior of notmuch_database_open_verbose pre-0.32, iykyk ๐.
modeโ the mode to open the database. Use one ofNOTMUCH_DATABASE_MODE_READ_WRITEorNOTMUCH_DATABASE_MODE_READ_ONLY.config_pathโ path to the config file. The config file is key-value, with mandatory sections. Seenotmuch-config(5)for more info. The key-value pair overrides the corresponding configuration data stored in the database (seenotmuch_database_get_config) ๐
If config_path is NULL, use the path specified:
- in environment variable
NOTMUCH_CONFIG, if non-empty - by
XDG_CONFIG_HOME/notmuch/, whereXDG_CONFIG_HOMEdefaults to"$HOME/.config" - by
$HOME/.notmuch-config
If config_path is "" (empty string), then do not open any configuration file. periodt.
profileโ name of the profile (the configuration/database variant). If it's non-NULL, append it to the directory / file path determined forconfig_pathanddatabase_path๐ธ.
If NULL, then use:
- environment variable
NOTMUCH_PROFILEif defined - otherwise
"default"for directories and""(empty string) for paths
databaseโ pointer to the database object. May not beNULL, no cap. The caller should callnotmuch_database_destroywhen finished with this database ๐ซถ.
In case of any failure, this function returns an error status and sets *database to NULL.
error_messageโ if non-NULL, store the error message from opening the database. Any such message is allocated bymalloc(3)and should be freed by the caller (yes, you, bestie โ free it ๐).
Return values
NOTMUCH_STATUS_SUCCESSโ successfully opened the database โจNOTMUCH_STATUS_NULL_POINTERโ the givendatabaseargument isNULLNOTMUCH_STATUS_NO_CONFIGโ no config file was found. Fatal. ๐ญNOTMUCH_STATUS_OUT_OF_MEMORYโ out of memoryNOTMUCH_STATUS_FILE_ERRORโ an error occurred trying to open the database or config file (like permission denied, or file not found, etc.), or the database version is unknownNOTMUCH_STATUS_XAPIAN_EXCEPTIONโ a Xapian exception occurred
Since
libnotmuch 5.4 (notmuch 0.32)
notmuch_status_t notmuch_database_load_config (const char * database_path, const char * config_path, const char * profile, notmuch_database_t ** database, char ** error_message)
Loads configuration from config file, database, and/or defaults ๐ . For a description of the arguments:
See also โ notmuch_database_open_with_config
For errors other than NO_DATABASE and NO_CONFIG, *database is set to NULL.
Return values
NOTMUCH_STATUS_SUCCESSโ successfully loaded configuration โจNOTMUCH_STATUS_NO_CONFIGโ no config file was loaded. Not fatal.NOTMUCH_STATUS_NO_DATABASEโ no config information was loaded from a database. Not fatal.NOTMUCH_STATUS_OUT_OF_MEMORYโ out of memoryNOTMUCH_STATUS_FILE_ERRORโ an error occurred trying to open the database or config file (such as permission denied, or file not found, etc.)NOTMUCH_STATUS_XAPIAN_EXCEPTIONโ a Xapian exception occurred
Since
libnotmuch 5.4 (notmuch 0.32)
notmuch_status_t notmuch_database_create_with_config (const char * database_path, const char * config_path, const char * profile, notmuch_database_t ** database, char ** error_message)
Creates a shiny new notmuch database located at database_path, using the configuration in config_path ๐ฆ. For a description of the arguments:
See also โ notmuch_database_open_with_config
In case of any failure, this function returns an error status and sets *database to NULL.
Return values
NOTMUCH_STATUS_SUCCESSโ successfully created the database ๐NOTMUCH_STATUS_DATABASE_EXISTSโ the database already exists, so it wasn't createdNOTMUCH_STATUS_OUT_OF_MEMORYโ out of memoryNOTMUCH_STATUS_FILE_ERRORโ an error occurred trying to open the database or config file (such as permission denied, or file not found, etc.)NOTMUCH_STATUS_XAPIAN_EXCEPTIONโ a Xapian exception occurred
Since
libnotmuch 5.4 (notmuch 0.32)
notmuch_status_t notmuch_database_close (notmuch_database_t * database)
Commits changes and closes the given notmuch database ๐ฅ. After notmuch_database_close has been called, calls to other functions on objects derived from this database may either behave as if the database had not been closed (e.g., if the required data has been cached) or may fail with a NOTMUCH_STATUS_XAPIAN_EXCEPTION. The only further operation permitted on the database itself is to call notmuch_database_destroy, and that's the tea โ.
notmuch_database_close can be called multiple times. Later calls have no effect.
For writable databases, notmuch_database_close commits all changes to disk before closing the database โ unless the caller is currently in an atomic section (there was a notmuch_database_begin_atomic without a matching notmuch_database_end_atomic). In that case, changes since the last commit are discarded ๐ญ.
See also โ notmuch_database_end_atomic for more information.
Return value:
NOTMUCH_STATUS_SUCCESS: successfully closed the database โจNOTMUCH_STATUS_XAPIAN_EXCEPTION: a Xapian exception occurred; the database has been closed but there are no guarantees the changes to the database, if any, have been flushed to disk. literally living on the edge ๐
notmuch_status_t notmuch_database_compact (const char * path, const char * backup_path, notmuch_compact_status_cb_t status_cb, void * closure)
Compacts a notmuch database, backing up the original database to the given path ๐ง. The database will be opened with NOTMUCH_DATABASE_MODE_READ_WRITE during the compaction process to ensure no writes are made.
If the optional callback function status_cb is non-NULL, it will be called with diagnostic and informational messages. The argument closure is passed verbatim to any callback invoked ๐ซถ.
notmuch_status_t notmuch_database_compact_db (notmuch_database_t * database, const char * backup_path, notmuch_compact_status_cb_t status_cb, void * closure)
Like notmuch_database_compact, but it takes an already-open database as a parameter ๐.
Since
libnnotmuch 5.4 (notmuch 0.32)
notmuch_status_t notmuch_database_destroy (notmuch_database_t * database)
Destroys the notmuch database, closing it if necessary and freeing all associated resources ๐. Return value is as in notmuch_database_close if the database was open; notmuch_database_destroy itself has no failure modes. icon behavior, honestly ๐
const char * notmuch_database_get_path (notmuch_database_t * database)
Returns the database path of the given database ๐. The return value is a string owned by notmuch, so it should not be modified nor freed by the caller โ hands off, bestie ๐.
unsigned int notmuch_database_get_version (notmuch_database_t * database)
Returns the database format version of the given database.
Return values
0on error ๐ญ
notmuch_bool_t notmuch_database_needs_upgrade (notmuch_database_t * database)
Can the database be upgraded to a newer database version? ๐ค If this function returns TRUE, then the caller may call notmuch_database_upgrade to upgrade the database. If the caller does not upgrade an out-of-date database, then some functions may fail with NOTMUCH_STATUS_UPGRADE_REQUIRED. This always returns FALSE for a read-only database, because there's literally no way to upgrade a read-only database ๐
.
Also returns FALSE if an error occurs accessing the database.
notmuch_status_t notmuch_database_upgrade (notmuch_database_t * database, void(* progress_notify )(void *closure, double progress), void * closure)
Upgrades the current database to the latest supported version ๐ฅ. This ensures that all current notmuch functionality will be available on the database. After opening a database in read-write mode, it's recommended that clients check if an upgrade is needed (notmuch_database_needs_upgrade) and, if so, upgrade with this function before making any modifications. If notmuch_database_needs_upgrade returns FALSE, this will be a no-op.
The optional progress_notify callback can be used by the caller to provide progress indication to the user โจ. If non-NULL, it will be called periodically with progress as a floating-point value in the range of [0.0 .. 1.0] indicating the progress made so far in the upgrade process. The argument closure is passed verbatim to any callback invoked.
notmuch_status_t notmuch_database_begin_atomic (notmuch_database_t * notmuch)
Begins an atomic database operation ๐ธ. Any modifications performed between a successful begin and a notmuch_database_end_atomic will be applied to the database atomically. Note that, unlike a typical database transaction, this only ensures atomicity, not durability; neither begin nor end necessarily flush modifications to disk ๐.
Atomic sections may be nested. begin_atomic and end_atomic must always be called in pairs, no cap.
Return value:
NOTMUCH_STATUS_SUCCESS: successfully entered atomic section โจNOTMUCH_STATUS_XAPIAN_EXCEPTION: a Xapian exception occurred; atomic section not entered
notmuch_status_t notmuch_database_end_atomic (notmuch_database_t * notmuch)
Indicates the end of an atomic database operation ๐ซถ. If repeated (with matching notmuch_database_begin_atomic) "database.autocommit" times, commit the transaction and all previous (non-cancelled) transactions to the database.
Return value:
NOTMUCH_STATUS_SUCCESS: successfully completed atomic section โจNOTMUCH_STATUS_XAPIAN_EXCEPTION: a Xapian exception occurred; atomic section not endedNOTMUCH_STATUS_UNBALANCED_ATOMIC: the database is not currently in an atomic section ๐ญ
unsigned long notmuch_database_get_revision (notmuch_database_t * notmuch, const char ** uuid)
Returns the committed database revision and UUID ๐. The database revision number increases monotonically with each commit to the database. Hence, all messages and message changes committed to the database (that is, visible to readers) have a last modification revision <= the committed database revision. Any messages committed in the future will be assigned a modification revision > the committed database revision โญ.
The UUID is a NUL-terminated opaque string that uniquely identifies this database. Two revision numbers are only comparable if they have the same database UUID โ like, they gotta be from the same db or the comparison is meaningless, bestie ๐
. The string uuid is owned by notmuch and should not be freed or modified by the user. Not yours, don't touch, no cap ๐ซถ.
๐ธ notmuch_status_t notmuch_database_get_directory (notmuch_database_t * database, const char * path, notmuch_directory_t ** directory)
Retrieve a directory object from the database for path. Okay so path should be a path relative to the path of database (peep notmuch_database_get_path), or else it can be an absolute path whose initial components match the path of database โจ.
If this directory object does not exist in the database, this returns NOTMUCH_STATUS_SUCCESS and sets *directory to NULL. Yes literally success with a NULL, that's the vibe ๐.
Otherwise the returned directory object is owned by the database โ and like any good nepo baby, it's only valid until notmuch_database_destroy is called ๐.
Return value:
NOTMUCH_STATUS_SUCCESS: Successfully retrieved directory.NOTMUCH_STATUS_NULL_POINTER: The givendirectoryargument isNULL.NOTMUCH_STATUS_XAPIAN_EXCEPTION: A Xapian exception occurred; directory not retrieved.NOTMUCH_STATUS_UPGRADE_REQUIRED: The caller must upgrade the database to use this function.
๐ฆ notmuch_status_t notmuch_database_index_file (notmuch_database_t * database, const char * filename, notmuch_indexopts_t * indexopts, notmuch_message_t ** message)
Add a message file to a database, indexing it so future searches can find it ๐ฅ. If a message already exists with the same message ID as the file you're giving it, their indexes get merged, and this new filename also gets associated with the existing message. Sharing is caring, ig ๐.
Here, filename should be a path relative to the path of database (see notmuch_database_get_path), or else an absolute filename with initial components that match the path of database.
The file should be a single mail message (not a multi-message mbox) that's expected to stay right where it is โ because the notmuch database will just reference the filename and will not copy the entire contents of the file. So don't move it after, bestie, the db will be looking for it ๐ญ.
If another message with the same message ID already exists in the database, rather than creating a new message, this adds the search terms from the identified file to the existing message's index, and adds filename to the list of filenames known for the message.
The indexopts parameter can be NULL (meaning: use the indexing defaults from the database), or it can be an explicit choice of indexing options that should govern the indexing of this specific filename โจ.
If message is not NULL, then on successful return (NOTMUCH_STATUS_SUCCESS or NOTMUCH_STATUS_DUPLICATE_MESSAGE_ID), *message will be initialized to a message object you can use for things like adding tags to the just-added message ๐. The user should call notmuch_message_destroy when done with the message. On any failure, *message will be set to NULL.
Return value:
NOTMUCH_STATUS_SUCCESS: Message successfully added to database.NOTMUCH_STATUS_XAPIAN_EXCEPTION: A Xapian exception occurred, message not added.NOTMUCH_STATUS_DUPLICATE_MESSAGE_ID: Message has the same message ID as another message already in the database. The new filename was successfully added to the message in the database (if not already present) and the existing message is returned.NOTMUCH_STATUS_FILE_ERROR: an error occurred trying to open the file (such as permission denied, or file not found, etc.). Nothing added to the database.NOTMUCH_STATUS_FILE_NOT_EMAIL: the contents offilenamedon't look like an email message. Nothing added to the database.NOTMUCH_STATUS_READ_ONLY_DATABASE: Database was opened in read-only mode so no message can be added.NOTMUCH_STATUS_UPGRADE_REQUIRED: The caller must upgrade the database to use this function.
Since: libnotmuch 5.1 (notmuch 0.26) ๐
๐ notmuch_status_t notmuch_database_add_message (notmuch_database_t * database, const char * filename, notmuch_message_t ** message)
Deprecated alias for notmuch_database_index_file called with NULL indexopts. It's giving "we keep it around for the old heads" ๐.
Deprecated: Deprecated as of libnotmuch 5.1 (notmuch 0.26). Please use notmuch_database_index_file instead. Like for real, use the new one.
๐ง notmuch_status_t notmuch_database_remove_message (notmuch_database_t * database, const char * filename)
Remove a message filename from the given notmuch database. If the message has no more filenames, remove the message entirely. Bye bestie ๐.
If the same message (as determined by the message ID) is still available via other filenames, then the message will persist in the database for those filenames. When the last filename is removed for a particular message, the database content for that message will be entirely removed ๐ .
Return value:
NOTMUCH_STATUS_SUCCESS: The last filename was removed and the message was removed from the database.NOTMUCH_STATUS_XAPIAN_EXCEPTION: A Xapian exception occurred, message not removed.NOTMUCH_STATUS_DUPLICATE_MESSAGE_ID: This filename was removed but the message persists in the database with at least one other filename.NOTMUCH_STATUS_READ_ONLY_DATABASE: Database was opened in read-only mode so no message can be removed.NOTMUCH_STATUS_UPGRADE_REQUIRED: The caller must upgrade the database to use this function.
๐ notmuch_status_t notmuch_database_find_message (notmuch_database_t * database, const char * message_id, notmuch_message_t ** message)
Find a message with the given message_id ๐. If a message with that message_id is found then, on successful return (NOTMUCH_STATUS_SUCCESS), *message will be initialized to a message object. The caller should call notmuch_message_destroy when done with the message.
On any failure or when the message is not found, this function initializes *message to NULL. So when NOTMUCH_STATUS_SUCCESS is returned, the caller is supposed to check *message for NULL to find out whether the message with the given message_id was actually found. Yes, success plus NULL is a whole thing here, keep up ๐ญ.
Return value:
NOTMUCH_STATUS_SUCCESS: Successful return, check*message.NOTMUCH_STATUS_NULL_POINTER: The givenmessageargument isNULLNOTMUCH_STATUS_OUT_OF_MEMORY: Out of memory, creating message objectNOTMUCH_STATUS_XAPIAN_EXCEPTION: A Xapian exception occurred
๐ notmuch_status_t notmuch_database_find_message_by_filename (notmuch_database_t * notmuch, const char * filename, notmuch_message_t ** message)
Find a message with the given filename ๐ธ. If the database contains a message with that filename then, on successful return (NOTMUCH_STATUS_SUCCESS), *message will be initialized to a message object. The caller should call notmuch_message_destroy when done with the message.
On any failure or when the message is not found, this function initializes *message to NULL. So when NOTMUCH_STATUS_SUCCESS is returned, the caller is supposed to check *message for NULL to find out whether the message with the given filename is found. Same energy as the last one, fr fr.
Return value:
NOTMUCH_STATUS_SUCCESS: Successful return, check*messageNOTMUCH_STATUS_NULL_POINTER: The givenmessageargument isNULLNOTMUCH_STATUS_OUT_OF_MEMORY: Out of memory, creating the message objectNOTMUCH_STATUS_XAPIAN_EXCEPTION: A Xapian exception occurredNOTMUCH_STATUS_UPGRADE_REQUIRED: The caller must upgrade the database to use this function.
โญ notmuch_tags_t * notmuch_database_get_all_tags (notmuch_database_t * db)
Return a list of all tags found in the database ๐ท๏ธ. This function creates a list of all tags found in the database โ and the resulting list contains all tags from all messages found in the database. The whole tag collection, iconic.
On error this function returns NULL.
๐ซถ notmuch_status_t notmuch_database_reopen (notmuch_database_t * db, notmuch_database_mode_t mode)
Reopen an open notmuch database. Like closing and reopening the group chat but the chat is a database ๐ .
Parameters:
dbโ open notmuch databasemodeโ mode (read only or read-write) for reopened database.
Return values:
NOTMUCH_STATUS_SUCCESSNOTMUCH_STATUS_ILLEGAL_ARGUMENTโ The passed database was not open.NOTMUCH_STATUS_XAPIAN_EXCEPTIONโ A Xapian exception occured
๐ฅ notmuch_query_t * notmuch_query_create (notmuch_database_t * database, const char * query_string)
Create a new query for database. Here, database should be an open database (see notmuch_database_open and notmuch_database_create) ๐
For the query string, we'll document the syntax here more completely in the future, but it's likely to be a specialized version of the general Xapian query syntax:
https://xapian.org/docs/queryparser.html
As a special case, passing either a length-zero string, (that is ""), or a string consisting of a single asterisk (that is "*"), will result in a query that returns all messages in the database. Match-all slay โจ.
See notmuch_query_set_sort for controlling the order of results. See notmuch_query_search_messages and notmuch_query_search_threads to actually execute the query. Those are the main characters that do the actual work ๐.
User should call notmuch_query_destroy when finished with this query.
Will return NULL if insufficient memory is available.
๐ฆ const char * notmuch_query_get_query_string (const notmuch_query_t * query)
Return the query_string of this query. See notmuch_query_create. Simple as that, no notes ๐
.
๐ notmuch_database_t * notmuch_query_get_database (const notmuch_query_t * query)
Return the notmuch database of this query. See notmuch_query_create. Also simple, also no notes ๐ซถ.
๐ void notmuch_query_set_omit_excluded (notmuch_query_t * query, notmuch_exclude_t omit_excluded)
Specify whether to omit excluded results or simply flag them. By default, this is set to TRUE. So like, exclusion is happening unless you say otherwise, bestie ๐.
If set to TRUE or ALL, notmuch_query_search_messages will omit excluded messages from the results, and notmuch_query_search_threads will omit threads that match only in excluded messages. If set to TRUE, notmuch_query_search_threads will include all messages in threads that match in at least one non-excluded message. Otherwise, if set to ALL, notmuch_query_search_threads will omit excluded messages from all threads.
If set to FALSE or FLAG then both notmuch_query_search_messages and notmuch_query_search_threads will return all matching messages/threads regardless of exclude status. If set to FLAG then the exclude flag will be set for any excluded message that is returned by notmuch_query_search_messages, and the thread counts for threads returned by notmuch_query_search_threads will be the number of non-excluded messages/matches. Otherwise, if set to FALSE, then the exclude status is completely ignored.
The performance difference when calling notmuch_query_search_messages should be relatively small (and both should be very fast). However, in some cases, notmuch_query_search_threads is very much faster when omitting excluded messages as it does not need to construct the threads that only match in excluded messages. Free speed, we love to see it ๐ฅ.
๐ notmuch_sort_t notmuch_query_get_sort (const notmuch_query_t * query)
Return the sort specified for this query. See notmuch_query_set_sort. That's it, that's the whole vibe ๐.
notmuch_status_t notmuch_query_add_tag_exclude (notmuch_query_t * query, const char * tag)
Okay so this is basically the "girl, not that one" button ๐ โ it adds a tag that gets excluded from the query results by default. But here's the little plot twist: that exclusion gets completely ignored if the tag shows up explicitly in the query. So if you go and name it yourself, you have un-excluded it, bestie. You did that. ๐
Returns
NOTMUCH_STATUS_SUCCESS: excluded was added successfully. slay.NOTMUCH_STATUS_XAPIAN_EXCEPTION: a Xapian exception occurred. Most likely a problem lazily parsing the query string.NOTMUCH_STATUS_IGNORED:tagis explicitly present in the query, so not excluded.
notmuch_status_t notmuch_query_search_threads (notmuch_query_t * query, notmuch_threads_t ** out)
Runs a query for threads and hands you back a notmuch_threads_t object you can iterate over. Big ownership note, and this is the part everyone skips (do not skip it, bestie): the returned threads object is owned by the query, so it's only valid until notmuch_query_destroy. It's giving borrowed-from-your-friend energy. ๐ซถ
Typical usage might be:
notmuch_query_t *query;
notmuch_threads_t *threads;
notmuch_thread_t *thread;
notmuch_status_t stat;
query = notmuch_query_create (database, query_string);
for (stat = notmuch_query_search_threads (query, &threads);
stat == NOTMUCH_STATUS_SUCCESS &&
! notmuch_threads_status (threads);
notmuch_threads_move_to_next (threads))
{
thread = notmuch_threads_get (threads);
....
notmuch_thread_destroy (thread);
}
notmuch_query_destroy (query);
Note: If you are finished with a thread before its containing query, you can call notmuch_thread_destroy to clean up some memory sooner (as in the above example). Otherwise, if your thread objects are long-lived, then you don't need to call notmuch_thread_destroy and all the memory will still be reclaimed when the query is destroyed. No leaked-memory scandal, we promise. โจ
Also there's literally no explicit destructor needed for the notmuch_threads_t object. (For consistency, we do provide a notmuch_threads_destroy function, but there's no good reason to call it if the query is about to be destroyed). So likeโฆ don't, unless you must. ๐
Since: libnotmuch 5.0 (notmuch 0.25)
notmuch_status_t notmuch_query_search_threads_st (notmuch_query_t * query, notmuch_threads_t ** out)
A deprecated alias for notmuch_query_search_threads. Like an old username you still have feelings about, but it's time to move on. ๐
Deprecated: Deprecated as of libnotmuch 5 (notmuch 0.25). Please use notmuch_query_search_threads instead.
notmuch_status_t notmuch_query_search_messages (notmuch_query_t * query, notmuch_messages_t ** out)
Same vibe, but for messages ๐ฆ โ executes a query for messages and returns a notmuch_messages_t object you can iterate over. And again, ownership check: the returned messages object is owned by the query, so it's only valid until notmuch_query_destroy. It's not yours, it's on loan, ok?
Typical usage might be:
notmuch_query_t *query;
notmuch_messages_t *messages;
notmuch_message_t *message;
query = notmuch_query_create (database, query_string);
if (notmuch_query_search_messages (query, &messages) != NOTMUCH_STATUS_SUCCESS)
return EXIT_FAILURE;
for (;
! notmuch_messages_status (messages);
notmuch_messages_move_to_next (messages))
{
message = notmuch_messages_get (messages);
....
notmuch_message_destroy (message);
}
if (notmuch_messages_status (messages) != NOTMUCH_STATUS_ITERATOR_EXHAUSTED)
return EXIT_FAILURE;
notmuch_query_destroy (query);
Note: If you are finished with a message before its containing query, you can call notmuch_message_destroy to clean up some memory sooner (as in the above example). Otherwise, if your message objects are long-lived, then you don't need to call notmuch_message_destroy and all the memory will still be reclaimed when the query is destroyed. ๐ธ
Same deal as threads: no explicit destructor needed for the notmuch_messages_t object. (For consistency, we do provide a notmuch_messages_destroy function, but there's no good reason to call it if the query is about to be destroyed). ๐
And heads up โ if a Xapian exception occurs this function will return NULL. Yes, even though it returns a status type. That's what the docs say, so that's what we're telling you, no cap. ๐ญ
Since: libnotmuch 5 (notmuch 0.25)
notmuch_status_t notmuch_query_search_messages_st (notmuch_query_t * query, notmuch_messages_t ** out)
Deprecated alias for notmuch_query_search_messages. Respectfully, retire it. ๐
Deprecated: Deprecated as of libnotmuch 5 (notmuch 0.25). Please use notmuch_query_search_messages instead.
void notmuch_query_destroy (notmuch_query_t * query)
The big cleanup ๐ โ destroys a notmuch_query_t along with any associated resources. And it does NOT stop there, bestie: this in turn destroys any notmuch_threads_t and notmuch_messages_t objects generated by this query, (and in turn any notmuch_thread_t and notmuch_message_t objects generated from those results, etc.), if such objects haven't already been destroyed. The whole family tree gets taken out at once, it's giving chain reaction ๐โจ
notmuch_bool_t notmuch_threads_valid (notmuch_threads_t * threads)
Vibe check on the iterator ๐ง โ is the given threads iterator pointing at a valid thread?
When this function returns TRUE, notmuch_threads_get will return a valid object. Whereas when this function returns FALSE, notmuch_threads_get will return NULL. Iconic binary behaviour, honestly.
If passed a NULL pointer, this function returns FALSE. No crash, no drama, just a polite no. ๐
See the documentation of notmuch_query_search_threads for example code showing how to iterate over a notmuch_threads_t object.
Important little note: an iterator may become invalid either due to getting exhausted or due to a runtime error. Use notmuch_threads_status to distinguish between those cases. Two very different reasons, one very invalid iterator. ๐ญ
notmuch_status_t notmuch_threads_status (notmuch_threads_t * threads)
Get the status of the given threads iterator. This is the one that tells you why your iterator gave up on you. Return value:
Return values
NOTMUCH_STATUS_SUCCESSโ The iterator is valid;notmuch_threads_getmay return a valid objectNOTMUCH_STATUS_ITERATOR_EXHAUSTEDโ All items have been readNOTMUCH_STATUS_OUT_OF_MEMORYโ Iteration failed to allocate memoryNOTMUCH_STATUS_OPERATION_INVALIDATEDโ Iteration was invalidated by the database. Re-open the database and try again.
See the documentation of notmuch_query_search_threads for example code showing how to iterate over a notmuch_threads_t object.
notmuch_thread_t * notmuch_threads_get (notmuch_threads_t * threads)
Grab the current thread from threads as a notmuch_thread_t. ๐
Note: The returned thread belongs to threads and has a lifetime identical to it (and the query to which it belongs). So like, don't outlive your parent, bestie.
See the documentation of notmuch_query_search_threads for example code showing how to iterate over a notmuch_threads_t object.
If an out-of-memory situation occurs, this function will return NULL. ๐ญ
void notmuch_threads_move_to_next (notmuch_threads_t * threads)
Move the threads iterator to the next thread โจ. And if threads is already pointing at the last thread, then the iterator gets moved to a point just beyond that last thread, (where notmuch_threads_status will return NOTMUCH_STATUS_ITERATOR_EXHAUSTED and notmuch_threads_get will return NULL). It's the one-way exit door of the loop, iykyk. ๐ช
See the documentation of notmuch_query_search_threads for example code showing how to iterate over a notmuch_threads_t object.
void notmuch_threads_destroy (notmuch_threads_t * threads)
Destroys a notmuch_threads_t object. And honestly? It's not strictly necessary to call this function. All memory from the notmuch_threads_t object will be reclaimed when the containing query object is destroyed. So it's optional cleanup, not a moral obligation. ๐ซถ
notmuch_status_t notmuch_query_count_messages (notmuch_query_t * query, unsigned int * count)
Want a number instead of an iterator? Say less. ๐ฅ This returns the number of messages matching a search โ it performs a search and returns the number of matching messages.
Returns
NOTMUCH_STATUS_SUCCESS: query completed successfully.NOTMUCH_STATUS_XAPIAN_EXCEPTION: a Xapian exception occurred. The value of*countis not defined.
Yes, "The value of *count is not defined" โ so don't go reading it like it means something. It does not. ๐
Since: libnotmuch 5 (notmuch 0.25)
notmuch_status_t notmuch_query_count_messages_st (notmuch_query_t * query, unsigned int * count)
Deprecated alias for notmuch_query_count_messages.
Deprecated: Deprecated since libnotmuch 5.0 (notmuch 0.25). Please use notmuch_query_count_messages instead.
notmuch_status_t notmuch_query_count_threads (notmuch_query_t * query, unsigned * count)
Returns the number of threads matching a search ๐. This function performs a search and returns the number of unique thread IDs in the matching messages. This is the same as number of threads matching a search. Cute, right?
Lowkey a warning though: this is a significantly heavier operation than notmuch_query_count_messages{_st}(). It's giving main-character energy but it's paying main-character prices. ๐
Returns
NOTMUCH_STATUS_OUT_OF_MEMORY: Memory allocation failed. The value of*countis not definedNOTMUCH_STATUS_SUCCESS: query completed successfully.NOTMUCH_STATUS_XAPIAN_EXCEPTION: a Xapian exception occurred. The value of*countis not defined.
Since: libnotmuch 5 (notmuch 0.25)
notmuch_status_t notmuch_query_count_threads_st (notmuch_query_t * query, unsigned * count)
Deprecated alias for notmuch_query_count_threads.
Deprecated: Deprecated as of libnotmuch 5.0 (notmuch 0.25). Please use notmuch_query_count_threads_st instead.
Not me telling you to use the_stversion to replace the_stversion ๐ โ that's literally what the page says, so we're relaying it faithfully, no edits, no cap. ๐
const char * notmuch_thread_get_thread_id (notmuch_thread_t * thread)
Get the thread ID of thread. ๐ The returned string belongs to thread and as such, should not be modified by the caller, and will only be valid for as long as the thread is valid, (which is until notmuch_thread_destroy or until the query from which it derived is destroyed). Borrowed string, borrowed lifetime, don't touch, don't keep. ๐
int notmuch_thread_get_total_messages (notmuch_thread_t * thread)
Get the total number of messages in thread. ๐ฌ This count consists of all messages in the database belonging to this thread. Contrast with notmuch_thread_get_matched_messages(). It's the whole group chat, not just the people who replied. ๐ซถ
int notmuch_thread_get_total_files (notmuch_thread_t * thread)
Get the total number of files in thread. ๐๏ธ This sums notmuch_message_count_files over all messages in the thread.
Returns: Non-negative integer
Since: libnotmuch 5.0 (notmuch 0.25)
notmuch_messages_t * notmuch_thread_get_toplevel_messages (notmuch_thread_t * thread)
Get a notmuch_messages_t iterator for the top-level messages in thread, in oldest-first order โณ. And no, this will not necessarily iterate over all of the messages in the thread โ it will only iterate over the messages in the thread which are not replies to other messages in the thread. Just the OGs, the ones who started it. ๐
The returned list will be destroyed when the thread is destroyed. So again: borrowed. You know the drill by now, bestie. ๐ฆ
notmuch_messages_t * notmuch_thread_get_messages (notmuch_thread_t * thread)
Get a notmuch_thread_t iterator for all messages in thread in oldest-first order ๐ธ. Yes, all of them, the entire saga.
The returned list will be destroyed when the thread is destroyed. Same lifetime rules, no notes. ๐
int notmuch_thread_get_matched_messages (notmuch_thread_t * thread)
Get the number of messages in thread that actually matched the search โจ. This count includes only the messages in this thread that were matched by the search from which the thread was created and were not excluded by any exclude tags passed in with the query (see notmuch_query_add_tag_exclude). Contrast with notmuch_thread_get_total_messages(). So: the ones who showed up to the search and weren't on the exclusion list. ๐ฏ
const char * notmuch_thread_get_authors (notmuch_thread_t * thread)
Okay so this one hands you the authors of thread as a UTF-8 string โจ and it's literally a comma-separated list of the names of the authors of the mail messages in the query results that belong to this thread.
The ordering is a whole thing, so pay attention bestie: the string has authors of messages matching the query first, then the non-matched authors, and those two groups are separated by '|'. Within each group? Authors are ordered by date.
The returned string belongs to thread, so like โ do not modify it, and it's only valid for as long as the thread is valid (which is until notmuch_thread_destroy or until the query from which it derived is destroyed). ๐ซถ
const char * notmuch_thread_get_subject (notmuch_thread_t * thread)
Grabs the subject of thread as a UTF-8 string ๐ The subject is taken from the first message (according to the query order โ see notmuch_query_set_sort) in the query results that belongs to this thread.
Same ownership rules as always, no cap: the string belongs to thread, don't you dare modify it, and it's only valid as long as the thread is valid (until notmuch_thread_destroy or until the query from which it derived is destroyed).
notmuch_tags_t * notmuch_thread_get_tags (notmuch_thread_t * thread)
Get the tags for thread, returning a notmuch_tags_t object you can iterate over to see all the tags ๐
Heads up babe: in the Notmuch database, tags are stored on individual messages, not on threads. So the tags you get back here are all tags of the messages which matched the search and which belong to this thread.
The tags object is owned by the thread, so it's only valid for as long as the thread is valid (for example, until notmuch_thread_destroy or until the query from which it derived is destroyed).
Typical usage might be:
notmuch_thread_t *thread;
notmuch_tags_t *tags;
const char *tag;
thread = notmuch_threads_get (threads);
for (tags = notmuch_thread_get_tags (thread);
notmuch_tags_valid (tags);
notmuch_tags_move_to_next (tags))
{
tag = notmuch_tags_get (tags);
....
}
notmuch_thread_destroy (thread);
And here's the cute part: there's no explicit destructor needed for the notmuch_tags_t object ๐
(For consistency, we do provide a notmuch_tags_destroy function, but there's no good reason to call it if the message is about to be destroyed.)
notmuch_bool_t notmuch_messages_valid (notmuch_messages_t * messages)
Is this messages iterator pointing at a valid message? ๐ When this function returns TRUE, notmuch_messages_get will return a valid object. When it returns FALSE, notmuch_messages_get will return NULL.
See the documentation of notmuch_query_search_messages for example code showing how to iterate over a notmuch_messages_t object.
Small but important detail: an iterator may become invalid either because it got exhausted or because of a runtime error ๐ญ Use notmuch_messages_status to tell those two cases apart.
notmuch_status_t notmuch_messages_status (notmuch_messages_t * messages)
Get the status of the given messages iterator. Return value:
NOTMUCH_STATUS_SUCCESSโ the iterator is valid;notmuch_messages_getwill return a valid object โNOTMUCH_STATUS_ITERATOR_EXHAUSTEDโ all items have been readNOTMUCH_STATUS_OUT_OF_MEMORYโ iteration failed to allocate memory ๐NOTMUCH_STATUS_OPERATION_INVALIDATEDโ iteration was invalidated by the database. Re-open the database and try again.
See the documentation of notmuch_query_search_messages for example code showing how to iterate over a notmuch_messages_t object.
notmuch_message_t * notmuch_messages_get (notmuch_messages_t * messages)
Get the current message from messages as a notmuch_message_t ๐ธ
Note: the returned message belongs to messages and has a lifetime identical to it (and the query to which it belongs).
See the documentation of notmuch_query_search_messages for example code showing how to iterate over a notmuch_messages_t object.
If an out-of-memory situation occurs, this function will return NULL.
void notmuch_messages_move_to_next (notmuch_messages_t * messages)
Move the messages iterator to the next message โก๏ธ If messages is already pointing at the last message, then the iterator gets moved to a point just beyond that last message โ that's the zone where notmuch_messages_status will return NOTMUCH_STATUS_ITERATOR_EXHAUSTED and notmuch_messages_get will return NULL.
See the documentation of notmuch_query_search_messages for example code showing how to iterate over a notmuch_messages_t object.
void notmuch_messages_destroy (notmuch_messages_t * messages)
Destroy a notmuch_messages_t object. It's not strictly necessary to call this function ๐ All memory from the notmuch_messages_t object will be reclaimed when the containing query object is destroyed.
notmuch_tags_t * notmuch_messages_collect_tags (notmuch_messages_t * messages)
Returns a list of tags from all messages, and the resulting list is guaranteed not to contain duplicated tags ๐ฆ
WARNING: you can no longer iterate over messages after calling this function, because the iterator will point at the end of the list. We do not have a function to reset the iterator yet, and the only way you can iterate over the list again is to recreate the message list. ๐ญ
The function returns NULL on error.
notmuch_database_t * notmuch_message_get_database (const notmuch_message_t * message)
Get the database associated with this message.
Since: libnotmuch 5.2 (notmuch 0.27)
const char * notmuch_message_get_message_id (notmuch_message_t * message)
Get the message ID of message ๐ The returned string belongs to message, so don't modify it, and it's only valid for as long as the message is valid (which is until the query from which it derived is destroyed).
This function will return NULL if it triggers an unhandled Xapian exception.
const char * notmuch_message_get_thread_id (notmuch_message_t * message)
Get the thread ID of message. The returned string belongs to message, so no modifying, and it's only valid for as long as the message is valid (for example, until the user calls notmuch_message_destroy on message or until a query from which it derived is destroyed).
This function will return NULL if it triggers an unhandled Xapian exception.
notmuch_messages_t * notmuch_message_get_replies (notmuch_message_t * message)
Get a notmuch_messages_t iterator for all of the replies to message ๐
Note: this call only makes sense ifmessagewas ultimately obtained from anotmuch_thread_tobject โ like by coming directly from the result of callingnotmuch_thread_get_toplevel_messages, or by any number of subsequent calls tonotmuch_message_get_replies.
If message was obtained through some non-thread means, (such as by a call to notmuch_query_search_messages), then this function will return NULL.
If there are no replies to message, this function will return NULL too. (Note that notmuch_messages_status will accept that NULL value as legitimate, and simply return NOTMUCH_STATUS_ITERATOR_EXHAUSTED for it.)
This function also returns NULL if it triggers a Xapian exception.
The returned list will be destroyed when the thread is destroyed.
int notmuch_message_count_files (notmuch_message_t * message)
Get the total number of files associated with a message ๐ฅ
Returns:
- Non-negative integer for file count.
- Negative integer for error.
Since: libnotmuch 5.0 (notmuch 0.25)
const char * notmuch_message_get_filename (notmuch_message_t * message)
Get a filename for the email corresponding to message ๐ The returned filename is an absolute filename โ the initial component will match notmuch_database_get_path().
The returned string belongs to the message, so it should not be modified or freed by the caller (and don't reference it after the message is destroyed either, bestie).
Note: if this message corresponds to multiple files in the mail store (that is, multiple files contain identical message IDs), this function will arbitrarily return a single one of those filenames. See notmuch_message_get_filenames for returning the complete list of filenames.
This function returns NULL if it triggers a Xapian exception.
notmuch_filenames_t * notmuch_message_get_filenames (notmuch_message_t * message)
Get all filenames for the email corresponding to message ๐
Returns a notmuch_filenames_t iterator listing all the filenames associated with message. These files may not have identical content, but each will have the identical Message-ID.
Each filename in the iterator is an absolute filename โ the initial component will match notmuch_database_get_path().
This function returns NULL if it triggers a Xapian exception.
notmuch_status_t notmuch_message_reindex (notmuch_message_t * message, notmuch_indexopts_t * indexopts)
Re-index the e-mail corresponding to message using the supplied index options. Returns the status of the re-index operation (see the return codes documented in notmuch_database_index_file).
After reindexing, the user should discard the message object passed in here by calling notmuch_message_destroy, since it refers to the original message, not to the reindexed message. ๐ซถ
notmuch_bool_t notmuch_message_get_flag (notmuch_message_t * message, notmuch_message_flag_t flag)
Get a value of a flag for the email corresponding to message. Returns FALSE in case of errors.
Deprecated: deprecated as of libnotmuch 5.3 (notmuch 0.31). Please use notmuch_message_get_flag_st instead. ๐
notmuch_status_t notmuch_message_get_flag_st (notmuch_message_t * message, notmuch_message_flag_t flag, notmuch_bool_t * is_set)
Get a value of a flag for the email corresponding to message โจ
Parameters:
messageโ a message objectflagโ flag to checkis_setโ pointer to boolean to store flag value.
Return values:
NOTMUCH_STATUS_SUCCESSNOTMUCH_STATUS_NULL_POINTERโis_setisNULLNOTMUCH_STATUS_XAPIAN_EXCEPTIONโ accessing the database triggered an exception.
Since: libnotmuch 5.3 (notmuch 0.31)
time_t notmuch_message_get_date (notmuch_message_t * message)
Get the date of message as a time_t value ๐ฐ๏ธ For the original textual representation of the Date header from the message, call notmuch_message_get_header() with a header value of "date".
Returns 0 in case of error.
const char * notmuch_message_get_header (notmuch_message_t * message, const char * header)
Get the value of the specified header from message as a UTF-8 string ๐ Common headers are stored in the database when the message is indexed and will be returned from the database. Other headers will be read from the actual message file.
The header name is case insensitive. ๐
Okay so about that returned string: it belongs to the message, so do not modify it or free it โ and donโt reference it after the message is destroyed either. ๐
Returns an empty string ("") if the message does not contain a header line matching header. Returns NULL if any error occurs.
notmuch_tags_t * notmuch_message_get_tags (notmuch_message_t * message) ๐ท๏ธ
Get the tags for message, returning a notmuch_tags_t object which can be used to iterate over all tags. The tags object is owned by the message and as such, will only be valid for as long as the message is valid, (which is until the query from which it derived is destroyed). Ownership tea, bestie: you donโt own it, the message does.
Typical usage might be:
notmuch_message_t *message;
notmuch_tags_t *tags;
const char *tag;
message = notmuch_database_find_message (database, message_id);
for (tags = notmuch_message_get_tags (message);
notmuch_tags_valid (tags);
notmuch_tags_move_to_next (tags))
{
tag = notmuch_tags_get (tags);
....
}
notmuch_message_destroy (message);
Note that thereโs no explicit destructor needed for the notmuch_tags_t object. (For consistency, we do provide a notmuch_tags_destroy function, but thereโs no good reason to call it if the message is about to be destroyed). โจ
notmuch_status_t notmuch_message_add_tag (notmuch_message_t * message, const char * tag) โ
Add a tag to the given message. Return value:
NOTMUCH_STATUS_SUCCESSโ Tag successfully added to message.NOTMUCH_STATUS_NULL_POINTERโ Thetagargument isNULL.NOTMUCH_STATUS_TAG_TOO_LONGโ The length oftagis too long (exceedsNOTMUCH_TAG_MAX).NOTMUCH_STATUS_READ_ONLY_DATABASEโ Database was opened in read-only mode so message cannot be modified.
notmuch_status_t notmuch_message_remove_tag (notmuch_message_t * message, const char * tag) โ
Remove a tag from the given message. Return value:
NOTMUCH_STATUS_SUCCESSโ Tag successfully removed from message.NOTMUCH_STATUS_NULL_POINTERโ Thetagargument isNULL.NOTMUCH_STATUS_TAG_TOO_LONGโ The length oftagis too long (exceedsNOTMUCH_TAG_MAX).NOTMUCH_STATUS_READ_ONLY_DATABASEโ Database was opened in read-only mode so message cannot be modified.
notmuch_status_t notmuch_message_remove_all_tags (notmuch_message_t * message) ๐งน
Remove all tags from the given message. See notmuch_message_freeze for an example showing how to safely replace tag values. Like, actually use the freeze example, bestie โ itโs there for a reason.
Return values
NOTMUCH_STATUS_READ_ONLY_DATABASEโ Database was opened in read-only mode so message cannot be modified.NOTMUCH_STATUS_XAPIAN_EXCEPTIONโ an exception was thrown accessing the database.
notmuch_status_t notmuch_message_maildir_flags_to_tags (notmuch_message_t * message) ๐ฌ
Add/remove tags according to maildir flags in the message filename(s). This function examines the filenames of message for maildir flags, and adds or removes tags on message as follows when these flags are present:
- Flag
'D'โ Adds the"draft"tag to the message. - Flag
'F'โ Adds the"flagged"tag to the message. - Flag
'P'โ Adds the"passed"tag to the message. - Flag
'R'โ Adds the"replied"tag to the message. - Flag
'S'โ Removes the"unread"tag from the message.
For each flag that is not present, the opposite action (add/remove) is performed for the corresponding tags.
Flags are identified as trailing components of the filename after a sequence of ":2,".
If there are multiple filenames associated with this message, the flag is considered present if it appears in one or more filenames. (That is, the flags from the multiple filenames are combined with the logical OR operator.) OR energy: one filename said it, so it counts.
A client can ensure that notmuch database tags remain synchronized with maildir flags by calling this function after each call to notmuch_database_index_file. See also notmuch_message_tags_to_maildir_flags for synchronizing tag changes back to maildir flags.
notmuch_bool_t notmuch_message_has_maildir_flag (notmuch_message_t * message, char flag) ๐ฉ
return TRUE if any filename of message has maildir flag flag, FALSE otherwise. Deprecated wrapper for notmuch_message_has_maildir_flag_st.
Returns
FALSEin case of error.
Deprecated: libnotmuch 5.3 (notmuch 0.31)
notmuch_status_t notmuch_message_has_maildir_flag_st (notmuch_message_t * message, char flag, notmuch_bool_t * is_set) ๐ฉโจ
check message for maildir flag.
Parameters
messageโ message to check.flagโ flag to check for.is_setโ pointer to boolean.
Return values
NOTMUCH_STATUS_SUCCESSNOTMUCH_STATUS_NULL_POINTERโis_setisNULL.NOTMUCH_STATUS_XAPIAN_EXCEPTIONโ Accessing the database triggered an exception.
notmuch_status_t notmuch_message_tags_to_maildir_flags (notmuch_message_t * message) ๐ฎ
Rename message filename(s) to encode tags as maildir flags. Specifically, for each filename corresponding to this message:
If the filename is not in a maildir directory, do nothing. (A maildir directory is determined as a directory named "new" or "cur".) Similarly, if the filename has invalid maildir info, (repeated or outof-ASCII-order flag characters after ":2,"), then do nothing. Yes, โoutof-ASCII-orderโ is the exact spelling here โ we keep the sacred text.
If the filename is in a maildir directory, rename the file so that its filename ends with the sequence ":2," followed by zero or more of the following single-character flags (in ASCII order):
- flag
'D'iff the message has the"draft"tag. - flag
'F'iff the message has the"flagged"tag. - flag
'P'iff the message has the"passed"tag. - flag
'R'iff the message has the"replied"tag. - flag
'S'iff the message does not have the"unread"tag.
Any existing flags unmentioned in the list above will be preserved in the renaming.
Also, if this filename is in a directory named "new", rename it to be within the neighboring directory named "cur".
A client can ensure that maildir filename flags remain synchronized with notmuch database tags by calling this function after changing tags, (after calls to notmuch_message_add_tag, notmuch_message_remove_tag, or notmuch_message_freeze/ notmuch_message_thaw). See also notmuch_message_maildir_flags_to_tags for synchronizing maildir flag changes back to tags.
notmuch_status_t notmuch_message_freeze (notmuch_message_t * message) ๐ง
Freeze the current state of message within the database. This means that changes to the message state, (via notmuch_message_add_tag, notmuch_message_remove_tag, and notmuch_message_remove_all_tags), will not be committed to the database until the message is thawed with notmuch_message_thaw.
Multiple calls to freeze/thaw are valid and these calls will โstackโ. That is there must be as many calls to thaw as to freeze before a message is actually thawed. Stack โem like your fave iced drink, but keep the count right.
The ability to do freeze/thaw allows for safe transactions to change tag values. For example, explicitly setting a message to have a given set of tags might look like this:
notmuch_message_freeze (message);
notmuch_message_remove_all_tags (message);
for (i = 0; i < NUM_TAGS; i++) notmuch_message_add_tag (message,
tags[i]);
notmuch_message_thaw (message);
With freeze/thaw used like this, the message in the database is guaranteed to have either the full set of original tag values, or the full set of new tag values, but nothing in between. All-or-nothing tag glow-up, periodt.
Imagine the example above without freeze/thaw and the operation somehow getting interrupted. This could result in the message being left with no tags if the interruption happened after notmuch_message_remove_all_tags but before notmuch_message_add_tag. ๐
Return value:
NOTMUCH_STATUS_SUCCESSโ Message successfully frozen.NOTMUCH_STATUS_READ_ONLY_DATABASEโ Database was opened in read-only mode so message cannot be modified.
notmuch_status_t notmuch_message_thaw (notmuch_message_t * message) ๐ก๏ธ
Thaw the current message, synchronizing any changes that may have occurred while message was frozen into the notmuch database. See notmuch_message_freeze for an example of how to use this function to safely provide tag changes.
Multiple calls to freeze/thaw are valid and these calls with โstackโ. That is there must be as many calls to thaw as to freeze before a message is actually thawed.
Return value:
NOTMUCH_STATUS_SUCCESSโ Message successfully thawed, (or at least its frozen count has successfully been reduced by 1).NOTMUCH_STATUS_UNBALANCED_FREEZE_THAWโ An attempt was made to thaw an unfrozen message. That is, there have been an unbalanced number of calls tonotmuch_message_freezeandnotmuch_message_thaw.
void notmuch_message_destroy (notmuch_message_t * message) ๐ซง
Destroy a notmuch_message_t object. It can be useful to call this function in the case of a single query object with many messages in the result, (such as iterating over the entire database). Otherwise, itโs fine to never call this function and there will still be no memory leaks. (The memory from the messages get reclaimed when the containing query is destroyed.) No leaks, no stress โ the queryโs got cleanup duty.
notmuch_status_t notmuch_message_get_property (notmuch_message_t * message, const char * key, const char ** value) ๐
Retrieve the value for a single property key. value is set to a string owned by the message or NULL if there is no such key. In the case of multiple values for the given key, the first one is retrieved.
Returns
NOTMUCH_STATUS_NULL_POINTER:valuemay not beNULL.NOTMUCH_STATUS_SUCCESS: No error occurred.
Since: libnotmuch 4.4 (notmuch 0.23)
notmuch_status_t notmuch_message_add_property (notmuch_message_t * message, const char * key, const char * value) โ๐
Add a (key,value) pair to a message.
Returns
NOTMUCH_STATUS_ILLEGAL_ARGUMENT:keymay not contain an'='character.NOTMUCH_STATUS_NULL_POINTER: Neitherkeynorvaluemay beNULL.NOTMUCH_STATUS_SUCCESS: No error occurred.
Since: libnotmuch 4.4 (notmuch 0.23)
notmuch_status_t notmuch_message_remove_property (notmuch_message_t * message, const char * key, const char * value) โ๐
Remove a (key,value) pair from a message. It is not an error to remove a non-existent (key,value) pair.
Returns
NOTMUCH_STATUS_ILLEGAL_ARGUMENT:keymay not contain an'='character.NOTMUCH_STATUS_NULL_POINTER: Neitherkeynorvaluemay beNULL.NOTMUCH_STATUS_SUCCESS: No error occurred.
Since: libnotmuch 4.4 (notmuch 0.23)
notmuch_status_t notmuch_message_remove_all_properties (notmuch_message_t * message, const char * key) ๐งฝ
Remove all (key,value) pairs from the given message.
Parameters
messageโ message to operate on.keyโ key to delete properties for. IfNULL, delete properties for all keys.
Returns
NOTMUCH_STATUS_READ_ONLY_DATABASEโ the database got opened in read-only mode, so bestie, the message literally cannot be modified. No edits for you. ๐ซNOTMUCH_STATUS_SUCCESSโ no error happened, we ate and left no crumbs. โจ
Since โ libnotmuch 4.4 (notmuch 0.23)
notmuch_status_t notmuch_message_remove_all_properties_with_prefix (notmuch_message_t * message, const char * prefix)
Okay so this one nukes all the (prefix*,value) pairs off the given message. Just wipes them. Gone. ๐
Parameters
messageโ the message we're operating on.prefixโ delete properties whose keys start withprefix. And if you passNULL? It deletes all properties. All of them. Every last one. ๐ญ
Returns
NOTMUCH_STATUS_READ_ONLY_DATABASEโ database was opened in read-only mode so the message cannot be modified.NOTMUCH_STATUS_SUCCESSโ no error occurred.
Since โ libnotmuch 5.1 (notmuch 0.26)
notmuch_message_properties_t * notmuch_message_get_properties (notmuch_message_t * message, const char * key, notmuch_bool_t exact)
Get the properties for message, returning a notmuch_message_properties_t object you can use to iterate over all the properties. Heads up though: that notmuch_message_properties_t object is owned by the message, so it's only valid for as long as the message is valid โ which is, like, until the query it derived from gets destroyed. So don't go keeping it around forever, it's giving temporary. ๐ฆ
Parameters
messageโ the message to examine.keyโ key, or key prefix.exactโ ifTRUE, require an exact match withkey. Otherwise treat it as a prefix.
Typical usage might be:
notmuch_message_properties_t *list;
for (list = notmuch_message_get_properties (message, "testkey1", TRUE);
notmuch_message_properties_valid (list); notmuch_message_properties_move_to_next (list)) {
printf("%s\n", notmuch_message_properties_value(list));
}
notmuch_message_properties_destroy (list);
And note, bestie โ there's no explicit destructor needed for the notmuch_message_properties_t object. (For consistency we do provide a notmuch_message_properities_destroy function, but there's genuinely no good reason to call it if the message is about to be destroyed anyway. It's just there for the vibes. ๐)
Since โ libnotmuch 4.4 (notmuch 0.23)
notmuch_status_t notmuch_message_count_properties (notmuch_message_t * message, const char * key, unsigned int * count)
Returns the number of properties named "key" that belong to this specific message. Math era. ๐ข
Parameters
messageโ the message to examine.keyโ the key to count.countโ the number of matching properties associated with this message.
Returns
NOTMUCH_STATUS_SUCCESS: successful count, possibly some other error.
Since โ libnotmuch 5.2 (notmuch 0.27)
notmuch_bool_t notmuch_message_properties_valid (notmuch_message_properties_t * properties)
Is the given properties iterator pointing at a valid (key,value) pair? ๐ When this returns TRUE, then notmuch_message_properties_{key,value} will hand you a valid string, and notmuch_message_properties_move_to_next will do exactly what it says on the tin. But when it returns FALSE? Calling any of those functions is undefined behaviour. So like, don't. ๐
See the docs for notmuch_message_get_properties for example code showing how to iterate over a notmuch_message_properties_t object.
Since โ libnotmuch 4.4 (notmuch 0.23)
void notmuch_message_properties_move_to_next (notmuch_message_properties_t * properties)
Moves the properties iterator to the next (key,value) pair. And if properties is already sitting on the last pair, the iterator gets moved to a point just beyond that last pair โ where notmuch_message_properties_valid will return FALSE. One step past the edge of the universe, basically. ๐
See the docs for notmuch_message_get_properties for example code showing how to iterate over a notmuch_message_properties_t object.
Since โ libnotmuch 4.4 (notmuch 0.23)
const char * notmuch_message_properties_key (notmuch_message_properties_t * properties)
Returns the key from the current (key,value) pair. Which, lowkey, is super useful if you're iterating for a prefix. ๐
Since โ libnotmuch 4.4 (notmuch 0.23)
const char * notmuch_message_properties_value (notmuch_message_properties_t * properties)
Returns the value from the current (key,value) pair. Also could be useful if you're iterating for a prefix. ๐ซถ
Since โ libnotmuch 4.4 (notmuch 0.23)
void notmuch_message_properties_destroy (notmuch_message_properties_t * properties)
Destroys a notmuch_message_properties_t object. Ngl, it's not strictly necessary to call this. All the memory from the notmuch_message_properties_t object gets reclaimed when the containing message object is destroyed anyway. So it's a nice-to-have, not a must. โจ
Since โ libnotmuch 4.4 (notmuch 0.23)
notmuch_bool_t notmuch_tags_valid (notmuch_tags_t * tags)
Is the given tags iterator pointing at a valid tag? When this returns TRUE, notmuch_tags_get will give you a valid string. When it returns FALSE, notmuch_tags_get will return NULL. Simple as that. ๐
And it's totally acceptable to pass NULL for tags โ in which case this function will always return FALSE.
See the docs for notmuch_message_get_tags for example code showing how to iterate over a notmuch_tags_t object.
const char * notmuch_tags_get (notmuch_tags_t * tags)
Gets the current tag from tags as a string. Note: the returned string belongs to tags and has a lifetime identical to it (and to the query it ultimately belongs to). So it's not yours to keep, bestie. ๐ฆ
See the docs for notmuch_message_get_tags for example code showing how to iterate over a notmuch_tags_t object.
void notmuch_tags_move_to_next (notmuch_tags_t * tags)
Moves the tags iterator to the next tag. If tags is already pointing at the last tag, then the iterator gets moved to a point just beyond that last tag โ where notmuch_tags_valid returns FALSE and notmuch_tags_get returns NULL. Same "one step past the end" situation as before. ๐
See the docs for notmuch_message_get_tags for example code showing how to iterate over a notmuch_tags_t object.
void notmuch_tags_destroy (notmuch_tags_t * tags)
Destroys a notmuch_tags_t object. Again โ not strictly necessary to call. All memory from the notmuch_tags_t object gets reclaimed when the containing message or query objects are destroyed. ๐
notmuch_status_t notmuch_directory_set_mtime (notmuch_directory_t * directory, time_t mtime)
Stores an mtime inside the database for directory. And directory should be an object you got from the database with notmuch_database_get_directory for a particular path. ๐
So the whole intention here is for you to use the mtime to efficiently spot new messages that need adding to the database. The recommended usage is, like:
- Read the mtime of a directory from the filesystem.
- Call
index_filefor all mail files in the directory. - Call
notmuch_directory_set_mtimewith the mtime read from the filesystem.
Then, later, when you wanna check for updates to that directory, the client can call notmuch_directory_get_mtime and know it only needs to add files if the mtime of the directory and files are newer than the stored timestamp. Efficient. Iconic. ๐
Note: thenotmuch_directory_get_mtimefunction does not let the caller distinguish a timestamp of0from a non-existent timestamp. So don't store a timestamp of0unless you're genuinely comfortable with that ambiguity. Fr fr, be careful. ๐ญ
Return value:
NOTMUCH_STATUS_SUCCESS: mtime successfully stored in database.NOTMUCH_STATUS_XAPIAN_EXCEPTION: a Xapian exception occurred, mtime not stored.NOTMUCH_STATUS_READ_ONLY_DATABASE: database was opened in read-only mode so the directory mtime cannot be modified.
time_t notmuch_directory_get_mtime (notmuch_directory_t * directory)
Gets the mtime of a directory (as previously stored with notmuch_directory_set_mtime). Returns 0 if no mtime has previously been stored for this directory. Zero, the classic "no data" number. ๐ฅ
notmuch_filenames_t * notmuch_directory_get_child_files (notmuch_directory_t * directory)
Gets a notmuch_filenames_t iterator listing all the filenames of messages in the database within the given directory. And the returned filenames will be the basename-entries only โ not complete paths. Just the little baby names. ๐
Returns NULL if it triggers a Xapian exception.
notmuch_filenames_t * notmuch_directory_get_child_directories (notmuch_directory_t * directory)
Gets a notmuch_filenames_t iterator listing all the filenames of sub-directories in the database within the given directory. Same deal โ the returned filenames will be basename-entries only, not complete paths. ๐ธ
Returns NULL if it triggers a Xapian exception.
notmuch_status_t notmuch_directory_delete (notmuch_directory_t * directory)
Deletes the directory document from the database, and destroys the notmuch_directory_t object. It assumes any child directories and files have already been deleted by the caller โ so like, that's on you, bestie. Don't come crying to me about orphaned children. ๐
Since โ libnotmuch 4.3 (notmuch 0.21)
notmuch_bool_t notmuch_filenames_valid (notmuch_filenames_t * filenames)
Is the given filenames iterator pointing at a valid filename? When this returns TRUE, notmuch_filenames_get will return a valid string. When it returns FALSE, notmuch_filenames_get will return NULL. ๐ฆ
It's acceptable to pass NULL for filenames, in which case this function will always return FALSE.
const char * notmuch_filenames_get (notmuch_filenames_t * filenames)
Gets the current filename from filenames as a string. Note: the returned string belongs to filenames and has a lifetime identical to it (and the directory it ultimately belongs to). Temp string, don't get attached. ๐
It's acceptable to pass NULL for filenames, in which case this function will always return NULL.
void notmuch_filenames_move_to_next (notmuch_filenames_t * filenames)
Moves the filenames iterator to the next filename. If filenames is already pointing at the last filename, the iterator gets moved to a point just beyond that last filename โ where notmuch_filenames_valid returns FALSE and notmuch_filenames_get returns NULL. Past the last one, into the void. ๐
It's acceptable to pass NULL for filenames, in which case this function does nothing. Chillest behaviour ever.
void notmuch_filenames_destroy (notmuch_filenames_t * filenames)
Destroys a notmuch_filenames_t object. Once again: not strictly necessary to call this. All memory from the notmuch_filenames_t object gets reclaimed when the containing directory object is destroyed. โจ
It's acceptable to pass NULL for filenames, in which case this function does nothing.
notmuch_status_t notmuch_database_set_config (notmuch_database_t * db, const char * key, const char * value)
Sets config key to value. Short and sweet, we love to see it. ๐
Since โ libnotmuch 4.4 (notmuch 0.23)
Return values
NOTMUCH_STATUS_READ_ONLY_DATABASEโ database was opened in read-only mode so the message cannot be modified.NOTMUCH_STATUS_XAPIAN_EXCEPTIONโ an exception was thrown accessing the database.NOTMUCH_STATUS_SUCCESS
notmuch_database_get_config
notmuch_status_t notmuch_database_get_config (notmuch_database_t * db, const
char * key, char ** value)
Okay so this one grabs the config item called key and drops it into value ๐ Keys that havenโt been set before with n_d_set_config come back as an empty string.
The return value is allocated by malloc and should be freed by the caller. No cap, bestie, you gotta free it.
Since: libnotmuch 4.4 (notmuch 0.23)
notmuch_database_get_config_list
notmuch_status_t notmuch_database_get_config_list (notmuch_database_t * db,
const char * prefix, notmuch_config_list_t ** out)
Creates an iterator for all config items whose keys match a given prefix โจ
Since: libnotmuch 4.4 (notmuch 0.23)
notmuch_config_list_valid
notmuch_bool_t notmuch_config_list_valid (notmuch_config_list_t *
config_list)
Is the config_list iterator valid? Like, can _key, _value, and _move_to_next actually be called on it? Thatโs the vibe check ๐ซถ
Since: libnotmuch 4.4 (notmuch 0.23)
notmuch_config_list_key
const char * notmuch_config_list_key (notmuch_config_list_t * config_list)
Returns the key for the current config pair. The return value is owned by the iterator, and will be destroyed by the next call to notmuch_config_list_key or notmuch_config_list_destroy ๐
Since: libnotmuch 4.4 (notmuch 0.23)
notmuch_config_list_value
const char * notmuch_config_list_value (notmuch_config_list_t * config_list)
Returns the value for the current config pair. The return value is owned by the iterator, and will be destroyed by the next call to notmuch_config_list_value or notmuch config_list_destroy ๐ญ
Return values: NULL for errors
Since: libnotmuch 4.4 (notmuch 0.23)
notmuch_config_list_move_to_next
void notmuch_config_list_move_to_next (notmuch_config_list_t * config_list)
Moves the config_list iterator to the next pair. Slay, next ๐
Since: libnotmuch 4.4 (notmuch 0.23)
notmuch_config_list_destroy
void notmuch_config_list_destroy (notmuch_config_list_t * config_list)
Frees any resources held by config_list ๐
Since: libnotmuch 4.4 (notmuch 0.23)
notmuch_config_get
const char * notmuch_config_get (notmuch_database_t * notmuch,
notmuch_config_key_t key)
Gets a configuration value from an open database. This value reflects all configuration information given at the time the database was opened.
Parameters
notmuchโ databasekeyโ configuration key
Since: libnotmuch 5.4 (notmuch 0.32)
Return values: NULL if key is unknown or if no value is known for key. Otherwise returns a string owned by notmuch which should not be modified nor freed by the caller ๐ฅ
notmuch_config_set
notmuch_status_t notmuch_config_set (notmuch_database_t * notmuch,
notmuch_config_key_t key, const char * val)
Sets a configuration value from in an open database. This value reflects all configuration information given at the time the database was opened.
Parameters
notmuchโ database open read/writekeyโ configuration keyvalโ configuration value
Since: libnotmuch 5.4 (notmuch 0.32)
Return values: returns any return value for notmuch_database_set_config ๐ธ
notmuch_config_get_values
notmuch_config_values_t * notmuch_config_get_values (notmuch_database_t *
notmuch, notmuch_config_key_t key)
Returns an iterator for a ;-delimited list of configuration values. These values reflect all configuration information given at the time the database was opened.
Parameters
notmuchโ databasekeyโ configuration key
Since: libnotmuch 5.4 (notmuch 0.32)
Return values: NULL in case of error ๐
notmuch_config_get_values_string
notmuch_config_values_t * notmuch_config_get_values_string
(notmuch_database_t * notmuch, const char * key)
Returns an iterator for a ;-delimited list of configuration values. These values reflect all configuration information given at the time the database was opened.
Parameters
notmuchโ databasekeyโ configuration key
Since: libnotmuch 5.4 (notmuch 0.32)
Return values: NULL in case of error ๐ฆ
notmuch_config_values_valid
notmuch_bool_t notmuch_config_values_valid (notmuch_config_values_t *
values)
Is the given config_values iterator pointing at a valid element?
Parameters
valuesโ iterator
Since: libnotmuch 5.4 (notmuch 0.32)
Return values: FALSE if passed a NULL pointer, or the iterator is exhausted ๐
notmuch_config_values_get
const char * notmuch_config_values_get (notmuch_config_values_t * values)
Gets the current value from the values iterator.
Parameters
valuesโ iterator
Since: libnotmuch 5.4 (notmuch 0.32)
Return values: a string with the same lifetime as the iterator โจ
notmuch_config_values_move_to_next
void notmuch_config_values_move_to_next (notmuch_config_values_t * values)
Moves the values iterator to the next element.
Parameters
valuesโ iterator
Since: libnotmuch 5.4 (notmuch 0.32)
notmuch_config_values_start
void notmuch_config_values_start (notmuch_config_values_t * values)
Resets the values iterator to the first element.
Parameters
valuesโ iterator. ANULLvalue is ignored.
Since: libnotmuch 5.4 (notmuch 0.32)
notmuch_config_values_destroy
void notmuch_config_values_destroy (notmuch_config_values_t * values)
Destroys a config values iterator, along with any associated resources ๐
Parameters
valuesโ iterator
Since: libnotmuch 5.4 (notmuch 0.32)
notmuch_config_get_pairs
notmuch_config_pairs_t * notmuch_config_get_pairs (notmuch_database_t *
notmuch, const char * prefix)
Returns an iterator for a (key, value) configuration pairs situation ๐
Parameters
notmuchโ databaseprefixโ prefix for keys. Pass""for all keys.
Since: libnotmuch 5.4 (notmuch 0.32)
Return values: NULL in case of error ๐ญ
notmuch_config_pairs_valid
notmuch_bool_t notmuch_config_pairs_valid (notmuch_config_pairs_t * pairs)
Is the given config_pairs iterator pointing at a valid element?
Parameters
pairsโ iterator
Since: libnotmuch 5.4 (notmuch 0.32)
Return values: FALSE if passed a NULL pointer, or the iterator is exhausted ๐
notmuch_config_pairs_move_to_next
void notmuch_config_pairs_move_to_next (notmuch_config_pairs_t * pairs)
Moves the config_pairs iterator to the next element.
Parameters
pairsโ iterator
Since: libnotmuch 5.4 (notmuch 0.32)
notmuch_config_pairs_key
const char * notmuch_config_pairs_key (notmuch_config_pairs_t * pairs)
Gets the current key from the config_pairs iterator.
Parameters
pairsโ iterator
Since: libnotmuch 5.4 (notmuch 0.32)
Return values: a string with the same lifetime as the iterator ๐
notmuch_config_pairs_value
const char * notmuch_config_pairs_value (notmuch_config_pairs_t * pairs)
Gets the current value from the config_pairs iterator.
Parameters
pairsโ iterator
Since: libnotmuch 5.4 (notmuch 0.32)
Return values: a string with the same lifetime as the iterator โญ
notmuch_config_pairs_destroy
void notmuch_config_pairs_destroy (notmuch_config_pairs_t * pairs)
Destroys a config_pairs iterator, along with any associated resources.
Parameters
pairsโ iterator
Since: libnotmuch 5.4 (notmuch 0.32)
notmuch_config_get_bool
notmuch_status_t notmuch_config_get_bool (notmuch_database_t * notmuch,
notmuch_config_key_t key, notmuch_bool_t * val)
Gets a configuration value from an open database as Boolean. This value reflects all configuration information given at the time the database was opened.
Parameters
notmuchโ databasekeyโ configuration keyvalโ configuration value, converted to Boolean
Since: libnotmuch 5.4 (notmuch 0.32)
Return values: NOTMUCH_STATUS_ILLEGAL_ARGUMENT if either key is unknown or the corresponding value does not convert to Boolean ๐ฅ
notmuch_config_path
const char * notmuch_config_path (notmuch_database_t * notmuch)
Returns the path of the config file loaded, if any.
Return values: NULL if no config file was loaded ๐ซถ
notmuch_database_get_default_indexopts
notmuch_indexopts_t * notmuch_database_get_default_indexopts
(notmuch_database_t * db)
Gets the current default indexing options for a given database. This object will survive until the database itself is destroyed, but the caller may also release it earlier with notmuch_indexopts_destroy ๐
This object represents a set of options on how a message can be added to the index. At the moment it is a featureless stub.
Since: libnotmuch 5.1 (notmuch 0.26)
Return values: NULL in case of error ๐
notmuch_indexopts_set_decrypt_policy
notmuch_status_t notmuch_indexopts_set_decrypt_policy (notmuch_indexopts_t *
indexopts, notmuch_decryption_policy_t decrypt_policy)
Specifies whether to decrypt encrypted parts while indexing.
โ ๏ธ Be aware that the index is likely sufficient to reconstruct the cleartext of the message itself, so please ensure that the notmuch message index is adequately protected. DO NOT SET THIS FLAG TO TRUE without considering the security of your index. This is not a drill, bestie ๐ญ๐
Since: libnotmuch 5.1 (notmuch 0.26)
notmuch_indexopts_get_decrypt_policy
notmuch_decryption_policy_t notmuch_indexopts_get_decrypt_policy (const
notmuch_indexopts_t * indexopts)
Returns whether to decrypt encrypted parts while indexing. See notmuch_indexopts_set_decrypt_policy โจ
Since: libnotmuch 5.1 (notmuch 0.26)
notmuch_indexopts_destroy
void notmuch_indexopts_destroy (notmuch_indexopts_t * options)
Destroys a notmuch_indexopts_t object.
Since: libnotmuch 5.1 (notmuch 0.26)
notmuch_built_with
notmuch_bool_t notmuch_built_with (const char * name)
Interrogates the library for compile time features. Cute little feature detective vibes ๐๐
Since: libnotmuch 4.4 (notmuch 0.23)
๐ AUTHOR ๐
Generated automatically by Doxygen for Notmuch 0.40 from the source code.
And thatโs the whole page, bestie ๐ซถ๐
The footer energy is: Notmuch 0.40, generated automatically by Doxygen from the source code, timestamped Mon May 4 2026 15:18:07, and the page is notmuch(3). Bye ๐โจ
๐ฆ where this page comes from
- ubuntu stonking: libnotmuch-dev 0.40-2ubuntu1 ยท GPL-3.0-or-later
- ๐ girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms