return index_storage_mailbox_open(box);
}
-static int
-cydir_mailbox_update(struct mailbox *box, const struct mailbox_update *update)
-{
- struct cydir_mailbox *mbox = (struct cydir_mailbox *)box;
- struct mail_index_transaction *trans;
-
- trans = mail_index_transaction_begin(mbox->ibox.view, 0);
- if (update->uid_validity != 0) {
- mail_index_update_header(trans,
- offsetof(struct mail_index_header, uid_validity),
- &update->uid_validity, sizeof(update->uid_validity),
- TRUE);
- }
- /* FIXME: update next_uid, highestmodseq. guid is also missing.. */
- if (mail_index_transaction_commit(&trans) < 0) {
- mail_storage_set_internal_error(box->storage);
- return -1;
- }
- return 0;
-}
-
static int
cydir_mailbox_create(struct mailbox *box, const struct mailbox_update *update,
bool directory)
return -1;
return directory || update == NULL ? 0 :
- cydir_mailbox_update(box, update);
+ index_storage_mailbox_update(box, update);
}
static int
cydir_mailbox_open,
index_storage_mailbox_close,
cydir_mailbox_create,
- cydir_mailbox_update,
+ index_storage_mailbox_update,
index_storage_get_status,
NULL,
NULL,
#include "unlink-old-files.h"
#include "index-mail.h"
#include "mail-copy.h"
+#include "mail-index-modseq.h"
#include "mailbox-uidvalidity.h"
#include "maildir/maildir-uidlist.h"
#include "dbox-map.h"
offsetof(struct mail_index_header, next_uid),
&uid_next, sizeof(uid_next), TRUE);
}
+ if (update != NULL && update->min_highest_modseq != 0 &&
+ mail_index_modseq_get_highest(mbox->ibox.view) <
+ update->min_highest_modseq) {
+ mail_index_update_highest_modseq(trans,
+ update->min_highest_modseq);
+ }
if (mail_index_transaction_commit(&trans) < 0) {
mail_storage_set_internal_error(box->storage);
pool_unref(&box->pool);
}
+int index_storage_mailbox_update(struct mailbox *box,
+ const struct mailbox_update *update)
+{
+ struct index_mailbox *ibox = (struct index_mailbox *)box;
+ const struct mail_index_header *hdr;
+ struct mail_index_view *view;
+ struct mail_index_transaction *trans;
+ int ret;
+
+ if (!box->opened) {
+ if (mailbox_open(box) < 0)
+ return -1;
+ }
+
+ /* make sure we get the latest index info */
+ (void)mail_index_refresh(ibox->index);
+ view = mail_index_view_open(ibox->index);
+ hdr = mail_index_get_header(view);
+
+ trans = mail_index_transaction_begin(view,
+ MAIL_INDEX_TRANSACTION_FLAG_EXTERNAL);
+ if (update->uid_validity != 0 &&
+ hdr->uid_validity != update->uid_validity) {
+ uint32_t uid_validity = update->uid_validity;
+
+ mail_index_update_header(trans,
+ offsetof(struct mail_index_header, uid_validity),
+ &uid_validity, sizeof(uid_validity), TRUE);
+ }
+ if (update->min_next_uid != 0 &&
+ hdr->next_uid < update->min_next_uid) {
+ uint32_t next_uid = update->min_next_uid;
+
+ mail_index_update_header(trans,
+ offsetof(struct mail_index_header, next_uid),
+ &next_uid, sizeof(next_uid), FALSE);
+ }
+ if (update->min_highest_modseq != 0 &&
+ mail_index_modseq_get_highest(view) < update->min_highest_modseq) {
+ mail_index_update_highest_modseq(trans,
+ update->min_highest_modseq);
+ }
+
+ if ((ret = mail_index_transaction_commit(&trans)) < 0)
+ mail_storage_set_internal_error(box->storage);
+ mail_index_view_close(&view);
+ return ret;
+}
+
bool index_storage_is_readonly(struct mailbox *box)
{
struct index_mailbox *ibox = (struct index_mailbox *) box;
int index_storage_mailbox_enable(struct mailbox *box,
enum mailbox_feature feature);
void index_storage_mailbox_close(struct mailbox *box);
+int index_storage_mailbox_update(struct mailbox *box,
+ const struct mailbox_update *update);
bool index_storage_is_readonly(struct mailbox *box);
bool index_storage_allow_new_keywords(struct mailbox *box);
maildir_uidlist_set_next_uid(uidlist, update->min_next_uid,
FALSE);
}
- /* FIXME: update highestmodseq */
-
ret = maildir_uidlist_update(uidlist);
+ if (ret == 0)
+ ret = index_storage_mailbox_update(box, update);
maildir_uidlist_unlock(uidlist);
return ret;
}