Mercurial > dovecot > core-2.2
annotate src/lib-storage/list/mailbox-list-index-notify.c @ 22457:5de2bae83c93
lib-storage: Fix INBOX notifications to set correct events
This fixes IMAP NOTIFY so it doesn't send STATUS notifications to INBOX when
it doesn't have to.
author | Timo Sirainen <timo.sirainen@dovecot.fi> |
---|---|
date | Mon, 04 Sep 2017 17:48:52 +0300 |
parents | d1658f4cb079 |
children | 71589abee915 |
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, |
5de2bae83c93
lib-storage: Fix INBOX notifications to set correct events
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22456
diff
changeset
|
749 &status, &rec)) |
14898
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
750 i_unreached(); |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
751 |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
752 /* 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
|
753 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
|
754 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
|
755 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
|
756 /* 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
|
757 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
|
758 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
|
759 } |
22456
d1658f4cb079
lib-storage: List index notify cleanup - move code to separate functions
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22455
diff
changeset
|
760 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
|
761 /* 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
|
762 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
|
763 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
|
764 } |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
765 |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
766 static bool |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
767 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
|
768 { |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
769 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
|
770 |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
771 /* 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
|
772 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
|
773 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
|
774 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
|
775 |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
776 /* mailbox renames */ |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
777 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
|
778 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
|
779 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
|
780 } |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
781 |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
782 /* 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
|
783 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
|
784 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
|
785 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
|
786 |
15027
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
787 /* subscribes */ |
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
788 if (inotify->subscription_idx < array_count(&inotify->new_subscriptions)) { |
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
789 return mailbox_list_index_notify_subscribe(inotify, |
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
790 inotify->subscription_idx++); |
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
791 } |
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
792 if (inotify->unsubscription_idx < array_count(&inotify->new_unsubscriptions)) { |
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
793 return mailbox_list_index_notify_unsubscribe(inotify, |
fcd480c4a0db
NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
794 inotify->unsubscription_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 |
14898
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
797 /* STATUS updates */ |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
798 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
|
799 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
|
800 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
|
801 return TRUE; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
802 } |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
803 return FALSE; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
804 } |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
805 |
22457
5de2bae83c93
lib-storage: Fix INBOX notifications to set correct events
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22456
diff
changeset
|
806 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
|
807 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
|
808 { |
5de2bae83c93
lib-storage: Fix INBOX notifications to set correct events
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22456
diff
changeset
|
809 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
|
810 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
|
811 |
5de2bae83c93
lib-storage: Fix INBOX notifications to set correct events
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22456
diff
changeset
|
812 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
|
813 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
|
814 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
|
815 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
|
816 return 0; |
5de2bae83c93
lib-storage: Fix INBOX notifications to set correct events
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22456
diff
changeset
|
817 } |
5de2bae83c93
lib-storage: Fix INBOX notifications to set correct events
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22456
diff
changeset
|
818 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
|
819 |
5de2bae83c93
lib-storage: Fix INBOX notifications to set correct events
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22456
diff
changeset
|
820 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
|
821 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
|
822 } |
5de2bae83c93
lib-storage: Fix INBOX notifications to set correct events
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22456
diff
changeset
|
823 |
14898
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
824 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
|
825 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
|
826 { |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
827 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
|
828 (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
|
829 |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
830 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
|
831 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
|
832 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
|
833 return -1; |
a4d4a5dffa09
lib-storge: Call mail_storage.list_index_corrupted() when needed
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
834 |
14898
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
835 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
|
836 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
|
837 *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
|
838 return 1; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
839 } else { |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
840 /* 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
|
841 } |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
842 } |
19118
f600285c3df2
lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents:
19117
diff
changeset
|
843 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
|
844 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
|
845 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
|
846 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
|
847 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
|
848 inotify->notify_rec.events = |
5de2bae83c93
lib-storage: Fix INBOX notifications to set correct events
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22456
diff
changeset
|
849 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
|
850 *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
|
851 return 1; |
f600285c3df2
lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents:
19117
diff
changeset
|
852 } |
14898
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
853 |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
854 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
|
855 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
|
856 } |
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 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
|
859 { |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
860 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
|
861 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
|
862 } |
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 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
|
865 { |
19118
f600285c3df2
lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents:
19117
diff
changeset
|
866 #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
|
867 ((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
|
868 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
|
869 (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
|
870 (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
|
871 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
|
872 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
|
873 |
14898
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
874 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
|
875 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
|
876 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
|
877 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
|
878 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
|
879 /* 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
|
880 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
|
881 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
|
882 /* 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
|
883 return; |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
884 } |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
885 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
|
886 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
|
887 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
|
888 } |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
889 } |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
890 |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
891 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
|
892 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
|
893 void *context) |
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 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
|
896 (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
|
897 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
|
898 |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
899 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
|
900 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
|
901 |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
902 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
|
903 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
|
904 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
|
905 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
|
906 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
|
907 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
|
908 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
|
909 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
|
910 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
|
911 } 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
|
912 (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
|
913 inotify, &inotify->io_wait); |
f600285c3df2
lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents:
19117
diff
changeset
|
914 /* 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
|
915 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
|
916 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
|
917 (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
|
918 notify_callback, inotify, |
f600285c3df2
lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents:
19117
diff
changeset
|
919 &inotify->io_wait_inbox); |
f600285c3df2
lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents:
19117
diff
changeset
|
920 } |
14898
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
921 /* 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
|
922 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
|
923 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
|
924 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
|
925 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
|
926 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
|
927 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
|
928 } |
a16d77a075bb
lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
929 } |
22081
c5eae96dcd71
lib-storage: Implement mailbox_list_notify_flush()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22078
diff
changeset
|
930 |
c5eae96dcd71
lib-storage: Implement mailbox_list_notify_flush()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22078
diff
changeset
|
931 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
|
932 { |
c5eae96dcd71
lib-storage: Implement mailbox_list_notify_flush()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22078
diff
changeset
|
933 struct mailbox_list_notify_index *inotify = |
c5eae96dcd71
lib-storage: Implement mailbox_list_notify_flush()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22078
diff
changeset
|
934 (struct mailbox_list_notify_index *)notify; |
c5eae96dcd71
lib-storage: Implement mailbox_list_notify_flush()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22078
diff
changeset
|
935 |
c5eae96dcd71
lib-storage: Implement mailbox_list_notify_flush()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22078
diff
changeset
|
936 if (inotify->to_notify != NULL) |
c5eae96dcd71
lib-storage: Implement mailbox_list_notify_flush()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22078
diff
changeset
|
937 notify_now_callback(inotify); |
c5eae96dcd71
lib-storage: Implement mailbox_list_notify_flush()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22078
diff
changeset
|
938 } |