annotate src/lib-storage/list/mailbox-list-index-notify.c @ 22457:5de2bae83c93

lib-storage: Fix INBOX notifications to set correct events This fixes IMAP NOTIFY so it doesn't send STATUS notifications to INBOX when it doesn't have to.
author Timo Sirainen <timo.sirainen@dovecot.fi>
date Mon, 04 Sep 2017 17:48:52 +0300
parents d1658f4cb079
children 71589abee915
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,
5de2bae83c93 lib-storage: Fix INBOX notifications to set correct events
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22456
diff changeset
749 &status, &rec))
14898
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
750 i_unreached();
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
751
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
752 /* get the old status */
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
753 nnode = mailbox_list_notify_tree_lookup(inotify->tree,
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
754 rec->storage_name);
19140
390d55d627a8 lib-storage: Fixed crash in mailbox list index notifying caused by fa979ccfa34c
Timo Sirainen <tss@iki.fi>
parents: 19118
diff changeset
755 if (nnode == NULL) {
390d55d627a8 lib-storage: Fixed crash in mailbox list index notifying caused by fa979ccfa34c
Timo Sirainen <tss@iki.fi>
parents: 19118
diff changeset
756 /* mailbox didn't exist earlier - report all events as new */
21389
59437f8764c6 global: Replaced all instances of memset(p, 0, sizeof(*p)) with the new i_zero() macro.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21226
diff changeset
757 i_zero(&empty_node);
19140
390d55d627a8 lib-storage: Fixed crash in mailbox list index notifying caused by fa979ccfa34c
Timo Sirainen <tss@iki.fi>
parents: 19118
diff changeset
758 nnode = &empty_node;
390d55d627a8 lib-storage: Fixed crash in mailbox list index notifying caused by fa979ccfa34c
Timo Sirainen <tss@iki.fi>
parents: 19118
diff changeset
759 }
22456
d1658f4cb079 lib-storage: List index notify cleanup - move code to separate functions
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22455
diff changeset
760 rec->events |= mailbox_list_index_get_changed_events(nnode, &status);
14898
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
761 /* update internal state */
22456
d1658f4cb079 lib-storage: List index notify cleanup - move code to separate functions
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22455
diff changeset
762 mailbox_notify_node_update_status(nnode, &status);
22078
f2b50a4a6951 lib-storage: Fix mailbox list index notifications when modseqs aren't enabled.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
763 return rec->events != 0;
14898
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
764 }
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
765
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
766 static bool
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
767 mailbox_list_index_notify_try_next(struct mailbox_list_notify_index *inotify)
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
768 {
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
769 uint32_t uid;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
770
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
771 /* first show mailbox deletes */
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
772 if (seq_range_array_iter_nth(&inotify->expunged_uids_iter,
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
773 inotify->expunged_uids_n++, &uid))
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
774 return mailbox_list_index_notify_expunge(inotify, uid);
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
775
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
776 /* mailbox renames */
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
777 if (inotify->rename_idx < array_count(&inotify->renames)) {
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
778 return mailbox_list_index_notify_rename(inotify,
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
779 inotify->rename_idx++);
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
780 }
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
781
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
782 /* next mailbox creates */
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
783 if (seq_range_array_iter_nth(&inotify->new_uids_iter,
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
784 inotify->new_uids_n++, &uid))
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
785 return mailbox_list_index_notify_new(inotify, uid);
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
786
15027
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
787 /* subscribes */
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
788 if (inotify->subscription_idx < array_count(&inotify->new_subscriptions)) {
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
789 return mailbox_list_index_notify_subscribe(inotify,
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
790 inotify->subscription_idx++);
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
791 }
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
792 if (inotify->unsubscription_idx < array_count(&inotify->new_unsubscriptions)) {
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
793 return mailbox_list_index_notify_unsubscribe(inotify,
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
794 inotify->unsubscription_idx++);
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
795 }
fcd480c4a0db NOTIFY: Implemented SubscriptionChange
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
796
14898
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
797 /* STATUS updates */
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
798 while (seq_range_array_iter_nth(&inotify->changed_uids_iter,
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
799 inotify->changed_uids_n++, &uid)) {
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
800 if (mailbox_list_index_notify_change(inotify, uid))
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
801 return TRUE;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
802 }
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
803 return FALSE;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
804 }
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
805
22457
5de2bae83c93 lib-storage: Fix INBOX notifications to set correct events
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22456
diff changeset
806 static enum mailbox_list_notify_event
5de2bae83c93 lib-storage: Fix INBOX notifications to set correct events
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22456
diff changeset
807 mailbox_list_notify_inbox_get_events(struct mailbox_list_notify_index *inotify)
5de2bae83c93 lib-storage: Fix INBOX notifications to set correct events
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22456
diff changeset
808 {
5de2bae83c93 lib-storage: Fix INBOX notifications to set correct events
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22456
diff changeset
809 struct mailbox_status old_status, new_status;
5de2bae83c93 lib-storage: Fix INBOX notifications to set correct events
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22456
diff changeset
810 struct mailbox_notify_node old_nnode;
5de2bae83c93 lib-storage: Fix INBOX notifications to set correct events
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22456
diff changeset
811
5de2bae83c93 lib-storage: Fix INBOX notifications to set correct events
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22456
diff changeset
812 mailbox_get_open_status(inotify->inbox, notify_status_items, &old_status);
5de2bae83c93 lib-storage: Fix INBOX notifications to set correct events
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22456
diff changeset
813 if (mailbox_sync(inotify->inbox, MAILBOX_SYNC_FLAG_FAST) < 0) {
5de2bae83c93 lib-storage: Fix INBOX notifications to set correct events
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22456
diff changeset
814 i_error("Mailbox list index notify: Failed to sync INBOX: %s",
5de2bae83c93 lib-storage: Fix INBOX notifications to set correct events
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22456
diff changeset
815 mailbox_get_last_internal_error(inotify->inbox, NULL));
5de2bae83c93 lib-storage: Fix INBOX notifications to set correct events
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22456
diff changeset
816 return 0;
5de2bae83c93 lib-storage: Fix INBOX notifications to set correct events
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22456
diff changeset
817 }
5de2bae83c93 lib-storage: Fix INBOX notifications to set correct events
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22456
diff changeset
818 mailbox_get_open_status(inotify->inbox, notify_status_items, &new_status);
5de2bae83c93 lib-storage: Fix INBOX notifications to set correct events
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22456
diff changeset
819
5de2bae83c93 lib-storage: Fix INBOX notifications to set correct events
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22456
diff changeset
820 mailbox_notify_node_update_status(&old_nnode, &old_status);
5de2bae83c93 lib-storage: Fix INBOX notifications to set correct events
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22456
diff changeset
821 return mailbox_list_index_get_changed_events(&old_nnode, &new_status);
5de2bae83c93 lib-storage: Fix INBOX notifications to set correct events
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22456
diff changeset
822 }
5de2bae83c93 lib-storage: Fix INBOX notifications to set correct events
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22456
diff changeset
823
14898
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
824 int mailbox_list_index_notify_next(struct mailbox_list_notify *notify,
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
825 const struct mailbox_list_notify_rec **rec_r)
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
826 {
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
827 struct mailbox_list_notify_index *inotify =
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
828 (struct mailbox_list_notify_index *)notify;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
829
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
830 if (!inotify->initialized)
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
831 mailbox_list_index_notify_read_init(inotify);
21226
a4d4a5dffa09 lib-storge: Call mail_storage.list_index_corrupted() when needed
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19552
diff changeset
832 if (mailbox_list_index_handle_corruption(notify->list) < 0)
a4d4a5dffa09 lib-storge: Call mail_storage.list_index_corrupted() when needed
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19552
diff changeset
833 return -1;
a4d4a5dffa09 lib-storge: Call mail_storage.list_index_corrupted() when needed
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19552
diff changeset
834
14898
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
835 while (mailbox_list_index_notify_try_next(inotify)) {
19117
fa979ccfa34c Mailbox list notify API changed to return multiple events at once.
Timo Sirainen <tss@iki.fi>
parents: 18907
diff changeset
836 if ((inotify->notify_rec.events & inotify->notify.mask) != 0) {
14898
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
837 *rec_r = &inotify->notify_rec;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
838 return 1;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
839 } else {
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
840 /* caller doesn't care about this change */
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
841 }
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
842 }
19118
f600285c3df2 lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents: 19117
diff changeset
843 if (inotify->inbox_event_pending) {
f600285c3df2 lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents: 19117
diff changeset
844 inotify->inbox_event_pending = FALSE;
21389
59437f8764c6 global: Replaced all instances of memset(p, 0, sizeof(*p)) with the new i_zero() macro.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21226
diff changeset
845 i_zero(&inotify->notify_rec);
19118
f600285c3df2 lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents: 19117
diff changeset
846 inotify->notify_rec.vname = "INBOX";
f600285c3df2 lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents: 19117
diff changeset
847 inotify->notify_rec.storage_name = "INBOX";
22457
5de2bae83c93 lib-storage: Fix INBOX notifications to set correct events
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22456
diff changeset
848 inotify->notify_rec.events =
5de2bae83c93 lib-storage: Fix INBOX notifications to set correct events
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22456
diff changeset
849 mailbox_list_notify_inbox_get_events(inotify);
19118
f600285c3df2 lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents: 19117
diff changeset
850 *rec_r = &inotify->notify_rec;
f600285c3df2 lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents: 19117
diff changeset
851 return 1;
f600285c3df2 lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents: 19117
diff changeset
852 }
14898
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
853
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
854 mailbox_list_index_notify_read_deinit(inotify);
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
855 return inotify->read_failed ? -1 : 0;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
856 }
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
857
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
858 static void notify_now_callback(struct mailbox_list_notify_index *inotify)
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
859 {
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
860 timeout_remove(&inotify->to_notify);
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
861 inotify->wait_callback(inotify->wait_context);
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
862 }
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
863
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
864 static void notify_callback(struct mailbox_list_notify_index *inotify)
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
865 {
19118
f600285c3df2 lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents: 19117
diff changeset
866 #define INOTIFY_ST_CHANGED(last_st, prev_st) \
f600285c3df2 lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents: 19117
diff changeset
867 ((last_st).st_mtime != (prev_st).st_mtime || \
f600285c3df2 lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents: 19117
diff changeset
868 ST_MTIME_NSEC(last_st) != ST_MTIME_NSEC(prev_st) || \
f600285c3df2 lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents: 19117
diff changeset
869 (last_st).st_size != (prev_st).st_size || \
f600285c3df2 lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents: 19117
diff changeset
870 (last_st).st_ino != (prev_st).st_ino)
f600285c3df2 lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents: 19117
diff changeset
871 struct stat list_prev_st = inotify->list_last_st;
f600285c3df2 lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents: 19117
diff changeset
872 struct stat inbox_prev_st = inotify->inbox_last_st;
f600285c3df2 lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents: 19117
diff changeset
873
14898
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
874 notify_update_stat(inotify);
19118
f600285c3df2 lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents: 19117
diff changeset
875 if (INOTIFY_ST_CHANGED(inotify->inbox_last_st, inbox_prev_st))
f600285c3df2 lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents: 19117
diff changeset
876 inotify->inbox_event_pending = TRUE;
f600285c3df2 lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents: 19117
diff changeset
877 if (inotify->inbox_event_pending ||
f600285c3df2 lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents: 19117
diff changeset
878 INOTIFY_ST_CHANGED(inotify->list_last_st, list_prev_st)) {
14898
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
879 /* log has changed. call the callback with a small delay
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
880 to allow bundling multiple changes together */
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
881 if (inotify->to_notify != NULL) {
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
882 /* already doing this */
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
883 return;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
884 }
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
885 inotify->to_notify =
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
886 timeout_add_short(NOTIFY_DELAY_MSECS,
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
887 notify_now_callback, inotify);
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
888 }
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
889 }
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
890
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
891 void mailbox_list_index_notify_wait(struct mailbox_list_notify *notify,
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
892 void (*callback)(void *context),
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
893 void *context)
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
894 {
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
895 struct mailbox_list_notify_index *inotify =
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
896 (struct mailbox_list_notify_index *)notify;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
897 unsigned int check_interval;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
898
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
899 inotify->wait_callback = callback;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
900 inotify->wait_context = context;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
901
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
902 if (callback == NULL) {
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
903 if (inotify->io_wait != NULL)
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
904 io_remove(&inotify->io_wait);
19118
f600285c3df2 lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents: 19117
diff changeset
905 if (inotify->io_wait_inbox != NULL)
f600285c3df2 lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents: 19117
diff changeset
906 io_remove(&inotify->io_wait_inbox);
14898
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
907 if (inotify->to_wait != NULL)
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
908 timeout_remove(&inotify->to_wait);
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
909 if (inotify->to_notify != NULL)
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
910 timeout_remove(&inotify->to_notify);
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
911 } else if (inotify->to_wait == NULL) {
19118
f600285c3df2 lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents: 19117
diff changeset
912 (void)io_add_notify(inotify->list_log_path, notify_callback,
f600285c3df2 lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents: 19117
diff changeset
913 inotify, &inotify->io_wait);
f600285c3df2 lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents: 19117
diff changeset
914 /* we need to check for INBOX explicitly, because INBOX changes
f600285c3df2 lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents: 19117
diff changeset
915 don't get added to mailbox.list.index.log */
f600285c3df2 lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents: 19117
diff changeset
916 if (inotify->inbox_log_path != NULL) {
f600285c3df2 lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents: 19117
diff changeset
917 (void)io_add_notify(inotify->inbox_log_path,
f600285c3df2 lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents: 19117
diff changeset
918 notify_callback, inotify,
f600285c3df2 lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents: 19117
diff changeset
919 &inotify->io_wait_inbox);
f600285c3df2 lib-storage: Mailbox list notifications didn't work for INBOX.
Timo Sirainen <tss@iki.fi>
parents: 19117
diff changeset
920 }
14898
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
921 /* check with timeout as well, in case io_add_notify()
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
922 doesn't work (e.g. NFS) */
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
923 check_interval = notify->list->mail_set->mailbox_idle_check_interval;
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
924 i_assert(check_interval > 0);
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
925 inotify->to_wait = timeout_add(check_interval * 1000,
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
926 notify_callback, inotify);
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
927 notify_update_stat(inotify);
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
928 }
a16d77a075bb lib-storage: Added mailbox-list-notify API for tracking changes in all mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
929 }
22081
c5eae96dcd71 lib-storage: Implement mailbox_list_notify_flush()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22078
diff changeset
930
c5eae96dcd71 lib-storage: Implement mailbox_list_notify_flush()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22078
diff changeset
931 void mailbox_list_index_notify_flush(struct mailbox_list_notify *notify)
c5eae96dcd71 lib-storage: Implement mailbox_list_notify_flush()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22078
diff changeset
932 {
c5eae96dcd71 lib-storage: Implement mailbox_list_notify_flush()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22078
diff changeset
933 struct mailbox_list_notify_index *inotify =
c5eae96dcd71 lib-storage: Implement mailbox_list_notify_flush()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22078
diff changeset
934 (struct mailbox_list_notify_index *)notify;
c5eae96dcd71 lib-storage: Implement mailbox_list_notify_flush()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22078
diff changeset
935
c5eae96dcd71 lib-storage: Implement mailbox_list_notify_flush()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22078
diff changeset
936 if (inotify->to_notify != NULL)
c5eae96dcd71 lib-storage: Implement mailbox_list_notify_flush()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22078
diff changeset
937 notify_now_callback(inotify);
c5eae96dcd71 lib-storage: Implement mailbox_list_notify_flush()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22078
diff changeset
938 }