Mercurial > dovecot > original-hg > dovecot-1.2
annotate src/lib-index/mail-index-transaction-view.c @ 9458:adee8cb3ff5d HEAD
Minor memory allocation tweaks.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Wed, 28 Oct 2009 14:10:04 -0400 |
parents | 22b45d08cd4e |
children | 00cd9aacd03c |
rev | line source |
---|---|
8590
b9faf4db2a9f
Updated copyright notices to include year 2009.
Timo Sirainen <tss@iki.fi>
parents:
8549
diff
changeset
|
1 /* Copyright (c) 2004-2009 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 |
9234
ae3e0ff64c94
Transaction view: Fixed getting extension data from messages whose flags had changed.
Timo Sirainen <tss@iki.fi>
parents:
8590
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; |
9234
ae3e0ff64c94
Transaction view: Fixed getting extension data from messages whose flags had changed.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
24 void *recs; |
9319
22b45d08cd4e
Transaction view: Don't assert-crash if record size grows during transaction.
Timo Sirainen <tss@iki.fi>
parents:
9234
diff
changeset
|
25 ARRAY_DEFINE(all_recs, void *); |
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; |
9319
22b45d08cd4e
Transaction view: Don't assert-crash if record size grows during transaction.
Timo Sirainen <tss@iki.fi>
parents:
9234
diff
changeset
|
33 void **recs; |
22b45d08cd4e
Transaction view: Don't assert-crash if record size grows during transaction.
Timo Sirainen <tss@iki.fi>
parents:
9234
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); |
9319
22b45d08cd4e
Transaction view: Don't assert-crash if record size grows during transaction.
Timo Sirainen <tss@iki.fi>
parents:
9234
diff
changeset
|
40 |
22b45d08cd4e
Transaction view: Don't assert-crash if record size grows during transaction.
Timo Sirainen <tss@iki.fi>
parents:
9234
diff
changeset
|
41 if (array_is_created(&tview->all_recs)) { |
22b45d08cd4e
Transaction view: Don't assert-crash if record size grows during transaction.
Timo Sirainen <tss@iki.fi>
parents:
9234
diff
changeset
|
42 recs = array_get_modifiable(&tview->all_recs, &count); |
22b45d08cd4e
Transaction view: Don't assert-crash if record size grows during transaction.
Timo Sirainen <tss@iki.fi>
parents:
9234
diff
changeset
|
43 for (i = 0; i < count; i++) |
22b45d08cd4e
Transaction view: Don't assert-crash if record size grows during transaction.
Timo Sirainen <tss@iki.fi>
parents:
9234
diff
changeset
|
44 i_free(recs[i]); |
22b45d08cd4e
Transaction view: Don't assert-crash if record size grows during transaction.
Timo Sirainen <tss@iki.fi>
parents:
9234
diff
changeset
|
45 array_free(&tview->all_recs); |
22b45d08cd4e
Transaction view: Don't assert-crash if record size grows during transaction.
Timo Sirainen <tss@iki.fi>
parents:
9234
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, |
9234
ae3e0ff64c94
Transaction view: Fixed getting extension data from messages whose flags had changed.
Timo Sirainen <tss@iki.fi>
parents:
8590
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; |
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
|
88 const struct mail_transaction_flag_update *updates; |
9234
ae3e0ff64c94
Transaction view: Fixed getting extension data from messages whose flags had changed.
Timo Sirainen <tss@iki.fi>
parents:
8590
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 |
9319
22b45d08cd4e
Transaction view: Don't assert-crash if record size grows during transaction.
Timo Sirainen <tss@iki.fi>
parents:
9234
diff
changeset
|
105 create a records array and return data from there. |
22b45d08cd4e
Transaction view: Don't assert-crash if record size grows during transaction.
Timo Sirainen <tss@iki.fi>
parents:
9234
diff
changeset
|
106 |
22b45d08cd4e
Transaction view: Don't assert-crash if record size grows during transaction.
Timo Sirainen <tss@iki.fi>
parents:
9234
diff
changeset
|
107 it's also possible that the record size increases, so we potentially |
22b45d08cd4e
Transaction view: Don't assert-crash if record size grows during transaction.
Timo Sirainen <tss@iki.fi>
parents:
9234
diff
changeset
|
108 have to create multiple arrays. they all get eventually freed when |
22b45d08cd4e
Transaction view: Don't assert-crash if record size grows during transaction.
Timo Sirainen <tss@iki.fi>
parents:
9234
diff
changeset
|
109 the view gets freed. */ |
22b45d08cd4e
Transaction view: Don't assert-crash if record size grows during transaction.
Timo Sirainen <tss@iki.fi>
parents:
9234
diff
changeset
|
110 if (map->hdr.record_size > tview->record_size) { |
22b45d08cd4e
Transaction view: Don't assert-crash if record size grows during transaction.
Timo Sirainen <tss@iki.fi>
parents:
9234
diff
changeset
|
111 if (!array_is_created(&tview->all_recs)) |
22b45d08cd4e
Transaction view: Don't assert-crash if record size grows during transaction.
Timo Sirainen <tss@iki.fi>
parents:
9234
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; |
9234
ae3e0ff64c94
Transaction view: Fixed getting extension data from messages whose flags had changed.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
114 tview->record_size = I_MAX(map->hdr.record_size, |
ae3e0ff64c94
Transaction view: Fixed getting extension data from messages whose flags had changed.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
115 tview->view.map->hdr.record_size); |
ae3e0ff64c94
Transaction view: Fixed getting extension data from messages whose flags had changed.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
116 tview->recs = i_malloc(tview->record_size * |
ae3e0ff64c94
Transaction view: Fixed getting extension data from messages whose flags had changed.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
117 tview->recs_count); |
9319
22b45d08cd4e
Transaction view: Don't assert-crash if record size grows during transaction.
Timo Sirainen <tss@iki.fi>
parents:
9234
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 |
9234
ae3e0ff64c94
Transaction view: Fixed getting extension data from messages whose flags had changed.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
123 trec = PTR_OFFSET(tview->recs, (seq-1) * tview->record_size); |
ae3e0ff64c94
Transaction view: Fixed getting extension data from messages whose flags had changed.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
124 memcpy(trec, rec, map->hdr.record_size); |
ae3e0ff64c94
Transaction view: Fixed getting extension data from messages whose flags had changed.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
125 trec->flags |= updates[idx].add_flags; |
ae3e0ff64c94
Transaction view: Fixed getting extension data from messages whose flags had changed.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
126 trec->flags &= ~updates[idx].remove_flags; |
ae3e0ff64c94
Transaction view: Fixed getting extension data from messages whose flags had changed.
Timo Sirainen <tss@iki.fi>
parents:
8590
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; |
6277
5f66277bbe40
mail_index_lookup*() can't fail anymore. Changed several APIs not to return
Timo Sirainen <tss@iki.fi>
parents:
6275
diff
changeset
|
142 *expunged_r = FALSE; |
5f66277bbe40
mail_index_lookup*() can't fail anymore. Changed several APIs not to return
Timo Sirainen <tss@iki.fi>
parents:
6275
diff
changeset
|
143 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
|
144 } |
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
|
145 |
6277
5f66277bbe40
mail_index_lookup*() can't fail anymore. Changed several APIs not to return
Timo Sirainen <tss@iki.fi>
parents:
6275
diff
changeset
|
146 rec = tview->super->lookup_full(view, seq, map_r, expunged_r); |
9234
ae3e0ff64c94
Transaction view: Fixed getting extension data from messages whose flags had changed.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
147 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
|
148 |
6277
5f66277bbe40
mail_index_lookup*() can't fail anymore. Changed several APIs not to return
Timo Sirainen <tss@iki.fi>
parents:
6275
diff
changeset
|
149 if (array_is_created(&tview->t->expunges) && |
5f66277bbe40
mail_index_lookup*() can't fail anymore. Changed several APIs not to return
Timo Sirainen <tss@iki.fi>
parents:
6275
diff
changeset
|
150 seq_range_exists(&tview->t->expunges, seq)) |
5f66277bbe40
mail_index_lookup*() can't fail anymore. Changed several APIs not to return
Timo Sirainen <tss@iki.fi>
parents:
6275
diff
changeset
|
151 *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
|
152 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
|
153 } |
a816e2d88406
Added mail_index_transaction_get_updated_view() which can be used to access
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
154 |
6420
a8b515e1a26f
Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents:
6277
diff
changeset
|
155 static void |
a8b515e1a26f
Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents:
6277
diff
changeset
|
156 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
|
157 { |
a816e2d88406
Added mail_index_transaction_get_updated_view() which can be used to access
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
158 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
|
159 (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
|
160 |
6275
913b188f4dd4
Removed explicit locking from views and maps. They were already locked all
Timo Sirainen <tss@iki.fi>
parents:
6262
diff
changeset
|
161 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
|
162 *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
|
163 else |
913b188f4dd4
Removed explicit locking from views and maps. They were already locked all
Timo Sirainen <tss@iki.fi>
parents:
6262
diff
changeset
|
164 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
|
165 } |
a816e2d88406
Added mail_index_transaction_get_updated_view() which can be used to access
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
166 |
6677
90bcf480312d
Renamed mail_index_lookup_uid_range() to mail_index_lookup_seq_range(), made
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
167 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
|
168 uint32_t first_uid, uint32_t last_uid, |
a8b515e1a26f
Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents:
6277
diff
changeset
|
169 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
|
170 { |
a816e2d88406
Added mail_index_transaction_get_updated_view() which can be used to access
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
171 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
|
172 (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
|
173 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
|
174 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
|
175 |
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
|
176 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
|
177 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
|
178 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
|
179 } 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
|
180 /* 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
|
181 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
|
182 *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
|
183 } |
6036
5d3a941444f1
mail_index_lookup_uid_range() works now correctly when searching for newly
Timo Sirainen <tss@iki.fi>
parents:
5855
diff
changeset
|
184 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
|
185 /* 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
|
186 return; |
2224
a816e2d88406
Added mail_index_transaction_get_updated_view() which can be used to access
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
187 } |
a816e2d88406
Added mail_index_transaction_get_updated_view() which can be used to access
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
188 |
6036
5d3a941444f1
mail_index_lookup_uid_range() works now correctly when searching for newly
Timo Sirainen <tss@iki.fi>
parents:
5855
diff
changeset
|
189 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
|
190 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
|
191 /* 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
|
192 return; |
6036
5d3a941444f1
mail_index_lookup_uid_range() works now correctly when searching for newly
Timo Sirainen <tss@iki.fi>
parents:
5855
diff
changeset
|
193 } |
5d3a941444f1
mail_index_lookup_uid_range() works now correctly when searching for newly
Timo Sirainen <tss@iki.fi>
parents:
5855
diff
changeset
|
194 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
|
195 /* 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
|
196 return; |
6036
5d3a941444f1
mail_index_lookup_uid_range() works now correctly when searching for newly
Timo Sirainen <tss@iki.fi>
parents:
5855
diff
changeset
|
197 } |
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 /* 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
|
200 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
|
201 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
|
202 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
|
203 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
|
204 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
|
205 break; |
046d06f52aa6
mail_index_lookup_seq*() were broken for updated transaction view when
Timo Sirainen <tss@iki.fi>
parents:
6677
diff
changeset
|
206 } |
046d06f52aa6
mail_index_lookup_seq*() were broken for updated transaction view when
Timo Sirainen <tss@iki.fi>
parents:
6677
diff
changeset
|
207 if (seq > tview->t->last_new_seq) { |
046d06f52aa6
mail_index_lookup_seq*() were broken for updated transaction view when
Timo Sirainen <tss@iki.fi>
parents:
6677
diff
changeset
|
208 /* 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
|
209 return; |
046d06f52aa6
mail_index_lookup_seq*() were broken for updated transaction view when
Timo Sirainen <tss@iki.fi>
parents:
6677
diff
changeset
|
210 } |
046d06f52aa6
mail_index_lookup_seq*() were broken for updated transaction view when
Timo Sirainen <tss@iki.fi>
parents:
6677
diff
changeset
|
211 *first_seq_r = seq; |
046d06f52aa6
mail_index_lookup_seq*() were broken for updated transaction view when
Timo Sirainen <tss@iki.fi>
parents:
6677
diff
changeset
|
212 } |
6036
5d3a941444f1
mail_index_lookup_uid_range() works now correctly when searching for newly
Timo Sirainen <tss@iki.fi>
parents:
5855
diff
changeset
|
213 |
5d3a941444f1
mail_index_lookup_uid_range() works now correctly when searching for newly
Timo Sirainen <tss@iki.fi>
parents:
5855
diff
changeset
|
214 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
|
215 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
|
216 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
|
217 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
|
218 *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
|
219 break; |
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 } |
5d3a941444f1
mail_index_lookup_uid_range() works now correctly when searching for newly
Timo Sirainen <tss@iki.fi>
parents:
5855
diff
changeset
|
222 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
|
223 } |
a816e2d88406
Added mail_index_transaction_get_updated_view() which can be used to access
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
224 |
6420
a8b515e1a26f
Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents:
6277
diff
changeset
|
225 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
|
226 enum mail_flags flags, uint8_t flags_mask, |
a8b515e1a26f
Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents:
6277
diff
changeset
|
227 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
|
228 { |
a816e2d88406
Added mail_index_transaction_get_updated_view() which can be used to access
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
229 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
|
230 (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
|
231 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
|
232 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
|
233 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
|
234 |
8215
c0888db40086
Transaction view: If index is reset, lookup_first() shouldn't return old sequences.
Timo Sirainen <tss@iki.fi>
parents:
8214
diff
changeset
|
235 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
|
236 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
|
237 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
|
238 return; |
c0888db40086
Transaction view: If index is reset, lookup_first() shouldn't return old sequences.
Timo Sirainen <tss@iki.fi>
parents:
8214
diff
changeset
|
239 } else { |
c0888db40086
Transaction view: If index is reset, lookup_first() shouldn't return old sequences.
Timo Sirainen <tss@iki.fi>
parents:
8214
diff
changeset
|
240 *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
|
241 } |
2224
a816e2d88406
Added mail_index_transaction_get_updated_view() which can be used to access
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
242 |
3191
0df3f5d71958
Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents:
2918
diff
changeset
|
243 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
|
244 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
|
245 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
|
246 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
|
247 |
2563
5752e5ac88f0
Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents:
2271
diff
changeset
|
248 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
|
249 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
|
250 *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
|
251 break; |
a816e2d88406
Added mail_index_transaction_get_updated_view() which can be used to access
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
252 } |
a816e2d88406
Added mail_index_transaction_get_updated_view() which can be used to access
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
253 } |
a816e2d88406
Added mail_index_transaction_get_updated_view() which can be used to access
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
254 } |
a816e2d88406
Added mail_index_transaction_get_updated_view() which can be used to access
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
255 |
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
|
256 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
|
257 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
|
258 { |
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
|
259 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
|
260 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
|
261 |
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
|
262 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
|
263 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
|
264 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
|
265 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
|
266 } |
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 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
|
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 |
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 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
|
271 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
|
272 { |
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 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
|
274 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
|
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 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
|
277 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
|
278 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
|
279 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
|
280 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
|
281 } |
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 } |
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 |
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 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
|
286 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
|
287 { |
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 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
|
289 (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
|
290 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
|
291 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
|
292 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
|
293 |
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 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
|
295 |
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 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
|
297 /* 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
|
298 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
|
299 } |
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 /* apply any keyword updates in this transaction */ |
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 if (array_is_created(&t->keyword_resets)) { |
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_range_exists(&t->keyword_resets, 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 array_clear(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
|
305 } |
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 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
|
308 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
|
309 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
|
310 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
|
311 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
|
312 } |
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 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
|
314 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
|
315 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
|
316 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
|
317 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
|
318 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
|
319 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
|
320 } |
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 |
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
|
323 static struct mail_index_map * |
15abc6d262cd
mail_index_ext_get_reset_id() takes now map parameters. Fixed it to work
Timo Sirainen <tss@iki.fi>
parents:
6171
diff
changeset
|
324 tview_get_lookup_map(struct mail_index_view_transaction *tview) |
15abc6d262cd
mail_index_ext_get_reset_id() takes now map parameters. Fixed it to work
Timo Sirainen <tss@iki.fi>
parents:
6171
diff
changeset
|
325 { |
15abc6d262cd
mail_index_ext_get_reset_id() takes now map parameters. Fixed it to work
Timo Sirainen <tss@iki.fi>
parents:
6171
diff
changeset
|
326 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
|
327 tview->lookup_map = |
15abc6d262cd
mail_index_ext_get_reset_id() takes now map parameters. Fixed it to work
Timo Sirainen <tss@iki.fi>
parents:
6171
diff
changeset
|
328 mail_index_map_clone(tview->view.index->map); |
15abc6d262cd
mail_index_ext_get_reset_id() takes now map parameters. Fixed it to work
Timo Sirainen <tss@iki.fi>
parents:
6171
diff
changeset
|
329 } |
15abc6d262cd
mail_index_ext_get_reset_id() takes now map parameters. Fixed it to work
Timo Sirainen <tss@iki.fi>
parents:
6171
diff
changeset
|
330 return tview->lookup_map; |
15abc6d262cd
mail_index_ext_get_reset_id() takes now map parameters. Fixed it to work
Timo Sirainen <tss@iki.fi>
parents:
6171
diff
changeset
|
331 } |
15abc6d262cd
mail_index_ext_get_reset_id() takes now map parameters. Fixed it to work
Timo Sirainen <tss@iki.fi>
parents:
6171
diff
changeset
|
332 |
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
|
333 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
|
334 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
|
335 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
|
336 { |
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 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
|
338 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
|
339 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
|
340 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
|
341 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
|
342 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
|
343 |
cf2c4f3c636f
mail_index_lookup_ext*() didn't return properly aligned pointers with updated transaction views.
Timo Sirainen <tss@iki.fi>
parents:
8115
diff
changeset
|
344 /* 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
|
345 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
|
346 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
|
347 |
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
|
348 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
|
349 /* 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
|
350 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
|
351 record_align = rext->record_align; |
413c70b0ae1d
Transaction view: Fix for the previous lookup_ext() fix.
Timo Sirainen <tss@iki.fi>
parents:
8192
diff
changeset
|
352 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
|
353 } 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
|
354 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
|
355 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
|
356 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
|
357 } |
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
|
358 |
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
|
359 /* 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
|
360 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
|
361 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
|
362 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
|
363 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
|
364 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
|
365 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
|
366 } |
32aa972895cc
Transaction view: lookup_ext() crashed if extension was just being added within the transaction.
Timo Sirainen <tss@iki.fi>
parents:
8126
diff
changeset
|
367 } |
32aa972895cc
Transaction view: lookup_ext() crashed if extension was just being added within the transaction.
Timo Sirainen <tss@iki.fi>
parents:
8126
diff
changeset
|
368 |
8199
94c751fa58e3
Transaction view: One more try at really fixing lookup_ext()..
Timo Sirainen <tss@iki.fi>
parents:
8195
diff
changeset
|
369 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
|
370 /* 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
|
371 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
|
372 } 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
|
373 /* 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
|
374 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
|
375 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
|
376 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
|
377 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
|
378 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
|
379 } 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
|
380 /* 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
|
381 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
|
382 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
|
383 } |
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
|
384 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
|
385 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
|
386 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
|
387 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
|
388 } |
cf2c4f3c636f
mail_index_lookup_ext*() didn't return properly aligned pointers with updated transaction views.
Timo Sirainen <tss@iki.fi>
parents:
8115
diff
changeset
|
389 } |
cf2c4f3c636f
mail_index_lookup_ext*() didn't return properly aligned pointers with updated transaction views.
Timo Sirainen <tss@iki.fi>
parents:
8115
diff
changeset
|
390 |
6277
5f66277bbe40
mail_index_lookup*() can't fail anymore. Changed several APIs not to return
Timo Sirainen <tss@iki.fi>
parents:
6275
diff
changeset
|
391 static void |
6420
a8b515e1a26f
Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents:
6277
diff
changeset
|
392 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
|
393 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
|
394 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
|
395 { |
5752e5ac88f0
Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents:
2271
diff
changeset
|
396 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
|
397 (struct mail_index_view_transaction *)view; |
4451
1a35d53c18fc
Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents:
4333
diff
changeset
|
398 const ARRAY_TYPE(seq_array) *ext_buf; |
3191
0df3f5d71958
Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents:
2918
diff
changeset
|
399 const void *data; |
0df3f5d71958
Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents:
2918
diff
changeset
|
400 unsigned int idx; |
2563
5752e5ac88f0
Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents:
2271
diff
changeset
|
401 |
3191
0df3f5d71958
Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents:
2918
diff
changeset
|
402 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
|
403 |
6277
5f66277bbe40
mail_index_lookup*() can't fail anymore. Changed several APIs not to return
Timo Sirainen <tss@iki.fi>
parents:
6275
diff
changeset
|
404 *expunged_r = FALSE; |
5f66277bbe40
mail_index_lookup*() can't fail anymore. Changed several APIs not to return
Timo Sirainen <tss@iki.fi>
parents:
6275
diff
changeset
|
405 |
3191
0df3f5d71958
Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents:
2918
diff
changeset
|
406 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
|
407 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
|
408 /* 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
|
409 see if there's any for this sequence. */ |
0df3f5d71958
Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents:
2918
diff
changeset
|
410 ext_buf = array_idx(&tview->t->ext_rec_updates, ext_id); |
0df3f5d71958
Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents:
2918
diff
changeset
|
411 if (array_is_created(ext_buf) && |
0df3f5d71958
Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents:
2918
diff
changeset
|
412 mail_index_seq_array_lookup(ext_buf, seq, &idx)) { |
0df3f5d71958
Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents:
2918
diff
changeset
|
413 data = array_idx(ext_buf, idx); |
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
|
414 *map_r = tview_get_lookup_map(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
|
415 *data_r = tview_return_updated_ext(tview, seq, data, |
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
|
416 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
|
417 return; |
3191
0df3f5d71958
Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents:
2918
diff
changeset
|
418 } |
2853
512dd7d76cdc
Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents:
2671
diff
changeset
|
419 } |
2563
5752e5ac88f0
Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents:
2271
diff
changeset
|
420 |
3191
0df3f5d71958
Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents:
2918
diff
changeset
|
421 /* not updated, return the existing value */ |
0df3f5d71958
Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents:
2918
diff
changeset
|
422 if (seq < tview->t->first_new_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
|
423 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
|
424 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
|
425 } else { |
5f66277bbe40
mail_index_lookup*() can't fail anymore. Changed several APIs not to return
Timo Sirainen <tss@iki.fi>
parents:
6275
diff
changeset
|
426 *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
|
427 *data_r = NULL; |
2563
5752e5ac88f0
Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents:
2271
diff
changeset
|
428 } |
5752e5ac88f0
Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents:
2271
diff
changeset
|
429 } |
5752e5ac88f0
Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents:
2271
diff
changeset
|
430 |
6420
a8b515e1a26f
Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents:
6277
diff
changeset
|
431 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
|
432 struct mail_index_map *map, uint32_t ext_id, |
a8b515e1a26f
Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents:
6277
diff
changeset
|
433 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
|
434 { |
512dd7d76cdc
Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents:
2671
diff
changeset
|
435 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
|
436 (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
|
437 |
512dd7d76cdc
Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents:
2671
diff
changeset
|
438 /* 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
|
439 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
|
440 } |
512dd7d76cdc
Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents:
2671
diff
changeset
|
441 |
6420
a8b515e1a26f
Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents:
6277
diff
changeset
|
442 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
|
443 struct mail_index_map *map, |
a8b515e1a26f
Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents:
6277
diff
changeset
|
444 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
|
445 { |
635b58fe8287
Added mail_index_ext_get_reset_id() which returns the latest reset_id when
Timo Sirainen <tss@iki.fi>
parents:
6037
diff
changeset
|
446 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
|
447 (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
|
448 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
|
449 |
635b58fe8287
Added mail_index_ext_get_reset_id() which returns the latest reset_id when
Timo Sirainen <tss@iki.fi>
parents:
6037
diff
changeset
|
450 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
|
451 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
|
452 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
|
453 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
|
454 *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
|
455 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
|
456 } |
635b58fe8287
Added mail_index_ext_get_reset_id() which returns the latest reset_id when
Timo Sirainen <tss@iki.fi>
parents:
6037
diff
changeset
|
457 |
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
|
458 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
|
459 } |
635b58fe8287
Added mail_index_ext_get_reset_id() which returns the latest reset_id when
Timo Sirainen <tss@iki.fi>
parents:
6037
diff
changeset
|
460 |
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
|
461 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
|
462 tview_close, |
a8b515e1a26f
Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents:
6277
diff
changeset
|
463 tview_get_message_count, |
a8b515e1a26f
Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents:
6277
diff
changeset
|
464 tview_get_header, |
a8b515e1a26f
Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents:
6277
diff
changeset
|
465 tview_lookup_full, |
a8b515e1a26f
Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents:
6277
diff
changeset
|
466 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
|
467 tview_lookup_seq_range, |
6420
a8b515e1a26f
Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents:
6277
diff
changeset
|
468 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
|
469 tview_lookup_keywords, |
6420
a8b515e1a26f
Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents:
6277
diff
changeset
|
470 tview_lookup_ext_full, |
a8b515e1a26f
Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents:
6277
diff
changeset
|
471 tview_get_header_ext, |
a8b515e1a26f
Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents:
6277
diff
changeset
|
472 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
|
473 }; |
a816e2d88406
Added mail_index_transaction_get_updated_view() which can be used to access
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
474 |
a816e2d88406
Added mail_index_transaction_get_updated_view() which can be used to access
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
475 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
|
476 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
|
477 { |
a816e2d88406
Added mail_index_transaction_get_updated_view() which can be used to access
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
478 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
|
479 |
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
|
480 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
|
481 /* 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
|
482 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
|
483 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
|
484 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
|
485 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
|
486 } |
173a0296e81d
Update view's header only after syncing the view. This and other changes fix
Timo Sirainen <tss@iki.fi>
parents:
2853
diff
changeset
|
487 |
2271
15d959d262a4
UIDs for appended messages can now be assigned all at once. Maildir now
Timo Sirainen <tss@iki.fi>
parents:
2240
diff
changeset
|
488 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
|
489 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
|
490 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
|
491 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
|
492 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
|
493 |
2271
15d959d262a4
UIDs for appended messages can now be assigned all at once. Maildir now
Timo Sirainen <tss@iki.fi>
parents:
2240
diff
changeset
|
494 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
|
495 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
|
496 } |