mail-index-view-sync.c revision 6f4ddcbd1961beb71a7e2b3e12f5af26942671c0
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek/* Copyright (C) 2003-2004 Timo Sirainen */
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek#include "lib.h"
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek#include "array.h"
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek#include "buffer.h"
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek#include "mail-index-view-private.h"
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek#include "mail-index-sync-private.h"
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek#include "mail-transaction-log.h"
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozekstruct mail_index_view_sync_ctx {
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek struct mail_index_view *view;
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek enum mail_index_view_sync_flags flags;
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek struct mail_index_sync_map_ctx sync_map_ctx;
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek ARRAY_TYPE(seq_range) expunges;
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek unsigned int finish_min_msg_count;
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek const struct mail_transaction_header *hdr;
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek const void *data;
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek
c9aab1c04c399ca2d1abef74f6df22ced34983dcPavel Březina size_t data_offset;
c9aab1c04c399ca2d1abef74f6df22ced34983dcPavel Březina unsigned int sync_map_update:1;
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek unsigned int skipped_expunges:1;
c9aab1c04c399ca2d1abef74f6df22ced34983dcPavel Březina unsigned int last_read:1;
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek};
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek
1a542b3698d8c42cf075b722f8838f106eb09fccPavel Březinastatic int
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozekmail_transaction_log_sort_expunges(ARRAY_TYPE(seq_range) *expunges,
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek const struct seq_range *src, size_t src_size)
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek{
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek /* Note that all the sequences are actually still UIDs at this point */
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek const struct seq_range *src_end;
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek struct seq_range *dest, new_exp;
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek unsigned int first, i, dest_count;
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek i_assert(src_size % sizeof(*src) == 0);
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek
c9aab1c04c399ca2d1abef74f6df22ced34983dcPavel Březina /* @UNSAFE */
80941dd89fd8bc7c4a1272c304f737ce0fd5fc54Sumit Bose dest = array_get_modifiable(expunges, &dest_count);
5a2cce34cf8843613b0b9dfde054b3d471dd5f3aPavel Březina if (dest_count == 0) {
5a2cce34cf8843613b0b9dfde054b3d471dd5f3aPavel Březina array_append(expunges, src, src_size / sizeof(*src));
5a2cce34cf8843613b0b9dfde054b3d471dd5f3aPavel Březina return 0;
5a2cce34cf8843613b0b9dfde054b3d471dd5f3aPavel Březina }
5a2cce34cf8843613b0b9dfde054b3d471dd5f3aPavel Březina
5a2cce34cf8843613b0b9dfde054b3d471dd5f3aPavel Březina src_end = CONST_PTR_OFFSET(src, src_size);
5a2cce34cf8843613b0b9dfde054b3d471dd5f3aPavel Březina for (i = 0; src != src_end; src++) {
5a2cce34cf8843613b0b9dfde054b3d471dd5f3aPavel Březina /* src[] must be sorted. */
5a2cce34cf8843613b0b9dfde054b3d471dd5f3aPavel Březina if (src->seq1 > src->seq2 ||
5a2cce34cf8843613b0b9dfde054b3d471dd5f3aPavel Březina (src+1 != src_end && src->seq2 >= src[1].seq1))
5a2cce34cf8843613b0b9dfde054b3d471dd5f3aPavel Březina return -1;
5a2cce34cf8843613b0b9dfde054b3d471dd5f3aPavel Březina
5a2cce34cf8843613b0b9dfde054b3d471dd5f3aPavel Březina for (; i < dest_count; i++) {
5a2cce34cf8843613b0b9dfde054b3d471dd5f3aPavel Březina if (src->seq1 < dest[i].seq1)
5a2cce34cf8843613b0b9dfde054b3d471dd5f3aPavel Březina break;
5a2cce34cf8843613b0b9dfde054b3d471dd5f3aPavel Březina }
5a2cce34cf8843613b0b9dfde054b3d471dd5f3aPavel Březina
5a2cce34cf8843613b0b9dfde054b3d471dd5f3aPavel Březina new_exp = *src;
5a2cce34cf8843613b0b9dfde054b3d471dd5f3aPavel Březina
5a2cce34cf8843613b0b9dfde054b3d471dd5f3aPavel Březina first = i;
5a2cce34cf8843613b0b9dfde054b3d471dd5f3aPavel Březina while (i < dest_count && src->seq2 >= dest[i].seq1-1) {
80941dd89fd8bc7c4a1272c304f737ce0fd5fc54Sumit Bose /* we can/must merge with next record */
5a2cce34cf8843613b0b9dfde054b3d471dd5f3aPavel Březina if (new_exp.seq2 < dest[i].seq2)
5a2cce34cf8843613b0b9dfde054b3d471dd5f3aPavel Březina new_exp.seq2 = dest[i].seq2;
5a2cce34cf8843613b0b9dfde054b3d471dd5f3aPavel Březina i++;
5a2cce34cf8843613b0b9dfde054b3d471dd5f3aPavel Březina }
5a2cce34cf8843613b0b9dfde054b3d471dd5f3aPavel Březina
5a2cce34cf8843613b0b9dfde054b3d471dd5f3aPavel Březina if (first > 0 && new_exp.seq1 <= dest[first-1].seq2+1) {
5a2cce34cf8843613b0b9dfde054b3d471dd5f3aPavel Březina /* continue previous record */
c9aab1c04c399ca2d1abef74f6df22ced34983dcPavel Březina if (dest[first-1].seq2 < new_exp.seq2)
c9aab1c04c399ca2d1abef74f6df22ced34983dcPavel Březina dest[first-1].seq2 = new_exp.seq2;
c9aab1c04c399ca2d1abef74f6df22ced34983dcPavel Březina } else if (i == first) {
c9aab1c04c399ca2d1abef74f6df22ced34983dcPavel Březina array_insert(expunges, i, &new_exp, 1);
c9aab1c04c399ca2d1abef74f6df22ced34983dcPavel Březina i++; first++;
c9aab1c04c399ca2d1abef74f6df22ced34983dcPavel Březina
db419c61035cb262010cc8d5a4047191c2b60f05Pavel Březina dest = array_get_modifiable(expunges, &dest_count);
4be402505ba20b43361753f0e6e1589c9b029e81Jakub Hrozek } else {
4be402505ba20b43361753f0e6e1589c9b029e81Jakub Hrozek /* use next record */
c9aab1c04c399ca2d1abef74f6df22ced34983dcPavel Březina dest[first] = new_exp;
c9aab1c04c399ca2d1abef74f6df22ced34983dcPavel Březina first++;
c9aab1c04c399ca2d1abef74f6df22ced34983dcPavel Březina }
c9aab1c04c399ca2d1abef74f6df22ced34983dcPavel Březina
4be402505ba20b43361753f0e6e1589c9b029e81Jakub Hrozek if (i > first) {
4be402505ba20b43361753f0e6e1589c9b029e81Jakub Hrozek array_delete(expunges, first, i - first);
4be402505ba20b43361753f0e6e1589c9b029e81Jakub Hrozek
c9aab1c04c399ca2d1abef74f6df22ced34983dcPavel Březina dest = array_get_modifiable(expunges, &dest_count);
c9aab1c04c399ca2d1abef74f6df22ced34983dcPavel Březina i = first;
c9aab1c04c399ca2d1abef74f6df22ced34983dcPavel Březina }
db419c61035cb262010cc8d5a4047191c2b60f05Pavel Březina }
db419c61035cb262010cc8d5a4047191c2b60f05Pavel Březina return 0;
db419c61035cb262010cc8d5a4047191c2b60f05Pavel Březina}
db419c61035cb262010cc8d5a4047191c2b60f05Pavel Březina
db419c61035cb262010cc8d5a4047191c2b60f05Pavel Březinastatic int
db419c61035cb262010cc8d5a4047191c2b60f05Pavel Březinaview_sync_set_log_view_range(struct mail_index_view *view, bool sync_expunges)
db419c61035cb262010cc8d5a4047191c2b60f05Pavel Březina{
c9aab1c04c399ca2d1abef74f6df22ced34983dcPavel Březina const struct mail_index_header *hdr = &view->index->map->hdr;
c9aab1c04c399ca2d1abef74f6df22ced34983dcPavel Březina uint32_t start_seq, end_seq;
c9aab1c04c399ca2d1abef74f6df22ced34983dcPavel Březina uoff_t start_offset, end_offset;
c9aab1c04c399ca2d1abef74f6df22ced34983dcPavel Březina bool reset;
c9aab1c04c399ca2d1abef74f6df22ced34983dcPavel Březina int ret;
4be402505ba20b43361753f0e6e1589c9b029e81Jakub Hrozek
4be402505ba20b43361753f0e6e1589c9b029e81Jakub Hrozek start_seq = view->log_file_expunge_seq;
4be402505ba20b43361753f0e6e1589c9b029e81Jakub Hrozek start_offset = view->log_file_expunge_offset;
4be402505ba20b43361753f0e6e1589c9b029e81Jakub Hrozek end_seq = hdr->log_file_seq;
c9aab1c04c399ca2d1abef74f6df22ced34983dcPavel Březina end_offset = hdr->log_file_head_offset;
c9aab1c04c399ca2d1abef74f6df22ced34983dcPavel Březina
c9aab1c04c399ca2d1abef74f6df22ced34983dcPavel Březina for (;;) {
c9aab1c04c399ca2d1abef74f6df22ced34983dcPavel Březina /* the view begins from the first non-synced transaction */
c9aab1c04c399ca2d1abef74f6df22ced34983dcPavel Březina ret = mail_transaction_log_view_set(view->log_view,
ed44814e0e7ff9f0ef7ffc98fab7d9542a7822dfPavel Březina start_seq, start_offset,
4be402505ba20b43361753f0e6e1589c9b029e81Jakub Hrozek end_seq, end_offset,
db419c61035cb262010cc8d5a4047191c2b60f05Pavel Březina &reset);
db419c61035cb262010cc8d5a4047191c2b60f05Pavel Březina if (ret <= 0) {
4be402505ba20b43361753f0e6e1589c9b029e81Jakub Hrozek if (ret < 0)
4be402505ba20b43361753f0e6e1589c9b029e81Jakub Hrozek return -1;
ed44814e0e7ff9f0ef7ffc98fab7d9542a7822dfPavel Březina
ed44814e0e7ff9f0ef7ffc98fab7d9542a7822dfPavel Březina /* FIXME: use the new index to get needed
ed44814e0e7ff9f0ef7ffc98fab7d9542a7822dfPavel Březina changes */
c9aab1c04c399ca2d1abef74f6df22ced34983dcPavel Březina mail_index_set_error(view->index,
4be402505ba20b43361753f0e6e1589c9b029e81Jakub Hrozek "Transaction log got desynced for index %s",
4be402505ba20b43361753f0e6e1589c9b029e81Jakub Hrozek view->index->filepath);
5a2cce34cf8843613b0b9dfde054b3d471dd5f3aPavel Březina view->inconsistent = TRUE;
5a2cce34cf8843613b0b9dfde054b3d471dd5f3aPavel Březina return -1;
db419c61035cb262010cc8d5a4047191c2b60f05Pavel Březina }
db419c61035cb262010cc8d5a4047191c2b60f05Pavel Březina
c9aab1c04c399ca2d1abef74f6df22ced34983dcPavel Březina if (!reset || sync_expunges)
c9aab1c04c399ca2d1abef74f6df22ced34983dcPavel Březina break;
c9aab1c04c399ca2d1abef74f6df22ced34983dcPavel Březina
4be402505ba20b43361753f0e6e1589c9b029e81Jakub Hrozek /* we can't do this. sync only up to reset. */
4be402505ba20b43361753f0e6e1589c9b029e81Jakub Hrozek mail_transaction_log_view_get_prev_pos(view->log_view,
4be402505ba20b43361753f0e6e1589c9b029e81Jakub Hrozek &end_seq, &end_offset);
4be402505ba20b43361753f0e6e1589c9b029e81Jakub Hrozek end_seq--; end_offset = (uoff_t)-1;
4be402505ba20b43361753f0e6e1589c9b029e81Jakub Hrozek if (end_seq < start_seq) {
c9aab1c04c399ca2d1abef74f6df22ced34983dcPavel Březina /* we have only this reset log */
c9aab1c04c399ca2d1abef74f6df22ced34983dcPavel Březina mail_transaction_log_view_clear(view->log_view);
c9aab1c04c399ca2d1abef74f6df22ced34983dcPavel Březina break;
c9aab1c04c399ca2d1abef74f6df22ced34983dcPavel Březina }
c9aab1c04c399ca2d1abef74f6df22ced34983dcPavel Březina }
c9aab1c04c399ca2d1abef74f6df22ced34983dcPavel Březina
ed44814e0e7ff9f0ef7ffc98fab7d9542a7822dfPavel Březina return 0;
4be402505ba20b43361753f0e6e1589c9b029e81Jakub Hrozek}
db419c61035cb262010cc8d5a4047191c2b60f05Pavel Březina
db419c61035cb262010cc8d5a4047191c2b60f05Pavel Březinastatic int
4be402505ba20b43361753f0e6e1589c9b029e81Jakub Hrozekview_sync_get_expunges(struct mail_index_view *view,
4be402505ba20b43361753f0e6e1589c9b029e81Jakub Hrozek ARRAY_TYPE(seq_range) *expunges_r,
ed44814e0e7ff9f0ef7ffc98fab7d9542a7822dfPavel Březina unsigned int *expunge_count_r)
ed44814e0e7ff9f0ef7ffc98fab7d9542a7822dfPavel Březina{
ed44814e0e7ff9f0ef7ffc98fab7d9542a7822dfPavel Březina const struct mail_transaction_header *hdr;
c9aab1c04c399ca2d1abef74f6df22ced34983dcPavel Březina struct seq_range *src, *src_end, *dest;
c9aab1c04c399ca2d1abef74f6df22ced34983dcPavel Březina const void *data;
4be402505ba20b43361753f0e6e1589c9b029e81Jakub Hrozek unsigned int count, expunge_count = 0;
5a2cce34cf8843613b0b9dfde054b3d471dd5f3aPavel Březina int ret;
5a2cce34cf8843613b0b9dfde054b3d471dd5f3aPavel Březina
db419c61035cb262010cc8d5a4047191c2b60f05Pavel Březina if (view_sync_set_log_view_range(view, TRUE) < 0)
db419c61035cb262010cc8d5a4047191c2b60f05Pavel Březina return -1;
c9aab1c04c399ca2d1abef74f6df22ced34983dcPavel Březina
c9aab1c04c399ca2d1abef74f6df22ced34983dcPavel Březina /* get a list of expunge transactions. there may be some that we have
c9aab1c04c399ca2d1abef74f6df22ced34983dcPavel Březina already synced, but it doesn't matter because they'll get dropped
4be402505ba20b43361753f0e6e1589c9b029e81Jakub Hrozek out when converting to sequences */
4be402505ba20b43361753f0e6e1589c9b029e81Jakub Hrozek i_array_init(expunges_r, 64);
4be402505ba20b43361753f0e6e1589c9b029e81Jakub Hrozek while ((ret = mail_transaction_log_view_next(view->log_view,
4be402505ba20b43361753f0e6e1589c9b029e81Jakub Hrozek &hdr, &data)) > 0) {
4be402505ba20b43361753f0e6e1589c9b029e81Jakub Hrozek if ((hdr->type & MAIL_TRANSACTION_EXPUNGE) == 0)
c9aab1c04c399ca2d1abef74f6df22ced34983dcPavel Březina continue;
c9aab1c04c399ca2d1abef74f6df22ced34983dcPavel Březina if ((hdr->type & MAIL_TRANSACTION_EXTERNAL) == 0) {
c9aab1c04c399ca2d1abef74f6df22ced34983dcPavel Březina /* this is simply a request for expunge */
4be402505ba20b43361753f0e6e1589c9b029e81Jakub Hrozek continue;
c9aab1c04c399ca2d1abef74f6df22ced34983dcPavel Březina }
c9aab1c04c399ca2d1abef74f6df22ced34983dcPavel Březina
c9aab1c04c399ca2d1abef74f6df22ced34983dcPavel Březina if (mail_transaction_log_sort_expunges(expunges_r, data,
4be402505ba20b43361753f0e6e1589c9b029e81Jakub Hrozek hdr->size) < 0) {
4be402505ba20b43361753f0e6e1589c9b029e81Jakub Hrozek mail_transaction_log_view_set_corrupted(view->log_view,
c9aab1c04c399ca2d1abef74f6df22ced34983dcPavel Březina "Corrupted expunge record");
c9aab1c04c399ca2d1abef74f6df22ced34983dcPavel Březina ret = -1;
c9aab1c04c399ca2d1abef74f6df22ced34983dcPavel Březina break;
c9aab1c04c399ca2d1abef74f6df22ced34983dcPavel Březina }
c9aab1c04c399ca2d1abef74f6df22ced34983dcPavel Březina }
c9aab1c04c399ca2d1abef74f6df22ced34983dcPavel Březina
c9aab1c04c399ca2d1abef74f6df22ced34983dcPavel Březina if (ret < 0) {
c9aab1c04c399ca2d1abef74f6df22ced34983dcPavel Březina array_free(expunges_r);
c9aab1c04c399ca2d1abef74f6df22ced34983dcPavel Březina return -1;
c9aab1c04c399ca2d1abef74f6df22ced34983dcPavel Březina }
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek
c9aab1c04c399ca2d1abef74f6df22ced34983dcPavel Březina /* convert UIDs to sequences */
c9aab1c04c399ca2d1abef74f6df22ced34983dcPavel Březina src = dest = array_get_modifiable(expunges_r, &count);
c9aab1c04c399ca2d1abef74f6df22ced34983dcPavel Březina src_end = src + count;
c9aab1c04c399ca2d1abef74f6df22ced34983dcPavel Březina for (; src != src_end; src++) {
c9aab1c04c399ca2d1abef74f6df22ced34983dcPavel Březina ret = mail_index_lookup_uid_range(view, src->seq1,
c9aab1c04c399ca2d1abef74f6df22ced34983dcPavel Březina src->seq2,
c9aab1c04c399ca2d1abef74f6df22ced34983dcPavel Březina &dest->seq1,
c9aab1c04c399ca2d1abef74f6df22ced34983dcPavel Březina &dest->seq2);
c9aab1c04c399ca2d1abef74f6df22ced34983dcPavel Březina i_assert(ret == 0);
c9aab1c04c399ca2d1abef74f6df22ced34983dcPavel Březina
c9aab1c04c399ca2d1abef74f6df22ced34983dcPavel Březina if (dest->seq1 == 0)
c9aab1c04c399ca2d1abef74f6df22ced34983dcPavel Březina count--;
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek else {
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek expunge_count += dest->seq2 - dest->seq1 + 1;
c9aab1c04c399ca2d1abef74f6df22ced34983dcPavel Březina dest++;
c9aab1c04c399ca2d1abef74f6df22ced34983dcPavel Březina }
c9aab1c04c399ca2d1abef74f6df22ced34983dcPavel Březina }
c9aab1c04c399ca2d1abef74f6df22ced34983dcPavel Březina array_delete(expunges_r, count, array_count(expunges_r) - count);
c9aab1c04c399ca2d1abef74f6df22ced34983dcPavel Březina *expunge_count_r = expunge_count;
c9aab1c04c399ca2d1abef74f6df22ced34983dcPavel Březina return 0;
c9aab1c04c399ca2d1abef74f6df22ced34983dcPavel Březina}
c9aab1c04c399ca2d1abef74f6df22ced34983dcPavel Březina
c9aab1c04c399ca2d1abef74f6df22ced34983dcPavel Březinastatic int have_existing_expunges(struct mail_index_view *view,
c9aab1c04c399ca2d1abef74f6df22ced34983dcPavel Březina const struct seq_range *range, size_t size)
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek{
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek const struct seq_range *range_end;
c9aab1c04c399ca2d1abef74f6df22ced34983dcPavel Březina uint32_t seq1, seq2;
c9aab1c04c399ca2d1abef74f6df22ced34983dcPavel Březina
c9aab1c04c399ca2d1abef74f6df22ced34983dcPavel Březina range_end = CONST_PTR_OFFSET(range, size);
c9aab1c04c399ca2d1abef74f6df22ced34983dcPavel Březina for (; range < range_end; range++) {
c9aab1c04c399ca2d1abef74f6df22ced34983dcPavel Březina if (mail_index_lookup_uid_range(view, range->seq1, range->seq2,
c9aab1c04c399ca2d1abef74f6df22ced34983dcPavel Březina &seq1, &seq2) < 0)
c9aab1c04c399ca2d1abef74f6df22ced34983dcPavel Březina return -1;
c9aab1c04c399ca2d1abef74f6df22ced34983dcPavel Březina if (seq1 != 0)
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek return 1;
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek }
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek return 0;
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek}
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozekstatic bool view_sync_have_expunges(struct mail_index_view *view)
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek{
f6171b2bc954a367f316853ab71090eb213bdee3Pavel Březina const struct mail_transaction_header *hdr;
f6171b2bc954a367f316853ab71090eb213bdee3Pavel Březina const void *data;
f6171b2bc954a367f316853ab71090eb213bdee3Pavel Březina uint32_t seq;
f7af8c5b369938725e47585c641ae5b017d442a1Pavel Březina uoff_t offset;
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek int ret = 0;
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek mail_transaction_log_view_get_prev_pos(view->log_view,
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek &seq, &offset);
f643754db81eeade60485bbe3d80324d889cc4f3Pavel Březina
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek while ((ret = mail_transaction_log_view_next(view->log_view,
f6171b2bc954a367f316853ab71090eb213bdee3Pavel Březina &hdr, &data)) > 0) {
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek if ((hdr->type & MAIL_TRANSACTION_EXPUNGE) == 0)
f6171b2bc954a367f316853ab71090eb213bdee3Pavel Březina continue;
f6171b2bc954a367f316853ab71090eb213bdee3Pavel Březina if ((hdr->type & MAIL_TRANSACTION_EXTERNAL) == 0) {
f6171b2bc954a367f316853ab71090eb213bdee3Pavel Březina /* this is simply a request for expunge */
f6171b2bc954a367f316853ab71090eb213bdee3Pavel Březina continue;
f6171b2bc954a367f316853ab71090eb213bdee3Pavel Březina }
f6171b2bc954a367f316853ab71090eb213bdee3Pavel Březina
f6171b2bc954a367f316853ab71090eb213bdee3Pavel Březina /* we have an expunge. see if it still exists. */
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek ret = have_existing_expunges(view, data, hdr->size);
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek if (ret != 0)
f6171b2bc954a367f316853ab71090eb213bdee3Pavel Březina break;
f6171b2bc954a367f316853ab71090eb213bdee3Pavel Březina }
f6171b2bc954a367f316853ab71090eb213bdee3Pavel Březina
f6171b2bc954a367f316853ab71090eb213bdee3Pavel Březina mail_transaction_log_view_seek(view->log_view, seq, offset);
f6171b2bc954a367f316853ab71090eb213bdee3Pavel Březina
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek /* handle failures as having expunges (which is safer).
f6171b2bc954a367f316853ab71090eb213bdee3Pavel Březina we'll probably fail later. */
f6171b2bc954a367f316853ab71090eb213bdee3Pavel Březina return ret != 0;
f6171b2bc954a367f316853ab71090eb213bdee3Pavel Březina}
f6171b2bc954a367f316853ab71090eb213bdee3Pavel Březina
f6171b2bc954a367f316853ab71090eb213bdee3Pavel Březinaint mail_index_view_sync_begin(struct mail_index_view *view,
f6171b2bc954a367f316853ab71090eb213bdee3Pavel Březina enum mail_index_view_sync_flags flags,
f6171b2bc954a367f316853ab71090eb213bdee3Pavel Březina struct mail_index_view_sync_ctx **ctx_r)
f6171b2bc954a367f316853ab71090eb213bdee3Pavel Březina{
f6171b2bc954a367f316853ab71090eb213bdee3Pavel Březina struct mail_index_view_sync_ctx *ctx;
f6171b2bc954a367f316853ab71090eb213bdee3Pavel Březina struct mail_index_map *map;
f6171b2bc954a367f316853ab71090eb213bdee3Pavel Březina ARRAY_TYPE(seq_range) expunges = ARRAY_INIT;
f6171b2bc954a367f316853ab71090eb213bdee3Pavel Březina unsigned int expunge_count = 0;
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek bool sync_expunges;
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek
f6171b2bc954a367f316853ab71090eb213bdee3Pavel Březina i_assert(!view->syncing);
f6171b2bc954a367f316853ab71090eb213bdee3Pavel Březina i_assert(view->transactions == 0);
f6171b2bc954a367f316853ab71090eb213bdee3Pavel Březina
f6171b2bc954a367f316853ab71090eb213bdee3Pavel Březina if (mail_index_map_lock(view->index->map) < 0)
f6171b2bc954a367f316853ab71090eb213bdee3Pavel Březina return -1;
f6171b2bc954a367f316853ab71090eb213bdee3Pavel Březina
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek sync_expunges = (flags & MAIL_INDEX_VIEW_SYNC_FLAG_NOEXPUNGES) == 0;
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek if (sync_expunges) {
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek /* get list of all expunges first */
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek if (view_sync_get_expunges(view, &expunges,
f6171b2bc954a367f316853ab71090eb213bdee3Pavel Březina &expunge_count) < 0)
f6171b2bc954a367f316853ab71090eb213bdee3Pavel Březina return -1;
f6171b2bc954a367f316853ab71090eb213bdee3Pavel Březina }
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek if (view_sync_set_log_view_range(view, sync_expunges) < 0) {
f6171b2bc954a367f316853ab71090eb213bdee3Pavel Březina if (array_is_created(&expunges))
f6171b2bc954a367f316853ab71090eb213bdee3Pavel Březina array_free(&expunges);
f6171b2bc954a367f316853ab71090eb213bdee3Pavel Březina return -1;
fb4e4c4eb6a6dc732370584f70d23dd4a2c5c7b6Pavel Březina }
f6171b2bc954a367f316853ab71090eb213bdee3Pavel Březina
f6171b2bc954a367f316853ab71090eb213bdee3Pavel Březina ctx = i_new(struct mail_index_view_sync_ctx, 1);
f6171b2bc954a367f316853ab71090eb213bdee3Pavel Březina ctx->view = view;
f6171b2bc954a367f316853ab71090eb213bdee3Pavel Březina ctx->flags = flags;
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek ctx->expunges = expunges;
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek ctx->finish_min_msg_count =
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek view->map->hdr.messages_count - expunge_count;
f7af8c5b369938725e47585c641ae5b017d442a1Pavel Březina mail_index_sync_map_init(&ctx->sync_map_ctx, view,
f7af8c5b369938725e47585c641ae5b017d442a1Pavel Březina MAIL_INDEX_SYNC_HANDLER_VIEW);
f7af8c5b369938725e47585c641ae5b017d442a1Pavel Březina
f7af8c5b369938725e47585c641ae5b017d442a1Pavel Březina if (sync_expunges || !view_sync_have_expunges(view)) {
f7af8c5b369938725e47585c641ae5b017d442a1Pavel Březina view->sync_new_map = view->index->map;
f7af8c5b369938725e47585c641ae5b017d442a1Pavel Březina view->sync_new_map->refcount++;
f7af8c5b369938725e47585c641ae5b017d442a1Pavel Březina i_assert(sync_expunges ||
f6171b2bc954a367f316853ab71090eb213bdee3Pavel Březina view->index->map->hdr.messages_count >=
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek view->map->hdr.messages_count);
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek /* keep the old mapping without expunges until we're
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek fully synced */
f6171b2bc954a367f316853ab71090eb213bdee3Pavel Březina } else {
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek /* We need a private copy of the map if we don't want to
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek sync expunges.
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek If view's map is the head map, it means that it contains
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek already all the latest changes and there's no need for us
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek to apply any changes to it. This can only happen if there
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek hadn't been any expunges. */
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek if (view->map != view->index->map) {
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek /* Using non-head mapping. We have to apply
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek transactions to it to get latest changes into it. */
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek ctx->sync_map_update = TRUE;
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek }
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek
e7b5b99e5a5d276f32039c4fb8b21ba51bdb1537Pavel Březina if (view->map->refcount > 1) {
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek map = mail_index_map_clone(view->map);
e7b5b99e5a5d276f32039c4fb8b21ba51bdb1537Pavel Březina mail_index_unmap(&view->map);
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek view->map = map;
8bbf89c5ab798c112773fe23515c3a9df56dde71Nick Guay } else {
e7b5b99e5a5d276f32039c4fb8b21ba51bdb1537Pavel Březina map = view->map;
e7b5b99e5a5d276f32039c4fb8b21ba51bdb1537Pavel Březina }
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek i_assert(map->records_count == map->hdr.messages_count);
9bdb93119ceaf9e2bbcec0c0a4747f1a04b48a12Pavel Březina }
e7b5b99e5a5d276f32039c4fb8b21ba51bdb1537Pavel Březina
9bdb93119ceaf9e2bbcec0c0a4747f1a04b48a12Pavel Březina#ifdef DEBUG
9bdb93119ceaf9e2bbcec0c0a4747f1a04b48a12Pavel Březina mail_index_map_check(view->map);
e7b5b99e5a5d276f32039c4fb8b21ba51bdb1537Pavel Březina#endif
e7b5b99e5a5d276f32039c4fb8b21ba51bdb1537Pavel Březina
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek /* Syncing the view invalidates all previous looked up records.
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek Unreference the mappings this view keeps because of them. */
f643754db81eeade60485bbe3d80324d889cc4f3Pavel Březina mail_index_view_unref_maps(view);
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek view->syncing = TRUE;
2ce00e0d3896bb42db169d1e79553a81ca837a22Simo Sorce
2ce00e0d3896bb42db169d1e79553a81ca837a22Simo Sorce *ctx_r = ctx;
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek return 0;
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek}
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozekstatic bool
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozekview_sync_is_hidden(struct mail_index_view *view, uint32_t seq, uoff_t offset)
cda8ff6cfdef22356dc3c06ec5204344912f0f0bPavel Březina{
cda8ff6cfdef22356dc3c06ec5204344912f0f0bPavel Březina const struct mail_index_view_log_sync_area *syncs;
cda8ff6cfdef22356dc3c06ec5204344912f0f0bPavel Březina unsigned int i, count;
cda8ff6cfdef22356dc3c06ec5204344912f0f0bPavel Březina
cda8ff6cfdef22356dc3c06ec5204344912f0f0bPavel Březina if (!array_is_created(&view->syncs_hidden))
cda8ff6cfdef22356dc3c06ec5204344912f0f0bPavel Březina return FALSE;
cda8ff6cfdef22356dc3c06ec5204344912f0f0bPavel Březina
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek syncs = array_get(&view->syncs_hidden, &count);
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek for (i = 0; i < count; i++) {
e7b5b99e5a5d276f32039c4fb8b21ba51bdb1537Pavel Březina if (syncs[i].log_file_offset <= offset &&
cda8ff6cfdef22356dc3c06ec5204344912f0f0bPavel Březina offset - syncs[i].log_file_offset < syncs[i].length &&
cda8ff6cfdef22356dc3c06ec5204344912f0f0bPavel Březina syncs[i].log_file_seq == seq)
cda8ff6cfdef22356dc3c06ec5204344912f0f0bPavel Březina return TRUE;
cda8ff6cfdef22356dc3c06ec5204344912f0f0bPavel Březina }
cda8ff6cfdef22356dc3c06ec5204344912f0f0bPavel Březina
e7b5b99e5a5d276f32039c4fb8b21ba51bdb1537Pavel Březina return FALSE;
cda8ff6cfdef22356dc3c06ec5204344912f0f0bPavel Březina}
e7b5b99e5a5d276f32039c4fb8b21ba51bdb1537Pavel Březina
e7b5b99e5a5d276f32039c4fb8b21ba51bdb1537Pavel Březinastatic bool
cda8ff6cfdef22356dc3c06ec5204344912f0f0bPavel Březinamail_index_view_sync_want(struct mail_index_view_sync_ctx *ctx,
cda8ff6cfdef22356dc3c06ec5204344912f0f0bPavel Březina const struct mail_transaction_header *hdr)
cda8ff6cfdef22356dc3c06ec5204344912f0f0bPavel Březina{
cda8ff6cfdef22356dc3c06ec5204344912f0f0bPavel Březina struct mail_index_view *view = ctx->view;
cda8ff6cfdef22356dc3c06ec5204344912f0f0bPavel Březina uint32_t seq;
cda8ff6cfdef22356dc3c06ec5204344912f0f0bPavel Březina uoff_t offset, next_offset;
cda8ff6cfdef22356dc3c06ec5204344912f0f0bPavel Březina
cda8ff6cfdef22356dc3c06ec5204344912f0f0bPavel Březina mail_transaction_log_view_get_prev_pos(view->log_view, &seq, &offset);
cda8ff6cfdef22356dc3c06ec5204344912f0f0bPavel Březina next_offset = offset + sizeof(*hdr) + hdr->size;
cda8ff6cfdef22356dc3c06ec5204344912f0f0bPavel Březina
cda8ff6cfdef22356dc3c06ec5204344912f0f0bPavel Březina if ((hdr->type & MAIL_TRANSACTION_EXPUNGE) != 0 &&
cda8ff6cfdef22356dc3c06ec5204344912f0f0bPavel Březina (hdr->type & MAIL_TRANSACTION_EXTERNAL) != 0) {
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek if ((ctx->flags & MAIL_INDEX_VIEW_SYNC_FLAG_NOEXPUNGES) != 0) {
cda8ff6cfdef22356dc3c06ec5204344912f0f0bPavel Březina i_assert(!LOG_IS_BEFORE(seq, offset,
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek view->log_file_expunge_seq,
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek view->log_file_expunge_offset));
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek if (!ctx->skipped_expunges) {
e7b5b99e5a5d276f32039c4fb8b21ba51bdb1537Pavel Březina view->log_file_expunge_seq = seq;
e7b5b99e5a5d276f32039c4fb8b21ba51bdb1537Pavel Březina view->log_file_expunge_offset = offset;
e7b5b99e5a5d276f32039c4fb8b21ba51bdb1537Pavel Březina ctx->skipped_expunges = TRUE;
5d72a91a37273c8c874640906fd2f7a70e606812Simo Sorce }
e7b5b99e5a5d276f32039c4fb8b21ba51bdb1537Pavel Březina return FALSE;
e7b5b99e5a5d276f32039c4fb8b21ba51bdb1537Pavel Březina }
e7b5b99e5a5d276f32039c4fb8b21ba51bdb1537Pavel Březina if (LOG_IS_BEFORE(seq, offset, view->log_file_expunge_seq,
e7b5b99e5a5d276f32039c4fb8b21ba51bdb1537Pavel Březina view->log_file_expunge_offset)) {
e7b5b99e5a5d276f32039c4fb8b21ba51bdb1537Pavel Březina /* already synced */
e7b5b99e5a5d276f32039c4fb8b21ba51bdb1537Pavel Březina return FALSE;
e7b5b99e5a5d276f32039c4fb8b21ba51bdb1537Pavel Březina }
e7b5b99e5a5d276f32039c4fb8b21ba51bdb1537Pavel Březina }
e7b5b99e5a5d276f32039c4fb8b21ba51bdb1537Pavel Březina
e7b5b99e5a5d276f32039c4fb8b21ba51bdb1537Pavel Březina if (LOG_IS_BEFORE(seq, offset, view->log_file_head_seq,
e7b5b99e5a5d276f32039c4fb8b21ba51bdb1537Pavel Březina view->log_file_head_offset)) {
e7b5b99e5a5d276f32039c4fb8b21ba51bdb1537Pavel Březina /* already synced */
e7b5b99e5a5d276f32039c4fb8b21ba51bdb1537Pavel Březina return FALSE;
e7b5b99e5a5d276f32039c4fb8b21ba51bdb1537Pavel Březina }
e7b5b99e5a5d276f32039c4fb8b21ba51bdb1537Pavel Březina
e7b5b99e5a5d276f32039c4fb8b21ba51bdb1537Pavel Březina view->log_file_head_seq = seq;
e7b5b99e5a5d276f32039c4fb8b21ba51bdb1537Pavel Březina view->log_file_head_offset = next_offset;
e7b5b99e5a5d276f32039c4fb8b21ba51bdb1537Pavel Březina return TRUE;
e7b5b99e5a5d276f32039c4fb8b21ba51bdb1537Pavel Březina}
e7b5b99e5a5d276f32039c4fb8b21ba51bdb1537Pavel Březina
e7b5b99e5a5d276f32039c4fb8b21ba51bdb1537Pavel Březinastatic int
e7b5b99e5a5d276f32039c4fb8b21ba51bdb1537Pavel Březinamail_index_view_sync_get_next_transaction(struct mail_index_view_sync_ctx *ctx)
e7b5b99e5a5d276f32039c4fb8b21ba51bdb1537Pavel Březina{
e7b5b99e5a5d276f32039c4fb8b21ba51bdb1537Pavel Březina struct mail_transaction_log_view *log_view = ctx->view->log_view;
e7b5b99e5a5d276f32039c4fb8b21ba51bdb1537Pavel Březina struct mail_index_view *view = ctx->view;
e7b5b99e5a5d276f32039c4fb8b21ba51bdb1537Pavel Březina const struct mail_transaction_header *hdr;
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek uint32_t seq;
cda8ff6cfdef22356dc3c06ec5204344912f0f0bPavel Březina uoff_t offset;
cda8ff6cfdef22356dc3c06ec5204344912f0f0bPavel Březina int ret;
cda8ff6cfdef22356dc3c06ec5204344912f0f0bPavel Březina bool synced_to_map;
cda8ff6cfdef22356dc3c06ec5204344912f0f0bPavel Březina
cda8ff6cfdef22356dc3c06ec5204344912f0f0bPavel Březina for (;;) {
cda8ff6cfdef22356dc3c06ec5204344912f0f0bPavel Březina /* Get the next transaction from log. */
cda8ff6cfdef22356dc3c06ec5204344912f0f0bPavel Březina ret = mail_transaction_log_view_next(log_view, &ctx->hdr,
cda8ff6cfdef22356dc3c06ec5204344912f0f0bPavel Březina &ctx->data);
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek if (ret <= 0) {
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek if (ret < 0)
69e7d6649b58c66675ef38084868fc5356c5a240Jakub Hrozek return -1;
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek ctx->hdr = NULL;
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek ctx->last_read = TRUE;
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek return 0;
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek }
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek hdr = ctx->hdr;
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek if (!mail_index_view_sync_want(ctx, hdr)) {
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek /* This is a visible record that we don't want to
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek sync. */
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek continue;
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek }
fb4e4c4eb6a6dc732370584f70d23dd4a2c5c7b6Pavel Březina
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek mail_transaction_log_view_get_prev_pos(log_view, &seq, &offset);
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek /* If we started from a map that we didn't create ourself,
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek some of the transactions may already be synced. at the end
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek of this view sync we'll update file_seq=0 so that this check
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek always becomes FALSE for subsequent syncs. */
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek synced_to_map = view->map->hdr.log_file_seq != 0 &&
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek LOG_IS_BEFORE(seq, offset,
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek view->map->hdr.log_file_seq,
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek view->map->hdr.log_file_head_offset);
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek /* Apply transaction to view's mapping if needed (meaning we
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek didn't just re-map the view to head mapping). */
dd7192379e5fc5bb852863e60ad4b6a20c5da183Simo Sorce if (ctx->sync_map_update && !synced_to_map) {
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek i_assert((hdr->type & MAIL_TRANSACTION_EXPUNGE) == 0 ||
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek (hdr->type & MAIL_TRANSACTION_EXTERNAL) == 0);
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek if (mail_index_sync_record(&ctx->sync_map_ctx,
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek hdr, ctx->data) < 0)
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek return -1;
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek }
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek /* skip changes committed by hidden transactions (eg. in IMAP
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina store +flags.silent command) */
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina if (view_sync_is_hidden(view, seq, offset))
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina continue;
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina break;
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina }
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina return 1;
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina}
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina#define FLAG_UPDATE_IS_INTERNAL(u) \
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina ((((u)->add_flags | (u)->remove_flags) & \
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina ~(MAIL_INDEX_MAIL_FLAG_DIRTY | MAIL_RECENT)) == 0)
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březinastatic bool
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březinamail_index_view_sync_get_rec(struct mail_index_view_sync_ctx *ctx,
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina struct mail_index_view_sync_rec *rec)
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina{
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina const struct mail_transaction_header *hdr = ctx->hdr;
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina const void *data = ctx->data;
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina switch (hdr->type & MAIL_TRANSACTION_TYPE_MASK) {
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina case MAIL_TRANSACTION_APPEND: {
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina /* data contains the appended records, but we don't care */
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina rec->type = MAIL_INDEX_SYNC_TYPE_APPEND;
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina rec->uid1 = rec->uid2 = 0;
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina ctx->data_offset += hdr->size;
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina break;
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina }
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina case MAIL_TRANSACTION_EXPUNGE: {
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina const struct mail_transaction_expunge *exp =
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina CONST_PTR_OFFSET(data, ctx->data_offset);
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina if ((hdr->type & MAIL_TRANSACTION_EXTERNAL) == 0) {
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina /* this is simply a request for expunge */
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina ctx->data_offset = ctx->hdr->size;
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina return 0;
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina }
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina /* data contains mail_transaction_expunge[] */
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina rec->type = MAIL_INDEX_SYNC_TYPE_EXPUNGE;
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina rec->uid1 = exp->uid1;
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina rec->uid2 = exp->uid2;
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina ctx->data_offset += sizeof(*exp);
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina break;
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina }
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina case MAIL_TRANSACTION_FLAG_UPDATE: {
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina const struct mail_transaction_flag_update *update =
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina CONST_PTR_OFFSET(data, ctx->data_offset);
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina /* data contains mail_transaction_flag_update[] */
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina for (;;) {
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina ctx->data_offset += sizeof(*update);
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina if (!FLAG_UPDATE_IS_INTERNAL(update))
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina break;
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina /* skip internal flag changes */
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina if (ctx->data_offset == ctx->hdr->size)
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina return 0;
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina update = CONST_PTR_OFFSET(data, ctx->data_offset);
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina }
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina rec->type = MAIL_INDEX_SYNC_TYPE_FLAGS;
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina rec->uid1 = update->uid1;
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina rec->uid2 = update->uid2;
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina break;
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina }
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina case MAIL_TRANSACTION_KEYWORD_UPDATE: {
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina const struct mail_transaction_keyword_update *update = data;
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina const uint32_t *uids;
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina /* data contains mail_transaction_keyword_update header,
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina the keyword name and an array of { uint32_t uid1, uid2; } */
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina if (ctx->data_offset == 0) {
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina /* skip over the header and name */
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina ctx->data_offset = sizeof(*update) + update->name_size;
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina if ((ctx->data_offset % 4) != 0)
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina ctx->data_offset += 4 - (ctx->data_offset % 4);
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina }
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina uids = CONST_PTR_OFFSET(data, ctx->data_offset);
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina rec->type = MAIL_INDEX_SYNC_TYPE_KEYWORD_ADD;
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina rec->uid1 = uids[0];
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina rec->uid2 = uids[1];
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina ctx->data_offset += sizeof(uint32_t) * 2;
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina break;
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina }
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina case MAIL_TRANSACTION_KEYWORD_RESET: {
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina const struct mail_transaction_keyword_reset *reset =
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina CONST_PTR_OFFSET(data, ctx->data_offset);
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina /* data contains mail_transaction_keyword_reset[] */
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina rec->type = MAIL_INDEX_SYNC_TYPE_KEYWORD_RESET;
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina rec->uid1 = reset->uid1;
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina rec->uid2 = reset->uid2;
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina ctx->data_offset += sizeof(*reset);
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina break;
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina }
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina default:
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina ctx->hdr = NULL;
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina return FALSE;
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina }
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina return TRUE;
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina}
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březinaint mail_index_view_sync_next(struct mail_index_view_sync_ctx *ctx,
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina struct mail_index_view_sync_rec *sync_rec)
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina{
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina int ret;
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina do {
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina if (ctx->hdr == NULL || ctx->data_offset == ctx->hdr->size) {
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina ret = mail_index_view_sync_get_next_transaction(ctx);
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina if (ret <= 0)
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina return ret;
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina ctx->data_offset = 0;
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina }
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina } while (!mail_index_view_sync_get_rec(ctx, sync_rec));
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina return 1;
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina}
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březinavoid mail_index_view_sync_get_expunges(struct mail_index_view_sync_ctx *ctx,
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina const ARRAY_TYPE(seq_range) **expunges_r)
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina{
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina *expunges_r = &ctx->expunges;
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina}
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březinastatic void
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březinamail_index_view_sync_clean_log_syncs(struct mail_index_view *view)
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina{
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina const struct mail_index_view_log_sync_area *syncs;
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina unsigned int i, count;
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina if (!array_is_created(&view->syncs_hidden))
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina return;
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina /* Clean up to view's tail */
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina syncs = array_get(&view->syncs_hidden, &count);
44749ce0c1fee9babee80060fa0db99eebb2ab51Pavel Březina for (i = 0; i < count; i++) {
f5d4b05027acce06e3509ecb68869d1c7ef37180Pavel Březina if ((syncs[i].log_file_offset +
f5d4b05027acce06e3509ecb68869d1c7ef37180Pavel Březina syncs[i].length > view->log_file_expunge_offset &&
9675bccabff4e79d224f64611ad9ff3e073b488eSimo Sorce syncs[i].log_file_seq == view->log_file_expunge_seq) ||
9675bccabff4e79d224f64611ad9ff3e073b488eSimo Sorce syncs[i].log_file_seq > view->log_file_expunge_seq)
f5d4b05027acce06e3509ecb68869d1c7ef37180Pavel Březina break;
f5d4b05027acce06e3509ecb68869d1c7ef37180Pavel Březina }
f5d4b05027acce06e3509ecb68869d1c7ef37180Pavel Březina if (i > 0)
f5d4b05027acce06e3509ecb68869d1c7ef37180Pavel Březina array_delete(&view->syncs_hidden, 0, i);
f5d4b05027acce06e3509ecb68869d1c7ef37180Pavel Březina}
f5d4b05027acce06e3509ecb68869d1c7ef37180Pavel Březina
f5d4b05027acce06e3509ecb68869d1c7ef37180Pavel Březinavoid mail_index_view_sync_end(struct mail_index_view_sync_ctx **_ctx)
f5d4b05027acce06e3509ecb68869d1c7ef37180Pavel Březina{
9675bccabff4e79d224f64611ad9ff3e073b488eSimo Sorce struct mail_index_view_sync_ctx *ctx = *_ctx;
f5d4b05027acce06e3509ecb68869d1c7ef37180Pavel Březina struct mail_index_view *view = ctx->view;
f5d4b05027acce06e3509ecb68869d1c7ef37180Pavel Březina
f5d4b05027acce06e3509ecb68869d1c7ef37180Pavel Březina i_assert(view->syncing);
f5d4b05027acce06e3509ecb68869d1c7ef37180Pavel Březina
f5d4b05027acce06e3509ecb68869d1c7ef37180Pavel Březina *_ctx = NULL;
f5d4b05027acce06e3509ecb68869d1c7ef37180Pavel Březina
f5d4b05027acce06e3509ecb68869d1c7ef37180Pavel Březina if (!ctx->last_read) {
f5d4b05027acce06e3509ecb68869d1c7ef37180Pavel Březina /* we didn't sync everything */
f5d4b05027acce06e3509ecb68869d1c7ef37180Pavel Březina view->inconsistent = TRUE;
f5d4b05027acce06e3509ecb68869d1c7ef37180Pavel Březina }
f5d4b05027acce06e3509ecb68869d1c7ef37180Pavel Březina
2d34690ae92215d355b0272001d9e68214dc80f6Jakub Hrozek if (view->sync_new_map != NULL) {
f5d4b05027acce06e3509ecb68869d1c7ef37180Pavel Březina mail_index_unmap(&view->map);
f5d4b05027acce06e3509ecb68869d1c7ef37180Pavel Březina view->map = view->sync_new_map;
f5d4b05027acce06e3509ecb68869d1c7ef37180Pavel Březina view->sync_new_map = NULL;
f5d4b05027acce06e3509ecb68869d1c7ef37180Pavel Březina }
f5d4b05027acce06e3509ecb68869d1c7ef37180Pavel Březina
f5d4b05027acce06e3509ecb68869d1c7ef37180Pavel Březina i_assert(view->map->hdr.messages_count >= ctx->finish_min_msg_count);
f5d4b05027acce06e3509ecb68869d1c7ef37180Pavel Březina
f5d4b05027acce06e3509ecb68869d1c7ef37180Pavel Březina if (!ctx->skipped_expunges) {
f5d4b05027acce06e3509ecb68869d1c7ef37180Pavel Březina view->log_file_expunge_seq = view->log_file_head_seq;
f5d4b05027acce06e3509ecb68869d1c7ef37180Pavel Březina view->log_file_expunge_offset = view->log_file_head_offset;
9675bccabff4e79d224f64611ad9ff3e073b488eSimo Sorce }
f5d4b05027acce06e3509ecb68869d1c7ef37180Pavel Březina
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek if (ctx->sync_map_update) {
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek /* log offsets have no meaning in views. make sure they're not
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek tried to be used wrong by setting them to zero. */
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek view->map->hdr.log_file_seq = 0;
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek view->map->hdr.log_file_head_offset = 0;
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek view->map->hdr.log_file_tail_offset = 0;
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek }
f5d4b05027acce06e3509ecb68869d1c7ef37180Pavel Březina
f5d4b05027acce06e3509ecb68869d1c7ef37180Pavel Březina mail_index_sync_map_deinit(&ctx->sync_map_ctx);
f643754db81eeade60485bbe3d80324d889cc4f3Pavel Březina mail_index_view_sync_clean_log_syncs(ctx->view);
f643754db81eeade60485bbe3d80324d889cc4f3Pavel Březina
f643754db81eeade60485bbe3d80324d889cc4f3Pavel Březina#ifdef DEBUG
f643754db81eeade60485bbe3d80324d889cc4f3Pavel Březina mail_index_map_check(view->map);
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek#endif
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek /* set log view to empty range so unneeded memory gets freed */
9675bccabff4e79d224f64611ad9ff3e073b488eSimo Sorce mail_transaction_log_view_clear(view->log_view);
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek if (array_is_created(&ctx->expunges))
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek array_free(&ctx->expunges);
f643754db81eeade60485bbe3d80324d889cc4f3Pavel Březina
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek view->syncing = FALSE;
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek i_free(ctx);
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek}
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozekvoid mail_index_view_add_hidden_transaction(struct mail_index_view *view,
f5d4b05027acce06e3509ecb68869d1c7ef37180Pavel Březina uint32_t log_file_seq,
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek uoff_t log_file_offset,
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek unsigned int length)
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek{
f5d4b05027acce06e3509ecb68869d1c7ef37180Pavel Březina struct mail_index_view_log_sync_area *area;
f5d4b05027acce06e3509ecb68869d1c7ef37180Pavel Březina
f5d4b05027acce06e3509ecb68869d1c7ef37180Pavel Březina if (!array_is_created(&view->syncs_hidden))
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek i_array_init(&view->syncs_hidden, 32);
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek
f5d4b05027acce06e3509ecb68869d1c7ef37180Pavel Březina area = array_append_space(&view->syncs_hidden);
f5d4b05027acce06e3509ecb68869d1c7ef37180Pavel Březina area->log_file_seq = log_file_seq;
3a59cbd0b7b9c5dd3c62ac1679876070c264d80fMichal Zidek area->log_file_offset = log_file_offset;
f5d4b05027acce06e3509ecb68869d1c7ef37180Pavel Březina area->length = length;
f5d4b05027acce06e3509ecb68869d1c7ef37180Pavel Březina}
f5d4b05027acce06e3509ecb68869d1c7ef37180Pavel Březina