mail-index-transaction-private.h revision 1279090ba03f9c176976a69ab7718f0ed77b19af
76b43e4417bab52e913da39b5f5bc2a130d3f149Timo Sirainen#ifndef MAIL_INDEX_TRANSACTION_PRIVATE_H
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen#define MAIL_INDEX_TRANSACTION_PRIVATE_H
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen#include "seq-range-array.h"
eff552f5fdc275c940c4c709eeeddb833bc51b40Timo Sirainen#include "mail-transaction-log.h"
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen
25757faf029c369a8318349dafe952e2358df1d8Timo SirainenARRAY_DEFINE_TYPE(seq_array_array, ARRAY_TYPE(seq_array));
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen
12aad74464367f7e8be11eafe1af985bf7b1adecTimo Sirainenstruct mail_index_transaction_keyword_update {
12aad74464367f7e8be11eafe1af985bf7b1adecTimo Sirainen ARRAY_TYPE(seq_range) add_seq;
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen ARRAY_TYPE(seq_range) remove_seq;
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen};
b42f37ae6f65ed986315b6885568d32115e589b1Timo Sirainen
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainenstruct mail_index_transaction_ext_hdr_update {
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen size_t alloc_size;
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen /* mask is in bytes, not bits */
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen unsigned char *mask;
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen unsigned char *data;
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen};
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainenstruct mail_index_transaction_vfuncs {
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen int (*commit)(struct mail_index_transaction *t,
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen uint32_t *log_file_seq_r, uoff_t *log_file_offset_r);
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen void (*rollback)(struct mail_index_transaction *t);
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen};
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainenunion mail_index_transaction_module_context {
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen struct mail_index_module_register *reg;
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen};
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainenstruct mail_index_transaction {
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen int refcount;
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen enum mail_index_transaction_flags flags;
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen struct mail_index_transaction_vfuncs v;
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen struct mail_index_view *view;
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen /* NOTE: If you add anything new, remember to update
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen mail_index_transaction_reset() to reset it. */
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen ARRAY_DEFINE(appends, struct mail_index_record);
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen uint32_t first_new_seq, last_new_seq;
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen uint32_t highest_append_uid;
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen /* lowest/highest sequence that updates flags/keywords */
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen uint32_t min_flagupdate_seq, max_flagupdate_seq;
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen ARRAY_TYPE(seq_range) expunges;
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen ARRAY_DEFINE(updates, struct mail_transaction_flag_update);
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen size_t last_update_idx;
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen
1f1e81aab38d833d1c9cdc244c91fd762e0080d4Timo Sirainen unsigned char pre_hdr_change[sizeof(struct mail_index_header)];
12aad74464367f7e8be11eafe1af985bf7b1adecTimo Sirainen unsigned char pre_hdr_mask[sizeof(struct mail_index_header)];
12aad74464367f7e8be11eafe1af985bf7b1adecTimo Sirainen unsigned char post_hdr_change[sizeof(struct mail_index_header)];
12aad74464367f7e8be11eafe1af985bf7b1adecTimo Sirainen unsigned char post_hdr_mask[sizeof(struct mail_index_header)];
2521482f3f897c83f7d5a2f9e17fe99fa4ba2cbeTimo Sirainen
2521482f3f897c83f7d5a2f9e17fe99fa4ba2cbeTimo Sirainen ARRAY_DEFINE(ext_hdr_updates,
12aad74464367f7e8be11eafe1af985bf7b1adecTimo Sirainen struct mail_index_transaction_ext_hdr_update);
137ea7ca34005345aa2304a940149b7f3774d727Timo Sirainen ARRAY_TYPE(seq_array_array) ext_rec_updates;
137ea7ca34005345aa2304a940149b7f3774d727Timo Sirainen ARRAY_TYPE(seq_array_array) ext_rec_atomics;
137ea7ca34005345aa2304a940149b7f3774d727Timo Sirainen ARRAY_DEFINE(ext_resizes, struct mail_transaction_ext_intro);
2521482f3f897c83f7d5a2f9e17fe99fa4ba2cbeTimo Sirainen ARRAY_DEFINE(ext_resets, struct mail_transaction_ext_reset);
2521482f3f897c83f7d5a2f9e17fe99fa4ba2cbeTimo Sirainen ARRAY_DEFINE(ext_reset_ids, uint32_t);
2521482f3f897c83f7d5a2f9e17fe99fa4ba2cbeTimo Sirainen ARRAY_DEFINE(ext_reset_atomic, uint32_t);
2521482f3f897c83f7d5a2f9e17fe99fa4ba2cbeTimo Sirainen
2521482f3f897c83f7d5a2f9e17fe99fa4ba2cbeTimo Sirainen ARRAY_DEFINE(keyword_updates,
12aad74464367f7e8be11eafe1af985bf7b1adecTimo Sirainen struct mail_index_transaction_keyword_update);
12aad74464367f7e8be11eafe1af985bf7b1adecTimo Sirainen ARRAY_TYPE(seq_range) keyword_resets;
12aad74464367f7e8be11eafe1af985bf7b1adecTimo Sirainen
12aad74464367f7e8be11eafe1af985bf7b1adecTimo Sirainen uint64_t max_modseq;
49e513d090753ccbf95560b2f3a21f081a5b6c51Timo Sirainen ARRAY_TYPE(seq_range) *conflict_seqs;
73e19ec2d5069ea125dcd1ede5d8a70f701fd9a8Timo Sirainen
12aad74464367f7e8be11eafe1af985bf7b1adecTimo Sirainen struct mail_cache_transaction_ctx *cache_trans_ctx;
12aad74464367f7e8be11eafe1af985bf7b1adecTimo Sirainen
12aad74464367f7e8be11eafe1af985bf7b1adecTimo Sirainen /* Module-specific contexts. */
12aad74464367f7e8be11eafe1af985bf7b1adecTimo Sirainen ARRAY_DEFINE(module_contexts,
12aad74464367f7e8be11eafe1af985bf7b1adecTimo Sirainen union mail_index_transaction_module_context *);
12aad74464367f7e8be11eafe1af985bf7b1adecTimo Sirainen
12aad74464367f7e8be11eafe1af985bf7b1adecTimo Sirainen unsigned int no_appends:1;
12aad74464367f7e8be11eafe1af985bf7b1adecTimo Sirainen
12aad74464367f7e8be11eafe1af985bf7b1adecTimo Sirainen unsigned int sync_transaction:1;
2521482f3f897c83f7d5a2f9e17fe99fa4ba2cbeTimo Sirainen unsigned int appends_nonsorted:1;
2521482f3f897c83f7d5a2f9e17fe99fa4ba2cbeTimo Sirainen unsigned int pre_hdr_changed:1;
12aad74464367f7e8be11eafe1af985bf7b1adecTimo Sirainen unsigned int post_hdr_changed:1;
137ea7ca34005345aa2304a940149b7f3774d727Timo Sirainen unsigned int reset:1;
ccfc6441cadb577084daeb1f0aa3dd7bdfa2a220Timo Sirainen /* non-extension updates. flag updates don't change this because
137ea7ca34005345aa2304a940149b7f3774d727Timo Sirainen they may be added and removed, so be sure to check that the updates
2521482f3f897c83f7d5a2f9e17fe99fa4ba2cbeTimo Sirainen array is non-empty also. */
2521482f3f897c83f7d5a2f9e17fe99fa4ba2cbeTimo Sirainen unsigned int log_updates:1;
2521482f3f897c83f7d5a2f9e17fe99fa4ba2cbeTimo Sirainen /* extension updates */
2521482f3f897c83f7d5a2f9e17fe99fa4ba2cbeTimo Sirainen unsigned int log_ext_updates:1;
2521482f3f897c83f7d5a2f9e17fe99fa4ba2cbeTimo Sirainen};
12aad74464367f7e8be11eafe1af985bf7b1adecTimo Sirainen
12aad74464367f7e8be11eafe1af985bf7b1adecTimo Sirainen#define MAIL_INDEX_TRANSACTION_HAS_CHANGES(t) \
12aad74464367f7e8be11eafe1af985bf7b1adecTimo Sirainen ((t)->log_updates || (t)->log_ext_updates || \
12aad74464367f7e8be11eafe1af985bf7b1adecTimo Sirainen (array_is_created(&(t)->updates) && array_count(&(t)->updates) > 0))
49e513d090753ccbf95560b2f3a21f081a5b6c51Timo Sirainen
73e19ec2d5069ea125dcd1ede5d8a70f701fd9a8Timo Sirainenextern void (*hook_mail_index_transaction_created)
12aad74464367f7e8be11eafe1af985bf7b1adecTimo Sirainen (struct mail_index_transaction *t);
12aad74464367f7e8be11eafe1af985bf7b1adecTimo Sirainen
12aad74464367f7e8be11eafe1af985bf7b1adecTimo Sirainenstruct mail_index_record *
12aad74464367f7e8be11eafe1af985bf7b1adecTimo Sirainenmail_index_transaction_lookup(struct mail_index_transaction *t, uint32_t seq);
12aad74464367f7e8be11eafe1af985bf7b1adecTimo Sirainen
12aad74464367f7e8be11eafe1af985bf7b1adecTimo Sirainenvoid mail_index_transaction_ref(struct mail_index_transaction *t);
e9503210d3521a6833ed62dc332fc42ffb0e7a13Timo Sirainenvoid mail_index_transaction_unref(struct mail_index_transaction **t);
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainenvoid mail_index_transaction_sort_appends(struct mail_index_transaction *t);
e9503210d3521a6833ed62dc332fc42ffb0e7a13Timo Sirainenuint32_t mail_index_transaction_get_next_uid(struct mail_index_transaction *t);
965ed6ea3fc8f7637bd0d159d2fdb283a191ce34Timo Sirainenvoid mail_index_transaction_set_log_updates(struct mail_index_transaction *t);
91e4199476cb2add8143c18583fa57e1decfea88Timo Sirainen
0727e38ac12efb8963a339daf56255e2be1f29fcTimo Sirainenunsigned int
e9503210d3521a6833ed62dc332fc42ffb0e7a13Timo Sirainenmail_index_transaction_get_flag_update_pos(struct mail_index_transaction *t,
e9503210d3521a6833ed62dc332fc42ffb0e7a13Timo Sirainen unsigned int left_idx,
e9503210d3521a6833ed62dc332fc42ffb0e7a13Timo Sirainen unsigned int right_idx,
e9503210d3521a6833ed62dc332fc42ffb0e7a13Timo Sirainen uint32_t seq);
e9503210d3521a6833ed62dc332fc42ffb0e7a13Timo Sirainen
e9503210d3521a6833ed62dc332fc42ffb0e7a13Timo Sirainenbool mail_index_seq_array_lookup(const ARRAY_TYPE(seq_array) *array,
e9503210d3521a6833ed62dc332fc42ffb0e7a13Timo Sirainen uint32_t seq, unsigned int *idx_r);
08aea01ef9a9d20703e0fcf8618e6195c0037a44Timo Sirainenbool mail_index_seq_array_add(ARRAY_TYPE(seq_array) *array, uint32_t seq,
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen const void *record, size_t record_size,
d5abbb932a0a598f002da39a8b3326643b1b5efcTimo Sirainen void *old_record);
d5abbb932a0a598f002da39a8b3326643b1b5efcTimo Sirainen
d5abbb932a0a598f002da39a8b3326643b1b5efcTimo Sirainenint mail_index_transaction_finish(struct mail_index_transaction *t);
d5abbb932a0a598f002da39a8b3326643b1b5efcTimo Sirainenvoid mail_index_transaction_export(struct mail_index_transaction *t,
747e77e3ab073a8e9e69c7a3e71b4593c5655d03Timo Sirainen struct mail_transaction_log_append_ctx *append_ctx);
747e77e3ab073a8e9e69c7a3e71b4593c5655d03Timo Sirainen
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen#endif
dd93aba1901a457346990f49c54a738947dc7128Timo Sirainen