]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
Added index->append_abort() to abort append cleanly.
authorTimo Sirainen <tss@iki.fi>
Wed, 5 Mar 2003 01:41:36 +0000 (03:41 +0200)
committerTimo Sirainen <tss@iki.fi>
Wed, 5 Mar 2003 01:41:36 +0000 (03:41 +0200)
--HG--
branch : HEAD

src/lib-index/mail-index.c
src/lib-index/mail-index.h
src/lib-index/maildir/maildir-build.c
src/lib-index/maildir/maildir-index.c
src/lib-index/mbox/mbox-append.c
src/lib-index/mbox/mbox-index.c

index 849b867ce62bdb0c8ab897f6fe715a7231fb9df6..d800db86a8a7784c288ace82cfe98f6513a40269 100644 (file)
@@ -817,31 +817,12 @@ static int mail_index_truncate_hole(struct mail_index *index)
        return TRUE;
 }
 
-#define INDEX_NEED_COMPRESS(records, hdr) \
-       ((records) > INDEX_MIN_RECORDS_COUNT && \
-        (records) * (100-INDEX_COMPRESS_PERCENTAGE) / 100 > \
-               (hdr)->messages_count)
-
-int mail_index_expunge(struct mail_index *index, struct mail_index_record *rec,
-                      unsigned int seq, int external_change)
+static void update_first_hole(struct mail_index *index,
+                             struct mail_index_record *rec)
 {
-       struct mail_index_header *hdr;
-       unsigned int records, uid, idx;
-
-       i_assert(index->lock_type == MAIL_LOCK_EXCLUSIVE);
-       i_assert(seq != 0);
-       i_assert(rec->uid != 0);
-
-       if (!mail_index_verify_hole_range(index))
-               return FALSE;
-
-       hdr = index->header;
-
-       /* setting UID to 0 is enough for deleting the mail from index */
-       uid = rec->uid;
-       rec->uid = 0;
+       struct mail_index_header *hdr = index->header;
+       unsigned int idx;
 
-       /* update first hole */
        idx = INDEX_RECORD_INDEX(index, rec);
        if (hdr->first_hole_records == 0) {
                /* first deleted message in index */
@@ -863,6 +844,33 @@ int mail_index_expunge(struct mail_index *index, struct mail_index_record *rec,
                        hdr->first_hole_records = 1;
                }
        }
+}
+
+#define INDEX_NEED_COMPRESS(records, hdr) \
+       ((records) > INDEX_MIN_RECORDS_COUNT && \
+        (records) * (100-INDEX_COMPRESS_PERCENTAGE) / 100 > \
+               (hdr)->messages_count)
+
+int mail_index_expunge(struct mail_index *index, struct mail_index_record *rec,
+                      unsigned int seq, int external_change)
+{
+       struct mail_index_header *hdr;
+       unsigned int records, uid;
+
+       i_assert(index->lock_type == MAIL_LOCK_EXCLUSIVE);
+       i_assert(seq != 0);
+       i_assert(rec->uid != 0);
+
+       if (!mail_index_verify_hole_range(index))
+               return FALSE;
+
+       hdr = index->header;
+
+       /* setting UID to 0 is enough for deleting the mail from index */
+       uid = rec->uid;
+       rec->uid = 0;
+
+       update_first_hole(index, rec);
 
        /* update message counts */
        if (hdr->messages_count == 0) {
@@ -1012,6 +1020,22 @@ int mail_index_append_end(struct mail_index *index,
        return TRUE;
 }
 
+void mail_index_append_abort(struct mail_index *index,
+                            struct mail_index_record *rec)
+{
+       i_assert(rec->uid == 0);
+
+       if (INDEX_FILE_POSITION(index, rec) ==
+           index->header->used_file_size - sizeof(*rec)) {
+               /* we can just rollback */
+               index->header->used_file_size -= sizeof(*rec);
+               index->mmap_used_length += sizeof(*rec);
+       } else {
+               /* mark it deleted */
+               update_first_hole(index, rec);
+       }
+}
+
 enum mail_index_error mail_index_get_last_error(struct mail_index *index)
 {
        if (index->inconsistent)
index f7b6d91ea577374f5bce9df42886b41fba3de87f..a4140e9913a81f4fad771a83181ec5bad71db8d8 100644 (file)
@@ -323,6 +323,8 @@ struct mail_index {
        struct mail_index_record *(*append_begin)(struct mail_index *index);
        int (*append_end)(struct mail_index *index,
                          struct mail_index_record *rec);
+       void (*append_abort)(struct mail_index *index,
+                            struct mail_index_record *rec);
 
        /* Updating fields happens by calling update_begin(), one or more
           update_field()s and finally update_end() which does the actual
@@ -473,6 +475,8 @@ int mail_index_update_flags(struct mail_index *index,
 struct mail_index_record *mail_index_append_begin(struct mail_index *index);
 int mail_index_append_end(struct mail_index *index,
                          struct mail_index_record *rec);
+void mail_index_append_abort(struct mail_index *index,
+                            struct mail_index_record *rec);
 struct mail_index_update *
 mail_index_update_begin(struct mail_index *index,
                        struct mail_index_record *rec);
index 0469705fbe4f6a8f1aeb3ea5c69e926e80aa11f6..04323f3bb82ff987e7042a6b4ef4f702442bd55b 100644 (file)
@@ -66,8 +66,10 @@ static int maildir_index_append_fd(struct mail_index *index,
        /* parse the header and update record's fields */
        failed = fd == -1 ? FALSE : !maildir_record_update(index, update, fd);
 
-       if (!index->update_end(update) || failed)
+       if (!index->update_end(update) || failed) {
+               index->append_abort(index, rec);
                return FALSE;
+       }
 
        return index->append_end(index, rec);
 }
index 7ca058872c8bded0b5e87ff66829a8ff6d14f9d9..ca1112f946b81bce5c1dc915053f8d453b0ee6f0 100644 (file)
@@ -263,6 +263,7 @@ struct mail_index maildir_index = {
        maildir_index_update_flags,
        mail_index_append_begin,
        mail_index_append_end,
+       mail_index_append_abort,
        mail_index_update_begin,
        mail_index_update_end,
        mail_index_update_field,
index 7c4b492d42632be062eb1a827c841a2e600ebe96..281db75753428d181a6f279e9abcaa6aa611ff47 100644 (file)
@@ -94,9 +94,10 @@ static int mbox_index_append_next(struct mail_index *index,
        index->update_field_raw(update, DATA_FIELD_MD5,
                                md5_digest, sizeof(md5_digest));
 
-       if (!index->update_end(update))
+       if (!index->update_end(update)) {
+               index->append_abort(index, rec);
                failed = TRUE;
-       else {
+       else {
                /* save message flags */
                rec->msg_flags = ctx.flags;
                mail_index_mark_flag_changes(index, rec, 0, rec->msg_flags);
index 848a713b0285b3e02a109ce19866c3b4d245ff60..f7b5a1d944114bd8569a2b637809d7f5ee938215 100644 (file)
@@ -821,6 +821,7 @@ struct mail_index mbox_index = {
        mbox_index_update_flags,
        mail_index_append_begin,
        mail_index_append_end,
+       mail_index_append_abort,
        mail_index_update_begin,
        mail_index_update_end,
        mail_index_update_field,