Mercurial > dovecot > original-hg > dovecot-1.2
annotate src/lib-storage/index/mbox/mbox-transaction.c @ 8590:b9faf4db2a9f HEAD
Updated copyright notices to include year 2009.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Tue, 06 Jan 2009 09:25:38 -0500 |
parents | 1a9e14718bd6 |
children | 06c641b17175 |
rev | line source |
---|---|
8590
b9faf4db2a9f
Updated copyright notices to include year 2009.
Timo Sirainen <tss@iki.fi>
parents:
8528
diff
changeset
|
1 /* Copyright (c) 2004-2009 Dovecot authors, see the included COPYING file */ |
1978
6303ef092c5b
mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2 |
6303ef092c5b
mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
3 #include "lib.h" |
4453
85fcdb478608
Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents:
3863
diff
changeset
|
4 #include "array.h" |
1978
6303ef092c5b
mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
5 #include "mbox-storage.h" |
6303ef092c5b
mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
6 #include "mbox-lock.h" |
6303ef092c5b
mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
7 #include "mbox-sync-private.h" |
6303ef092c5b
mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
8 |
4453
85fcdb478608
Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents:
3863
diff
changeset
|
9 static void (*next_hook_mail_index_transaction_created) |
85fcdb478608
Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents:
3863
diff
changeset
|
10 (struct mail_index_transaction *t) = NULL; |
1978
6303ef092c5b
mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
11 |
4453
85fcdb478608
Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents:
3863
diff
changeset
|
12 static int mbox_transaction_commit(struct mail_index_transaction *t, |
85fcdb478608
Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents:
3863
diff
changeset
|
13 uint32_t *log_file_seq_r, |
85fcdb478608
Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents:
3863
diff
changeset
|
14 uoff_t *log_file_offset_r) |
1978
6303ef092c5b
mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
15 { |
5450
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
5265
diff
changeset
|
16 struct mbox_transaction_context *mt = MAIL_STORAGE_CONTEXT(t); |
4453
85fcdb478608
Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents:
3863
diff
changeset
|
17 struct mbox_mailbox *mbox = (struct mbox_mailbox *)mt->ictx.ibox; |
85fcdb478608
Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents:
3863
diff
changeset
|
18 unsigned int lock_id = mt->mbox_lock_id; |
6511
fe5c19ffc119
Sync mbox when committing transaction only when saving messages to update
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
19 bool mails_saved; |
3863
55df57c028d4
Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents:
3279
diff
changeset
|
20 int ret = 0; |
1978
6303ef092c5b
mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
21 |
4453
85fcdb478608
Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents:
3863
diff
changeset
|
22 if (mt->save_ctx != NULL) |
85fcdb478608
Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents:
3863
diff
changeset
|
23 ret = mbox_transaction_save_commit(mt->save_ctx); |
6511
fe5c19ffc119
Sync mbox when committing transaction only when saving messages to update
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
24 mails_saved = mt->mails_saved; |
1978
6303ef092c5b
mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
25 |
4453
85fcdb478608
Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents:
3863
diff
changeset
|
26 if (ret < 0) |
85fcdb478608
Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents:
3863
diff
changeset
|
27 index_transaction_finish_rollback(&mt->ictx); |
85fcdb478608
Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents:
3863
diff
changeset
|
28 else { |
85fcdb478608
Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents:
3863
diff
changeset
|
29 if (index_transaction_finish_commit(&mt->ictx, log_file_seq_r, |
85fcdb478608
Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents:
3863
diff
changeset
|
30 log_file_offset_r) < 0) |
1978
6303ef092c5b
mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
31 ret = -1; |
6303ef092c5b
mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
32 } |
4453
85fcdb478608
Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents:
3863
diff
changeset
|
33 |
85fcdb478608
Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents:
3863
diff
changeset
|
34 /* transaction is destroyed now. */ |
85fcdb478608
Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents:
3863
diff
changeset
|
35 mt = NULL; |
1978
6303ef092c5b
mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
36 |
3279
b698ae839a18
Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents:
3209
diff
changeset
|
37 if (lock_id != 0 && mbox->mbox_lock_type != F_WRLCK) { |
2724
0b4d8354737a
Don't lock/unlock mbox separately for each message. Drop the lock only at
Timo Sirainen <tss@iki.fi>
parents:
2665
diff
changeset
|
38 /* unlock before writing any changes */ |
3279
b698ae839a18
Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents:
3209
diff
changeset
|
39 (void)mbox_unlock(mbox, lock_id); |
2724
0b4d8354737a
Don't lock/unlock mbox separately for each message. Drop the lock only at
Timo Sirainen <tss@iki.fi>
parents:
2665
diff
changeset
|
40 lock_id = 0; |
0b4d8354737a
Don't lock/unlock mbox separately for each message. Drop the lock only at
Timo Sirainen <tss@iki.fi>
parents:
2665
diff
changeset
|
41 } |
0b4d8354737a
Don't lock/unlock mbox separately for each message. Drop the lock only at
Timo Sirainen <tss@iki.fi>
parents:
2665
diff
changeset
|
42 |
6511
fe5c19ffc119
Sync mbox when committing transaction only when saving messages to update
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
43 if (ret == 0 && mails_saved) { |
fe5c19ffc119
Sync mbox when committing transaction only when saving messages to update
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
44 /* after saving mails we want to update the last-uid */ |
fe5c19ffc119
Sync mbox when committing transaction only when saving messages to update
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
45 if (mbox_sync(mbox, MBOX_SYNC_HEADER | MBOX_SYNC_REWRITE) < 0) |
1978
6303ef092c5b
mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
46 ret = -1; |
6303ef092c5b
mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
47 } |
6303ef092c5b
mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
48 |
6303ef092c5b
mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
49 if (lock_id != 0) { |
3279
b698ae839a18
Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents:
3209
diff
changeset
|
50 if (mbox_unlock(mbox, lock_id) < 0) |
1978
6303ef092c5b
mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
51 ret = -1; |
6303ef092c5b
mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
52 } |
8528 | 53 i_assert(mbox->ibox.box.transaction_count > 0 || |
54 mbox->mbox_lock_type == F_UNLCK); | |
1978
6303ef092c5b
mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
55 return ret; |
6303ef092c5b
mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
56 } |
6303ef092c5b
mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
57 |
4453
85fcdb478608
Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents:
3863
diff
changeset
|
58 static void mbox_transaction_rollback(struct mail_index_transaction *t) |
1978
6303ef092c5b
mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
59 { |
5450
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
5265
diff
changeset
|
60 struct mbox_transaction_context *mt = MAIL_STORAGE_CONTEXT(t); |
4453
85fcdb478608
Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents:
3863
diff
changeset
|
61 struct mbox_mailbox *mbox = (struct mbox_mailbox *)mt->ictx.ibox; |
85fcdb478608
Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents:
3863
diff
changeset
|
62 |
85fcdb478608
Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents:
3863
diff
changeset
|
63 if (mt->save_ctx != NULL) |
85fcdb478608
Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents:
3863
diff
changeset
|
64 mbox_transaction_save_rollback(mt->save_ctx); |
85fcdb478608
Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents:
3863
diff
changeset
|
65 |
85fcdb478608
Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents:
3863
diff
changeset
|
66 if (mt->mbox_lock_id != 0) |
85fcdb478608
Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents:
3863
diff
changeset
|
67 (void)mbox_unlock(mbox, mt->mbox_lock_id); |
85fcdb478608
Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents:
3863
diff
changeset
|
68 index_transaction_finish_rollback(&mt->ictx); |
8528 | 69 |
70 i_assert(mbox->ibox.box.transaction_count > 0 || | |
71 mbox->mbox_lock_type == F_UNLCK); | |
4453
85fcdb478608
Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents:
3863
diff
changeset
|
72 } |
85fcdb478608
Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents:
3863
diff
changeset
|
73 |
5469
35a54122b396
Changed *_transaction_created() to static.
Timo Sirainen <tss@iki.fi>
parents:
5450
diff
changeset
|
74 static void mbox_transaction_created(struct mail_index_transaction *t) |
4453
85fcdb478608
Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents:
3863
diff
changeset
|
75 { |
5570
1b7edfc77e9f
Map mailbox to mail_index_view, not to mail_index. Fixes crashes when the
Timo Sirainen <tss@iki.fi>
parents:
5469
diff
changeset
|
76 struct mailbox *box = MAIL_STORAGE_CONTEXT(t->view); |
4453
85fcdb478608
Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents:
3863
diff
changeset
|
77 |
4848
967de900c73a
Mailbox list indexing and related changes. Currently works only with
Timo Sirainen <tss@iki.fi>
parents:
4678
diff
changeset
|
78 /* index can be for mailbox list index, in which case box=NULL */ |
967de900c73a
Mailbox list indexing and related changes. Currently works only with
Timo Sirainen <tss@iki.fi>
parents:
4678
diff
changeset
|
79 if (box != NULL && strcmp(box->storage->name, MBOX_STORAGE_NAME) == 0) { |
4453
85fcdb478608
Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents:
3863
diff
changeset
|
80 struct mbox_mailbox *mbox = (struct mbox_mailbox *)box; |
85fcdb478608
Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents:
3863
diff
changeset
|
81 struct mbox_transaction_context *mt; |
85fcdb478608
Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents:
3863
diff
changeset
|
82 |
85fcdb478608
Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents:
3863
diff
changeset
|
83 mt = i_new(struct mbox_transaction_context, 1); |
85fcdb478608
Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents:
3863
diff
changeset
|
84 mt->ictx.trans = t; |
85fcdb478608
Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents:
3863
diff
changeset
|
85 mt->ictx.super = t->v; |
1978
6303ef092c5b
mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
86 |
4453
85fcdb478608
Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents:
3863
diff
changeset
|
87 t->v.commit = mbox_transaction_commit; |
85fcdb478608
Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents:
3863
diff
changeset
|
88 t->v.rollback = mbox_transaction_rollback; |
5450
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
5265
diff
changeset
|
89 MODULE_CONTEXT_SET(t, mail_storage_mail_index_module, mt); |
4453
85fcdb478608
Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents:
3863
diff
changeset
|
90 |
85fcdb478608
Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents:
3863
diff
changeset
|
91 index_transaction_init(&mt->ictx, &mbox->ibox); |
85fcdb478608
Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents:
3863
diff
changeset
|
92 } |
85fcdb478608
Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents:
3863
diff
changeset
|
93 |
85fcdb478608
Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents:
3863
diff
changeset
|
94 if (next_hook_mail_index_transaction_created != NULL) |
85fcdb478608
Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents:
3863
diff
changeset
|
95 next_hook_mail_index_transaction_created(t); |
85fcdb478608
Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents:
3863
diff
changeset
|
96 } |
1978
6303ef092c5b
mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
97 |
4453
85fcdb478608
Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents:
3863
diff
changeset
|
98 void mbox_transaction_class_init(void) |
85fcdb478608
Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents:
3863
diff
changeset
|
99 { |
85fcdb478608
Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents:
3863
diff
changeset
|
100 next_hook_mail_index_transaction_created = |
85fcdb478608
Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents:
3863
diff
changeset
|
101 hook_mail_index_transaction_created; |
85fcdb478608
Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents:
3863
diff
changeset
|
102 hook_mail_index_transaction_created = mbox_transaction_created; |
1978
6303ef092c5b
mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
103 } |
4453
85fcdb478608
Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents:
3863
diff
changeset
|
104 |
85fcdb478608
Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents:
3863
diff
changeset
|
105 void mbox_transaction_class_deinit(void) |
85fcdb478608
Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents:
3863
diff
changeset
|
106 { |
85fcdb478608
Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents:
3863
diff
changeset
|
107 i_assert(hook_mail_index_transaction_created == |
85fcdb478608
Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents:
3863
diff
changeset
|
108 mbox_transaction_created); |
85fcdb478608
Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents:
3863
diff
changeset
|
109 hook_mail_index_transaction_created = |
85fcdb478608
Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents:
3863
diff
changeset
|
110 next_hook_mail_index_transaction_created; |
85fcdb478608
Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents:
3863
diff
changeset
|
111 } |