1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
|
/* Copyright (c) 2007-2018 Dovecot authors, see the included COPYING file */
#include "lib.h"
#include "ioloop.h"
#include "raw-storage.h"
#include "raw-sync.h"
#include "mailbox-recent-flags.h"
static int raw_sync(struct raw_mailbox *mbox)
{
struct mail_index_sync_ctx *index_sync_ctx;
struct mail_index_view *sync_view;
struct mail_index_sync_rec sync_rec;
struct mail_index_transaction *trans;
uint32_t seq, uid_validity = ioloop_time;
enum mail_index_sync_flags sync_flags;
int ret;
i_assert(!mbox->synced);
sync_flags = index_storage_get_sync_flags(&mbox->box) |
MAIL_INDEX_SYNC_FLAG_FLUSH_DIRTY |
MAIL_INDEX_SYNC_FLAG_REQUIRE_CHANGES;
if (mail_index_view_get_messages_count(mbox->box.view) > 0) {
/* already-synced index was opened via
mail-index-alloc-cache. */
return 0;
}
ret = mail_index_sync_begin(mbox->box.index, &index_sync_ctx,
&sync_view, &trans, sync_flags);
if (ret <= 0) {
if (ret < 0)
mailbox_set_index_error(&mbox->box);
return ret;
}
/* set our uidvalidity */
mail_index_update_header(trans,
offsetof(struct mail_index_header, uid_validity),
&uid_validity, sizeof(uid_validity), TRUE);
/* add our one and only message */
mail_index_append(trans, 1, &seq);
mailbox_recent_flags_set_uid(&mbox->box, 1);
while (mail_index_sync_next(index_sync_ctx, &sync_rec)) ;
if (mail_index_sync_commit(&index_sync_ctx) < 0) {
mailbox_set_index_error(&mbox->box);
return -1;
}
mbox->synced = TRUE;
return 0;
}
struct mailbox_sync_context *
raw_storage_sync_init(struct mailbox *box, enum mailbox_sync_flags flags)
{
struct raw_mailbox *mbox = RAW_MAILBOX(box);
int ret = 0;
if (!mbox->synced)
ret = raw_sync(mbox);
return index_mailbox_sync_init(box, flags, ret < 0);
}
|