annotate src/lib-storage/list/mailbox-list-index-notify.c @ 22604:98d99bf6511e

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