mail-search.h revision 1cc4d4d1a2ca48a82434da470872392c1bdcb651
551fef69c0633ae3c7738038e047a7c0762d9599Timo Sirainen /* sequence sets */
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainen /* dates (date_type required) */
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainen SEARCH_ON, /* time must point to beginning of the day */
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainen /* headers */
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainen /* extensions */
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainen /* For BEFORE/SINCE/ON searches: Don't drop timezone from
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainen comparisons */
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainen const char *str;
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainen const char *hdr_field_name; /* for SEARCH_HEADER* */
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainen unsigned int match_not:1; /* result = !result */
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainen unsigned int match_always:1; /* result = 1 always */
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainen unsigned int nonmatch_always:1; /* result = 0 always */
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainen unsigned int fuzzy:1; /* use fuzzy matching for this arg */
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainen int result; /* -1 = unknown, 0 = unmatched, 1 = matched */
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainen /* Stop mail_search_next() when finding a non-matching mail.
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainen (Could be useful when wanting to find only the oldest mails.) */
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainentypedef void mail_search_foreach_callback_t(struct mail_search_arg *arg,
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainen/* Allocate keywords for search arguments. If change_uidsets is TRUE,
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainen change uidsets to seqsets. */
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainenvoid mail_search_args_init(struct mail_search_args *args,
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainen const ARRAY_TYPE(seq_range) *search_saved_uidset)
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainen/* Free keywords. The args can initialized afterwards again if needed.
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainen The args can be reused for other queries after calling this. */
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainenvoid mail_search_args_deinit(struct mail_search_args *args);
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainen/* Convert sequence sets in args to UIDs. */
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainenvoid mail_search_args_seq2uid(struct mail_search_args *args);
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainen/* Returns TRUE if the two search arguments are fully compatible.
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainen Always returns FALSE if there are seqsets, since they may point to different
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainen messages depending on when the search is run. */
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainenbool mail_search_args_equal(const struct mail_search_args *args1,
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainenvoid mail_search_args_ref(struct mail_search_args *args);
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainenvoid mail_search_args_unref(struct mail_search_args **args);
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainenmail_search_args_dup(const struct mail_search_args *args);
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainenmail_search_arg_dup(pool_t pool, const struct mail_search_arg *arg);
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainen/* Reset the results in search arguments. match_always is reset only if
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainen full_reset is TRUE. */
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainenvoid mail_search_args_reset(struct mail_search_arg *args, bool full_reset);
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainen/* goes through arguments in list that don't have a result yet.
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainen Returns 1 = search matched, 0 = search unmatched, -1 = don't know yet */
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainenint mail_search_args_foreach(struct mail_search_arg *args,
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainen#define mail_search_args_foreach(args, callback, context) \
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainen struct mail_search_arg *, typeof(context))), \
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainen (mail_search_foreach_callback_t *)callback, context)
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainen/* Fills have_headers and have_body based on if such search argument exists
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainen that needs to be checked. Returns the headers that we're searching for, or
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainen NULL if we're searching for TEXT. */
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainenconst char *const *
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainenmail_search_args_analyze(struct mail_search_arg *args,
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainen/* Returns FALSE if search query contains MAILBOX[_GLOB] args such that the
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainen query can never match any messages in the given mailbox. */
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainenbool mail_search_args_match_mailbox(struct mail_search_args *args,
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainen/* Simplify/optimize search arguments. Afterwards all OR/SUB args are
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainen guaranteed to have match_not=FALSE. */
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainenvoid mail_search_args_simplify(struct mail_search_args *args);
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainen/* Append all args as IMAP SEARCH AND-query to the dest string and returns TRUE.
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainen If some search arg can't be written as IMAP SEARCH parameter, error_r is set
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainen and FALSE is returned. */
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainenbool mail_search_args_to_imap(string_t *dest, const struct mail_search_arg *args,
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainen const char **error_r);
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainen/* Like mail_search_args_to_imap(), but append only a single arg. */
bf7dc750b95039981c0e9d728f313d50cf38a156Martti Rannanjärvibool mail_search_arg_to_imap(string_t *dest, const struct mail_search_arg *arg,
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainen const char **error_r);
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainen/* Serialization for search args' results. */
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainenvoid mail_search_args_result_serialize(const struct mail_search_args *args,
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainenvoid mail_search_args_result_deserialize(struct mail_search_args *args,
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainen const unsigned char *data,