Mercurial > dovecot > core-2.2
annotate src/lib-storage/list/mailbox-list-index-notify.c @ 22604:98d99bf6511e
lib-storage: Make sure mailbox list notification flush sees latest changes.
This is mainly useful with imaptest test scripts to make sure they're seeing
the changes done by the other session, without assuming that inotify will
always notify about the change before NOOP is run (it doesn't).
Do this only if mailbox_idle_check_interval>0, so it's not run when periodic
stat()s are wanted to be avoided.
author | Timo Sirainen <timo.sirainen@dovecot.fi> |
---|---|
date | Mon, 11 Sep 2017 13:48:17 +0300 |
parents | 71589abee915 |
children | cb108f786fb4 |
rev | line source |
---|---|
21390
2e2563132d5f
Updated copyright notices to include the year 2017.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
21389
diff
changeset
|
1 /* Copyright (c) 2013-2017 Dovecot authors, see the included COPYING file */ |
14898
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2 |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
3 #include "lib.h" |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
4 #include "ioloop.h" |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
5 #include "str.h" |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
6 #include "mail-index-private.h" |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
7 #include "mail-transaction-log-private.h" |
19118
f600285c3df2
lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents:
19117
diff
changeset
|
8 #include "mail-storage-private.h" |
14898
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
9 #include "mailbox-list-notify.h" |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
10 #include "mailbox-list-notify-tree.h" |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
11 #include "mailbox-list-index.h" |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
12 |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
13 #include <sys/stat.h> |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
14 |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
15 #define NOTIFY_DELAY_MSECS 500 |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
16 |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
17 enum ilist_ext_type { |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
18 ILIST_EXT_NONE, |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
19 ILIST_EXT_BASE, |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
20 ILIST_EXT_MSGS, |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
21 ILIST_EXT_HIGHESTMODSEQ, |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
22 ILIST_EXT_UNKNOWN |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
23 }; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
24 |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
25 struct mailbox_list_notify_rename { |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
26 uint32_t old_uid, new_uid; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
27 }; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
28 |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
29 struct mailbox_list_inotify_entry { |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
30 uint32_t uid; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
31 guid_128_t guid; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
32 bool expunge; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
33 }; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
34 |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
35 struct mailbox_list_notify_index { |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
36 struct mailbox_list_notify notify; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
37 |
15027
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
38 struct mailbox_tree_context *subscriptions; |
14898
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
39 struct mailbox_list_notify_tree *tree; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
40 struct mail_index_view *view, *old_view; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
41 struct mail_index_view_sync_ctx *sync_ctx; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
42 enum ilist_ext_type cur_ext; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
43 uint32_t cur_ext_id; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
44 |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
45 void (*wait_callback)(void *context); |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
46 void *wait_context; |
19118
f600285c3df2
lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents:
19117
diff
changeset
|
47 struct io *io_wait, *io_wait_inbox; |
14898
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
48 struct timeout *to_wait, *to_notify; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
49 |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
50 ARRAY_TYPE(seq_range) new_uids, expunged_uids, changed_uids; |
15027
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
51 ARRAY_TYPE(const_string) new_subscriptions, new_unsubscriptions; |
14920
a097ef0a9d6d
Array API changed: ARRAY_DEFINE(name, type) -> ARRAY(type) name
Timo Sirainen <tss@iki.fi>
parents:
14898
diff
changeset
|
52 ARRAY(struct mailbox_list_notify_rename) renames; |
14898
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
53 struct seq_range_iter new_uids_iter, expunged_uids_iter; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
54 struct seq_range_iter changed_uids_iter; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
55 unsigned int new_uids_n, expunged_uids_n, changed_uids_n; |
15027
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
56 unsigned int rename_idx, subscription_idx, unsubscription_idx; |
14898
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
57 |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
58 struct mailbox_list_notify_rec notify_rec; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
59 string_t *rec_name; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
60 |
19118
f600285c3df2
lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents:
19117
diff
changeset
|
61 char *list_log_path, *inbox_log_path; |
f600285c3df2
lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents:
19117
diff
changeset
|
62 struct stat list_last_st, inbox_last_st; |
22457
5de2bae83c93
lib-storage: Fix INBOX notifications to set correct events
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22456
diff
changeset
|
63 struct mailbox *inbox; |
14898
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
64 |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
65 unsigned int initialized:1; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
66 unsigned int read_failed:1; |
19118
f600285c3df2
lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents:
19117
diff
changeset
|
67 unsigned int inbox_event_pending:1; |
14898
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
68 }; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
69 |
22457
5de2bae83c93
lib-storage: Fix INBOX notifications to set correct events
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22456
diff
changeset
|
70 static const enum mailbox_status_items notify_status_items = |
5de2bae83c93
lib-storage: Fix INBOX notifications to set correct events
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22456
diff
changeset
|
71 STATUS_UIDVALIDITY | STATUS_UIDNEXT | STATUS_MESSAGES | |
5de2bae83c93
lib-storage: Fix INBOX notifications to set correct events
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22456
diff
changeset
|
72 STATUS_UNSEEN | STATUS_HIGHESTMODSEQ; |
5de2bae83c93
lib-storage: Fix INBOX notifications to set correct events
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22456
diff
changeset
|
73 |
22456
d1658f4cb079
lib-storage: List index notify cleanup - move code to separate functions
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22455
diff
changeset
|
74 static enum mailbox_list_notify_event |
d1658f4cb079
lib-storage: List index notify cleanup - move code to separate functions
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22455
diff
changeset
|
75 mailbox_list_index_get_changed_events(const struct mailbox_notify_node *nnode, |
d1658f4cb079
lib-storage: List index notify cleanup - move code to separate functions
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22455
diff
changeset
|
76 const struct mailbox_status *status) |
d1658f4cb079
lib-storage: List index notify cleanup - move code to separate functions
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22455
diff
changeset
|
77 { |
d1658f4cb079
lib-storage: List index notify cleanup - move code to separate functions
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22455
diff
changeset
|
78 enum mailbox_list_notify_event events = 0; |
d1658f4cb079
lib-storage: List index notify cleanup - move code to separate functions
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22455
diff
changeset
|
79 |
d1658f4cb079
lib-storage: List index notify cleanup - move code to separate functions
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22455
diff
changeset
|
80 if (nnode->uidvalidity != status->uidvalidity) |
d1658f4cb079
lib-storage: List index notify cleanup - move code to separate functions
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22455
diff
changeset
|
81 events |= MAILBOX_LIST_NOTIFY_UIDVALIDITY; |
d1658f4cb079
lib-storage: List index notify cleanup - move code to separate functions
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22455
diff
changeset
|
82 if (nnode->uidnext != status->uidnext) |
d1658f4cb079
lib-storage: List index notify cleanup - move code to separate functions
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22455
diff
changeset
|
83 events |= MAILBOX_LIST_NOTIFY_APPENDS; |
d1658f4cb079
lib-storage: List index notify cleanup - move code to separate functions
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22455
diff
changeset
|
84 if (nnode->messages > status->messages) { |
d1658f4cb079
lib-storage: List index notify cleanup - move code to separate functions
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22455
diff
changeset
|
85 /* NOTE: not entirely reliable, since there could be both |
d1658f4cb079
lib-storage: List index notify cleanup - move code to separate functions
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22455
diff
changeset
|
86 expunges and appends.. but it shouldn't make any difference |
d1658f4cb079
lib-storage: List index notify cleanup - move code to separate functions
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22455
diff
changeset
|
87 in practise, since anybody interested in expunges is most |
d1658f4cb079
lib-storage: List index notify cleanup - move code to separate functions
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22455
diff
changeset
|
88 likely also interested in appends. */ |
d1658f4cb079
lib-storage: List index notify cleanup - move code to separate functions
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22455
diff
changeset
|
89 events |= MAILBOX_LIST_NOTIFY_EXPUNGES; |
d1658f4cb079
lib-storage: List index notify cleanup - move code to separate functions
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22455
diff
changeset
|
90 } |
d1658f4cb079
lib-storage: List index notify cleanup - move code to separate functions
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22455
diff
changeset
|
91 if (nnode->unseen != status->unseen) |
d1658f4cb079
lib-storage: List index notify cleanup - move code to separate functions
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22455
diff
changeset
|
92 events |= MAILBOX_LIST_NOTIFY_SEEN_CHANGES; |
d1658f4cb079
lib-storage: List index notify cleanup - move code to separate functions
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22455
diff
changeset
|
93 if (nnode->highest_modseq < status->highest_modseq) |
d1658f4cb079
lib-storage: List index notify cleanup - move code to separate functions
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22455
diff
changeset
|
94 events |= MAILBOX_LIST_NOTIFY_MODSEQ_CHANGES; |
d1658f4cb079
lib-storage: List index notify cleanup - move code to separate functions
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22455
diff
changeset
|
95 return events; |
d1658f4cb079
lib-storage: List index notify cleanup - move code to separate functions
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22455
diff
changeset
|
96 } |
d1658f4cb079
lib-storage: List index notify cleanup - move code to separate functions
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22455
diff
changeset
|
97 |
d1658f4cb079
lib-storage: List index notify cleanup - move code to separate functions
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22455
diff
changeset
|
98 static void |
d1658f4cb079
lib-storage: List index notify cleanup - move code to separate functions
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22455
diff
changeset
|
99 mailbox_notify_node_update_status(struct mailbox_notify_node *nnode, |
d1658f4cb079
lib-storage: List index notify cleanup - move code to separate functions
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22455
diff
changeset
|
100 struct mailbox_status *status) |
d1658f4cb079
lib-storage: List index notify cleanup - move code to separate functions
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22455
diff
changeset
|
101 { |
d1658f4cb079
lib-storage: List index notify cleanup - move code to separate functions
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22455
diff
changeset
|
102 nnode->uidvalidity = status->uidvalidity; |
d1658f4cb079
lib-storage: List index notify cleanup - move code to separate functions
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22455
diff
changeset
|
103 nnode->uidnext = status->uidnext; |
d1658f4cb079
lib-storage: List index notify cleanup - move code to separate functions
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22455
diff
changeset
|
104 nnode->messages = status->messages; |
d1658f4cb079
lib-storage: List index notify cleanup - move code to separate functions
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22455
diff
changeset
|
105 nnode->unseen = status->unseen; |
d1658f4cb079
lib-storage: List index notify cleanup - move code to separate functions
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22455
diff
changeset
|
106 nnode->highest_modseq = status->highest_modseq; |
d1658f4cb079
lib-storage: List index notify cleanup - move code to separate functions
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22455
diff
changeset
|
107 } |
d1658f4cb079
lib-storage: List index notify cleanup - move code to separate functions
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22455
diff
changeset
|
108 |
22457
5de2bae83c93
lib-storage: Fix INBOX notifications to set correct events
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22456
diff
changeset
|
109 static void |
5de2bae83c93
lib-storage: Fix INBOX notifications to set correct events
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22456
diff
changeset
|
110 mailbox_list_index_notify_init_inbox(struct mailbox_list_notify_index *inotify) |
5de2bae83c93
lib-storage: Fix INBOX notifications to set correct events
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22456
diff
changeset
|
111 { |
5de2bae83c93
lib-storage: Fix INBOX notifications to set correct events
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22456
diff
changeset
|
112 inotify->inbox = mailbox_alloc(inotify->notify.list, "INBOX", |
5de2bae83c93
lib-storage: Fix INBOX notifications to set correct events
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22456
diff
changeset
|
113 MAILBOX_FLAG_READONLY); |
5de2bae83c93
lib-storage: Fix INBOX notifications to set correct events
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22456
diff
changeset
|
114 if (mailbox_open(inotify->inbox) < 0) |
5de2bae83c93
lib-storage: Fix INBOX notifications to set correct events
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22456
diff
changeset
|
115 mailbox_free(&inotify->inbox); |
5de2bae83c93
lib-storage: Fix INBOX notifications to set correct events
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22456
diff
changeset
|
116 inotify->inbox_log_path = |
5de2bae83c93
lib-storage: Fix INBOX notifications to set correct events
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22456
diff
changeset
|
117 i_strconcat(inotify->inbox->index->filepath, ".log", NULL); |
5de2bae83c93
lib-storage: Fix INBOX notifications to set correct events
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22456
diff
changeset
|
118 } |
5de2bae83c93
lib-storage: Fix INBOX notifications to set correct events
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22456
diff
changeset
|
119 |
14898
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
120 int mailbox_list_index_notify_init(struct mailbox_list *list, |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
121 enum mailbox_list_notify_event mask, |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
122 struct mailbox_list_notify **notify_r) |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
123 { |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
124 struct mailbox_list_index *ilist = INDEX_LIST_CONTEXT(list); |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
125 struct mailbox_list_notify_index *inotify; |
19118
f600285c3df2
lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents:
19117
diff
changeset
|
126 const char *index_dir; |
14898
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
127 |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
128 if (ilist == NULL) { |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
129 /* can't do this without mailbox list indexes */ |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
130 return -1; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
131 } |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
132 |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
133 (void)mailbox_list_index_refresh(list); |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
134 |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
135 inotify = i_new(struct mailbox_list_notify_index, 1); |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
136 inotify->notify.list = list; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
137 inotify->notify.mask = mask; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
138 inotify->view = mail_index_view_open(ilist->index); |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
139 inotify->old_view = mail_index_view_dup_private(inotify->view); |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
140 inotify->tree = mailbox_list_notify_tree_init(list); |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
141 i_array_init(&inotify->new_uids, 8); |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
142 i_array_init(&inotify->expunged_uids, 8); |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
143 i_array_init(&inotify->changed_uids, 16); |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
144 i_array_init(&inotify->renames, 16); |
15027
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
145 i_array_init(&inotify->new_subscriptions, 16); |
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
146 i_array_init(&inotify->new_unsubscriptions, 16); |
14898
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
147 inotify->rec_name = str_new(default_pool, 64); |
15027
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
148 if ((mask & (MAILBOX_LIST_NOTIFY_SUBSCRIBE | |
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
149 MAILBOX_LIST_NOTIFY_UNSUBSCRIBE)) != 0) { |
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
150 (void)mailbox_list_iter_subscriptions_refresh(list); |
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
151 mailbox_tree_sort(list->subscriptions); |
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
152 inotify->subscriptions = mailbox_tree_dup(list->subscriptions); |
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
153 } |
19118
f600285c3df2
lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents:
19117
diff
changeset
|
154 inotify->list_log_path = i_strdup(ilist->index->log->filepath); |
22454
725057ef25e4
lib-storage: Optimize INBOX notifications with mailbox_list_index_include_inbox=yes
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22081
diff
changeset
|
155 if (list->mail_set->mailbox_list_index_include_inbox) { |
725057ef25e4
lib-storage: Optimize INBOX notifications with mailbox_list_index_include_inbox=yes
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22081
diff
changeset
|
156 /* INBOX can be handled also using mailbox list index */ |
725057ef25e4
lib-storage: Optimize INBOX notifications with mailbox_list_index_include_inbox=yes
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22081
diff
changeset
|
157 } else if ((list->ns->flags & NAMESPACE_FLAG_INBOX_ANY) == 0) { |
725057ef25e4
lib-storage: Optimize INBOX notifications with mailbox_list_index_include_inbox=yes
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22081
diff
changeset
|
158 /* no INBOX in this namespace */ |
22455
056a93bfc669
lib-storage: Remove INBOX notification checks if mailbox events aren't requested
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22454
diff
changeset
|
159 } else if ((mask & MAILBOX_LIST_NOTIFY_STATUS) == 0) { |
056a93bfc669
lib-storage: Remove INBOX notification checks if mailbox events aren't requested
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22454
diff
changeset
|
160 /* not interested in mailbox changes */ |
22454
725057ef25e4
lib-storage: Optimize INBOX notifications with mailbox_list_index_include_inbox=yes
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22081
diff
changeset
|
161 } else if (mailbox_list_get_path(list, "INBOX", MAILBOX_LIST_PATH_TYPE_INDEX, |
725057ef25e4
lib-storage: Optimize INBOX notifications with mailbox_list_index_include_inbox=yes
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22081
diff
changeset
|
162 &index_dir) <= 0) { |
725057ef25e4
lib-storage: Optimize INBOX notifications with mailbox_list_index_include_inbox=yes
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22081
diff
changeset
|
163 /* no indexes for INBOX? can't handle it */ |
725057ef25e4
lib-storage: Optimize INBOX notifications with mailbox_list_index_include_inbox=yes
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22081
diff
changeset
|
164 } else { |
22457
5de2bae83c93
lib-storage: Fix INBOX notifications to set correct events
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22456
diff
changeset
|
165 mailbox_list_index_notify_init_inbox(inotify); |
19118
f600285c3df2
lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents:
19117
diff
changeset
|
166 } |
14898
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
167 |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
168 *notify_r = &inotify->notify; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
169 return 1; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
170 } |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
171 |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
172 void mailbox_list_index_notify_deinit(struct mailbox_list_notify *notify) |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
173 { |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
174 struct mailbox_list_notify_index *inotify = |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
175 (struct mailbox_list_notify_index *)notify; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
176 bool b; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
177 |
22457
5de2bae83c93
lib-storage: Fix INBOX notifications to set correct events
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22456
diff
changeset
|
178 if (inotify->inbox != NULL) |
5de2bae83c93
lib-storage: Fix INBOX notifications to set correct events
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22456
diff
changeset
|
179 mailbox_free(&inotify->inbox); |
15027
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
180 if (inotify->subscriptions != NULL) |
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
181 mailbox_tree_deinit(&inotify->subscriptions); |
14898
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
182 if (inotify->io_wait != NULL) |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
183 io_remove(&inotify->io_wait); |
19118
f600285c3df2
lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents:
19117
diff
changeset
|
184 if (inotify->io_wait_inbox != NULL) |
f600285c3df2
lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents:
19117
diff
changeset
|
185 io_remove(&inotify->io_wait_inbox); |
14898
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
186 if (inotify->to_wait != NULL) |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
187 timeout_remove(&inotify->to_wait); |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
188 if (inotify->to_notify != NULL) |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
189 timeout_remove(&inotify->to_notify); |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
190 if (inotify->sync_ctx != NULL) |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
191 (void)mail_index_view_sync_commit(&inotify->sync_ctx, &b); |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
192 mail_index_view_close(&inotify->view); |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
193 mail_index_view_close(&inotify->old_view); |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
194 mailbox_list_notify_tree_deinit(&inotify->tree); |
15027
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
195 array_free(&inotify->new_subscriptions); |
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
196 array_free(&inotify->new_unsubscriptions); |
14898
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
197 array_free(&inotify->new_uids); |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
198 array_free(&inotify->expunged_uids); |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
199 array_free(&inotify->changed_uids); |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
200 array_free(&inotify->renames); |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
201 str_free(&inotify->rec_name); |
19118
f600285c3df2
lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents:
19117
diff
changeset
|
202 i_free(inotify->list_log_path); |
f600285c3df2
lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents:
19117
diff
changeset
|
203 i_free(inotify->inbox_log_path); |
14898
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
204 i_free(inotify); |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
205 } |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
206 |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
207 static struct mailbox_list_index_node * |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
208 notify_lookup_guid(struct mailbox_list_notify_index *inotify, |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
209 struct mail_index_view *view, |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
210 uint32_t uid, enum mailbox_status_items items, |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
211 struct mailbox_status *status_r, guid_128_t guid_r) |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
212 { |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
213 struct mailbox_list_index *ilist = |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
214 INDEX_LIST_CONTEXT(inotify->notify.list); |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
215 struct mailbox_list_index_node *index_node; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
216 uint32_t seq; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
217 |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
218 if (!mail_index_lookup_seq(view, uid, &seq)) |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
219 return NULL; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
220 |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
221 index_node = mailbox_list_index_lookup_uid(ilist, uid); |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
222 if (index_node == NULL) { |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
223 /* re-parse the index list using the given view. we could be |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
224 jumping here between old and new view. */ |
15167
0fa075f2e85a
lib-storage: Added initial implementation for layout=index.
Timo Sirainen <tss@iki.fi>
parents:
15027
diff
changeset
|
225 (void)mailbox_list_index_parse(inotify->notify.list, |
0fa075f2e85a
lib-storage: Added initial implementation for layout=index.
Timo Sirainen <tss@iki.fi>
parents:
15027
diff
changeset
|
226 view, FALSE); |
14898
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
227 index_node = mailbox_list_index_lookup_uid(ilist, uid); |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
228 if (index_node == NULL) |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
229 return NULL; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
230 } |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
231 |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
232 /* get GUID */ |
21389
59437f8764c6
global: Replaced all instances of memset(p, 0, sizeof(*p)) with the new i_zero() macro.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
21226
diff
changeset
|
233 i_zero(status_r); |
14898
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
234 memset(guid_r, 0, GUID_128_SIZE); |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
235 (void)mailbox_list_index_status(inotify->notify.list, view, seq, |
18907
46cbde67f50b
lib-storage: If mailboxes' vsizes are used, keep them updated also in mailbox list index.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
236 items, status_r, guid_r, NULL); |
14898
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
237 return index_node; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
238 } |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
239 |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
240 static void notify_update_stat(struct mailbox_list_notify_index *inotify) |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
241 { |
19118
f600285c3df2
lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents:
19117
diff
changeset
|
242 bool call = FALSE; |
14898
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
243 |
19118
f600285c3df2
lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents:
19117
diff
changeset
|
244 if (stat(inotify->list_log_path, &inotify->list_last_st) < 0 && |
f600285c3df2
lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents:
19117
diff
changeset
|
245 errno != ENOENT) { |
f600285c3df2
lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents:
19117
diff
changeset
|
246 i_error("stat(%s) failed: %m", inotify->list_log_path); |
f600285c3df2
lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents:
19117
diff
changeset
|
247 call = TRUE; |
f600285c3df2
lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents:
19117
diff
changeset
|
248 } |
f600285c3df2
lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents:
19117
diff
changeset
|
249 if (inotify->inbox_log_path != NULL) { |
f600285c3df2
lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents:
19117
diff
changeset
|
250 if (stat(inotify->inbox_log_path, &inotify->inbox_last_st) < 0 && |
f600285c3df2
lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents:
19117
diff
changeset
|
251 errno != ENOENT) { |
f600285c3df2
lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents:
19117
diff
changeset
|
252 i_error("stat(%s) failed: %m", inotify->inbox_log_path); |
f600285c3df2
lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents:
19117
diff
changeset
|
253 call = TRUE; |
f600285c3df2
lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents:
19117
diff
changeset
|
254 } |
f600285c3df2
lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents:
19117
diff
changeset
|
255 } |
f600285c3df2
lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents:
19117
diff
changeset
|
256 if (call) |
14898
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
257 mailbox_list_index_notify_wait(&inotify->notify, NULL, NULL); |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
258 } |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
259 |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
260 static void |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
261 mailbox_list_index_notify_sync_init(struct mailbox_list_notify_index *inotify) |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
262 { |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
263 struct mail_index_view_sync_rec sync_rec; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
264 |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
265 notify_update_stat(inotify); |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
266 (void)mail_index_refresh(inotify->view->index); |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
267 |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
268 /* sync the view so that map extensions gets updated */ |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
269 inotify->sync_ctx = mail_index_view_sync_begin(inotify->view, 0); |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
270 mail_transaction_log_view_mark(inotify->view->log_view); |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
271 while (mail_index_view_sync_next(inotify->sync_ctx, &sync_rec)) ; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
272 mail_transaction_log_view_rewind(inotify->view->log_view); |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
273 |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
274 inotify->cur_ext = ILIST_EXT_NONE; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
275 inotify->cur_ext_id = (uint32_t)-1; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
276 } |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
277 |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
278 static bool notify_ext_rec(struct mailbox_list_notify_index *inotify, |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
279 uint32_t uid) |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
280 { |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
281 struct mailbox_list_notify *notify = &inotify->notify; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
282 |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
283 switch (inotify->cur_ext) { |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
284 case ILIST_EXT_NONE: |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
285 i_unreached(); |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
286 case ILIST_EXT_BASE: |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
287 /* UIDVALIDITY changed */ |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
288 if ((notify->mask & MAILBOX_LIST_NOTIFY_UIDVALIDITY) == 0) |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
289 return FALSE; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
290 break; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
291 case ILIST_EXT_MSGS: |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
292 /* APPEND, EXPUNGE, \Seen or \Recent flag change */ |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
293 if ((notify->mask & MAILBOX_LIST_NOTIFY_STATUS) == 0) |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
294 return FALSE; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
295 break; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
296 case ILIST_EXT_HIGHESTMODSEQ: |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
297 /* when this doesn't come with EXT_MSGS update, |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
298 it can only be a flag change or an explicit |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
299 modseq change */ |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
300 if ((notify->mask & MAILBOX_LIST_NOTIFY_MODSEQ_CHANGES) == 0) |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
301 return FALSE; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
302 break; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
303 case ILIST_EXT_UNKNOWN: |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
304 return FALSE; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
305 } |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
306 seq_range_array_add(&inotify->changed_uids, uid); |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
307 return TRUE; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
308 } |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
309 |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
310 static int |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
311 mailbox_list_index_notify_read_next(struct mailbox_list_notify_index *inotify) |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
312 { |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
313 struct mailbox_list_notify *notify = &inotify->notify; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
314 struct mailbox_list_index *ilist = INDEX_LIST_CONTEXT(notify->list); |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
315 const struct mail_transaction_header *hdr; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
316 const void *data; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
317 int ret; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
318 |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
319 ret = mail_transaction_log_view_next(inotify->view->log_view, |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
320 &hdr, &data); |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
321 if (ret <= 0) |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
322 return ret; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
323 |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
324 if ((hdr->type & MAIL_TRANSACTION_EXTERNAL) == 0) { |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
325 /* all mailbox index updates are external */ |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
326 return 1; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
327 } |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
328 switch (hdr->type & MAIL_TRANSACTION_TYPE_MASK) { |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
329 case MAIL_TRANSACTION_APPEND: { |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
330 /* mailbox added or renamed */ |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
331 const struct mail_index_record *rec, *end; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
332 |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
333 if ((notify->mask & (MAILBOX_LIST_NOTIFY_CREATE | |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
334 MAILBOX_LIST_NOTIFY_RENAME)) == 0) |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
335 break; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
336 |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
337 end = CONST_PTR_OFFSET(data, hdr->size); |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
338 for (rec = data; rec != end; rec++) |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
339 seq_range_array_add(&inotify->new_uids, rec->uid); |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
340 break; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
341 } |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
342 case MAIL_TRANSACTION_EXPUNGE_GUID: { |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
343 /* mailbox deleted or renamed */ |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
344 const struct mail_transaction_expunge_guid *rec, *end; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
345 |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
346 if ((notify->mask & (MAILBOX_LIST_NOTIFY_DELETE | |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
347 MAILBOX_LIST_NOTIFY_RENAME)) == 0) |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
348 break; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
349 |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
350 end = CONST_PTR_OFFSET(data, hdr->size); |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
351 for (rec = data; rec != end; rec++) |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
352 seq_range_array_add(&inotify->expunged_uids, rec->uid); |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
353 break; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
354 } |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
355 case MAIL_TRANSACTION_EXT_INTRO: { |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
356 struct mail_index_map *map = inotify->view->map; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
357 const struct mail_transaction_ext_intro *rec = data; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
358 const struct mail_index_ext *ext = NULL; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
359 const char *name; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
360 uint32_t ext_map_idx; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
361 |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
362 if (!array_is_created(&map->extensions)) |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
363 break; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
364 /* we want to know what extension the future |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
365 ext-rec-updates are changing. we're assuming here that |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
366 there is only one ext-intro record before those, |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
367 which is true at least for now. */ |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
368 if (rec->ext_id != (uint32_t)-1 && |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
369 rec->ext_id < array_count(&map->extensions)) { |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
370 /* get extension by id */ |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
371 ext = array_idx(&map->extensions, rec->ext_id); |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
372 } else if (rec->name_size > 0) { |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
373 /* by name */ |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
374 name = t_strndup(rec+1, rec->name_size); |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
375 if (mail_index_map_lookup_ext(map, name, &ext_map_idx)) |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
376 ext = array_idx(&map->extensions, ext_map_idx); |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
377 } |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
378 if (ext != NULL) { |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
379 if (ext->index_idx == ilist->ext_id) |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
380 inotify->cur_ext = ILIST_EXT_BASE; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
381 else if (ext->index_idx == ilist->msgs_ext_id) |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
382 inotify->cur_ext = ILIST_EXT_MSGS; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
383 else if (ext->index_idx == ilist->hmodseq_ext_id) |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
384 inotify->cur_ext = ILIST_EXT_HIGHESTMODSEQ; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
385 else |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
386 inotify->cur_ext = ILIST_EXT_UNKNOWN; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
387 inotify->cur_ext_id = ext->index_idx; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
388 } |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
389 break; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
390 } |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
391 case MAIL_TRANSACTION_EXT_REC_UPDATE: { |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
392 const struct mail_index_registered_ext *ext; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
393 const struct mail_transaction_ext_rec_update *rec; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
394 unsigned int i, record_size; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
395 |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
396 if (inotify->cur_ext == ILIST_EXT_NONE) { |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
397 i_error("%s: Missing ext-intro for ext-rec-update", |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
398 ilist->index->filepath); |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
399 break; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
400 } |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
401 |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
402 /* the record is padded to 32bits in the transaction log */ |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
403 ext = array_idx(&inotify->view->index->extensions, |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
404 inotify->cur_ext_id); |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
405 record_size = (sizeof(*rec) + ext->record_size + 3) & ~3; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
406 for (i = 0; i < hdr->size; i += record_size) { |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
407 rec = CONST_PTR_OFFSET(data, i); |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
408 |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
409 if (i + record_size > hdr->size) |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
410 break; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
411 if (!notify_ext_rec(inotify, rec->uid)) |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
412 break; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
413 } |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
414 break; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
415 } |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
416 } |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
417 return 1; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
418 } |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
419 |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
420 static int |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
421 mailbox_list_inotify_entry_guid_cmp(const struct mailbox_list_inotify_entry *r1, |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
422 const struct mailbox_list_inotify_entry *r2) |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
423 { |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
424 int ret; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
425 |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
426 ret = memcmp(r1->guid, r2->guid, sizeof(r1->guid)); |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
427 if (ret != 0) |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
428 return ret; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
429 |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
430 if (r1->expunge == r2->expunge) { |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
431 /* this really shouldn't happen */ |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
432 return 0; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
433 } |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
434 return r1->expunge ? -1 : 1; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
435 } |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
436 |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
437 static void |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
438 mailbox_list_index_notify_find_renames(struct mailbox_list_notify_index *inotify) |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
439 { |
14920
a097ef0a9d6d
Array API changed: ARRAY_DEFINE(name, type) -> ARRAY(type) name
Timo Sirainen <tss@iki.fi>
parents:
14898
diff
changeset
|
440 ARRAY(struct mailbox_list_inotify_entry) entries; |
14898
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
441 struct mailbox_status status; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
442 struct mailbox_list_notify_rename *rename; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
443 struct mailbox_list_inotify_entry *entry; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
444 const struct mailbox_list_inotify_entry *e; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
445 unsigned int i, count; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
446 guid_128_t guid; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
447 uint32_t uid; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
448 |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
449 /* first get all of the added and expunged GUIDs */ |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
450 t_array_init(&entries, array_count(&inotify->new_uids) + |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
451 array_count(&inotify->expunged_uids)); |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
452 while (seq_range_array_iter_nth(&inotify->expunged_uids_iter, |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
453 inotify->expunged_uids_n++, &uid)) { |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
454 if (notify_lookup_guid(inotify, inotify->old_view, uid, |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
455 0, &status, guid) != NULL && |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
456 !guid_128_is_empty(guid)) { |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
457 entry = array_append_space(&entries); |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
458 entry->uid = uid; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
459 entry->expunge = TRUE; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
460 memcpy(entry->guid, guid, sizeof(entry->guid)); |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
461 } |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
462 } |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
463 |
15167
0fa075f2e85a
lib-storage: Added initial implementation for layout=index.
Timo Sirainen <tss@iki.fi>
parents:
15027
diff
changeset
|
464 (void)mailbox_list_index_parse(inotify->notify.list, |
0fa075f2e85a
lib-storage: Added initial implementation for layout=index.
Timo Sirainen <tss@iki.fi>
parents:
15027
diff
changeset
|
465 inotify->view, TRUE); |
14898
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
466 while (seq_range_array_iter_nth(&inotify->new_uids_iter, |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
467 inotify->new_uids_n++, &uid)) { |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
468 if (notify_lookup_guid(inotify, inotify->view, uid, |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
469 0, &status, guid) != NULL && |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
470 !guid_128_is_empty(guid)) { |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
471 entry = array_append_space(&entries); |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
472 entry->uid = uid; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
473 memcpy(entry->guid, guid, sizeof(entry->guid)); |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
474 } |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
475 } |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
476 |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
477 /* now sort the entries by GUID and find those that have been both |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
478 added and expunged */ |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
479 array_sort(&entries, mailbox_list_inotify_entry_guid_cmp); |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
480 |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
481 e = array_get(&entries, &count); |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
482 for (i = 1; i < count; i++) { |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
483 if (e[i-1].expunge && !e[i].expunge && |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
484 memcmp(e[i-1].guid, e[i].guid, sizeof(e[i].guid)) == 0) { |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
485 rename = array_append_space(&inotify->renames); |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
486 rename->old_uid = e[i-1].uid; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
487 rename->new_uid = e[i].uid; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
488 |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
489 seq_range_array_remove(&inotify->expunged_uids, |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
490 rename->old_uid); |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
491 seq_range_array_remove(&inotify->new_uids, |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
492 rename->new_uid); |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
493 } |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
494 } |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
495 } |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
496 |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
497 static void |
15027
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
498 mailbox_list_index_notify_find_subscribes(struct mailbox_list_notify_index *inotify) |
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
499 { |
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
500 struct mailbox_tree_iterate_context *old_iter, *new_iter; |
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
501 struct mailbox_tree_context *old_tree, *new_tree; |
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
502 const char *old_path = NULL, *new_path = NULL; |
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
503 pool_t pool; |
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
504 int ret; |
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
505 |
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
506 if (mailbox_list_iter_subscriptions_refresh(inotify->notify.list) < 0) |
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
507 return; |
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
508 mailbox_tree_sort(inotify->notify.list->subscriptions); |
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
509 |
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
510 old_tree = inotify->subscriptions; |
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
511 new_tree = mailbox_tree_dup(inotify->notify.list->subscriptions); |
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
512 |
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
513 old_iter = mailbox_tree_iterate_init(old_tree, NULL, MAILBOX_SUBSCRIBED); |
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
514 new_iter = mailbox_tree_iterate_init(new_tree, NULL, MAILBOX_SUBSCRIBED); |
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
515 |
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
516 pool = mailbox_tree_get_pool(new_tree); |
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
517 for (;;) { |
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
518 if (old_path == NULL) { |
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
519 if (mailbox_tree_iterate_next(old_iter, &old_path) == NULL) |
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
520 old_path = NULL; |
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
521 } |
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
522 if (new_path == NULL) { |
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
523 if (mailbox_tree_iterate_next(new_iter, &new_path) == NULL) |
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
524 new_path = NULL; |
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
525 } |
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
526 |
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
527 if (old_path == NULL) { |
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
528 if (new_path == NULL) |
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
529 break; |
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
530 ret = 1; |
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
531 } else if (new_path == NULL) |
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
532 ret = -1; |
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
533 else { |
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
534 ret = strcmp(old_path, new_path); |
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
535 } |
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
536 |
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
537 if (ret == 0) { |
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
538 old_path = NULL; |
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
539 new_path = NULL; |
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
540 } else if (ret > 0) { |
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
541 new_path = p_strdup(pool, new_path); |
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
542 array_append(&inotify->new_subscriptions, &new_path, 1); |
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
543 new_path = NULL; |
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
544 } else { |
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
545 old_path = p_strdup(pool, old_path); |
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
546 array_append(&inotify->new_unsubscriptions, &old_path, 1); |
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
547 old_path = NULL; |
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
548 } |
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
549 } |
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
550 mailbox_tree_iterate_deinit(&old_iter); |
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
551 mailbox_tree_iterate_deinit(&new_iter); |
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
552 |
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
553 mailbox_tree_deinit(&inotify->subscriptions); |
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
554 inotify->subscriptions = new_tree; |
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
555 } |
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
556 |
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
557 static void |
14898
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
558 mailbox_list_index_notify_reset_iters(struct mailbox_list_notify_index *inotify) |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
559 { |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
560 seq_range_array_iter_init(&inotify->new_uids_iter, |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
561 &inotify->new_uids); |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
562 seq_range_array_iter_init(&inotify->expunged_uids_iter, |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
563 &inotify->expunged_uids); |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
564 seq_range_array_iter_init(&inotify->changed_uids_iter, |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
565 &inotify->changed_uids); |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
566 inotify->changed_uids_n = 0; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
567 inotify->new_uids_n = 0; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
568 inotify->expunged_uids_n = 0; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
569 inotify->rename_idx = 0; |
15027
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
570 inotify->subscription_idx = 0; |
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
571 inotify->unsubscription_idx = 0; |
14898
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
572 } |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
573 |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
574 static void |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
575 mailbox_list_index_notify_read_init(struct mailbox_list_notify_index *inotify) |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
576 { |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
577 bool b; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
578 int ret; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
579 |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
580 mailbox_list_index_notify_sync_init(inotify); |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
581 |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
582 /* read all changes from .log file */ |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
583 while ((ret = mailbox_list_index_notify_read_next(inotify)) > 0) ; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
584 inotify->read_failed = ret < 0; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
585 |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
586 (void)mail_index_view_sync_commit(&inotify->sync_ctx, &b); |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
587 |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
588 /* remove changes for already deleted mailboxes */ |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
589 seq_range_array_remove_seq_range(&inotify->new_uids, |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
590 &inotify->expunged_uids); |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
591 seq_range_array_remove_seq_range(&inotify->changed_uids, |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
592 &inotify->expunged_uids); |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
593 mailbox_list_index_notify_reset_iters(inotify); |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
594 if (array_count(&inotify->new_uids) > 0 && |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
595 array_count(&inotify->expunged_uids) > 0) { |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
596 mailbox_list_index_notify_find_renames(inotify); |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
597 mailbox_list_index_notify_reset_iters(inotify); |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
598 } |
15027
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
599 if (inotify->subscriptions != NULL) |
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
600 mailbox_list_index_notify_find_subscribes(inotify); |
14898
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
601 |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
602 inotify->initialized = TRUE; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
603 } |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
604 |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
605 static void |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
606 mailbox_list_index_notify_read_deinit(struct mailbox_list_notify_index *inotify) |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
607 { |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
608 /* save the old view so we can look up expunged records */ |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
609 mail_index_view_close(&inotify->old_view); |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
610 inotify->old_view = mail_index_view_dup_private(inotify->view); |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
611 |
15027
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
612 array_clear(&inotify->new_subscriptions); |
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
613 array_clear(&inotify->new_unsubscriptions); |
14898
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
614 array_clear(&inotify->new_uids); |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
615 array_clear(&inotify->expunged_uids); |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
616 array_clear(&inotify->changed_uids); |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
617 array_clear(&inotify->renames); |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
618 |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
619 inotify->initialized = FALSE; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
620 } |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
621 |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
622 static bool |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
623 mailbox_list_index_notify_lookup(struct mailbox_list_notify_index *inotify, |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
624 struct mail_index_view *view, |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
625 uint32_t uid, enum mailbox_status_items items, |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
626 struct mailbox_status *status_r, |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
627 struct mailbox_list_notify_rec **rec_r) |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
628 { |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
629 struct mailbox_list_notify_rec *rec = &inotify->notify_rec; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
630 struct mailbox_list_index_node *index_node; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
631 const char *storage_name; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
632 char ns_sep = mailbox_list_get_hierarchy_sep(inotify->notify.list); |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
633 |
21389
59437f8764c6
global: Replaced all instances of memset(p, 0, sizeof(*p)) with the new i_zero() macro.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
21226
diff
changeset
|
634 i_zero(rec); |
14898
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
635 index_node = notify_lookup_guid(inotify, view, uid, |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
636 items, status_r, rec->guid); |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
637 if (index_node == NULL) |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
638 return FALSE; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
639 |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
640 /* get storage_name */ |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
641 str_truncate(inotify->rec_name, 0); |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
642 mailbox_list_index_node_get_path(index_node, ns_sep, inotify->rec_name); |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
643 storage_name = str_c(inotify->rec_name); |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
644 |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
645 rec->storage_name = storage_name; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
646 rec->vname = mailbox_list_get_vname(inotify->notify.list, |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
647 rec->storage_name); |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
648 *rec_r = rec; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
649 return TRUE; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
650 } |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
651 |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
652 static bool |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
653 mailbox_list_index_notify_rename(struct mailbox_list_notify_index *inotify, |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
654 unsigned int idx) |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
655 { |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
656 const struct mailbox_list_notify_rename *rename; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
657 struct mailbox_list_notify_rec *rec; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
658 struct mailbox_status status; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
659 const char *old_vname; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
660 |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
661 rename = array_idx(&inotify->renames, idx); |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
662 |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
663 /* lookup the old name */ |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
664 if (!mailbox_list_index_notify_lookup(inotify, inotify->old_view, |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
665 rename->old_uid, 0, &status, &rec)) |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
666 return FALSE; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
667 old_vname = t_strdup(rec->vname); |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
668 |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
669 /* return using the new name */ |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
670 if (!mailbox_list_index_notify_lookup(inotify, inotify->view, |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
671 rename->new_uid, 0, &status, &rec)) |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
672 return FALSE; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
673 |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
674 rec->old_vname = old_vname; |
19117
fa979ccfa34c
Mailbox list notify API changed to return multiple events at once.
Timo Sirainen <tss@iki.fi>
parents:
18907
diff
changeset
|
675 rec->events = MAILBOX_LIST_NOTIFY_RENAME; |
14898
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
676 return TRUE; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
677 } |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
678 |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
679 static bool |
15027
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
680 mailbox_list_index_notify_subscribe(struct mailbox_list_notify_index *inotify, |
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
681 unsigned int idx) |
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
682 { |
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
683 struct mailbox_list_notify_rec *rec = &inotify->notify_rec; |
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
684 const char *const *vnamep; |
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
685 |
21389
59437f8764c6
global: Replaced all instances of memset(p, 0, sizeof(*p)) with the new i_zero() macro.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
21226
diff
changeset
|
686 i_zero(rec); |
15027
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
687 vnamep = array_idx(&inotify->new_subscriptions, idx); |
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
688 rec->vname = *vnamep; |
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
689 rec->storage_name = mailbox_list_get_storage_name(inotify->notify.list, |
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
690 rec->vname); |
19117
fa979ccfa34c
Mailbox list notify API changed to return multiple events at once.
Timo Sirainen <tss@iki.fi>
parents:
18907
diff
changeset
|
691 rec->events = MAILBOX_LIST_NOTIFY_SUBSCRIBE; |
15027
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
692 return TRUE; |
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
693 } |
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
694 |
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
695 static bool |
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
696 mailbox_list_index_notify_unsubscribe(struct mailbox_list_notify_index *inotify, |
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
697 unsigned int idx) |
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
698 { |
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
699 struct mailbox_list_notify_rec *rec = &inotify->notify_rec; |
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
700 const char *const *vnamep; |
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
701 |
21389
59437f8764c6
global: Replaced all instances of memset(p, 0, sizeof(*p)) with the new i_zero() macro.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
21226
diff
changeset
|
702 i_zero(rec); |
15027
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
703 vnamep = array_idx(&inotify->new_unsubscriptions, idx); |
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
704 rec->vname = *vnamep; |
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
705 rec->storage_name = mailbox_list_get_storage_name(inotify->notify.list, |
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
706 rec->vname); |
19117
fa979ccfa34c
Mailbox list notify API changed to return multiple events at once.
Timo Sirainen <tss@iki.fi>
parents:
18907
diff
changeset
|
707 rec->events = MAILBOX_LIST_NOTIFY_UNSUBSCRIBE; |
15027
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
708 return TRUE; |
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
709 } |
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
710 |
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
711 static bool |
14898
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
712 mailbox_list_index_notify_expunge(struct mailbox_list_notify_index *inotify, |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
713 uint32_t uid) |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
714 { |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
715 struct mailbox_list_notify_rec *rec; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
716 struct mailbox_status status; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
717 |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
718 if (!mailbox_list_index_notify_lookup(inotify, inotify->old_view, |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
719 uid, 0, &status, &rec)) |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
720 return FALSE; |
19117
fa979ccfa34c
Mailbox list notify API changed to return multiple events at once.
Timo Sirainen <tss@iki.fi>
parents:
18907
diff
changeset
|
721 rec->events = MAILBOX_LIST_NOTIFY_DELETE; |
14898
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
722 return TRUE; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
723 } |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
724 |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
725 static bool |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
726 mailbox_list_index_notify_new(struct mailbox_list_notify_index *inotify, |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
727 uint32_t uid) |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
728 { |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
729 struct mailbox_list_notify_rec *rec; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
730 struct mailbox_status status; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
731 |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
732 if (!mailbox_list_index_notify_lookup(inotify, inotify->view, |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
733 uid, 0, &status, &rec)) |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
734 i_unreached(); |
19117
fa979ccfa34c
Mailbox list notify API changed to return multiple events at once.
Timo Sirainen <tss@iki.fi>
parents:
18907
diff
changeset
|
735 rec->events = MAILBOX_LIST_NOTIFY_CREATE; |
14898
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
736 return TRUE; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
737 } |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
738 |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
739 static bool |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
740 mailbox_list_index_notify_change(struct mailbox_list_notify_index *inotify, |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
741 uint32_t uid) |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
742 { |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
743 struct mailbox_list_notify_rec *rec; |
19140
390d55d627a8
lib-storage: Fixed crash in mailbox list index notifying caused by fa979ccfa34c
Timo Sirainen <tss@iki.fi>
parents:
19118
diff
changeset
|
744 struct mailbox_notify_node *nnode, empty_node; |
14898
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
745 struct mailbox_status status; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
746 |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
747 if (!mailbox_list_index_notify_lookup(inotify, inotify->view, |
22457
5de2bae83c93
lib-storage: Fix INBOX notifications to set correct events
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22456
diff
changeset
|
748 uid, notify_status_items, |
22484
71589abee915
lib-storage: Fix mailbox list notification assert-crash when mailbox is deleted
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22457
diff
changeset
|
749 &status, &rec)) { |
71589abee915
lib-storage: Fix mailbox list notification assert-crash when mailbox is deleted
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22457
diff
changeset
|
750 /* Mailbox is already deleted. We won't get here if we're |
71589abee915
lib-storage: Fix mailbox list notification assert-crash when mailbox is deleted
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22457
diff
changeset
|
751 tracking MAILBOX_LIST_NOTIFY_DELETE or _RENAME |
71589abee915
lib-storage: Fix mailbox list notification assert-crash when mailbox is deleted
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22457
diff
changeset
|
752 (which update expunged_uids). */ |
71589abee915
lib-storage: Fix mailbox list notification assert-crash when mailbox is deleted
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22457
diff
changeset
|
753 return FALSE; |
71589abee915
lib-storage: Fix mailbox list notification assert-crash when mailbox is deleted
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22457
diff
changeset
|
754 } |
14898
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
755 |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
756 /* get the old status */ |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
757 nnode = mailbox_list_notify_tree_lookup(inotify->tree, |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
758 rec->storage_name); |
19140
390d55d627a8
lib-storage: Fixed crash in mailbox list index notifying caused by fa979ccfa34c
Timo Sirainen <tss@iki.fi>
parents:
19118
diff
changeset
|
759 if (nnode == NULL) { |
390d55d627a8
lib-storage: Fixed crash in mailbox list index notifying caused by fa979ccfa34c
Timo Sirainen <tss@iki.fi>
parents:
19118
diff
changeset
|
760 /* mailbox didn't exist earlier - report all events as new */ |
21389
59437f8764c6
global: Replaced all instances of memset(p, 0, sizeof(*p)) with the new i_zero() macro.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
21226
diff
changeset
|
761 i_zero(&empty_node); |
19140
390d55d627a8
lib-storage: Fixed crash in mailbox list index notifying caused by fa979ccfa34c
Timo Sirainen <tss@iki.fi>
parents:
19118
diff
changeset
|
762 nnode = &empty_node; |
390d55d627a8
lib-storage: Fixed crash in mailbox list index notifying caused by fa979ccfa34c
Timo Sirainen <tss@iki.fi>
parents:
19118
diff
changeset
|
763 } |
22456
d1658f4cb079
lib-storage: List index notify cleanup - move code to separate functions
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22455
diff
changeset
|
764 rec->events |= mailbox_list_index_get_changed_events(nnode, &status); |
14898
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
765 /* update internal state */ |
22456
d1658f4cb079
lib-storage: List index notify cleanup - move code to separate functions
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22455
diff
changeset
|
766 mailbox_notify_node_update_status(nnode, &status); |
22078
f2b50a4a6951
lib-storage: Fix mailbox list index notifications when modseqs aren't enabled.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
767 return rec->events != 0; |
14898
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
768 } |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
769 |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
770 static bool |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
771 mailbox_list_index_notify_try_next(struct mailbox_list_notify_index *inotify) |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
772 { |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
773 uint32_t uid; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
774 |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
775 /* first show mailbox deletes */ |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
776 if (seq_range_array_iter_nth(&inotify->expunged_uids_iter, |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
777 inotify->expunged_uids_n++, &uid)) |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
778 return mailbox_list_index_notify_expunge(inotify, uid); |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
779 |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
780 /* mailbox renames */ |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
781 if (inotify->rename_idx < array_count(&inotify->renames)) { |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
782 return mailbox_list_index_notify_rename(inotify, |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
783 inotify->rename_idx++); |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
784 } |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
785 |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
786 /* next mailbox creates */ |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
787 if (seq_range_array_iter_nth(&inotify->new_uids_iter, |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
788 inotify->new_uids_n++, &uid)) |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
789 return mailbox_list_index_notify_new(inotify, uid); |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
790 |
15027
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
791 /* subscribes */ |
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
792 if (inotify->subscription_idx < array_count(&inotify->new_subscriptions)) { |
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
793 return mailbox_list_index_notify_subscribe(inotify, |
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
794 inotify->subscription_idx++); |
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
795 } |
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
796 if (inotify->unsubscription_idx < array_count(&inotify->new_unsubscriptions)) { |
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
797 return mailbox_list_index_notify_unsubscribe(inotify, |
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
798 inotify->unsubscription_idx++); |
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
799 } |
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
800 |
14898
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
801 /* STATUS updates */ |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
802 while (seq_range_array_iter_nth(&inotify->changed_uids_iter, |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
803 inotify->changed_uids_n++, &uid)) { |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
804 if (mailbox_list_index_notify_change(inotify, uid)) |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
805 return TRUE; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
806 } |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
807 return FALSE; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
808 } |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
809 |
22457
5de2bae83c93
lib-storage: Fix INBOX notifications to set correct events
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22456
diff
changeset
|
810 static enum mailbox_list_notify_event |
5de2bae83c93
lib-storage: Fix INBOX notifications to set correct events
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22456
diff
changeset
|
811 mailbox_list_notify_inbox_get_events(struct mailbox_list_notify_index *inotify) |
5de2bae83c93
lib-storage: Fix INBOX notifications to set correct events
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22456
diff
changeset
|
812 { |
5de2bae83c93
lib-storage: Fix INBOX notifications to set correct events
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22456
diff
changeset
|
813 struct mailbox_status old_status, new_status; |
5de2bae83c93
lib-storage: Fix INBOX notifications to set correct events
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22456
diff
changeset
|
814 struct mailbox_notify_node old_nnode; |
5de2bae83c93
lib-storage: Fix INBOX notifications to set correct events
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22456
diff
changeset
|
815 |
5de2bae83c93
lib-storage: Fix INBOX notifications to set correct events
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22456
diff
changeset
|
816 mailbox_get_open_status(inotify->inbox, notify_status_items, &old_status); |
5de2bae83c93
lib-storage: Fix INBOX notifications to set correct events
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22456
diff
changeset
|
817 if (mailbox_sync(inotify->inbox, MAILBOX_SYNC_FLAG_FAST) < 0) { |
5de2bae83c93
lib-storage: Fix INBOX notifications to set correct events
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22456
diff
changeset
|
818 i_error("Mailbox list index notify: Failed to sync INBOX: %s", |
5de2bae83c93
lib-storage: Fix INBOX notifications to set correct events
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22456
diff
changeset
|
819 mailbox_get_last_internal_error(inotify->inbox, NULL)); |
5de2bae83c93
lib-storage: Fix INBOX notifications to set correct events
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22456
diff
changeset
|
820 return 0; |
5de2bae83c93
lib-storage: Fix INBOX notifications to set correct events
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22456
diff
changeset
|
821 } |
5de2bae83c93
lib-storage: Fix INBOX notifications to set correct events
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22456
diff
changeset
|
822 mailbox_get_open_status(inotify->inbox, notify_status_items, &new_status); |
5de2bae83c93
lib-storage: Fix INBOX notifications to set correct events
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22456
diff
changeset
|
823 |
5de2bae83c93
lib-storage: Fix INBOX notifications to set correct events
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22456
diff
changeset
|
824 mailbox_notify_node_update_status(&old_nnode, &old_status); |
5de2bae83c93
lib-storage: Fix INBOX notifications to set correct events
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22456
diff
changeset
|
825 return mailbox_list_index_get_changed_events(&old_nnode, &new_status); |
5de2bae83c93
lib-storage: Fix INBOX notifications to set correct events
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22456
diff
changeset
|
826 } |
5de2bae83c93
lib-storage: Fix INBOX notifications to set correct events
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22456
diff
changeset
|
827 |
14898
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
828 int mailbox_list_index_notify_next(struct mailbox_list_notify *notify, |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
829 const struct mailbox_list_notify_rec **rec_r) |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
830 { |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
831 struct mailbox_list_notify_index *inotify = |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
832 (struct mailbox_list_notify_index *)notify; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
833 |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
834 if (!inotify->initialized) |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
835 mailbox_list_index_notify_read_init(inotify); |
21226
a4d4a5dffa09
lib-storge: Call mail_storage.list_index_corrupted() when needed
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
836 if (mailbox_list_index_handle_corruption(notify->list) < 0) |
a4d4a5dffa09
lib-storge: Call mail_storage.list_index_corrupted() when needed
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
837 return -1; |
a4d4a5dffa09
lib-storge: Call mail_storage.list_index_corrupted() when needed
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
838 |
14898
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
839 while (mailbox_list_index_notify_try_next(inotify)) { |
19117
fa979ccfa34c
Mailbox list notify API changed to return multiple events at once.
Timo Sirainen <tss@iki.fi>
parents:
18907
diff
changeset
|
840 if ((inotify->notify_rec.events & inotify->notify.mask) != 0) { |
14898
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
841 *rec_r = &inotify->notify_rec; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
842 return 1; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
843 } else { |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
844 /* caller doesn't care about this change */ |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
845 } |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
846 } |
19118
f600285c3df2
lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents:
19117
diff
changeset
|
847 if (inotify->inbox_event_pending) { |
f600285c3df2
lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents:
19117
diff
changeset
|
848 inotify->inbox_event_pending = FALSE; |
21389
59437f8764c6
global: Replaced all instances of memset(p, 0, sizeof(*p)) with the new i_zero() macro.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
21226
diff
changeset
|
849 i_zero(&inotify->notify_rec); |
19118
f600285c3df2
lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents:
19117
diff
changeset
|
850 inotify->notify_rec.vname = "INBOX"; |
f600285c3df2
lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents:
19117
diff
changeset
|
851 inotify->notify_rec.storage_name = "INBOX"; |
22457
5de2bae83c93
lib-storage: Fix INBOX notifications to set correct events
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22456
diff
changeset
|
852 inotify->notify_rec.events = |
5de2bae83c93
lib-storage: Fix INBOX notifications to set correct events
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22456
diff
changeset
|
853 mailbox_list_notify_inbox_get_events(inotify); |
19118
f600285c3df2
lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents:
19117
diff
changeset
|
854 *rec_r = &inotify->notify_rec; |
f600285c3df2
lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents:
19117
diff
changeset
|
855 return 1; |
f600285c3df2
lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents:
19117
diff
changeset
|
856 } |
14898
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
857 |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
858 mailbox_list_index_notify_read_deinit(inotify); |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
859 return inotify->read_failed ? -1 : 0; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
860 } |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
861 |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
862 static void notify_now_callback(struct mailbox_list_notify_index *inotify) |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
863 { |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
864 timeout_remove(&inotify->to_notify); |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
865 inotify->wait_callback(inotify->wait_context); |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
866 } |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
867 |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
868 static void notify_callback(struct mailbox_list_notify_index *inotify) |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
869 { |
19118
f600285c3df2
lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents:
19117
diff
changeset
|
870 #define INOTIFY_ST_CHANGED(last_st, prev_st) \ |
f600285c3df2
lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents:
19117
diff
changeset
|
871 ((last_st).st_mtime != (prev_st).st_mtime || \ |
f600285c3df2
lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents:
19117
diff
changeset
|
872 ST_MTIME_NSEC(last_st) != ST_MTIME_NSEC(prev_st) || \ |
f600285c3df2
lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents:
19117
diff
changeset
|
873 (last_st).st_size != (prev_st).st_size || \ |
f600285c3df2
lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents:
19117
diff
changeset
|
874 (last_st).st_ino != (prev_st).st_ino) |
f600285c3df2
lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents:
19117
diff
changeset
|
875 struct stat list_prev_st = inotify->list_last_st; |
f600285c3df2
lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents:
19117
diff
changeset
|
876 struct stat inbox_prev_st = inotify->inbox_last_st; |
f600285c3df2
lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents:
19117
diff
changeset
|
877 |
14898
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
878 notify_update_stat(inotify); |
19118
f600285c3df2
lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents:
19117
diff
changeset
|
879 if (INOTIFY_ST_CHANGED(inotify->inbox_last_st, inbox_prev_st)) |
f600285c3df2
lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents:
19117
diff
changeset
|
880 inotify->inbox_event_pending = TRUE; |
f600285c3df2
lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents:
19117
diff
changeset
|
881 if (inotify->inbox_event_pending || |
f600285c3df2
lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents:
19117
diff
changeset
|
882 INOTIFY_ST_CHANGED(inotify->list_last_st, list_prev_st)) { |
14898
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
883 /* log has changed. call the callback with a small delay |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
884 to allow bundling multiple changes together */ |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
885 if (inotify->to_notify != NULL) { |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
886 /* already doing this */ |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
887 return; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
888 } |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
889 inotify->to_notify = |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
890 timeout_add_short(NOTIFY_DELAY_MSECS, |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
891 notify_now_callback, inotify); |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
892 } |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
893 } |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
894 |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
895 void mailbox_list_index_notify_wait(struct mailbox_list_notify *notify, |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
896 void (*callback)(void *context), |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
897 void *context) |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
898 { |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
899 struct mailbox_list_notify_index *inotify = |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
900 (struct mailbox_list_notify_index *)notify; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
901 unsigned int check_interval; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
902 |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
903 inotify->wait_callback = callback; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
904 inotify->wait_context = context; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
905 |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
906 if (callback == NULL) { |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
907 if (inotify->io_wait != NULL) |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
908 io_remove(&inotify->io_wait); |
19118
f600285c3df2
lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents:
19117
diff
changeset
|
909 if (inotify->io_wait_inbox != NULL) |
f600285c3df2
lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents:
19117
diff
changeset
|
910 io_remove(&inotify->io_wait_inbox); |
14898
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
911 if (inotify->to_wait != NULL) |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
912 timeout_remove(&inotify->to_wait); |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
913 if (inotify->to_notify != NULL) |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
914 timeout_remove(&inotify->to_notify); |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
915 } else if (inotify->to_wait == NULL) { |
19118
f600285c3df2
lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents:
19117
diff
changeset
|
916 (void)io_add_notify(inotify->list_log_path, notify_callback, |
f600285c3df2
lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents:
19117
diff
changeset
|
917 inotify, &inotify->io_wait); |
f600285c3df2
lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents:
19117
diff
changeset
|
918 /* we need to check for INBOX explicitly, because INBOX changes |
f600285c3df2
lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents:
19117
diff
changeset
|
919 don't get added to mailbox.list.index.log */ |
f600285c3df2
lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents:
19117
diff
changeset
|
920 if (inotify->inbox_log_path != NULL) { |
f600285c3df2
lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents:
19117
diff
changeset
|
921 (void)io_add_notify(inotify->inbox_log_path, |
f600285c3df2
lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents:
19117
diff
changeset
|
922 notify_callback, inotify, |
f600285c3df2
lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents:
19117
diff
changeset
|
923 &inotify->io_wait_inbox); |
f600285c3df2
lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents:
19117
diff
changeset
|
924 } |
14898
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
925 /* check with timeout as well, in case io_add_notify() |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
926 doesn't work (e.g. NFS) */ |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
927 check_interval = notify->list->mail_set->mailbox_idle_check_interval; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
928 i_assert(check_interval > 0); |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
929 inotify->to_wait = timeout_add(check_interval * 1000, |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
930 notify_callback, inotify); |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
931 notify_update_stat(inotify); |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
932 } |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
933 } |
22081
c5eae96dcd71
lib-storage: Implement mailbox_list_notify_flush()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22078
diff
changeset
|
934 |
c5eae96dcd71
lib-storage: Implement mailbox_list_notify_flush()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22078
diff
changeset
|
935 void mailbox_list_index_notify_flush(struct mailbox_list_notify *notify) |
c5eae96dcd71
lib-storage: Implement mailbox_list_notify_flush()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22078
diff
changeset
|
936 { |
c5eae96dcd71
lib-storage: Implement mailbox_list_notify_flush()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22078
diff
changeset
|
937 struct mailbox_list_notify_index *inotify = |
c5eae96dcd71
lib-storage: Implement mailbox_list_notify_flush()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22078
diff
changeset
|
938 (struct mailbox_list_notify_index *)notify; |
c5eae96dcd71
lib-storage: Implement mailbox_list_notify_flush()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22078
diff
changeset
|
939 |
22604
98d99bf6511e
lib-storage: Make sure mailbox list notification flush sees latest changes.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22484
diff
changeset
|
940 if (inotify->to_notify == NULL && |
98d99bf6511e
lib-storage: Make sure mailbox list notification flush sees latest changes.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22484
diff
changeset
|
941 notify->list->mail_set->mailbox_idle_check_interval > 0) { |
98d99bf6511e
lib-storage: Make sure mailbox list notification flush sees latest changes.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22484
diff
changeset
|
942 /* no pending notification - check if anything had changed */ |
98d99bf6511e
lib-storage: Make sure mailbox list notification flush sees latest changes.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22484
diff
changeset
|
943 notify_callback(inotify); |
98d99bf6511e
lib-storage: Make sure mailbox list notification flush sees latest changes.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22484
diff
changeset
|
944 } |
22081
c5eae96dcd71
lib-storage: Implement mailbox_list_notify_flush()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22078
diff
changeset
|
945 if (inotify->to_notify != NULL) |
c5eae96dcd71
lib-storage: Implement mailbox_list_notify_flush()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22078
diff
changeset
|
946 notify_now_callback(inotify); |
c5eae96dcd71
lib-storage: Implement mailbox_list_notify_flush()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22078
diff
changeset
|
947 } |