Mercurial > dovecot > core-2.2
annotate src/lib-index/mail-index-transaction-view.c @ 22576:707ae9de3812
lib: istream-multiplex - Minor code cleanup
Avoid propagating the error twice, and avoid any confusion about what "got"
actually contains.
author | Timo Sirainen <timo.sirainen@dovecot.fi> |
---|---|
date | Thu, 05 Oct 2017 20:24:11 +0300 |
parents | 2e2563132d5f |
children | cb108f786fb4 |
rev | line source |
---|---|
21390
2e2563132d5f
Updated copyright notices to include the year 2017.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
21389
diff
changeset
|
1 /* Copyright (c) 2004-2017 Dovecot authors, see the included COPYING file */ |
2224
a816e2d88406
Added mail_index_transaction_get_updated_view() which can be used to access
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2 |
a816e2d88406
Added mail_index_transaction_get_updated_view() which can be used to access
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
3 #include "lib.h" |
3470
346a494c2feb
Moved array declaration to array-decl.h and include it in lib.h. So array.h
Timo Sirainen <tss@iki.fi>
parents:
3195
diff
changeset
|
4 #include "array.h" |
2224
a816e2d88406
Added mail_index_transaction_get_updated_view() which can be used to access
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
5 #include "buffer.h" |
4333
8bfdd3928097
mail_index_lookup() and mail_index_lookup_full() returns now 0 if the mail has been expunged within the transaction.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
3879
diff
changeset
|
6 #include "seq-range-array.h" |
2224
a816e2d88406
Added mail_index_transaction_get_updated_view() which can be used to access
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
7 #include "mail-index-private.h" |
a816e2d88406
Added mail_index_transaction_get_updated_view() which can be used to access
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
8 #include "mail-index-view-private.h" |
a816e2d88406
Added mail_index_transaction_get_updated_view() which can be used to access
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
9 #include "mail-index-transaction-private.h" |
a816e2d88406
Added mail_index_transaction_get_updated_view() which can be used to access
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
10 |
a816e2d88406
Added mail_index_transaction_get_updated_view() which can be used to access
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
11 struct mail_index_view_transaction { |
a816e2d88406
Added mail_index_transaction_get_updated_view() which can be used to access
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
12 struct mail_index_view view; |
4453
85fcdb478608
Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4451
diff
changeset
|
13 struct mail_index_view_vfuncs *super; |
2224
a816e2d88406
Added mail_index_transaction_get_updated_view() which can be used to access
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
14 struct mail_index_transaction *t; |
4528
74212d11b6b5
Transaction view: mail_index_get_header() returns now updated next_uid field
Timo Sirainen <tss@iki.fi>
parents:
4453
diff
changeset
|
15 |
6262
15abc6d262cd
mail_index_ext_get_reset_id() takes now map parameters. Fixed it to work
Timo Sirainen <tss@iki.fi>
parents:
6171
diff
changeset
|
16 struct mail_index_map *lookup_map; |
4528
74212d11b6b5
Transaction view: mail_index_get_header() returns now updated next_uid field
Timo Sirainen <tss@iki.fi>
parents:
4453
diff
changeset
|
17 struct mail_index_header hdr; |
8549
7b16388a3bb0
mail_get_flags/keywords() now returns updated values if they've been changed within transaction.
Timo Sirainen <tss@iki.fi>
parents:
8548
diff
changeset
|
18 |
8126
cf2c4f3c636f
mail_index_lookup_ext*() didn't return properly aligned pointers with updated transaction views.
Timo Sirainen <tss@iki.fi>
parents:
8115
diff
changeset
|
19 buffer_t *lookup_return_data; |
8548
6a6a3bfea547
transaction view: Allow looking up multiple ext datas for the same message without breaking.
Timo Sirainen <tss@iki.fi>
parents:
8215
diff
changeset
|
20 uint32_t lookup_prev_seq; |
8549
7b16388a3bb0
mail_get_flags/keywords() now returns updated values if they've been changed within transaction.
Timo Sirainen <tss@iki.fi>
parents:
8548
diff
changeset
|
21 |
9646
d1c159e447a2
Transaction view: Fixed getting extension data from messages whose flags had changed.
Timo Sirainen <tss@iki.fi>
parents:
9624
diff
changeset
|
22 unsigned int record_size; |
8549
7b16388a3bb0
mail_get_flags/keywords() now returns updated values if they've been changed within transaction.
Timo Sirainen <tss@iki.fi>
parents:
8548
diff
changeset
|
23 unsigned int recs_count; |
9646
d1c159e447a2
Transaction view: Fixed getting extension data from messages whose flags had changed.
Timo Sirainen <tss@iki.fi>
parents:
9624
diff
changeset
|
24 void *recs; |
14920
a097ef0a9d6d
Array API changed: ARRAY_DEFINE(name, type) -> ARRAY(type) name
Timo Sirainen <tss@iki.fi>
parents:
14599
diff
changeset
|
25 ARRAY(void *) all_recs; |
2224
a816e2d88406
Added mail_index_transaction_get_updated_view() which can be used to access
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
26 }; |
a816e2d88406
Added mail_index_transaction_get_updated_view() which can be used to access
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
27 |
6420
a8b515e1a26f
Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents:
6277
diff
changeset
|
28 static void tview_close(struct mail_index_view *view) |
2224
a816e2d88406
Added mail_index_transaction_get_updated_view() which can be used to access
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
29 { |
a816e2d88406
Added mail_index_transaction_get_updated_view() which can be used to access
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
30 struct mail_index_view_transaction *tview = |
a816e2d88406
Added mail_index_transaction_get_updated_view() which can be used to access
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
31 (struct mail_index_view_transaction *)view; |
4453
85fcdb478608
Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4451
diff
changeset
|
32 struct mail_index_transaction *t = tview->t; |
9784
3296870a8510
Transaction view: Don't assert-crash if record size grows during transaction.
Timo Sirainen <tss@iki.fi>
parents:
9646
diff
changeset
|
33 void **recs; |
3296870a8510
Transaction view: Don't assert-crash if record size grows during transaction.
Timo Sirainen <tss@iki.fi>
parents:
9646
diff
changeset
|
34 unsigned int i, count; |
2224
a816e2d88406
Added mail_index_transaction_get_updated_view() which can be used to access
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
35 |
6262
15abc6d262cd
mail_index_ext_get_reset_id() takes now map parameters. Fixed it to work
Timo Sirainen <tss@iki.fi>
parents:
6171
diff
changeset
|
36 if (tview->lookup_map != NULL) |
15abc6d262cd
mail_index_ext_get_reset_id() takes now map parameters. Fixed it to work
Timo Sirainen <tss@iki.fi>
parents:
6171
diff
changeset
|
37 mail_index_unmap(&tview->lookup_map); |
8126
cf2c4f3c636f
mail_index_lookup_ext*() didn't return properly aligned pointers with updated transaction views.
Timo Sirainen <tss@iki.fi>
parents:
8115
diff
changeset
|
38 if (tview->lookup_return_data != NULL) |
cf2c4f3c636f
mail_index_lookup_ext*() didn't return properly aligned pointers with updated transaction views.
Timo Sirainen <tss@iki.fi>
parents:
8115
diff
changeset
|
39 buffer_free(&tview->lookup_return_data); |
9784
3296870a8510
Transaction view: Don't assert-crash if record size grows during transaction.
Timo Sirainen <tss@iki.fi>
parents:
9646
diff
changeset
|
40 |
3296870a8510
Transaction view: Don't assert-crash if record size grows during transaction.
Timo Sirainen <tss@iki.fi>
parents:
9646
diff
changeset
|
41 if (array_is_created(&tview->all_recs)) { |
3296870a8510
Transaction view: Don't assert-crash if record size grows during transaction.
Timo Sirainen <tss@iki.fi>
parents:
9646
diff
changeset
|
42 recs = array_get_modifiable(&tview->all_recs, &count); |
3296870a8510
Transaction view: Don't assert-crash if record size grows during transaction.
Timo Sirainen <tss@iki.fi>
parents:
9646
diff
changeset
|
43 for (i = 0; i < count; i++) |
3296870a8510
Transaction view: Don't assert-crash if record size grows during transaction.
Timo Sirainen <tss@iki.fi>
parents:
9646
diff
changeset
|
44 i_free(recs[i]); |
3296870a8510
Transaction view: Don't assert-crash if record size grows during transaction.
Timo Sirainen <tss@iki.fi>
parents:
9646
diff
changeset
|
45 array_free(&tview->all_recs); |
3296870a8510
Transaction view: Don't assert-crash if record size grows during transaction.
Timo Sirainen <tss@iki.fi>
parents:
9646
diff
changeset
|
46 } |
6262
15abc6d262cd
mail_index_ext_get_reset_id() takes now map parameters. Fixed it to work
Timo Sirainen <tss@iki.fi>
parents:
6171
diff
changeset
|
47 |
4453
85fcdb478608
Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4451
diff
changeset
|
48 tview->super->close(view); |
85fcdb478608
Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4451
diff
changeset
|
49 mail_index_transaction_unref(&t); |
2224
a816e2d88406
Added mail_index_transaction_get_updated_view() which can be used to access
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
50 } |
a816e2d88406
Added mail_index_transaction_get_updated_view() which can be used to access
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
51 |
6420
a8b515e1a26f
Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents:
6277
diff
changeset
|
52 static uint32_t tview_get_message_count(struct mail_index_view *view) |
2224
a816e2d88406
Added mail_index_transaction_get_updated_view() which can be used to access
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
53 { |
a816e2d88406
Added mail_index_transaction_get_updated_view() which can be used to access
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
54 struct mail_index_view_transaction *tview = |
a816e2d88406
Added mail_index_transaction_get_updated_view() which can be used to access
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
55 (struct mail_index_view_transaction *)view; |
a816e2d88406
Added mail_index_transaction_get_updated_view() which can be used to access
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
56 |
5855
fd6ff4d9cab1
Removed view->hdr. Use view->map->hdr directly.
Timo Sirainen <tss@iki.fi>
parents:
5228
diff
changeset
|
57 return view->map->hdr.messages_count + |
2224
a816e2d88406
Added mail_index_transaction_get_updated_view() which can be used to access
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
58 (tview->t->last_new_seq == 0 ? 0 : |
8213
ffefb9074966
Transaction view: get_message_count() returned one too few when there were new messages.
Timo Sirainen <tss@iki.fi>
parents:
8199
diff
changeset
|
59 tview->t->last_new_seq - tview->t->first_new_seq + 1); |
2224
a816e2d88406
Added mail_index_transaction_get_updated_view() which can be used to access
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
60 } |
a816e2d88406
Added mail_index_transaction_get_updated_view() which can be used to access
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
61 |
2892
62d53b49110d
Changed mail_index_get_header() to return the header as return value because
Timo Sirainen <tss@iki.fi>
parents:
2884
diff
changeset
|
62 static const struct mail_index_header * |
6420
a8b515e1a26f
Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents:
6277
diff
changeset
|
63 tview_get_header(struct mail_index_view *view) |
2224
a816e2d88406
Added mail_index_transaction_get_updated_view() which can be used to access
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
64 { |
a816e2d88406
Added mail_index_transaction_get_updated_view() which can be used to access
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
65 struct mail_index_view_transaction *tview = |
a816e2d88406
Added mail_index_transaction_get_updated_view() which can be used to access
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
66 (struct mail_index_view_transaction *)view; |
4528
74212d11b6b5
Transaction view: mail_index_get_header() returns now updated next_uid field
Timo Sirainen <tss@iki.fi>
parents:
4453
diff
changeset
|
67 const struct mail_index_header *hdr; |
6037
d911d943438e
Recent flag handling rewrite. Still not perfect with maildir.
Timo Sirainen <tss@iki.fi>
parents:
6036
diff
changeset
|
68 uint32_t next_uid; |
2224
a816e2d88406
Added mail_index_transaction_get_updated_view() which can be used to access
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
69 |
2884
173a0296e81d
Update view's header only after syncing the view. This and other changes fix
Timo Sirainen <tss@iki.fi>
parents:
2853
diff
changeset
|
70 /* FIXME: header counters may not be correct */ |
4528
74212d11b6b5
Transaction view: mail_index_get_header() returns now updated next_uid field
Timo Sirainen <tss@iki.fi>
parents:
4453
diff
changeset
|
71 hdr = tview->super->get_header(view); |
74212d11b6b5
Transaction view: mail_index_get_header() returns now updated next_uid field
Timo Sirainen <tss@iki.fi>
parents:
4453
diff
changeset
|
72 |
6037
d911d943438e
Recent flag handling rewrite. Still not perfect with maildir.
Timo Sirainen <tss@iki.fi>
parents:
6036
diff
changeset
|
73 next_uid = mail_index_transaction_get_next_uid(tview->t); |
d911d943438e
Recent flag handling rewrite. Still not perfect with maildir.
Timo Sirainen <tss@iki.fi>
parents:
6036
diff
changeset
|
74 if (next_uid != hdr->next_uid) { |
d911d943438e
Recent flag handling rewrite. Still not perfect with maildir.
Timo Sirainen <tss@iki.fi>
parents:
6036
diff
changeset
|
75 tview->hdr = *hdr; |
d911d943438e
Recent flag handling rewrite. Still not perfect with maildir.
Timo Sirainen <tss@iki.fi>
parents:
6036
diff
changeset
|
76 tview->hdr.next_uid = next_uid; |
d911d943438e
Recent flag handling rewrite. Still not perfect with maildir.
Timo Sirainen <tss@iki.fi>
parents:
6036
diff
changeset
|
77 hdr = &tview->hdr; |
4528
74212d11b6b5
Transaction view: mail_index_get_header() returns now updated next_uid field
Timo Sirainen <tss@iki.fi>
parents:
4453
diff
changeset
|
78 } |
4529 | 79 return hdr; |
2224
a816e2d88406
Added mail_index_transaction_get_updated_view() which can be used to access
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
80 } |
a816e2d88406
Added mail_index_transaction_get_updated_view() which can be used to access
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
81 |
6277
5f66277bbe40
mail_index_lookup*() can't fail anymore. Changed several APIs not to return
Timo Sirainen <tss@iki.fi>
parents:
6275
diff
changeset
|
82 static const struct mail_index_record * |
8549
7b16388a3bb0
mail_get_flags/keywords() now returns updated values if they've been changed within transaction.
Timo Sirainen <tss@iki.fi>
parents:
8548
diff
changeset
|
83 tview_apply_flag_updates(struct mail_index_view_transaction *tview, |
9646
d1c159e447a2
Transaction view: Fixed getting extension data from messages whose flags had changed.
Timo Sirainen <tss@iki.fi>
parents:
9624
diff
changeset
|
84 struct mail_index_map *map, |
8549
7b16388a3bb0
mail_get_flags/keywords() now returns updated values if they've been changed within transaction.
Timo Sirainen <tss@iki.fi>
parents:
8548
diff
changeset
|
85 const struct mail_index_record *rec, uint32_t seq) |
7b16388a3bb0
mail_get_flags/keywords() now returns updated values if they've been changed within transaction.
Timo Sirainen <tss@iki.fi>
parents:
8548
diff
changeset
|
86 { |
7b16388a3bb0
mail_get_flags/keywords() now returns updated values if they've been changed within transaction.
Timo Sirainen <tss@iki.fi>
parents:
8548
diff
changeset
|
87 struct mail_index_transaction *t = tview->t; |
14599
dbd42f7198eb
shared mailboxes: Per-user flags can now be stored in private index files.
Timo Sirainen <tss@iki.fi>
parents:
14580
diff
changeset
|
88 const struct mail_index_flag_update *updates; |
9646
d1c159e447a2
Transaction view: Fixed getting extension data from messages whose flags had changed.
Timo Sirainen <tss@iki.fi>
parents:
9624
diff
changeset
|
89 struct mail_index_record *trec; |
8549
7b16388a3bb0
mail_get_flags/keywords() now returns updated values if they've been changed within transaction.
Timo Sirainen <tss@iki.fi>
parents:
8548
diff
changeset
|
90 unsigned int idx, count; |
7b16388a3bb0
mail_get_flags/keywords() now returns updated values if they've been changed within transaction.
Timo Sirainen <tss@iki.fi>
parents:
8548
diff
changeset
|
91 |
7b16388a3bb0
mail_get_flags/keywords() now returns updated values if they've been changed within transaction.
Timo Sirainen <tss@iki.fi>
parents:
8548
diff
changeset
|
92 /* see if there are any flag updates */ |
7b16388a3bb0
mail_get_flags/keywords() now returns updated values if they've been changed within transaction.
Timo Sirainen <tss@iki.fi>
parents:
8548
diff
changeset
|
93 if (seq < t->min_flagupdate_seq || seq > t->max_flagupdate_seq || |
7b16388a3bb0
mail_get_flags/keywords() now returns updated values if they've been changed within transaction.
Timo Sirainen <tss@iki.fi>
parents:
8548
diff
changeset
|
94 !array_is_created(&t->updates)) |
7b16388a3bb0
mail_get_flags/keywords() now returns updated values if they've been changed within transaction.
Timo Sirainen <tss@iki.fi>
parents:
8548
diff
changeset
|
95 return rec; |
7b16388a3bb0
mail_get_flags/keywords() now returns updated values if they've been changed within transaction.
Timo Sirainen <tss@iki.fi>
parents:
8548
diff
changeset
|
96 |
7b16388a3bb0
mail_get_flags/keywords() now returns updated values if they've been changed within transaction.
Timo Sirainen <tss@iki.fi>
parents:
8548
diff
changeset
|
97 updates = array_get(&t->updates, &count); |
7b16388a3bb0
mail_get_flags/keywords() now returns updated values if they've been changed within transaction.
Timo Sirainen <tss@iki.fi>
parents:
8548
diff
changeset
|
98 idx = mail_index_transaction_get_flag_update_pos(t, 0, count, seq); |
7b16388a3bb0
mail_get_flags/keywords() now returns updated values if they've been changed within transaction.
Timo Sirainen <tss@iki.fi>
parents:
8548
diff
changeset
|
99 if (seq < updates[idx].uid1 || seq > updates[idx].uid2) |
7b16388a3bb0
mail_get_flags/keywords() now returns updated values if they've been changed within transaction.
Timo Sirainen <tss@iki.fi>
parents:
8548
diff
changeset
|
100 return rec; |
7b16388a3bb0
mail_get_flags/keywords() now returns updated values if they've been changed within transaction.
Timo Sirainen <tss@iki.fi>
parents:
8548
diff
changeset
|
101 |
7b16388a3bb0
mail_get_flags/keywords() now returns updated values if they've been changed within transaction.
Timo Sirainen <tss@iki.fi>
parents:
8548
diff
changeset
|
102 /* yes, we have flag updates. since we can't modify rec directly and |
7b16388a3bb0
mail_get_flags/keywords() now returns updated values if they've been changed within transaction.
Timo Sirainen <tss@iki.fi>
parents:
8548
diff
changeset
|
103 we want to be able to handle multiple mail_index_lookup() calls |
7b16388a3bb0
mail_get_flags/keywords() now returns updated values if they've been changed within transaction.
Timo Sirainen <tss@iki.fi>
parents:
8548
diff
changeset
|
104 without the second one overriding the first one's data, we'll |
9784
3296870a8510
Transaction view: Don't assert-crash if record size grows during transaction.
Timo Sirainen <tss@iki.fi>
parents:
9646
diff
changeset
|
105 create a records array and return data from there. |
3296870a8510
Transaction view: Don't assert-crash if record size grows during transaction.
Timo Sirainen <tss@iki.fi>
parents:
9646
diff
changeset
|
106 |
3296870a8510
Transaction view: Don't assert-crash if record size grows during transaction.
Timo Sirainen <tss@iki.fi>
parents:
9646
diff
changeset
|
107 it's also possible that the record size increases, so we potentially |
3296870a8510
Transaction view: Don't assert-crash if record size grows during transaction.
Timo Sirainen <tss@iki.fi>
parents:
9646
diff
changeset
|
108 have to create multiple arrays. they all get eventually freed when |
3296870a8510
Transaction view: Don't assert-crash if record size grows during transaction.
Timo Sirainen <tss@iki.fi>
parents:
9646
diff
changeset
|
109 the view gets freed. */ |
3296870a8510
Transaction view: Don't assert-crash if record size grows during transaction.
Timo Sirainen <tss@iki.fi>
parents:
9646
diff
changeset
|
110 if (map->hdr.record_size > tview->record_size) { |
3296870a8510
Transaction view: Don't assert-crash if record size grows during transaction.
Timo Sirainen <tss@iki.fi>
parents:
9646
diff
changeset
|
111 if (!array_is_created(&tview->all_recs)) |
3296870a8510
Transaction view: Don't assert-crash if record size grows during transaction.
Timo Sirainen <tss@iki.fi>
parents:
9646
diff
changeset
|
112 i_array_init(&tview->all_recs, 4); |
8549
7b16388a3bb0
mail_get_flags/keywords() now returns updated values if they've been changed within transaction.
Timo Sirainen <tss@iki.fi>
parents:
8548
diff
changeset
|
113 tview->recs_count = t->first_new_seq; |
9646
d1c159e447a2
Transaction view: Fixed getting extension data from messages whose flags had changed.
Timo Sirainen <tss@iki.fi>
parents:
9624
diff
changeset
|
114 tview->record_size = I_MAX(map->hdr.record_size, |
d1c159e447a2
Transaction view: Fixed getting extension data from messages whose flags had changed.
Timo Sirainen <tss@iki.fi>
parents:
9624
diff
changeset
|
115 tview->view.map->hdr.record_size); |
21323
d223fad9767f
global: Make sure *_malloc() calculations won't cause integer overflows.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19777
diff
changeset
|
116 tview->recs = i_malloc(MALLOC_MULTIPLY(tview->record_size, |
d223fad9767f
global: Make sure *_malloc() calculations won't cause integer overflows.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19777
diff
changeset
|
117 tview->recs_count)); |
9784
3296870a8510
Transaction view: Don't assert-crash if record size grows during transaction.
Timo Sirainen <tss@iki.fi>
parents:
9646
diff
changeset
|
118 array_append(&tview->all_recs, &tview->recs, 1); |
8549
7b16388a3bb0
mail_get_flags/keywords() now returns updated values if they've been changed within transaction.
Timo Sirainen <tss@iki.fi>
parents:
8548
diff
changeset
|
119 } |
7b16388a3bb0
mail_get_flags/keywords() now returns updated values if they've been changed within transaction.
Timo Sirainen <tss@iki.fi>
parents:
8548
diff
changeset
|
120 i_assert(tview->recs_count == t->first_new_seq); |
7b16388a3bb0
mail_get_flags/keywords() now returns updated values if they've been changed within transaction.
Timo Sirainen <tss@iki.fi>
parents:
8548
diff
changeset
|
121 i_assert(seq > 0 && seq <= tview->recs_count); |
7b16388a3bb0
mail_get_flags/keywords() now returns updated values if they've been changed within transaction.
Timo Sirainen <tss@iki.fi>
parents:
8548
diff
changeset
|
122 |
9646
d1c159e447a2
Transaction view: Fixed getting extension data from messages whose flags had changed.
Timo Sirainen <tss@iki.fi>
parents:
9624
diff
changeset
|
123 trec = PTR_OFFSET(tview->recs, (seq-1) * tview->record_size); |
d1c159e447a2
Transaction view: Fixed getting extension data from messages whose flags had changed.
Timo Sirainen <tss@iki.fi>
parents:
9624
diff
changeset
|
124 memcpy(trec, rec, map->hdr.record_size); |
d1c159e447a2
Transaction view: Fixed getting extension data from messages whose flags had changed.
Timo Sirainen <tss@iki.fi>
parents:
9624
diff
changeset
|
125 trec->flags |= updates[idx].add_flags; |
d1c159e447a2
Transaction view: Fixed getting extension data from messages whose flags had changed.
Timo Sirainen <tss@iki.fi>
parents:
9624
diff
changeset
|
126 trec->flags &= ~updates[idx].remove_flags; |
d1c159e447a2
Transaction view: Fixed getting extension data from messages whose flags had changed.
Timo Sirainen <tss@iki.fi>
parents:
9624
diff
changeset
|
127 return trec; |
8549
7b16388a3bb0
mail_get_flags/keywords() now returns updated values if they've been changed within transaction.
Timo Sirainen <tss@iki.fi>
parents:
8548
diff
changeset
|
128 } |
7b16388a3bb0
mail_get_flags/keywords() now returns updated values if they've been changed within transaction.
Timo Sirainen <tss@iki.fi>
parents:
8548
diff
changeset
|
129 |
7b16388a3bb0
mail_get_flags/keywords() now returns updated values if they've been changed within transaction.
Timo Sirainen <tss@iki.fi>
parents:
8548
diff
changeset
|
130 static const struct mail_index_record * |
6420
a8b515e1a26f
Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents:
6277
diff
changeset
|
131 tview_lookup_full(struct mail_index_view *view, uint32_t seq, |
a8b515e1a26f
Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents:
6277
diff
changeset
|
132 struct mail_index_map **map_r, bool *expunged_r) |
2224
a816e2d88406
Added mail_index_transaction_get_updated_view() which can be used to access
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
133 { |
a816e2d88406
Added mail_index_transaction_get_updated_view() which can be used to access
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
134 struct mail_index_view_transaction *tview = |
a816e2d88406
Added mail_index_transaction_get_updated_view() which can be used to access
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
135 (struct mail_index_view_transaction *)view; |
6277
5f66277bbe40
mail_index_lookup*() can't fail anymore. Changed several APIs not to return
Timo Sirainen <tss@iki.fi>
parents:
6275
diff
changeset
|
136 const struct mail_index_record *rec; |
2224
a816e2d88406
Added mail_index_transaction_get_updated_view() which can be used to access
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
137 |
a816e2d88406
Added mail_index_transaction_get_updated_view() which can be used to access
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
138 if (seq >= tview->t->first_new_seq) { |
a816e2d88406
Added mail_index_transaction_get_updated_view() which can be used to access
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
139 /* FIXME: is this right to return index map..? |
a816e2d88406
Added mail_index_transaction_get_updated_view() which can be used to access
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
140 it's not there yet. */ |
a816e2d88406
Added mail_index_transaction_get_updated_view() which can be used to access
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
141 *map_r = view->index->map; |
15775
f9b1aaf844c8
lib-index: Don't lookup mail's expunge-state in transaction log view if caller doesn't care.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
142 if (expunged_r != NULL) |
f9b1aaf844c8
lib-index: Don't lookup mail's expunge-state in transaction log view if caller doesn't care.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
143 *expunged_r = FALSE; |
6277
5f66277bbe40
mail_index_lookup*() can't fail anymore. Changed several APIs not to return
Timo Sirainen <tss@iki.fi>
parents:
6275
diff
changeset
|
144 return mail_index_transaction_lookup(tview->t, seq); |
2224
a816e2d88406
Added mail_index_transaction_get_updated_view() which can be used to access
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
145 } |
4333
8bfdd3928097
mail_index_lookup() and mail_index_lookup_full() returns now 0 if the mail has been expunged within the transaction.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
3879
diff
changeset
|
146 |
6277
5f66277bbe40
mail_index_lookup*() can't fail anymore. Changed several APIs not to return
Timo Sirainen <tss@iki.fi>
parents:
6275
diff
changeset
|
147 rec = tview->super->lookup_full(view, seq, map_r, expunged_r); |
9646
d1c159e447a2
Transaction view: Fixed getting extension data from messages whose flags had changed.
Timo Sirainen <tss@iki.fi>
parents:
9624
diff
changeset
|
148 rec = tview_apply_flag_updates(tview, *map_r, rec, seq); |
4333
8bfdd3928097
mail_index_lookup() and mail_index_lookup_full() returns now 0 if the mail has been expunged within the transaction.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
3879
diff
changeset
|
149 |
15775
f9b1aaf844c8
lib-index: Don't lookup mail's expunge-state in transaction log view if caller doesn't care.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
150 if (expunged_r != NULL && |
f9b1aaf844c8
lib-index: Don't lookup mail's expunge-state in transaction log view if caller doesn't care.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
151 mail_index_transaction_is_expunged(tview->t, seq)) |
6277
5f66277bbe40
mail_index_lookup*() can't fail anymore. Changed several APIs not to return
Timo Sirainen <tss@iki.fi>
parents:
6275
diff
changeset
|
152 *expunged_r = TRUE; |
5f66277bbe40
mail_index_lookup*() can't fail anymore. Changed several APIs not to return
Timo Sirainen <tss@iki.fi>
parents:
6275
diff
changeset
|
153 return rec; |
2224
a816e2d88406
Added mail_index_transaction_get_updated_view() which can be used to access
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
154 } |
a816e2d88406
Added mail_index_transaction_get_updated_view() which can be used to access
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
155 |
6420
a8b515e1a26f
Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents:
6277
diff
changeset
|
156 static void |
a8b515e1a26f
Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents:
6277
diff
changeset
|
157 tview_lookup_uid(struct mail_index_view *view, uint32_t seq, uint32_t *uid_r) |
2224
a816e2d88406
Added mail_index_transaction_get_updated_view() which can be used to access
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
158 { |
a816e2d88406
Added mail_index_transaction_get_updated_view() which can be used to access
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
159 struct mail_index_view_transaction *tview = |
a816e2d88406
Added mail_index_transaction_get_updated_view() which can be used to access
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
160 (struct mail_index_view_transaction *)view; |
a816e2d88406
Added mail_index_transaction_get_updated_view() which can be used to access
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
161 |
6275
913b188f4dd4
Removed explicit locking from views and maps. They were already locked all
Timo Sirainen <tss@iki.fi>
parents:
6262
diff
changeset
|
162 if (seq >= tview->t->first_new_seq) |
2224
a816e2d88406
Added mail_index_transaction_get_updated_view() which can be used to access
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
163 *uid_r = mail_index_transaction_lookup(tview->t, seq)->uid; |
6275
913b188f4dd4
Removed explicit locking from views and maps. They were already locked all
Timo Sirainen <tss@iki.fi>
parents:
6262
diff
changeset
|
164 else |
913b188f4dd4
Removed explicit locking from views and maps. They were already locked all
Timo Sirainen <tss@iki.fi>
parents:
6262
diff
changeset
|
165 tview->super->lookup_uid(view, seq, uid_r); |
2224
a816e2d88406
Added mail_index_transaction_get_updated_view() which can be used to access
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
166 } |
a816e2d88406
Added mail_index_transaction_get_updated_view() which can be used to access
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
167 |
6677
90bcf480312d
Renamed mail_index_lookup_uid_range() to mail_index_lookup_seq_range(), made
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
168 static void tview_lookup_seq_range(struct mail_index_view *view, |
6420
a8b515e1a26f
Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents:
6277
diff
changeset
|
169 uint32_t first_uid, uint32_t last_uid, |
a8b515e1a26f
Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents:
6277
diff
changeset
|
170 uint32_t *first_seq_r, uint32_t *last_seq_r) |
2224
a816e2d88406
Added mail_index_transaction_get_updated_view() which can be used to access
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
171 { |
a816e2d88406
Added mail_index_transaction_get_updated_view() which can be used to access
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
172 struct mail_index_view_transaction *tview = |
a816e2d88406
Added mail_index_transaction_get_updated_view() which can be used to access
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
173 (struct mail_index_view_transaction *)view; |
6036
5d3a941444f1
mail_index_lookup_uid_range() works now correctly when searching for newly
Timo Sirainen <tss@iki.fi>
parents:
5855
diff
changeset
|
174 const struct mail_index_record *rec; |
5d3a941444f1
mail_index_lookup_uid_range() works now correctly when searching for newly
Timo Sirainen <tss@iki.fi>
parents:
5855
diff
changeset
|
175 uint32_t seq; |
2224
a816e2d88406
Added mail_index_transaction_get_updated_view() which can be used to access
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
176 |
8214
76425554b4bc
Transaction view: If index is reset, don't return old to-be-removed sequences.
Timo Sirainen <tss@iki.fi>
parents:
8213
diff
changeset
|
177 if (!tview->t->reset) { |
76425554b4bc
Transaction view: If index is reset, don't return old to-be-removed sequences.
Timo Sirainen <tss@iki.fi>
parents:
8213
diff
changeset
|
178 tview->super->lookup_seq_range(view, first_uid, last_uid, |
76425554b4bc
Transaction view: If index is reset, don't return old to-be-removed sequences.
Timo Sirainen <tss@iki.fi>
parents:
8213
diff
changeset
|
179 first_seq_r, last_seq_r); |
76425554b4bc
Transaction view: If index is reset, don't return old to-be-removed sequences.
Timo Sirainen <tss@iki.fi>
parents:
8213
diff
changeset
|
180 } else { |
76425554b4bc
Transaction view: If index is reset, don't return old to-be-removed sequences.
Timo Sirainen <tss@iki.fi>
parents:
8213
diff
changeset
|
181 /* index is being reset. we never want to return old |
76425554b4bc
Transaction view: If index is reset, don't return old to-be-removed sequences.
Timo Sirainen <tss@iki.fi>
parents:
8213
diff
changeset
|
182 sequences. */ |
76425554b4bc
Transaction view: If index is reset, don't return old to-be-removed sequences.
Timo Sirainen <tss@iki.fi>
parents:
8213
diff
changeset
|
183 *first_seq_r = *last_seq_r = 0; |
76425554b4bc
Transaction view: If index is reset, don't return old to-be-removed sequences.
Timo Sirainen <tss@iki.fi>
parents:
8213
diff
changeset
|
184 } |
6036
5d3a941444f1
mail_index_lookup_uid_range() works now correctly when searching for newly
Timo Sirainen <tss@iki.fi>
parents:
5855
diff
changeset
|
185 if (tview->t->last_new_seq == 0) { |
5d3a941444f1
mail_index_lookup_uid_range() works now correctly when searching for newly
Timo Sirainen <tss@iki.fi>
parents:
5855
diff
changeset
|
186 /* no new messages, the results are final. */ |
6275
913b188f4dd4
Removed explicit locking from views and maps. They were already locked all
Timo Sirainen <tss@iki.fi>
parents:
6262
diff
changeset
|
187 return; |
2224
a816e2d88406
Added mail_index_transaction_get_updated_view() which can be used to access
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
188 } |
a816e2d88406
Added mail_index_transaction_get_updated_view() which can be used to access
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
189 |
6036
5d3a941444f1
mail_index_lookup_uid_range() works now correctly when searching for newly
Timo Sirainen <tss@iki.fi>
parents:
5855
diff
changeset
|
190 rec = mail_index_transaction_lookup(tview->t, tview->t->first_new_seq); |
5d3a941444f1
mail_index_lookup_uid_range() works now correctly when searching for newly
Timo Sirainen <tss@iki.fi>
parents:
5855
diff
changeset
|
191 if (rec->uid == 0) { |
5d3a941444f1
mail_index_lookup_uid_range() works now correctly when searching for newly
Timo Sirainen <tss@iki.fi>
parents:
5855
diff
changeset
|
192 /* new messages don't have UIDs */ |
6275
913b188f4dd4
Removed explicit locking from views and maps. They were already locked all
Timo Sirainen <tss@iki.fi>
parents:
6262
diff
changeset
|
193 return; |
6036
5d3a941444f1
mail_index_lookup_uid_range() works now correctly when searching for newly
Timo Sirainen <tss@iki.fi>
parents:
5855
diff
changeset
|
194 } |
5d3a941444f1
mail_index_lookup_uid_range() works now correctly when searching for newly
Timo Sirainen <tss@iki.fi>
parents:
5855
diff
changeset
|
195 if (last_uid < rec->uid) { |
5d3a941444f1
mail_index_lookup_uid_range() works now correctly when searching for newly
Timo Sirainen <tss@iki.fi>
parents:
5855
diff
changeset
|
196 /* all wanted messages were existing */ |
6275
913b188f4dd4
Removed explicit locking from views and maps. They were already locked all
Timo Sirainen <tss@iki.fi>
parents:
6262
diff
changeset
|
197 return; |
6036
5d3a941444f1
mail_index_lookup_uid_range() works now correctly when searching for newly
Timo Sirainen <tss@iki.fi>
parents:
5855
diff
changeset
|
198 } |
5d3a941444f1
mail_index_lookup_uid_range() works now correctly when searching for newly
Timo Sirainen <tss@iki.fi>
parents:
5855
diff
changeset
|
199 |
5d3a941444f1
mail_index_lookup_uid_range() works now correctly when searching for newly
Timo Sirainen <tss@iki.fi>
parents:
5855
diff
changeset
|
200 /* at least some of the wanted messages are newly created */ |
7064
046d06f52aa6
mail_index_lookup_seq*() were broken for updated transaction view when
Timo Sirainen <tss@iki.fi>
parents:
6677
diff
changeset
|
201 if (*first_seq_r == 0) { |
046d06f52aa6
mail_index_lookup_seq*() were broken for updated transaction view when
Timo Sirainen <tss@iki.fi>
parents:
6677
diff
changeset
|
202 seq = tview->t->first_new_seq; |
046d06f52aa6
mail_index_lookup_seq*() were broken for updated transaction view when
Timo Sirainen <tss@iki.fi>
parents:
6677
diff
changeset
|
203 for (; seq <= tview->t->last_new_seq; seq++) { |
8115
8ac8713b1386
mail_index_lookup_seq*() could have returned wrong sequences with transaction views.
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
204 rec = mail_index_transaction_lookup(tview->t, seq); |
7064
046d06f52aa6
mail_index_lookup_seq*() were broken for updated transaction view when
Timo Sirainen <tss@iki.fi>
parents:
6677
diff
changeset
|
205 if (first_uid <= rec->uid) |
046d06f52aa6
mail_index_lookup_seq*() were broken for updated transaction view when
Timo Sirainen <tss@iki.fi>
parents:
6677
diff
changeset
|
206 break; |
046d06f52aa6
mail_index_lookup_seq*() were broken for updated transaction view when
Timo Sirainen <tss@iki.fi>
parents:
6677
diff
changeset
|
207 } |
15568
7f4835cff04a
lib-index: Fixed sequence lookup of newly created mails in transaction view.
lion@ubuntu.ubuntu-domain
parents:
14133
diff
changeset
|
208 if (seq > tview->t->last_new_seq || rec->uid > last_uid) { |
7064
046d06f52aa6
mail_index_lookup_seq*() were broken for updated transaction view when
Timo Sirainen <tss@iki.fi>
parents:
6677
diff
changeset
|
209 /* no messages in range */ |
046d06f52aa6
mail_index_lookup_seq*() were broken for updated transaction view when
Timo Sirainen <tss@iki.fi>
parents:
6677
diff
changeset
|
210 return; |
046d06f52aa6
mail_index_lookup_seq*() were broken for updated transaction view when
Timo Sirainen <tss@iki.fi>
parents:
6677
diff
changeset
|
211 } |
046d06f52aa6
mail_index_lookup_seq*() were broken for updated transaction view when
Timo Sirainen <tss@iki.fi>
parents:
6677
diff
changeset
|
212 *first_seq_r = seq; |
15569
c9e6ad8a42db
lib-index: Optimized single sequence lookup of newly created mails in transaction view.
lion@ubuntu.ubuntu-domain
parents:
15568
diff
changeset
|
213 |
c9e6ad8a42db
lib-index: Optimized single sequence lookup of newly created mails in transaction view.
lion@ubuntu.ubuntu-domain
parents:
15568
diff
changeset
|
214 if (rec->uid == last_uid) { |
c9e6ad8a42db
lib-index: Optimized single sequence lookup of newly created mails in transaction view.
lion@ubuntu.ubuntu-domain
parents:
15568
diff
changeset
|
215 /* one seq in range */ |
c9e6ad8a42db
lib-index: Optimized single sequence lookup of newly created mails in transaction view.
lion@ubuntu.ubuntu-domain
parents:
15568
diff
changeset
|
216 *last_seq_r = seq; |
c9e6ad8a42db
lib-index: Optimized single sequence lookup of newly created mails in transaction view.
lion@ubuntu.ubuntu-domain
parents:
15568
diff
changeset
|
217 return; |
c9e6ad8a42db
lib-index: Optimized single sequence lookup of newly created mails in transaction view.
lion@ubuntu.ubuntu-domain
parents:
15568
diff
changeset
|
218 } |
7064
046d06f52aa6
mail_index_lookup_seq*() were broken for updated transaction view when
Timo Sirainen <tss@iki.fi>
parents:
6677
diff
changeset
|
219 } |
6036
5d3a941444f1
mail_index_lookup_uid_range() works now correctly when searching for newly
Timo Sirainen <tss@iki.fi>
parents:
5855
diff
changeset
|
220 |
5d3a941444f1
mail_index_lookup_uid_range() works now correctly when searching for newly
Timo Sirainen <tss@iki.fi>
parents:
5855
diff
changeset
|
221 seq = tview->t->last_new_seq; |
5d3a941444f1
mail_index_lookup_uid_range() works now correctly when searching for newly
Timo Sirainen <tss@iki.fi>
parents:
5855
diff
changeset
|
222 for (; seq >= tview->t->first_new_seq; seq--) { |
5d3a941444f1
mail_index_lookup_uid_range() works now correctly when searching for newly
Timo Sirainen <tss@iki.fi>
parents:
5855
diff
changeset
|
223 rec = mail_index_transaction_lookup(tview->t, seq); |
5d3a941444f1
mail_index_lookup_uid_range() works now correctly when searching for newly
Timo Sirainen <tss@iki.fi>
parents:
5855
diff
changeset
|
224 if (rec->uid <= last_uid) { |
5d3a941444f1
mail_index_lookup_uid_range() works now correctly when searching for newly
Timo Sirainen <tss@iki.fi>
parents:
5855
diff
changeset
|
225 *last_seq_r = seq; |
5d3a941444f1
mail_index_lookup_uid_range() works now correctly when searching for newly
Timo Sirainen <tss@iki.fi>
parents:
5855
diff
changeset
|
226 break; |
5d3a941444f1
mail_index_lookup_uid_range() works now correctly when searching for newly
Timo Sirainen <tss@iki.fi>
parents:
5855
diff
changeset
|
227 } |
5d3a941444f1
mail_index_lookup_uid_range() works now correctly when searching for newly
Timo Sirainen <tss@iki.fi>
parents:
5855
diff
changeset
|
228 } |
5d3a941444f1
mail_index_lookup_uid_range() works now correctly when searching for newly
Timo Sirainen <tss@iki.fi>
parents:
5855
diff
changeset
|
229 i_assert(seq >= tview->t->first_new_seq); |
2224
a816e2d88406
Added mail_index_transaction_get_updated_view() which can be used to access
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
230 } |
a816e2d88406
Added mail_index_transaction_get_updated_view() which can be used to access
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
231 |
6420
a8b515e1a26f
Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents:
6277
diff
changeset
|
232 static void tview_lookup_first(struct mail_index_view *view, |
a8b515e1a26f
Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents:
6277
diff
changeset
|
233 enum mail_flags flags, uint8_t flags_mask, |
a8b515e1a26f
Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents:
6277
diff
changeset
|
234 uint32_t *seq_r) |
2224
a816e2d88406
Added mail_index_transaction_get_updated_view() which can be used to access
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
235 { |
a816e2d88406
Added mail_index_transaction_get_updated_view() which can be used to access
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
236 struct mail_index_view_transaction *tview = |
a816e2d88406
Added mail_index_transaction_get_updated_view() which can be used to access
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
237 (struct mail_index_view_transaction *)view; |
a816e2d88406
Added mail_index_transaction_get_updated_view() which can be used to access
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
238 const struct mail_index_record *rec; |
3191
0df3f5d71958
Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents:
2918
diff
changeset
|
239 unsigned int append_count; |
2224
a816e2d88406
Added mail_index_transaction_get_updated_view() which can be used to access
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
240 uint32_t seq, message_count; |
a816e2d88406
Added mail_index_transaction_get_updated_view() which can be used to access
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
241 |
8215
c0888db40086
Transaction view: If index is reset, lookup_first() shouldn't return old sequences.
Timo Sirainen <tss@iki.fi>
parents:
8214
diff
changeset
|
242 if (!tview->t->reset) { |
c0888db40086
Transaction view: If index is reset, lookup_first() shouldn't return old sequences.
Timo Sirainen <tss@iki.fi>
parents:
8214
diff
changeset
|
243 tview->super->lookup_first(view, flags, flags_mask, seq_r); |
c0888db40086
Transaction view: If index is reset, lookup_first() shouldn't return old sequences.
Timo Sirainen <tss@iki.fi>
parents:
8214
diff
changeset
|
244 if (*seq_r != 0) |
c0888db40086
Transaction view: If index is reset, lookup_first() shouldn't return old sequences.
Timo Sirainen <tss@iki.fi>
parents:
8214
diff
changeset
|
245 return; |
c0888db40086
Transaction view: If index is reset, lookup_first() shouldn't return old sequences.
Timo Sirainen <tss@iki.fi>
parents:
8214
diff
changeset
|
246 } else { |
c0888db40086
Transaction view: If index is reset, lookup_first() shouldn't return old sequences.
Timo Sirainen <tss@iki.fi>
parents:
8214
diff
changeset
|
247 *seq_r = 0; |
c0888db40086
Transaction view: If index is reset, lookup_first() shouldn't return old sequences.
Timo Sirainen <tss@iki.fi>
parents:
8214
diff
changeset
|
248 } |
2224
a816e2d88406
Added mail_index_transaction_get_updated_view() which can be used to access
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
249 |
3191
0df3f5d71958
Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents:
2918
diff
changeset
|
250 rec = array_get(&tview->t->appends, &append_count); |
2224
a816e2d88406
Added mail_index_transaction_get_updated_view() which can be used to access
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
251 seq = tview->t->first_new_seq; |
a816e2d88406
Added mail_index_transaction_get_updated_view() which can be used to access
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
252 message_count = tview->t->last_new_seq; |
3191
0df3f5d71958
Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents:
2918
diff
changeset
|
253 i_assert(append_count == message_count - seq + 1); |
0df3f5d71958
Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents:
2918
diff
changeset
|
254 |
2563
5752e5ac88f0
Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents:
2271
diff
changeset
|
255 for (; seq <= message_count; seq++, rec++) { |
2224
a816e2d88406
Added mail_index_transaction_get_updated_view() which can be used to access
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
256 if ((rec->flags & flags_mask) == (uint8_t)flags) { |
a816e2d88406
Added mail_index_transaction_get_updated_view() which can be used to access
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
257 *seq_r = seq; |
a816e2d88406
Added mail_index_transaction_get_updated_view() which can be used to access
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
258 break; |
a816e2d88406
Added mail_index_transaction_get_updated_view() which can be used to access
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
259 } |
a816e2d88406
Added mail_index_transaction_get_updated_view() which can be used to access
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
260 } |
a816e2d88406
Added mail_index_transaction_get_updated_view() which can be used to access
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
261 } |
a816e2d88406
Added mail_index_transaction_get_updated_view() which can be used to access
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
262 |
8549
7b16388a3bb0
mail_get_flags/keywords() now returns updated values if they've been changed within transaction.
Timo Sirainen <tss@iki.fi>
parents:
8548
diff
changeset
|
263 static void keyword_index_add(ARRAY_TYPE(keyword_indexes) *keywords, |
7b16388a3bb0
mail_get_flags/keywords() now returns updated values if they've been changed within transaction.
Timo Sirainen <tss@iki.fi>
parents:
8548
diff
changeset
|
264 unsigned int idx) |
7b16388a3bb0
mail_get_flags/keywords() now returns updated values if they've been changed within transaction.
Timo Sirainen <tss@iki.fi>
parents:
8548
diff
changeset
|
265 { |
7b16388a3bb0
mail_get_flags/keywords() now returns updated values if they've been changed within transaction.
Timo Sirainen <tss@iki.fi>
parents:
8548
diff
changeset
|
266 const unsigned int *indexes; |
7b16388a3bb0
mail_get_flags/keywords() now returns updated values if they've been changed within transaction.
Timo Sirainen <tss@iki.fi>
parents:
8548
diff
changeset
|
267 unsigned int i, count; |
7b16388a3bb0
mail_get_flags/keywords() now returns updated values if they've been changed within transaction.
Timo Sirainen <tss@iki.fi>
parents:
8548
diff
changeset
|
268 |
7b16388a3bb0
mail_get_flags/keywords() now returns updated values if they've been changed within transaction.
Timo Sirainen <tss@iki.fi>
parents:
8548
diff
changeset
|
269 indexes = array_get(keywords, &count); |
7b16388a3bb0
mail_get_flags/keywords() now returns updated values if they've been changed within transaction.
Timo Sirainen <tss@iki.fi>
parents:
8548
diff
changeset
|
270 for (i = 0; i < count; i++) { |
7b16388a3bb0
mail_get_flags/keywords() now returns updated values if they've been changed within transaction.
Timo Sirainen <tss@iki.fi>
parents:
8548
diff
changeset
|
271 if (indexes[i] == idx) |
7b16388a3bb0
mail_get_flags/keywords() now returns updated values if they've been changed within transaction.
Timo Sirainen <tss@iki.fi>
parents:
8548
diff
changeset
|
272 return; |
7b16388a3bb0
mail_get_flags/keywords() now returns updated values if they've been changed within transaction.
Timo Sirainen <tss@iki.fi>
parents:
8548
diff
changeset
|
273 } |
7b16388a3bb0
mail_get_flags/keywords() now returns updated values if they've been changed within transaction.
Timo Sirainen <tss@iki.fi>
parents:
8548
diff
changeset
|
274 array_append(keywords, &idx, 1); |
7b16388a3bb0
mail_get_flags/keywords() now returns updated values if they've been changed within transaction.
Timo Sirainen <tss@iki.fi>
parents:
8548
diff
changeset
|
275 } |
7b16388a3bb0
mail_get_flags/keywords() now returns updated values if they've been changed within transaction.
Timo Sirainen <tss@iki.fi>
parents:
8548
diff
changeset
|
276 |
7b16388a3bb0
mail_get_flags/keywords() now returns updated values if they've been changed within transaction.
Timo Sirainen <tss@iki.fi>
parents:
8548
diff
changeset
|
277 static void keyword_index_remove(ARRAY_TYPE(keyword_indexes) *keywords, |
7b16388a3bb0
mail_get_flags/keywords() now returns updated values if they've been changed within transaction.
Timo Sirainen <tss@iki.fi>
parents:
8548
diff
changeset
|
278 unsigned int idx) |
7b16388a3bb0
mail_get_flags/keywords() now returns updated values if they've been changed within transaction.
Timo Sirainen <tss@iki.fi>
parents:
8548
diff
changeset
|
279 { |
7b16388a3bb0
mail_get_flags/keywords() now returns updated values if they've been changed within transaction.
Timo Sirainen <tss@iki.fi>
parents:
8548
diff
changeset
|
280 const unsigned int *indexes; |
7b16388a3bb0
mail_get_flags/keywords() now returns updated values if they've been changed within transaction.
Timo Sirainen <tss@iki.fi>
parents:
8548
diff
changeset
|
281 unsigned int i, count; |
7b16388a3bb0
mail_get_flags/keywords() now returns updated values if they've been changed within transaction.
Timo Sirainen <tss@iki.fi>
parents:
8548
diff
changeset
|
282 |
7b16388a3bb0
mail_get_flags/keywords() now returns updated values if they've been changed within transaction.
Timo Sirainen <tss@iki.fi>
parents:
8548
diff
changeset
|
283 indexes = array_get(keywords, &count); |
7b16388a3bb0
mail_get_flags/keywords() now returns updated values if they've been changed within transaction.
Timo Sirainen <tss@iki.fi>
parents:
8548
diff
changeset
|
284 for (i = 0; i < count; i++) { |
7b16388a3bb0
mail_get_flags/keywords() now returns updated values if they've been changed within transaction.
Timo Sirainen <tss@iki.fi>
parents:
8548
diff
changeset
|
285 if (indexes[i] == idx) { |
7b16388a3bb0
mail_get_flags/keywords() now returns updated values if they've been changed within transaction.
Timo Sirainen <tss@iki.fi>
parents:
8548
diff
changeset
|
286 array_delete(keywords, i, 1); |
7b16388a3bb0
mail_get_flags/keywords() now returns updated values if they've been changed within transaction.
Timo Sirainen <tss@iki.fi>
parents:
8548
diff
changeset
|
287 break; |
7b16388a3bb0
mail_get_flags/keywords() now returns updated values if they've been changed within transaction.
Timo Sirainen <tss@iki.fi>
parents:
8548
diff
changeset
|
288 } |
7b16388a3bb0
mail_get_flags/keywords() now returns updated values if they've been changed within transaction.
Timo Sirainen <tss@iki.fi>
parents:
8548
diff
changeset
|
289 } |
7b16388a3bb0
mail_get_flags/keywords() now returns updated values if they've been changed within transaction.
Timo Sirainen <tss@iki.fi>
parents:
8548
diff
changeset
|
290 } |
7b16388a3bb0
mail_get_flags/keywords() now returns updated values if they've been changed within transaction.
Timo Sirainen <tss@iki.fi>
parents:
8548
diff
changeset
|
291 |
7b16388a3bb0
mail_get_flags/keywords() now returns updated values if they've been changed within transaction.
Timo Sirainen <tss@iki.fi>
parents:
8548
diff
changeset
|
292 static void tview_lookup_keywords(struct mail_index_view *view, uint32_t seq, |
7b16388a3bb0
mail_get_flags/keywords() now returns updated values if they've been changed within transaction.
Timo Sirainen <tss@iki.fi>
parents:
8548
diff
changeset
|
293 ARRAY_TYPE(keyword_indexes) *keyword_idx) |
7b16388a3bb0
mail_get_flags/keywords() now returns updated values if they've been changed within transaction.
Timo Sirainen <tss@iki.fi>
parents:
8548
diff
changeset
|
294 { |
7b16388a3bb0
mail_get_flags/keywords() now returns updated values if they've been changed within transaction.
Timo Sirainen <tss@iki.fi>
parents:
8548
diff
changeset
|
295 struct mail_index_view_transaction *tview = |
7b16388a3bb0
mail_get_flags/keywords() now returns updated values if they've been changed within transaction.
Timo Sirainen <tss@iki.fi>
parents:
8548
diff
changeset
|
296 (struct mail_index_view_transaction *)view; |
7b16388a3bb0
mail_get_flags/keywords() now returns updated values if they've been changed within transaction.
Timo Sirainen <tss@iki.fi>
parents:
8548
diff
changeset
|
297 struct mail_index_transaction *t = tview->t; |
7b16388a3bb0
mail_get_flags/keywords() now returns updated values if they've been changed within transaction.
Timo Sirainen <tss@iki.fi>
parents:
8548
diff
changeset
|
298 const struct mail_index_transaction_keyword_update *updates; |
7b16388a3bb0
mail_get_flags/keywords() now returns updated values if they've been changed within transaction.
Timo Sirainen <tss@iki.fi>
parents:
8548
diff
changeset
|
299 unsigned int i, count; |
7b16388a3bb0
mail_get_flags/keywords() now returns updated values if they've been changed within transaction.
Timo Sirainen <tss@iki.fi>
parents:
8548
diff
changeset
|
300 |
7b16388a3bb0
mail_get_flags/keywords() now returns updated values if they've been changed within transaction.
Timo Sirainen <tss@iki.fi>
parents:
8548
diff
changeset
|
301 tview->super->lookup_keywords(view, seq, keyword_idx); |
7b16388a3bb0
mail_get_flags/keywords() now returns updated values if they've been changed within transaction.
Timo Sirainen <tss@iki.fi>
parents:
8548
diff
changeset
|
302 |
7b16388a3bb0
mail_get_flags/keywords() now returns updated values if they've been changed within transaction.
Timo Sirainen <tss@iki.fi>
parents:
8548
diff
changeset
|
303 if (seq < t->min_flagupdate_seq || seq > t->max_flagupdate_seq) { |
7b16388a3bb0
mail_get_flags/keywords() now returns updated values if they've been changed within transaction.
Timo Sirainen <tss@iki.fi>
parents:
8548
diff
changeset
|
304 /* no keyword updates for this sequence */ |
7b16388a3bb0
mail_get_flags/keywords() now returns updated values if they've been changed within transaction.
Timo Sirainen <tss@iki.fi>
parents:
8548
diff
changeset
|
305 return; |
7b16388a3bb0
mail_get_flags/keywords() now returns updated values if they've been changed within transaction.
Timo Sirainen <tss@iki.fi>
parents:
8548
diff
changeset
|
306 } |
7b16388a3bb0
mail_get_flags/keywords() now returns updated values if they've been changed within transaction.
Timo Sirainen <tss@iki.fi>
parents:
8548
diff
changeset
|
307 |
7b16388a3bb0
mail_get_flags/keywords() now returns updated values if they've been changed within transaction.
Timo Sirainen <tss@iki.fi>
parents:
8548
diff
changeset
|
308 if (array_is_created(&t->keyword_updates)) |
7b16388a3bb0
mail_get_flags/keywords() now returns updated values if they've been changed within transaction.
Timo Sirainen <tss@iki.fi>
parents:
8548
diff
changeset
|
309 updates = array_get(&t->keyword_updates, &count); |
7b16388a3bb0
mail_get_flags/keywords() now returns updated values if they've been changed within transaction.
Timo Sirainen <tss@iki.fi>
parents:
8548
diff
changeset
|
310 else { |
7b16388a3bb0
mail_get_flags/keywords() now returns updated values if they've been changed within transaction.
Timo Sirainen <tss@iki.fi>
parents:
8548
diff
changeset
|
311 updates = NULL; |
7b16388a3bb0
mail_get_flags/keywords() now returns updated values if they've been changed within transaction.
Timo Sirainen <tss@iki.fi>
parents:
8548
diff
changeset
|
312 count = 0; |
7b16388a3bb0
mail_get_flags/keywords() now returns updated values if they've been changed within transaction.
Timo Sirainen <tss@iki.fi>
parents:
8548
diff
changeset
|
313 } |
7b16388a3bb0
mail_get_flags/keywords() now returns updated values if they've been changed within transaction.
Timo Sirainen <tss@iki.fi>
parents:
8548
diff
changeset
|
314 for (i = 0; i < count; i++) { |
7b16388a3bb0
mail_get_flags/keywords() now returns updated values if they've been changed within transaction.
Timo Sirainen <tss@iki.fi>
parents:
8548
diff
changeset
|
315 if (array_is_created(&updates[i].add_seq) && |
7b16388a3bb0
mail_get_flags/keywords() now returns updated values if they've been changed within transaction.
Timo Sirainen <tss@iki.fi>
parents:
8548
diff
changeset
|
316 seq_range_exists(&updates[i].add_seq, seq)) |
7b16388a3bb0
mail_get_flags/keywords() now returns updated values if they've been changed within transaction.
Timo Sirainen <tss@iki.fi>
parents:
8548
diff
changeset
|
317 keyword_index_add(keyword_idx, i); |
7b16388a3bb0
mail_get_flags/keywords() now returns updated values if they've been changed within transaction.
Timo Sirainen <tss@iki.fi>
parents:
8548
diff
changeset
|
318 else if (array_is_created(&updates[i].remove_seq) && |
7b16388a3bb0
mail_get_flags/keywords() now returns updated values if they've been changed within transaction.
Timo Sirainen <tss@iki.fi>
parents:
8548
diff
changeset
|
319 seq_range_exists(&updates[i].remove_seq, seq)) |
7b16388a3bb0
mail_get_flags/keywords() now returns updated values if they've been changed within transaction.
Timo Sirainen <tss@iki.fi>
parents:
8548
diff
changeset
|
320 keyword_index_remove(keyword_idx, i); |
7b16388a3bb0
mail_get_flags/keywords() now returns updated values if they've been changed within transaction.
Timo Sirainen <tss@iki.fi>
parents:
8548
diff
changeset
|
321 } |
7b16388a3bb0
mail_get_flags/keywords() now returns updated values if they've been changed within transaction.
Timo Sirainen <tss@iki.fi>
parents:
8548
diff
changeset
|
322 } |
7b16388a3bb0
mail_get_flags/keywords() now returns updated values if they've been changed within transaction.
Timo Sirainen <tss@iki.fi>
parents:
8548
diff
changeset
|
323 |
8126
cf2c4f3c636f
mail_index_lookup_ext*() didn't return properly aligned pointers with updated transaction views.
Timo Sirainen <tss@iki.fi>
parents:
8115
diff
changeset
|
324 static const void * |
cf2c4f3c636f
mail_index_lookup_ext*() didn't return properly aligned pointers with updated transaction views.
Timo Sirainen <tss@iki.fi>
parents:
8115
diff
changeset
|
325 tview_return_updated_ext(struct mail_index_view_transaction *tview, |
8548
6a6a3bfea547
transaction view: Allow looking up multiple ext datas for the same message without breaking.
Timo Sirainen <tss@iki.fi>
parents:
8215
diff
changeset
|
326 uint32_t seq, const void *data, uint32_t ext_id) |
8126
cf2c4f3c636f
mail_index_lookup_ext*() didn't return properly aligned pointers with updated transaction views.
Timo Sirainen <tss@iki.fi>
parents:
8115
diff
changeset
|
327 { |
cf2c4f3c636f
mail_index_lookup_ext*() didn't return properly aligned pointers with updated transaction views.
Timo Sirainen <tss@iki.fi>
parents:
8115
diff
changeset
|
328 const struct mail_index_ext *ext; |
8192
32aa972895cc
Transaction view: lookup_ext() crashed if extension was just being added within the transaction.
Timo Sirainen <tss@iki.fi>
parents:
8126
diff
changeset
|
329 const struct mail_index_registered_ext *rext; |
32aa972895cc
Transaction view: lookup_ext() crashed if extension was just being added within the transaction.
Timo Sirainen <tss@iki.fi>
parents:
8126
diff
changeset
|
330 const struct mail_transaction_ext_intro *intro; |
32aa972895cc
Transaction view: lookup_ext() crashed if extension was just being added within the transaction.
Timo Sirainen <tss@iki.fi>
parents:
8126
diff
changeset
|
331 unsigned int record_align, record_size; |
8126
cf2c4f3c636f
mail_index_lookup_ext*() didn't return properly aligned pointers with updated transaction views.
Timo Sirainen <tss@iki.fi>
parents:
8115
diff
changeset
|
332 uint32_t ext_idx; |
8548
6a6a3bfea547
transaction view: Allow looking up multiple ext datas for the same message without breaking.
Timo Sirainen <tss@iki.fi>
parents:
8215
diff
changeset
|
333 size_t pos; |
8126
cf2c4f3c636f
mail_index_lookup_ext*() didn't return properly aligned pointers with updated transaction views.
Timo Sirainen <tss@iki.fi>
parents:
8115
diff
changeset
|
334 |
cf2c4f3c636f
mail_index_lookup_ext*() didn't return properly aligned pointers with updated transaction views.
Timo Sirainen <tss@iki.fi>
parents:
8115
diff
changeset
|
335 /* data begins with a 32bit sequence, followed by the actual |
cf2c4f3c636f
mail_index_lookup_ext*() didn't return properly aligned pointers with updated transaction views.
Timo Sirainen <tss@iki.fi>
parents:
8115
diff
changeset
|
336 extension data */ |
cf2c4f3c636f
mail_index_lookup_ext*() didn't return properly aligned pointers with updated transaction views.
Timo Sirainen <tss@iki.fi>
parents:
8115
diff
changeset
|
337 data = CONST_PTR_OFFSET(data, sizeof(uint32_t)); |
cf2c4f3c636f
mail_index_lookup_ext*() didn't return properly aligned pointers with updated transaction views.
Timo Sirainen <tss@iki.fi>
parents:
8115
diff
changeset
|
338 |
8192
32aa972895cc
Transaction view: lookup_ext() crashed if extension was just being added within the transaction.
Timo Sirainen <tss@iki.fi>
parents:
8126
diff
changeset
|
339 if (!mail_index_map_get_ext_idx(tview->lookup_map, ext_id, &ext_idx)) { |
32aa972895cc
Transaction view: lookup_ext() crashed if extension was just being added within the transaction.
Timo Sirainen <tss@iki.fi>
parents:
8126
diff
changeset
|
340 /* we're adding the extension now. */ |
32aa972895cc
Transaction view: lookup_ext() crashed if extension was just being added within the transaction.
Timo Sirainen <tss@iki.fi>
parents:
8126
diff
changeset
|
341 rext = array_idx(&tview->view.index->extensions, ext_id); |
8195
413c70b0ae1d
Transaction view: Fix for the previous lookup_ext() fix.
Timo Sirainen <tss@iki.fi>
parents:
8192
diff
changeset
|
342 record_align = rext->record_align; |
413c70b0ae1d
Transaction view: Fix for the previous lookup_ext() fix.
Timo Sirainen <tss@iki.fi>
parents:
8192
diff
changeset
|
343 record_size = rext->record_size; |
8192
32aa972895cc
Transaction view: lookup_ext() crashed if extension was just being added within the transaction.
Timo Sirainen <tss@iki.fi>
parents:
8126
diff
changeset
|
344 } else { |
32aa972895cc
Transaction view: lookup_ext() crashed if extension was just being added within the transaction.
Timo Sirainen <tss@iki.fi>
parents:
8126
diff
changeset
|
345 ext = array_idx(&tview->lookup_map->extensions, ext_idx); |
32aa972895cc
Transaction view: lookup_ext() crashed if extension was just being added within the transaction.
Timo Sirainen <tss@iki.fi>
parents:
8126
diff
changeset
|
346 record_align = ext->record_align; |
32aa972895cc
Transaction view: lookup_ext() crashed if extension was just being added within the transaction.
Timo Sirainen <tss@iki.fi>
parents:
8126
diff
changeset
|
347 record_size = ext->record_size; |
32aa972895cc
Transaction view: lookup_ext() crashed if extension was just being added within the transaction.
Timo Sirainen <tss@iki.fi>
parents:
8126
diff
changeset
|
348 } |
8126
cf2c4f3c636f
mail_index_lookup_ext*() didn't return properly aligned pointers with updated transaction views.
Timo Sirainen <tss@iki.fi>
parents:
8115
diff
changeset
|
349 |
8192
32aa972895cc
Transaction view: lookup_ext() crashed if extension was just being added within the transaction.
Timo Sirainen <tss@iki.fi>
parents:
8126
diff
changeset
|
350 /* see if the extension has been resized within this transaction */ |
32aa972895cc
Transaction view: lookup_ext() crashed if extension was just being added within the transaction.
Timo Sirainen <tss@iki.fi>
parents:
8126
diff
changeset
|
351 if (array_is_created(&tview->t->ext_resizes) && |
32aa972895cc
Transaction view: lookup_ext() crashed if extension was just being added within the transaction.
Timo Sirainen <tss@iki.fi>
parents:
8126
diff
changeset
|
352 ext_id < array_count(&tview->t->ext_resizes)) { |
32aa972895cc
Transaction view: lookup_ext() crashed if extension was just being added within the transaction.
Timo Sirainen <tss@iki.fi>
parents:
8126
diff
changeset
|
353 intro = array_idx(&tview->t->ext_resizes, ext_id); |
32aa972895cc
Transaction view: lookup_ext() crashed if extension was just being added within the transaction.
Timo Sirainen <tss@iki.fi>
parents:
8126
diff
changeset
|
354 if (intro[ext_id].name_size != 0) { |
32aa972895cc
Transaction view: lookup_ext() crashed if extension was just being added within the transaction.
Timo Sirainen <tss@iki.fi>
parents:
8126
diff
changeset
|
355 record_align = intro->record_align; |
32aa972895cc
Transaction view: lookup_ext() crashed if extension was just being added within the transaction.
Timo Sirainen <tss@iki.fi>
parents:
8126
diff
changeset
|
356 record_size = intro->record_size; |
32aa972895cc
Transaction view: lookup_ext() crashed if extension was just being added within the transaction.
Timo Sirainen <tss@iki.fi>
parents:
8126
diff
changeset
|
357 } |
32aa972895cc
Transaction view: lookup_ext() crashed if extension was just being added within the transaction.
Timo Sirainen <tss@iki.fi>
parents:
8126
diff
changeset
|
358 } |
32aa972895cc
Transaction view: lookup_ext() crashed if extension was just being added within the transaction.
Timo Sirainen <tss@iki.fi>
parents:
8126
diff
changeset
|
359 |
8199
94c751fa58e3
Transaction view: One more try at really fixing lookup_ext()..
Timo Sirainen <tss@iki.fi>
parents:
8195
diff
changeset
|
360 if (record_align <= sizeof(uint32_t)) { |
8126
cf2c4f3c636f
mail_index_lookup_ext*() didn't return properly aligned pointers with updated transaction views.
Timo Sirainen <tss@iki.fi>
parents:
8115
diff
changeset
|
361 /* data is 32bit aligned already */ |
cf2c4f3c636f
mail_index_lookup_ext*() didn't return properly aligned pointers with updated transaction views.
Timo Sirainen <tss@iki.fi>
parents:
8115
diff
changeset
|
362 return data; |
cf2c4f3c636f
mail_index_lookup_ext*() didn't return properly aligned pointers with updated transaction views.
Timo Sirainen <tss@iki.fi>
parents:
8115
diff
changeset
|
363 } else { |
cf2c4f3c636f
mail_index_lookup_ext*() didn't return properly aligned pointers with updated transaction views.
Timo Sirainen <tss@iki.fi>
parents:
8115
diff
changeset
|
364 /* assume we want 64bit alignment - copy the data to |
cf2c4f3c636f
mail_index_lookup_ext*() didn't return properly aligned pointers with updated transaction views.
Timo Sirainen <tss@iki.fi>
parents:
8115
diff
changeset
|
365 temporary buffer and return it */ |
cf2c4f3c636f
mail_index_lookup_ext*() didn't return properly aligned pointers with updated transaction views.
Timo Sirainen <tss@iki.fi>
parents:
8115
diff
changeset
|
366 if (tview->lookup_return_data == NULL) { |
cf2c4f3c636f
mail_index_lookup_ext*() didn't return properly aligned pointers with updated transaction views.
Timo Sirainen <tss@iki.fi>
parents:
8115
diff
changeset
|
367 tview->lookup_return_data = |
cf2c4f3c636f
mail_index_lookup_ext*() didn't return properly aligned pointers with updated transaction views.
Timo Sirainen <tss@iki.fi>
parents:
8115
diff
changeset
|
368 buffer_create_dynamic(default_pool, |
8199
94c751fa58e3
Transaction view: One more try at really fixing lookup_ext()..
Timo Sirainen <tss@iki.fi>
parents:
8195
diff
changeset
|
369 record_size + 64); |
8548
6a6a3bfea547
transaction view: Allow looking up multiple ext datas for the same message without breaking.
Timo Sirainen <tss@iki.fi>
parents:
8215
diff
changeset
|
370 } else if (seq != tview->lookup_prev_seq) { |
6a6a3bfea547
transaction view: Allow looking up multiple ext datas for the same message without breaking.
Timo Sirainen <tss@iki.fi>
parents:
8215
diff
changeset
|
371 /* clear the buffer between lookups for different |
6a6a3bfea547
transaction view: Allow looking up multiple ext datas for the same message without breaking.
Timo Sirainen <tss@iki.fi>
parents:
8215
diff
changeset
|
372 messages */ |
6a6a3bfea547
transaction view: Allow looking up multiple ext datas for the same message without breaking.
Timo Sirainen <tss@iki.fi>
parents:
8215
diff
changeset
|
373 buffer_set_used_size(tview->lookup_return_data, 0); |
8126
cf2c4f3c636f
mail_index_lookup_ext*() didn't return properly aligned pointers with updated transaction views.
Timo Sirainen <tss@iki.fi>
parents:
8115
diff
changeset
|
374 } |
8548
6a6a3bfea547
transaction view: Allow looking up multiple ext datas for the same message without breaking.
Timo Sirainen <tss@iki.fi>
parents:
8215
diff
changeset
|
375 tview->lookup_prev_seq = seq; |
6a6a3bfea547
transaction view: Allow looking up multiple ext datas for the same message without breaking.
Timo Sirainen <tss@iki.fi>
parents:
8215
diff
changeset
|
376 pos = tview->lookup_return_data->used; |
6a6a3bfea547
transaction view: Allow looking up multiple ext datas for the same message without breaking.
Timo Sirainen <tss@iki.fi>
parents:
8215
diff
changeset
|
377 buffer_append(tview->lookup_return_data, data, record_size); |
6a6a3bfea547
transaction view: Allow looking up multiple ext datas for the same message without breaking.
Timo Sirainen <tss@iki.fi>
parents:
8215
diff
changeset
|
378 return CONST_PTR_OFFSET(tview->lookup_return_data->data, pos); |
8126
cf2c4f3c636f
mail_index_lookup_ext*() didn't return properly aligned pointers with updated transaction views.
Timo Sirainen <tss@iki.fi>
parents:
8115
diff
changeset
|
379 } |
cf2c4f3c636f
mail_index_lookup_ext*() didn't return properly aligned pointers with updated transaction views.
Timo Sirainen <tss@iki.fi>
parents:
8115
diff
changeset
|
380 } |
cf2c4f3c636f
mail_index_lookup_ext*() didn't return properly aligned pointers with updated transaction views.
Timo Sirainen <tss@iki.fi>
parents:
8115
diff
changeset
|
381 |
15370
148dc0f6f990
lib-index: Transaction view shouldn't return ext records if the ext was already reset.
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
382 static bool |
148dc0f6f990
lib-index: Transaction view shouldn't return ext records if the ext was already reset.
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
383 tview_is_ext_reset(struct mail_index_view_transaction *tview, uint32_t ext_id) |
148dc0f6f990
lib-index: Transaction view shouldn't return ext records if the ext was already reset.
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
384 { |
148dc0f6f990
lib-index: Transaction view shouldn't return ext records if the ext was already reset.
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
385 const struct mail_transaction_ext_reset *resets; |
148dc0f6f990
lib-index: Transaction view shouldn't return ext records if the ext was already reset.
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
386 unsigned int count; |
148dc0f6f990
lib-index: Transaction view shouldn't return ext records if the ext was already reset.
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
387 |
148dc0f6f990
lib-index: Transaction view shouldn't return ext records if the ext was already reset.
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
388 if (!array_is_created(&tview->t->ext_resets)) |
148dc0f6f990
lib-index: Transaction view shouldn't return ext records if the ext was already reset.
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
389 return FALSE; |
148dc0f6f990
lib-index: Transaction view shouldn't return ext records if the ext was already reset.
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
390 |
148dc0f6f990
lib-index: Transaction view shouldn't return ext records if the ext was already reset.
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
391 resets = array_get(&tview->t->ext_resets, &count); |
148dc0f6f990
lib-index: Transaction view shouldn't return ext records if the ext was already reset.
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
392 return ext_id < count && resets[ext_id].new_reset_id != 0; |
148dc0f6f990
lib-index: Transaction view shouldn't return ext records if the ext was already reset.
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
393 } |
148dc0f6f990
lib-index: Transaction view shouldn't return ext records if the ext was already reset.
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
394 |
19776
d49645a28c44
lib-index: Code cleanup - moved code to tview_lookup_ext_update()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
395 static bool |
d49645a28c44
lib-index: Code cleanup - moved code to tview_lookup_ext_update()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
396 tview_lookup_ext_update(struct mail_index_view_transaction *tview, uint32_t seq, |
d49645a28c44
lib-index: Code cleanup - moved code to tview_lookup_ext_update()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
397 uint32_t ext_id, struct mail_index_map **map_r, |
d49645a28c44
lib-index: Code cleanup - moved code to tview_lookup_ext_update()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
398 const void **data_r) |
d49645a28c44
lib-index: Code cleanup - moved code to tview_lookup_ext_update()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
399 { |
d49645a28c44
lib-index: Code cleanup - moved code to tview_lookup_ext_update()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
400 const ARRAY_TYPE(seq_array) *ext_buf; |
d49645a28c44
lib-index: Code cleanup - moved code to tview_lookup_ext_update()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
401 const void *data; |
d49645a28c44
lib-index: Code cleanup - moved code to tview_lookup_ext_update()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
402 unsigned int idx; |
d49645a28c44
lib-index: Code cleanup - moved code to tview_lookup_ext_update()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
403 uint32_t map_ext_idx; |
d49645a28c44
lib-index: Code cleanup - moved code to tview_lookup_ext_update()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
404 |
d49645a28c44
lib-index: Code cleanup - moved code to tview_lookup_ext_update()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
405 ext_buf = array_idx(&tview->t->ext_rec_updates, ext_id); |
d49645a28c44
lib-index: Code cleanup - moved code to tview_lookup_ext_update()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
406 if (!array_is_created(ext_buf) || |
d49645a28c44
lib-index: Code cleanup - moved code to tview_lookup_ext_update()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
407 !mail_index_seq_array_lookup(ext_buf, seq, &idx)) |
d49645a28c44
lib-index: Code cleanup - moved code to tview_lookup_ext_update()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
408 return FALSE; |
d49645a28c44
lib-index: Code cleanup - moved code to tview_lookup_ext_update()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
409 |
d49645a28c44
lib-index: Code cleanup - moved code to tview_lookup_ext_update()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
410 if (tview->lookup_map == NULL) { |
d49645a28c44
lib-index: Code cleanup - moved code to tview_lookup_ext_update()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
411 tview->lookup_map = |
d49645a28c44
lib-index: Code cleanup - moved code to tview_lookup_ext_update()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
412 mail_index_map_clone(tview->view.index->map); |
d49645a28c44
lib-index: Code cleanup - moved code to tview_lookup_ext_update()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
413 } |
19777
bcdda0e61d7d
lib-index: Fixed mail_index_lookup_ext_full()'s map_r with transaction-view.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19776
diff
changeset
|
414 if (!mail_index_map_get_ext_idx(tview->lookup_map, ext_id, &map_ext_idx)) { |
bcdda0e61d7d
lib-index: Fixed mail_index_lookup_ext_full()'s map_r with transaction-view.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19776
diff
changeset
|
415 /* extension doesn't yet exist in the map. add it there with |
bcdda0e61d7d
lib-index: Fixed mail_index_lookup_ext_full()'s map_r with transaction-view.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19776
diff
changeset
|
416 the preliminary information (mainly its size) so if caller |
bcdda0e61d7d
lib-index: Fixed mail_index_lookup_ext_full()'s map_r with transaction-view.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19776
diff
changeset
|
417 looks it up, it's going to be found. */ |
bcdda0e61d7d
lib-index: Fixed mail_index_lookup_ext_full()'s map_r with transaction-view.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19776
diff
changeset
|
418 const struct mail_index_registered_ext *rext = |
bcdda0e61d7d
lib-index: Fixed mail_index_lookup_ext_full()'s map_r with transaction-view.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19776
diff
changeset
|
419 array_idx(&tview->view.index->extensions, ext_id); |
bcdda0e61d7d
lib-index: Fixed mail_index_lookup_ext_full()'s map_r with transaction-view.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19776
diff
changeset
|
420 struct mail_index_ext_header ext_hdr; |
bcdda0e61d7d
lib-index: Fixed mail_index_lookup_ext_full()'s map_r with transaction-view.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19776
diff
changeset
|
421 |
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:
21323
diff
changeset
|
422 i_zero(&ext_hdr); |
19777
bcdda0e61d7d
lib-index: Fixed mail_index_lookup_ext_full()'s map_r with transaction-view.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19776
diff
changeset
|
423 ext_hdr.hdr_size = rext->hdr_size; |
bcdda0e61d7d
lib-index: Fixed mail_index_lookup_ext_full()'s map_r with transaction-view.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19776
diff
changeset
|
424 ext_hdr.record_size = ext_buf->arr.element_size - sizeof(uint32_t); |
bcdda0e61d7d
lib-index: Fixed mail_index_lookup_ext_full()'s map_r with transaction-view.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19776
diff
changeset
|
425 ext_hdr.record_align = rext->record_align; |
bcdda0e61d7d
lib-index: Fixed mail_index_lookup_ext_full()'s map_r with transaction-view.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19776
diff
changeset
|
426 |
bcdda0e61d7d
lib-index: Fixed mail_index_lookup_ext_full()'s map_r with transaction-view.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19776
diff
changeset
|
427 mail_index_map_register_ext(tview->lookup_map, rext->name, |
bcdda0e61d7d
lib-index: Fixed mail_index_lookup_ext_full()'s map_r with transaction-view.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19776
diff
changeset
|
428 (uint32_t)-1, &ext_hdr); |
bcdda0e61d7d
lib-index: Fixed mail_index_lookup_ext_full()'s map_r with transaction-view.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19776
diff
changeset
|
429 } |
19776
d49645a28c44
lib-index: Code cleanup - moved code to tview_lookup_ext_update()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
430 |
d49645a28c44
lib-index: Code cleanup - moved code to tview_lookup_ext_update()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
431 data = array_idx(ext_buf, idx); |
d49645a28c44
lib-index: Code cleanup - moved code to tview_lookup_ext_update()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
432 *map_r = tview->lookup_map; |
d49645a28c44
lib-index: Code cleanup - moved code to tview_lookup_ext_update()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
433 *data_r = tview_return_updated_ext(tview, seq, data, ext_id); |
d49645a28c44
lib-index: Code cleanup - moved code to tview_lookup_ext_update()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
434 return TRUE; |
d49645a28c44
lib-index: Code cleanup - moved code to tview_lookup_ext_update()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
435 } |
d49645a28c44
lib-index: Code cleanup - moved code to tview_lookup_ext_update()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
436 |
6277
5f66277bbe40
mail_index_lookup*() can't fail anymore. Changed several APIs not to return
Timo Sirainen <tss@iki.fi>
parents:
6275
diff
changeset
|
437 static void |
6420
a8b515e1a26f
Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents:
6277
diff
changeset
|
438 tview_lookup_ext_full(struct mail_index_view *view, uint32_t seq, |
a8b515e1a26f
Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents:
6277
diff
changeset
|
439 uint32_t ext_id, struct mail_index_map **map_r, |
a8b515e1a26f
Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents:
6277
diff
changeset
|
440 const void **data_r, bool *expunged_r) |
2563
5752e5ac88f0
Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents:
2271
diff
changeset
|
441 { |
5752e5ac88f0
Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents:
2271
diff
changeset
|
442 struct mail_index_view_transaction *tview = |
5752e5ac88f0
Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents:
2271
diff
changeset
|
443 (struct mail_index_view_transaction *)view; |
5752e5ac88f0
Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents:
2271
diff
changeset
|
444 |
3191
0df3f5d71958
Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents:
2918
diff
changeset
|
445 i_assert(ext_id < array_count(&view->index->extensions)); |
0df3f5d71958
Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents:
2918
diff
changeset
|
446 |
15775
f9b1aaf844c8
lib-index: Don't lookup mail's expunge-state in transaction log view if caller doesn't care.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
447 if (expunged_r != NULL) |
f9b1aaf844c8
lib-index: Don't lookup mail's expunge-state in transaction log view if caller doesn't care.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
448 *expunged_r = FALSE; |
6277
5f66277bbe40
mail_index_lookup*() can't fail anymore. Changed several APIs not to return
Timo Sirainen <tss@iki.fi>
parents:
6275
diff
changeset
|
449 |
3191
0df3f5d71958
Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents:
2918
diff
changeset
|
450 if (array_is_created(&tview->t->ext_rec_updates) && |
0df3f5d71958
Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents:
2918
diff
changeset
|
451 ext_id < array_count(&tview->t->ext_rec_updates)) { |
0df3f5d71958
Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents:
2918
diff
changeset
|
452 /* there are some ext updates in transaction. |
0df3f5d71958
Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents:
2918
diff
changeset
|
453 see if there's any for this sequence. */ |
19776
d49645a28c44
lib-index: Code cleanup - moved code to tview_lookup_ext_update()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
454 if (tview_lookup_ext_update(tview, seq, ext_id, map_r, data_r)) |
6277
5f66277bbe40
mail_index_lookup*() can't fail anymore. Changed several APIs not to return
Timo Sirainen <tss@iki.fi>
parents:
6275
diff
changeset
|
455 return; |
2853
512dd7d76cdc
Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents:
2671
diff
changeset
|
456 } |
2563
5752e5ac88f0
Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents:
2271
diff
changeset
|
457 |
15370
148dc0f6f990
lib-index: Transaction view shouldn't return ext records if the ext was already reset.
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
458 /* not updated, return the existing value, unless ext was |
148dc0f6f990
lib-index: Transaction view shouldn't return ext records if the ext was already reset.
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
459 already reset */ |
148dc0f6f990
lib-index: Transaction view shouldn't return ext records if the ext was already reset.
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
460 if (seq < tview->t->first_new_seq && |
148dc0f6f990
lib-index: Transaction view shouldn't return ext records if the ext was already reset.
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
461 !tview_is_ext_reset(tview, ext_id)) { |
6277
5f66277bbe40
mail_index_lookup*() can't fail anymore. Changed several APIs not to return
Timo Sirainen <tss@iki.fi>
parents:
6275
diff
changeset
|
462 tview->super->lookup_ext_full(view, seq, ext_id, |
5f66277bbe40
mail_index_lookup*() can't fail anymore. Changed several APIs not to return
Timo Sirainen <tss@iki.fi>
parents:
6275
diff
changeset
|
463 map_r, data_r, expunged_r); |
5f66277bbe40
mail_index_lookup*() can't fail anymore. Changed several APIs not to return
Timo Sirainen <tss@iki.fi>
parents:
6275
diff
changeset
|
464 } else { |
5f66277bbe40
mail_index_lookup*() can't fail anymore. Changed several APIs not to return
Timo Sirainen <tss@iki.fi>
parents:
6275
diff
changeset
|
465 *map_r = view->index->map; |
5f66277bbe40
mail_index_lookup*() can't fail anymore. Changed several APIs not to return
Timo Sirainen <tss@iki.fi>
parents:
6275
diff
changeset
|
466 *data_r = NULL; |
2563
5752e5ac88f0
Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents:
2271
diff
changeset
|
467 } |
5752e5ac88f0
Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents:
2271
diff
changeset
|
468 } |
5752e5ac88f0
Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents:
2271
diff
changeset
|
469 |
6420
a8b515e1a26f
Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents:
6277
diff
changeset
|
470 static void tview_get_header_ext(struct mail_index_view *view, |
a8b515e1a26f
Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents:
6277
diff
changeset
|
471 struct mail_index_map *map, uint32_t ext_id, |
a8b515e1a26f
Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents:
6277
diff
changeset
|
472 const void **data_r, size_t *data_size_r) |
2853
512dd7d76cdc
Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents:
2671
diff
changeset
|
473 { |
512dd7d76cdc
Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents:
2671
diff
changeset
|
474 struct mail_index_view_transaction *tview = |
512dd7d76cdc
Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents:
2671
diff
changeset
|
475 (struct mail_index_view_transaction *)view; |
512dd7d76cdc
Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents:
2671
diff
changeset
|
476 |
512dd7d76cdc
Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents:
2671
diff
changeset
|
477 /* FIXME: check updates */ |
6275
913b188f4dd4
Removed explicit locking from views and maps. They were already locked all
Timo Sirainen <tss@iki.fi>
parents:
6262
diff
changeset
|
478 tview->super->get_header_ext(view, map, ext_id, data_r, data_size_r); |
2853
512dd7d76cdc
Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents:
2671
diff
changeset
|
479 } |
512dd7d76cdc
Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents:
2671
diff
changeset
|
480 |
6420
a8b515e1a26f
Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents:
6277
diff
changeset
|
481 static bool tview_ext_get_reset_id(struct mail_index_view *view, |
a8b515e1a26f
Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents:
6277
diff
changeset
|
482 struct mail_index_map *map, |
a8b515e1a26f
Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents:
6277
diff
changeset
|
483 uint32_t ext_id, uint32_t *reset_id_r) |
6171
635b58fe8287
Added mail_index_ext_get_reset_id() which returns the latest reset_id when
Timo Sirainen <tss@iki.fi>
parents:
6037
diff
changeset
|
484 { |
635b58fe8287
Added mail_index_ext_get_reset_id() which returns the latest reset_id when
Timo Sirainen <tss@iki.fi>
parents:
6037
diff
changeset
|
485 struct mail_index_view_transaction *tview = |
635b58fe8287
Added mail_index_ext_get_reset_id() which returns the latest reset_id when
Timo Sirainen <tss@iki.fi>
parents:
6037
diff
changeset
|
486 (struct mail_index_view_transaction *)view; |
635b58fe8287
Added mail_index_ext_get_reset_id() which returns the latest reset_id when
Timo Sirainen <tss@iki.fi>
parents:
6037
diff
changeset
|
487 const uint32_t *reset_id_p; |
635b58fe8287
Added mail_index_ext_get_reset_id() which returns the latest reset_id when
Timo Sirainen <tss@iki.fi>
parents:
6037
diff
changeset
|
488 |
635b58fe8287
Added mail_index_ext_get_reset_id() which returns the latest reset_id when
Timo Sirainen <tss@iki.fi>
parents:
6037
diff
changeset
|
489 if (array_is_created(&tview->t->ext_reset_ids) && |
6262
15abc6d262cd
mail_index_ext_get_reset_id() takes now map parameters. Fixed it to work
Timo Sirainen <tss@iki.fi>
parents:
6171
diff
changeset
|
490 ext_id < array_count(&tview->t->ext_reset_ids) && |
15abc6d262cd
mail_index_ext_get_reset_id() takes now map parameters. Fixed it to work
Timo Sirainen <tss@iki.fi>
parents:
6171
diff
changeset
|
491 map == tview->lookup_map) { |
6171
635b58fe8287
Added mail_index_ext_get_reset_id() which returns the latest reset_id when
Timo Sirainen <tss@iki.fi>
parents:
6037
diff
changeset
|
492 reset_id_p = array_idx(&tview->t->ext_reset_ids, ext_id); |
635b58fe8287
Added mail_index_ext_get_reset_id() which returns the latest reset_id when
Timo Sirainen <tss@iki.fi>
parents:
6037
diff
changeset
|
493 *reset_id_r = *reset_id_p; |
635b58fe8287
Added mail_index_ext_get_reset_id() which returns the latest reset_id when
Timo Sirainen <tss@iki.fi>
parents:
6037
diff
changeset
|
494 return TRUE; |
635b58fe8287
Added mail_index_ext_get_reset_id() which returns the latest reset_id when
Timo Sirainen <tss@iki.fi>
parents:
6037
diff
changeset
|
495 } |
635b58fe8287
Added mail_index_ext_get_reset_id() which returns the latest reset_id when
Timo Sirainen <tss@iki.fi>
parents:
6037
diff
changeset
|
496 |
6262
15abc6d262cd
mail_index_ext_get_reset_id() takes now map parameters. Fixed it to work
Timo Sirainen <tss@iki.fi>
parents:
6171
diff
changeset
|
497 return tview->super->ext_get_reset_id(view, map, ext_id, reset_id_r); |
6171
635b58fe8287
Added mail_index_ext_get_reset_id() which returns the latest reset_id when
Timo Sirainen <tss@iki.fi>
parents:
6037
diff
changeset
|
498 } |
635b58fe8287
Added mail_index_ext_get_reset_id() which returns the latest reset_id when
Timo Sirainen <tss@iki.fi>
parents:
6037
diff
changeset
|
499 |
4453
85fcdb478608
Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4451
diff
changeset
|
500 static struct mail_index_view_vfuncs trans_view_vfuncs = { |
6420
a8b515e1a26f
Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents:
6277
diff
changeset
|
501 tview_close, |
a8b515e1a26f
Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents:
6277
diff
changeset
|
502 tview_get_message_count, |
a8b515e1a26f
Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents:
6277
diff
changeset
|
503 tview_get_header, |
a8b515e1a26f
Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents:
6277
diff
changeset
|
504 tview_lookup_full, |
a8b515e1a26f
Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents:
6277
diff
changeset
|
505 tview_lookup_uid, |
6677
90bcf480312d
Renamed mail_index_lookup_uid_range() to mail_index_lookup_seq_range(), made
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
506 tview_lookup_seq_range, |
6420
a8b515e1a26f
Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents:
6277
diff
changeset
|
507 tview_lookup_first, |
8549
7b16388a3bb0
mail_get_flags/keywords() now returns updated values if they've been changed within transaction.
Timo Sirainen <tss@iki.fi>
parents:
8548
diff
changeset
|
508 tview_lookup_keywords, |
6420
a8b515e1a26f
Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents:
6277
diff
changeset
|
509 tview_lookup_ext_full, |
a8b515e1a26f
Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents:
6277
diff
changeset
|
510 tview_get_header_ext, |
a8b515e1a26f
Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents:
6277
diff
changeset
|
511 tview_ext_get_reset_id |
2224
a816e2d88406
Added mail_index_transaction_get_updated_view() which can be used to access
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
512 }; |
a816e2d88406
Added mail_index_transaction_get_updated_view() which can be used to access
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
513 |
a816e2d88406
Added mail_index_transaction_get_updated_view() which can be used to access
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
514 struct mail_index_view * |
2271
15d959d262a4
UIDs for appended messages can now be assigned all at once. Maildir now
Timo Sirainen <tss@iki.fi>
parents:
2240
diff
changeset
|
515 mail_index_transaction_open_updated_view(struct mail_index_transaction *t) |
2224
a816e2d88406
Added mail_index_transaction_get_updated_view() which can be used to access
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
516 { |
a816e2d88406
Added mail_index_transaction_get_updated_view() which can be used to access
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
517 struct mail_index_view_transaction *tview; |
a816e2d88406
Added mail_index_transaction_get_updated_view() which can be used to access
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
518 |
2884
173a0296e81d
Update view's header only after syncing the view. This and other changes fix
Timo Sirainen <tss@iki.fi>
parents:
2853
diff
changeset
|
519 if (t->view->syncing) { |
173a0296e81d
Update view's header only after syncing the view. This and other changes fix
Timo Sirainen <tss@iki.fi>
parents:
2853
diff
changeset
|
520 /* transaction view is being synced. while it's done, it's not |
173a0296e81d
Update view's header only after syncing the view. This and other changes fix
Timo Sirainen <tss@iki.fi>
parents:
2853
diff
changeset
|
521 possible to add new messages, but the view itself might |
173a0296e81d
Update view's header only after syncing the view. This and other changes fix
Timo Sirainen <tss@iki.fi>
parents:
2853
diff
changeset
|
522 change. so we can't make a copy of the view. */ |
173a0296e81d
Update view's header only after syncing the view. This and other changes fix
Timo Sirainen <tss@iki.fi>
parents:
2853
diff
changeset
|
523 mail_index_view_ref(t->view); |
173a0296e81d
Update view's header only after syncing the view. This and other changes fix
Timo Sirainen <tss@iki.fi>
parents:
2853
diff
changeset
|
524 return t->view; |
173a0296e81d
Update view's header only after syncing the view. This and other changes fix
Timo Sirainen <tss@iki.fi>
parents:
2853
diff
changeset
|
525 } |
173a0296e81d
Update view's header only after syncing the view. This and other changes fix
Timo Sirainen <tss@iki.fi>
parents:
2853
diff
changeset
|
526 |
2271
15d959d262a4
UIDs for appended messages can now be assigned all at once. Maildir now
Timo Sirainen <tss@iki.fi>
parents:
2240
diff
changeset
|
527 tview = i_new(struct mail_index_view_transaction, 1); |
15d959d262a4
UIDs for appended messages can now be assigned all at once. Maildir now
Timo Sirainen <tss@iki.fi>
parents:
2240
diff
changeset
|
528 mail_index_view_clone(&tview->view, t->view); |
4453
85fcdb478608
Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4451
diff
changeset
|
529 tview->view.v = trans_view_vfuncs; |
85fcdb478608
Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4451
diff
changeset
|
530 tview->super = &t->view->v; |
2271
15d959d262a4
UIDs for appended messages can now be assigned all at once. Maildir now
Timo Sirainen <tss@iki.fi>
parents:
2240
diff
changeset
|
531 tview->t = t; |
2224
a816e2d88406
Added mail_index_transaction_get_updated_view() which can be used to access
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
532 |
2271
15d959d262a4
UIDs for appended messages can now be assigned all at once. Maildir now
Timo Sirainen <tss@iki.fi>
parents:
2240
diff
changeset
|
533 mail_index_transaction_ref(t); |
15d959d262a4
UIDs for appended messages can now be assigned all at once. Maildir now
Timo Sirainen <tss@iki.fi>
parents:
2240
diff
changeset
|
534 return &tview->view; |
2224
a816e2d88406
Added mail_index_transaction_get_updated_view() which can be used to access
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
535 } |