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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
1a9e14718bd6 mbox locking fixes.
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
53 i_assert(mbox->ibox.box.transaction_count > 0 ||
1a9e14718bd6 mbox locking fixes.
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
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
1a9e14718bd6 mbox locking fixes.
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
69
1a9e14718bd6 mbox locking fixes.
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
70 i_assert(mbox->ibox.box.transaction_count > 0 ||
1a9e14718bd6 mbox locking fixes.
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
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 }