mail-search.h revision cb8d97555cc3e686aa1f446bc32d0213486d38fb
2454dfa32c93c20a8522c6ed42fe057baaac9f9aStephan Bosch#ifndef MAIL_SEARCH_H
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen#define MAIL_SEARCH_H
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen#include "seq-range-array.h"
5e327e031d1591f8bff17b67eba7139afbd36cddTimo Sirainen#include "mail-types.h"
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen#include "mail-thread.h"
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainenenum mail_search_arg_type {
a2fdfd2efdbb2d912aad23900a466cf74114920bTimo Sirainen SEARCH_OR,
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen SEARCH_SUB,
1e11a94ec50fc9b57eb2c859771c6a326ccaf86fAki Tuomi
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen /* sequence sets */
c6be98b5270900746f35ebe28bd636019976e29eTimo Sirainen SEARCH_ALL,
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen SEARCH_SEQSET,
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen SEARCH_UIDSET,
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen
1e11a94ec50fc9b57eb2c859771c6a326ccaf86fAki Tuomi /* flags */
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen SEARCH_FLAGS,
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen SEARCH_KEYWORDS,
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen
1e11a94ec50fc9b57eb2c859771c6a326ccaf86fAki Tuomi /* dates */
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen SEARCH_BEFORE,
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen SEARCH_ON, /* time must point to beginning of the day */
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen SEARCH_SINCE,
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen SEARCH_SENTBEFORE,
5e327e031d1591f8bff17b67eba7139afbd36cddTimo Sirainen SEARCH_SENTON, /* time must point to beginning of the day */
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen SEARCH_SENTSINCE,
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen
f36c4185474823594a78b3f252e79d8923522c36Timo Sirainen /* sizes */
f36c4185474823594a78b3f252e79d8923522c36Timo Sirainen SEARCH_SMALLER,
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen SEARCH_LARGER,
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen /* headers */
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen SEARCH_HEADER,
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen SEARCH_HEADER_ADDRESS,
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen SEARCH_HEADER_COMPRESS_LWSP,
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen /* body */
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen SEARCH_BODY,
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen SEARCH_TEXT,
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen SEARCH_BODY_FAST,
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen SEARCH_TEXT_FAST,
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen
1e11a94ec50fc9b57eb2c859771c6a326ccaf86fAki Tuomi /* extensions */
f300f927771a39549ce6cb7607129508e9041b4aStephan Bosch SEARCH_MODSEQ,
1e11a94ec50fc9b57eb2c859771c6a326ccaf86fAki Tuomi SEARCH_INTHREAD,
e60c3e17c656c53da60f0ac51aa15e9ef2742d77Stephan Bosch SEARCH_GUID,
1e11a94ec50fc9b57eb2c859771c6a326ccaf86fAki Tuomi SEARCH_MAILBOX
1e11a94ec50fc9b57eb2c859771c6a326ccaf86fAki Tuomi};
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainenenum mail_search_arg_flag {
45ead232666a47819e89dc71dec57767340d0b62Timo Sirainen /* For (SENT)BEFORE/SINCE/ON searches: Don't drop timezone from
45ead232666a47819e89dc71dec57767340d0b62Timo Sirainen comparisons */
45ead232666a47819e89dc71dec57767340d0b62Timo Sirainen MAIL_SEARCH_ARG_FLAG_USE_TZ = 0x01,
45ead232666a47819e89dc71dec57767340d0b62Timo Sirainen};
45ead232666a47819e89dc71dec57767340d0b62Timo Sirainen
45ead232666a47819e89dc71dec57767340d0b62Timo Sirainenenum mail_search_modseq_type {
1e11a94ec50fc9b57eb2c859771c6a326ccaf86fAki Tuomi MAIL_SEARCH_MODSEQ_TYPE_ANY = 0,
1e11a94ec50fc9b57eb2c859771c6a326ccaf86fAki Tuomi MAIL_SEARCH_MODSEQ_TYPE_PRIVATE,
1e11a94ec50fc9b57eb2c859771c6a326ccaf86fAki Tuomi MAIL_SEARCH_MODSEQ_TYPE_SHARED
1e11a94ec50fc9b57eb2c859771c6a326ccaf86fAki Tuomi};
1e11a94ec50fc9b57eb2c859771c6a326ccaf86fAki Tuomi
1e11a94ec50fc9b57eb2c859771c6a326ccaf86fAki Tuomistruct mail_search_modseq {
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen uint64_t modseq;
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen enum mail_search_modseq_type type;
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen};
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainenstruct mail_search_arg {
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen struct mail_search_arg *next;
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen enum mail_search_arg_type type;
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen struct {
f36c4185474823594a78b3f252e79d8923522c36Timo Sirainen struct mail_search_arg *subargs;
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen ARRAY_TYPE(seq_range) seqset;
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen const char *str;
f36c4185474823594a78b3f252e79d8923522c36Timo Sirainen time_t time;
5e327e031d1591f8bff17b67eba7139afbd36cddTimo Sirainen uoff_t size;
5e327e031d1591f8bff17b67eba7139afbd36cddTimo Sirainen enum mail_flags flags;
5e327e031d1591f8bff17b67eba7139afbd36cddTimo Sirainen enum mail_search_arg_flag search_flags;
5e327e031d1591f8bff17b67eba7139afbd36cddTimo Sirainen enum mail_thread_type thread_type;
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen struct mail_keywords *keywords;
45ead232666a47819e89dc71dec57767340d0b62Timo Sirainen struct mail_search_modseq *modseq;
a13b1245bee0b6524b4aeb3c8fd9e34af648b746Aki Tuomi struct mail_search_args *search_args;
c6be98b5270900746f35ebe28bd636019976e29eTimo Sirainen struct mail_search_result *search_result;
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen } value;
80a225c0b1f4bf322a562cc7c21d5891fb6895eeStephan Bosch
a2fdfd2efdbb2d912aad23900a466cf74114920bTimo Sirainen void *context;
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen const char *hdr_field_name; /* for SEARCH_HEADER* */
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen unsigned int not:1;
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen unsigned int match_always:1; /* result = 1 always */
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen int result; /* -1 = unknown, 0 = unmatched, 1 = matched */
80a225c0b1f4bf322a562cc7c21d5891fb6895eeStephan Bosch};
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen
c6be98b5270900746f35ebe28bd636019976e29eTimo Sirainenstruct mail_search_args {
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen int refcount;
a2fdfd2efdbb2d912aad23900a466cf74114920bTimo Sirainen pool_t pool;
237a6211c7fc4d6dbb58dd0467da6dba1b8f21f6Timo Sirainen struct mailbox *box;
45ead232666a47819e89dc71dec57767340d0b62Timo Sirainen struct mail_search_arg *args;
f36c4185474823594a78b3f252e79d8923522c36Timo Sirainen const char *charset;
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen unsigned int initialized:1;
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen unsigned int simplified:1;
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen unsigned int have_inthreads:1;
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen};
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen#define ARG_SET_RESULT(arg, res) \
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen STMT_START { \
2d1892aaeb63b9774237b6e60d6bb04bf6f8259cTimo Sirainen (arg)->result = !(arg)->not ? (res) : \
2d1892aaeb63b9774237b6e60d6bb04bf6f8259cTimo Sirainen (res) == -1 ? -1 : !(res); \
c1fc5a97a15332f1253ee13a9cab65a7b4b6cd5fTimo Sirainen } STMT_END
c1fc5a97a15332f1253ee13a9cab65a7b4b6cd5fTimo Sirainen
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainentypedef void mail_search_foreach_callback_t(struct mail_search_arg *arg,
107659c01b2359b0ee426bde020c8d4e29ede30dTimo Sirainen void *context);
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen
2d1892aaeb63b9774237b6e60d6bb04bf6f8259cTimo Sirainen/* Allocate keywords for search arguments. If change_uidsets is TRUE,
107659c01b2359b0ee426bde020c8d4e29ede30dTimo Sirainen change uidsets to seqsets. */
107659c01b2359b0ee426bde020c8d4e29ede30dTimo Sirainenvoid mail_search_args_init(struct mail_search_args *args,
107659c01b2359b0ee426bde020c8d4e29ede30dTimo Sirainen struct mailbox *box, bool change_uidsets,
107659c01b2359b0ee426bde020c8d4e29ede30dTimo Sirainen const ARRAY_TYPE(seq_range) *search_saved_uidset);
107659c01b2359b0ee426bde020c8d4e29ede30dTimo Sirainen/* Free keywords. The args can initialized afterwards again if needed. */
107659c01b2359b0ee426bde020c8d4e29ede30dTimo Sirainenvoid mail_search_args_deinit(struct mail_search_args *args);
107659c01b2359b0ee426bde020c8d4e29ede30dTimo Sirainen/* Convert sequence sets in args to UIDs. */
107659c01b2359b0ee426bde020c8d4e29ede30dTimo Sirainenvoid mail_search_args_seq2uid(struct mail_search_args *args);
107659c01b2359b0ee426bde020c8d4e29ede30dTimo Sirainen/* Returns TRUE if the two search arguments are fully compatible.
107659c01b2359b0ee426bde020c8d4e29ede30dTimo Sirainen Always returns FALSE if there are seqsets, since they may point to different
107659c01b2359b0ee426bde020c8d4e29ede30dTimo Sirainen messages depending on when the search is run. */
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainenbool mail_search_args_equal(const struct mail_search_args *args1,
efe78d3ba24fc866af1c79b9223dc0809ba26cadStephan Bosch const struct mail_search_args *args2);
c1fc5a97a15332f1253ee13a9cab65a7b4b6cd5fTimo Sirainen
c1fc5a97a15332f1253ee13a9cab65a7b4b6cd5fTimo Sirainenvoid mail_search_args_ref(struct mail_search_args *args);
c1fc5a97a15332f1253ee13a9cab65a7b4b6cd5fTimo Sirainenvoid mail_search_args_unref(struct mail_search_args **args);
c1fc5a97a15332f1253ee13a9cab65a7b4b6cd5fTimo Sirainen
c1fc5a97a15332f1253ee13a9cab65a7b4b6cd5fTimo Sirainen/* Reset the results in search arguments. match_always is reset only if
c1fc5a97a15332f1253ee13a9cab65a7b4b6cd5fTimo Sirainen full_reset is TRUE. */
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainenvoid mail_search_args_reset(struct mail_search_arg *args, bool full_reset);
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen/* goes through arguments in list that don't have a result yet.
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen Returns 1 = search matched, 0 = search unmatched, -1 = don't know yet */
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainenint mail_search_args_foreach(struct mail_search_arg *args,
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen mail_search_foreach_callback_t *callback,
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen void *context);
d6b3cfd855c0eebed68be50d3111de1b5a6afeb0Timo Sirainen#ifdef CONTEXT_TYPE_SAFETY
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen# define mail_search_args_foreach(args, callback, context) \
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen ({(void)(1 ? 0 : callback((struct mail_search_arg *)NULL, context)); \
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen mail_search_args_foreach(args, \
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen (mail_search_foreach_callback_t *)callback, context); })
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen#else
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen# define mail_search_args_foreach(args, callback, context) \
mail_search_args_foreach(args, \
(mail_search_foreach_callback_t *)callback, context)
#endif
/* Fills have_headers and have_body based on if such search argument exists
that needs to be checked. Returns the headers that we're searching for, or
NULL if we're searching for TEXT. */
const char *const *
mail_search_args_analyze(struct mail_search_arg *args,
bool *have_headers, bool *have_body);
/* Simplify/optimize search arguments */
void mail_search_args_simplify(struct mail_search_args *args);
#endif