X-Git-Url: https://git.notmuchmail.org/git?p=notmuch;a=blobdiff_plain;f=lib%2Fnotmuch-private.h;h=ea836f721291c3d7d84bfb9edb3f70b3ea717155;hp=657816f17d665dafadf138f303943b58f34fcaaf;hb=1a53f9f116fa7c460cda3df532be921baaafb082;hpb=9b1c6c250b2413b987ffeccbf1cd69cb1e8b934d diff --git a/lib/notmuch-private.h b/lib/notmuch-private.h index 657816f1..ea836f72 100644 --- a/lib/notmuch-private.h +++ b/lib/notmuch-private.h @@ -26,6 +26,8 @@ #endif #include +#include "compat.h" + #include "notmuch.h" NOTMUCH_BEGIN_DECLS @@ -45,6 +47,9 @@ NOTMUCH_BEGIN_DECLS #include #include "xutil.h" +#include "error_util.h" + +#pragma GCC visibility push(hidden) #ifdef DEBUG # define DEBUG_DATABASE_SANITY 1 @@ -53,27 +58,17 @@ NOTMUCH_BEGIN_DECLS #define COMPILE_TIME_ASSERT(pred) ((void)sizeof(char[1 - 2*!(pred)])) -/* There's no point in continuing when we've detected that we've done - * something wrong internally (as opposed to the user passing in a - * bogus value). - * - * Note that PRINTF_ATTRIBUTE comes from talloc.h - */ -int -_internal_error (const char *format, ...) PRINTF_ATTRIBUTE (1, 2); - -/* There's no point in continuing when we've detected that we've done - * something wrong internally (as opposed to the user passing in a - * bogus value). - * - * Note that __location__ comes from talloc.h. - */ -#define INTERNAL_ERROR(format, ...) \ - _internal_error (format " (%s).\n", \ - ##__VA_ARGS__, __location__) +#define STRNCMP_LITERAL(var, literal) \ + strncmp ((var), (literal), sizeof (literal) - 1) #define unused(x) x __attribute__ ((unused)) +#ifdef __cplusplus +# define visible __attribute__((visibility("default"))) +#else +# define visible +#endif + /* Thanks to Andrew Tridgell's (SAMBA's) talloc for this definition of * unlikely. The talloc source code comes to us via the GNU LGPL v. 3. */ @@ -98,7 +93,9 @@ _internal_error (const char *format, ...) PRINTF_ATTRIBUTE (1, 2); typedef enum { NOTMUCH_VALUE_TIMESTAMP = 0, - NOTMUCH_VALUE_MESSAGE_ID + NOTMUCH_VALUE_MESSAGE_ID, + NOTMUCH_VALUE_FROM, + NOTMUCH_VALUE_SUBJECT } notmuch_value_t; /* Xapian (with flint backend) complains if we provide a term longer @@ -106,17 +103,29 @@ typedef enum { * programmatically. */ #define NOTMUCH_TERM_MAX 245 +#define NOTMUCH_METADATA_THREAD_ID_PREFIX "thread_id_" + +/* For message IDs we have to be even more restrictive. Beyond fitting + * into the term limit, we also use message IDs to construct + * metadata-key values. And the documentation says that these should + * be restricted to about 200 characters. (The actual limit for the + * chert backend at least is 252.) + */ +#define NOTMUCH_MESSAGE_ID_MAX (200 - sizeof (NOTMUCH_METADATA_THREAD_ID_PREFIX)) + typedef enum _notmuch_private_status { /* First, copy all the public status values. */ NOTMUCH_PRIVATE_STATUS_SUCCESS = NOTMUCH_STATUS_SUCCESS, NOTMUCH_PRIVATE_STATUS_OUT_OF_MEMORY = NOTMUCH_STATUS_OUT_OF_MEMORY, + NOTMUCH_PRIVATE_STATUS_READ_ONLY_DATABASE = NOTMUCH_STATUS_READ_ONLY_DATABASE, NOTMUCH_PRIVATE_STATUS_XAPIAN_EXCEPTION = NOTMUCH_STATUS_XAPIAN_EXCEPTION, NOTMUCH_PRIVATE_STATUS_FILE_NOT_EMAIL = NOTMUCH_STATUS_FILE_NOT_EMAIL, NOTMUCH_PRIVATE_STATUS_NULL_POINTER = NOTMUCH_STATUS_NULL_POINTER, NOTMUCH_PRIVATE_STATUS_TAG_TOO_LONG = NOTMUCH_STATUS_TAG_TOO_LONG, + NOTMUCH_PRIVATE_STATUS_UNBALANCED_FREEZE_THAW = NOTMUCH_STATUS_UNBALANCED_FREEZE_THAW, /* Then add our own private values. */ - NOTMUCH_PRIVATE_STATUS_TERM_TOO_LONG, + NOTMUCH_PRIVATE_STATUS_TERM_TOO_LONG = NOTMUCH_STATUS_LAST_STATUS, NOTMUCH_PRIVATE_STATUS_NO_DOCUMENT_FOUND, NOTMUCH_PRIVATE_STATUS_LAST_STATUS @@ -137,6 +146,10 @@ typedef enum _notmuch_private_status { : \ (notmuch_status_t) private_status) +typedef struct _notmuch_doc_id_set notmuch_doc_id_set_t; + +typedef struct _notmuch_string_list notmuch_string_list_t; + /* database.cc */ /* Lookup a prefix value by name. @@ -147,16 +160,66 @@ typedef enum _notmuch_private_status { const char * _find_prefix (const char *name); -char * -_parse_message_id (void *ctx, const char *message_id, const char **next); +notmuch_status_t +_notmuch_database_ensure_writable (notmuch_database_t *notmuch); + +const char * +_notmuch_database_relative_path (notmuch_database_t *notmuch, + const char *path); + +notmuch_status_t +_notmuch_database_split_path (void *ctx, + const char *path, + const char **directory, + const char **basename); + +const char * +_notmuch_database_get_directory_db_path (const char *path); + +unsigned int +_notmuch_database_generate_doc_id (notmuch_database_t *notmuch); + +notmuch_private_status_t +_notmuch_database_find_unique_doc_id (notmuch_database_t *notmuch, + const char *prefix_name, + const char *value, + unsigned int *doc_id); + +notmuch_status_t +_notmuch_database_find_directory_id (notmuch_database_t *database, + const char *path, + unsigned int *directory_id); + +const char * +_notmuch_database_get_directory_path (void *ctx, + notmuch_database_t *notmuch, + unsigned int doc_id); + +notmuch_status_t +_notmuch_database_filename_to_direntry (void *ctx, + notmuch_database_t *notmuch, + const char *filename, + char **direntry); + +/* directory.cc */ + +notmuch_directory_t * +_notmuch_directory_create (notmuch_database_t *notmuch, + const char *path, + notmuch_status_t *status_ret); + +unsigned int +_notmuch_directory_get_document_id (notmuch_directory_t *directory); /* thread.cc */ notmuch_thread_t * _notmuch_thread_create (void *ctx, notmuch_database_t *notmuch, - const char *thread_id, - const char *query_string); + unsigned int seed_doc_id, + notmuch_doc_id_set_t *match_set, + notmuch_string_list_t *excluded_terms, + notmuch_sort_t sort); /* message.cc */ @@ -167,13 +230,15 @@ _notmuch_message_create (const void *talloc_owner, notmuch_private_status_t *status); notmuch_message_t * -_notmuch_message_create_for_message_id (const void *talloc_owner, - notmuch_database_t *notmuch, +_notmuch_message_create_for_message_id (notmuch_database_t *notmuch, const char *message_id, notmuch_private_status_t *status); +unsigned int +_notmuch_message_get_doc_id (notmuch_message_t *message); + const char * -_notmuch_message_get_subject (notmuch_message_t *message); +_notmuch_message_get_in_reply_to (notmuch_message_t *message); notmuch_private_status_t _notmuch_message_add_term (notmuch_message_t *message, @@ -191,23 +256,63 @@ _notmuch_message_gen_terms (notmuch_message_t *message, const char *text); void -_notmuch_message_set_filename (notmuch_message_t *message, +_notmuch_message_upgrade_filename_storage (notmuch_message_t *message); + +notmuch_status_t +_notmuch_message_add_filename (notmuch_message_t *message, const char *filename); -void -_notmuch_message_add_thread_id (notmuch_message_t *message, - const char *thread_id); +notmuch_status_t +_notmuch_message_remove_filename (notmuch_message_t *message, + const char *filename); + +notmuch_status_t +_notmuch_message_rename (notmuch_message_t *message, + const char *new_filename); void _notmuch_message_ensure_thread_id (notmuch_message_t *message); void -_notmuch_message_set_date (notmuch_message_t *message, - const char *date); - +_notmuch_message_set_header_values (notmuch_message_t *message, + const char *date, + const char *from, + const char *subject); void _notmuch_message_sync (notmuch_message_t *message); +notmuch_status_t +_notmuch_message_delete (notmuch_message_t *message); + +void +_notmuch_message_close (notmuch_message_t *message); + +/* Get a copy of the data in this message document. + * + * Caller should talloc_free the result when done. + * + * This function is intended to support database upgrade and really + * shouldn't be used otherwise. */ +char * +_notmuch_message_talloc_copy_data (notmuch_message_t *message); + +/* Clear the data in this message document. + * + * This function is intended to support database upgrade and really + * shouldn't be used otherwise. */ +void +_notmuch_message_clear_data (notmuch_message_t *message); + +/* Set the author member of 'message' - this is the representation used + * when displaying the message */ +void +notmuch_message_set_author (notmuch_message_t *message, const char *author); + +/* Get the author member of 'message' */ +const char * +notmuch_message_get_author (notmuch_message_t *message); + + /* index.cc */ notmuch_status_t @@ -235,7 +340,7 @@ notmuch_message_file_open (const char *filename); notmuch_message_file_t * _notmuch_message_file_open_ctx (void *ctx, const char *filename); -/* Close a notmuch message preivously opened with notmuch_message_open. */ +/* Close a notmuch message previously opened with notmuch_message_open. */ void notmuch_message_file_close (notmuch_message_file_t *message); @@ -267,6 +372,9 @@ notmuch_message_file_restrict_headersv (notmuch_message_file_t *message, * * The header name is case insensitive. * + * The Received: header is special - for it all Received: headers in + * the message are concatenated + * * The returned value is owned by the notmuch message and is valid * only until the message is closed. The caller should copy it if * needing to modify the value or to hold onto it for longer. @@ -280,24 +388,64 @@ notmuch_message_file_get_header (notmuch_message_file_t *message, /* messages.c */ +typedef struct _notmuch_message_node { + notmuch_message_t *message; + struct _notmuch_message_node *next; +} notmuch_message_node_t; + +typedef struct _notmuch_message_list { + notmuch_message_node_t *head; + notmuch_message_node_t **tail; +} notmuch_message_list_t; + +/* There's a rumor that there's an alternate struct _notmuch_messages + * somewhere with some nasty C++ objects in it. We'll try to maintain + * ignorance of that here. (See notmuch_mset_messages_t in query.cc) + */ +struct visible _notmuch_messages { + notmuch_bool_t is_of_list_type; + notmuch_doc_id_set_t *excluded_doc_ids; + notmuch_message_node_t *iterator; +}; + +notmuch_message_list_t * +_notmuch_message_list_create (const void *ctx); + +void +_notmuch_message_list_append (notmuch_message_list_t *list, + notmuch_message_node_t *node); + +void +_notmuch_message_list_add_message (notmuch_message_list_t *list, + notmuch_message_t *message); + notmuch_messages_t * -_notmuch_messages_create (void *ctx); +_notmuch_messages_create (notmuch_message_list_t *list); + +/* query.cc */ + +notmuch_bool_t +_notmuch_mset_messages_valid (notmuch_messages_t *messages); + +notmuch_message_t * +_notmuch_mset_messages_get (notmuch_messages_t *messages); void -_notmuch_messages_add_message (notmuch_messages_t *messages, - notmuch_message_t *message); +_notmuch_mset_messages_move_to_next (notmuch_messages_t *messages); -/* date.c */ +notmuch_bool_t +_notmuch_doc_id_set_contains (notmuch_doc_id_set_t *doc_ids, + unsigned int doc_id); -/* Parse an RFC 8222 date string to a time_t value. - * - * The tz_offset argument can be used to also obtain the time-zone - * offset, (but can be NULL if the call is not interested in that). - * - * Returns 0 on error. - */ -time_t -notmuch_parse_date (const char *str, int *tz_offset); +void +_notmuch_doc_id_set_remove (notmuch_doc_id_set_t *doc_ids, + unsigned int doc_id); + +/* message.cc */ + +void +_notmuch_message_add_reply (notmuch_message_t *message, + notmuch_message_node_t *reply); /* sha1.c */ @@ -307,16 +455,47 @@ notmuch_sha1_of_string (const char *str); char * notmuch_sha1_of_file (const char *filename); -/* tags.c */ +/* string-list.c */ -notmuch_tags_t * -_notmuch_tags_create (void *ctx); +typedef struct _notmuch_string_node { + char *string; + struct _notmuch_string_node *next; +} notmuch_string_node_t; + +struct visible _notmuch_string_list { + int length; + notmuch_string_node_t *head; + notmuch_string_node_t **tail; +}; + +notmuch_string_list_t * +_notmuch_string_list_create (const void *ctx); +/* Add 'string' to 'list'. + * + * The list will create its own talloced copy of 'string'. + */ void -_notmuch_tags_add_tag (notmuch_tags_t *tags, const char *tag); +_notmuch_string_list_append (notmuch_string_list_t *list, + const char *string); void -_notmuch_tags_prepare_iterator (notmuch_tags_t *tags); +_notmuch_string_list_sort (notmuch_string_list_t *list); + +/* tags.c */ + +notmuch_tags_t * +_notmuch_tags_create (const void *ctx, notmuch_string_list_t *list); + +/* filenames.c */ + +/* The notmuch_filenames_t iterates over a notmuch_string_list_t of + * file names */ +notmuch_filenames_t * +_notmuch_filenames_create (const void *ctx, + notmuch_string_list_t *list); + +#pragma GCC visibility pop NOTMUCH_END_DECLS