mail-index-transaction-private.h revision 515f81466f673c1b4f72e053f1a9686e6fca6b61
c25356d5978632df6203437e1953bcb29e0c736fTimo Sirainen#ifndef MAIL_INDEX_TRANSACTION_PRIVATE_H
c25356d5978632df6203437e1953bcb29e0c736fTimo Sirainen#define MAIL_INDEX_TRANSACTION_PRIVATE_H
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
8d80659e504ffb34bb0c6a633184fece35751b18Timo Sirainen#include "seq-range-array.h"
24fc71a693331ffe77e2b6d81c70aca6fa055e47Timo Sirainen#include "mail-transaction-log.h"
24fc71a693331ffe77e2b6d81c70aca6fa055e47Timo Sirainen
c5794838af9995f50bfecb06a3cd4f9a0ac77858Timo SirainenARRAY_DEFINE_TYPE(seq_array_array, ARRAY_TYPE(seq_array));
c5794838af9995f50bfecb06a3cd4f9a0ac77858Timo Sirainen
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainenstruct mail_index_transaction_keyword_update {
8d80659e504ffb34bb0c6a633184fece35751b18Timo Sirainen ARRAY_TYPE(seq_range) add_seq;
8d80659e504ffb34bb0c6a633184fece35751b18Timo Sirainen ARRAY_TYPE(seq_range) remove_seq;
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen};
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen
beb6125ee872e7fed57745ab33e6de99639180f3Timo Sirainenstruct mail_index_transaction_ext_hdr_update {
81a5d8714c566ce50c4a2409f59e82e716d576d2Timo Sirainen size_t alloc_size;
81a5d8714c566ce50c4a2409f59e82e716d576d2Timo Sirainen /* mask is in bytes, not bits */
81a5d8714c566ce50c4a2409f59e82e716d576d2Timo Sirainen unsigned char *mask;
81a5d8714c566ce50c4a2409f59e82e716d576d2Timo Sirainen unsigned char *data;
beb6125ee872e7fed57745ab33e6de99639180f3Timo Sirainen};
beb6125ee872e7fed57745ab33e6de99639180f3Timo Sirainen
d6badc27cd6e8d3398877b6766cb0aaeef3a7800Timo Sirainenstruct mail_index_transaction_vfuncs {
5e40ed3f0a2c2acddc9b8eab59670c7a850114c5Timo Sirainen void (*reset)(struct mail_index_transaction *t);
d6badc27cd6e8d3398877b6766cb0aaeef3a7800Timo Sirainen int (*commit)(struct mail_index_transaction *t,
9f19a50d5966643c4d1c5ca06868ac2ad31bc4d5Timo Sirainen struct mail_index_transaction_commit_result *result_r);
d6badc27cd6e8d3398877b6766cb0aaeef3a7800Timo Sirainen void (*rollback)(struct mail_index_transaction *t);
d6badc27cd6e8d3398877b6766cb0aaeef3a7800Timo Sirainen};
d6badc27cd6e8d3398877b6766cb0aaeef3a7800Timo Sirainen
46c31f64b9f0949f00b7819f45b22f2d64b2ea27Timo Sirainenunion mail_index_transaction_module_context {
46c31f64b9f0949f00b7819f45b22f2d64b2ea27Timo Sirainen struct mail_index_module_register *reg;
46c31f64b9f0949f00b7819f45b22f2d64b2ea27Timo Sirainen};
46c31f64b9f0949f00b7819f45b22f2d64b2ea27Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenstruct mail_index_transaction {
09c3a491f4f6ccebe290c7709bdc0d79a187610bTimo Sirainen int refcount;
d6badc27cd6e8d3398877b6766cb0aaeef3a7800Timo Sirainen
db87d16551d1081ada01f787ea21aa3ed1402c31Timo Sirainen enum mail_index_transaction_flags flags;
d6badc27cd6e8d3398877b6766cb0aaeef3a7800Timo Sirainen struct mail_index_transaction_vfuncs v;
09c3a491f4f6ccebe290c7709bdc0d79a187610bTimo Sirainen struct mail_index_view *view;
515f81466f673c1b4f72e053f1a9686e6fca6b61Timo Sirainen struct mail_index_view *latest_view;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
ae8817f05005f57bba32479a610b52d083e2b6ebTimo Sirainen /* NOTE: If you add anything new, remember to update
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen mail_index_transaction_reset_v() to reset it. */
8d80659e504ffb34bb0c6a633184fece35751b18Timo Sirainen ARRAY_DEFINE(appends, struct mail_index_record);
31ddc75584c5cde53d2e78a737587f2e7fdcb0d2Timo Sirainen uint32_t first_new_seq, last_new_seq;
cf93189100a9136f2fd508c26e1573410bc8c1aaTimo Sirainen uint32_t highest_append_uid;
48270badadd82279bfe50ae3d187aea8b0b2b30eTimo Sirainen /* lowest/highest sequence that updates flags/keywords */
48270badadd82279bfe50ae3d187aea8b0b2b30eTimo Sirainen uint32_t min_flagupdate_seq, max_flagupdate_seq;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
ad48319996942463675b53877092ab7e13a7a75aTimo Sirainen ARRAY_DEFINE(modseq_updates, struct mail_transaction_modseq_update);
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen ARRAY_DEFINE(expunges, struct mail_transaction_expunge_guid);
8d80659e504ffb34bb0c6a633184fece35751b18Timo Sirainen ARRAY_DEFINE(updates, struct mail_transaction_flag_update);
c251a38df327599a62d341bf5c2282f31352faa5Timo Sirainen size_t last_update_idx;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
aa38d1a0945f0bc13a225d043f53fad2eec666b1Timo Sirainen unsigned char pre_hdr_change[sizeof(struct mail_index_header)];
aa38d1a0945f0bc13a225d043f53fad2eec666b1Timo Sirainen unsigned char pre_hdr_mask[sizeof(struct mail_index_header)];
aa38d1a0945f0bc13a225d043f53fad2eec666b1Timo Sirainen unsigned char post_hdr_change[sizeof(struct mail_index_header)];
aa38d1a0945f0bc13a225d043f53fad2eec666b1Timo Sirainen unsigned char post_hdr_mask[sizeof(struct mail_index_header)];
e06c0b65c16ccce69bbee009ead14d7d3d17a256Timo Sirainen
beb6125ee872e7fed57745ab33e6de99639180f3Timo Sirainen ARRAY_DEFINE(ext_hdr_updates,
81a5d8714c566ce50c4a2409f59e82e716d576d2Timo Sirainen struct mail_index_transaction_ext_hdr_update);
c5794838af9995f50bfecb06a3cd4f9a0ac77858Timo Sirainen ARRAY_TYPE(seq_array_array) ext_rec_updates;
c5794838af9995f50bfecb06a3cd4f9a0ac77858Timo Sirainen ARRAY_TYPE(seq_array_array) ext_rec_atomics;
8d80659e504ffb34bb0c6a633184fece35751b18Timo Sirainen ARRAY_DEFINE(ext_resizes, struct mail_transaction_ext_intro);
6e07b4251bf6a3cf34019c351a32a65c08392e58Timo Sirainen ARRAY_DEFINE(ext_resets, struct mail_transaction_ext_reset);
893e5bbd5184ec5c21f47c67c8ea6efbea41f7d0Timo Sirainen ARRAY_DEFINE(ext_reset_ids, uint32_t);
6e07b4251bf6a3cf34019c351a32a65c08392e58Timo Sirainen ARRAY_DEFINE(ext_reset_atomic, uint32_t);
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen
8d80659e504ffb34bb0c6a633184fece35751b18Timo Sirainen ARRAY_DEFINE(keyword_updates,
8d80659e504ffb34bb0c6a633184fece35751b18Timo Sirainen struct mail_index_transaction_keyword_update);
8d80659e504ffb34bb0c6a633184fece35751b18Timo Sirainen ARRAY_TYPE(seq_range) keyword_resets;
1175f27441385a7011629f295f42708f9a3a4ffcTimo Sirainen
4b89231f4ec9cc69f4aea715e1d34f405c7e317dTimo Sirainen uint64_t min_highest_modseq;
48270badadd82279bfe50ae3d187aea8b0b2b30eTimo Sirainen uint64_t max_modseq;
48270badadd82279bfe50ae3d187aea8b0b2b30eTimo Sirainen ARRAY_TYPE(seq_range) *conflict_seqs;
48270badadd82279bfe50ae3d187aea8b0b2b30eTimo Sirainen
46c31f64b9f0949f00b7819f45b22f2d64b2ea27Timo Sirainen /* Module-specific contexts. */
46c31f64b9f0949f00b7819f45b22f2d64b2ea27Timo Sirainen ARRAY_DEFINE(module_contexts,
46c31f64b9f0949f00b7819f45b22f2d64b2ea27Timo Sirainen union mail_index_transaction_module_context *);
d6badc27cd6e8d3398877b6766cb0aaeef3a7800Timo Sirainen
1b3bb8d39686ed24730cbc31cc9a33dc62c8c6c3Timo Sirainen unsigned int no_appends:1;
ae8817f05005f57bba32479a610b52d083e2b6ebTimo Sirainen
f153a2cec0319f549388d28f8cfd4d50229d1132Timo Sirainen unsigned int sync_transaction:1;
ae8817f05005f57bba32479a610b52d083e2b6ebTimo Sirainen unsigned int appends_nonsorted:1;
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen unsigned int expunges_nonsorted:1;
54b51a9c2705a19dfb1639647bc7e9378e37f881Timo Sirainen unsigned int drop_unnecessary_flag_updates:1;
aa38d1a0945f0bc13a225d043f53fad2eec666b1Timo Sirainen unsigned int pre_hdr_changed:1;
aa38d1a0945f0bc13a225d043f53fad2eec666b1Timo Sirainen unsigned int post_hdr_changed:1;
ae8817f05005f57bba32479a610b52d083e2b6ebTimo Sirainen unsigned int reset:1;
651fc0f1e43fef3e02e0e7b5f498973b05f641d7Timo Sirainen unsigned int index_deleted:1;
8872e5c991430f96138a46e36b7f3c2c40d8e5c2Timo Sirainen unsigned int index_undeleted:1;
491178793199e62320f7bc6292e7b8fd843ae5bcTimo Sirainen unsigned int commit_deleted_index:1;
a022088674a5ae72ed29ae001834cbad62a4f19fTimo Sirainen /* non-extension updates. flag updates don't change this because
a022088674a5ae72ed29ae001834cbad62a4f19fTimo Sirainen they may be added and removed, so be sure to check that the updates
a022088674a5ae72ed29ae001834cbad62a4f19fTimo Sirainen array is non-empty also. */
73e7998716853b5b7621c06aea0022dccda70ad1Timo Sirainen unsigned int log_updates:1;
a2cbf1d392ee983520451bc9b849a490f28ac298Timo Sirainen /* extension updates */
a2cbf1d392ee983520451bc9b849a490f28ac298Timo Sirainen unsigned int log_ext_updates:1;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen};
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen#define MAIL_INDEX_TRANSACTION_HAS_CHANGES(t) \
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen ((t)->log_updates || (t)->log_ext_updates || \
8872e5c991430f96138a46e36b7f3c2c40d8e5c2Timo Sirainen (array_is_created(&(t)->updates) && array_count(&(t)->updates) > 0) || \
8872e5c991430f96138a46e36b7f3c2c40d8e5c2Timo Sirainen (t)->index_deleted || (t)->index_undeleted)
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen
d6badc27cd6e8d3398877b6766cb0aaeef3a7800Timo Sirainenextern void (*hook_mail_index_transaction_created)
d6badc27cd6e8d3398877b6766cb0aaeef3a7800Timo Sirainen (struct mail_index_transaction *t);
d6badc27cd6e8d3398877b6766cb0aaeef3a7800Timo Sirainen
24fc71a693331ffe77e2b6d81c70aca6fa055e47Timo Sirainenstruct mail_index_record *
24fc71a693331ffe77e2b6d81c70aca6fa055e47Timo Sirainenmail_index_transaction_lookup(struct mail_index_transaction *t, uint32_t seq);
24fc71a693331ffe77e2b6d81c70aca6fa055e47Timo Sirainen
09c3a491f4f6ccebe290c7709bdc0d79a187610bTimo Sirainenvoid mail_index_transaction_ref(struct mail_index_transaction *t);
d5cebe7f98e63d4e2822863ef2faa4971e8b3a5dTimo Sirainenvoid mail_index_transaction_unref(struct mail_index_transaction **t);
b346610430690398b8c840006004a2df4aa8ce92Timo Sirainenvoid mail_index_transaction_reset_v(struct mail_index_transaction *t);
09c3a491f4f6ccebe290c7709bdc0d79a187610bTimo Sirainen
985fa802913c96ce6f2e25bbc788ee39c416a7e0Timo Sirainenvoid mail_index_transaction_sort_appends(struct mail_index_transaction *t);
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainenvoid mail_index_transaction_sort_expunges(struct mail_index_transaction *t);
1d3f7c1278168d5b1cbfa9a2cc9929a0909056b4Timo Sirainenuint32_t mail_index_transaction_get_next_uid(struct mail_index_transaction *t);
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainenvoid mail_index_transaction_set_log_updates(struct mail_index_transaction *t);
b346610430690398b8c840006004a2df4aa8ce92Timo Sirainenvoid mail_index_update_day_headers(struct mail_index_transaction *t);
985fa802913c96ce6f2e25bbc788ee39c416a7e0Timo Sirainen
3fe9483b2b412a14493e3120751b0e99ecfe9388Timo Sirainenunsigned int
3fe9483b2b412a14493e3120751b0e99ecfe9388Timo Sirainenmail_index_transaction_get_flag_update_pos(struct mail_index_transaction *t,
3fe9483b2b412a14493e3120751b0e99ecfe9388Timo Sirainen unsigned int left_idx,
3fe9483b2b412a14493e3120751b0e99ecfe9388Timo Sirainen unsigned int right_idx,
3fe9483b2b412a14493e3120751b0e99ecfe9388Timo Sirainen uint32_t seq);
515f81466f673c1b4f72e053f1a9686e6fca6b61Timo Sirainenvoid mail_index_transaction_lookup_latest_keywords(struct mail_index_transaction *t,
515f81466f673c1b4f72e053f1a9686e6fca6b61Timo Sirainen uint32_t seq,
515f81466f673c1b4f72e053f1a9686e6fca6b61Timo Sirainen ARRAY_TYPE(keyword_indexes) *keywords);
3fe9483b2b412a14493e3120751b0e99ecfe9388Timo Sirainen
02bb8313a711dfe50c7f01e8132e13ca93ecfb42Timo Sirainenbool mail_index_cancel_flag_updates(struct mail_index_transaction *t,
02bb8313a711dfe50c7f01e8132e13ca93ecfb42Timo Sirainen uint32_t seq);
02bb8313a711dfe50c7f01e8132e13ca93ecfb42Timo Sirainenbool mail_index_cancel_keyword_updates(struct mail_index_transaction *t,
02bb8313a711dfe50c7f01e8132e13ca93ecfb42Timo Sirainen uint32_t seq);
02bb8313a711dfe50c7f01e8132e13ca93ecfb42Timo Sirainen
5e88e4624aa6d482b5b195acd2f4e02aeb385f20Timo Sirainenvoid mail_index_transaction_finish(struct mail_index_transaction *t);
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainenvoid mail_index_transaction_export(struct mail_index_transaction *t,
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen struct mail_transaction_log_append_ctx *append_ctx);
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainenint mail_transaction_expunge_guid_cmp(const struct mail_transaction_expunge_guid *e1,
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen const struct mail_transaction_expunge_guid *e2);
b346610430690398b8c840006004a2df4aa8ce92Timo Sirainenunsigned int
b346610430690398b8c840006004a2df4aa8ce92Timo Sirainenmail_index_transaction_get_flag_update_pos(struct mail_index_transaction *t,
b346610430690398b8c840006004a2df4aa8ce92Timo Sirainen unsigned int left_idx,
b346610430690398b8c840006004a2df4aa8ce92Timo Sirainen unsigned int right_idx,
b346610430690398b8c840006004a2df4aa8ce92Timo Sirainen uint32_t seq);
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainen
16c28dd75976f94acc4940d6ba68b6cd4853aac7Timo Sirainenbool mail_index_ext_using_reset_id(struct mail_index_transaction *t,
16c28dd75976f94acc4940d6ba68b6cd4853aac7Timo Sirainen uint32_t ext_id, uint32_t reset_id);
16c28dd75976f94acc4940d6ba68b6cd4853aac7Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen#endif