예제 #1
0
void mdbox_update_header(struct mdbox_mailbox *mbox,
                         struct mail_index_transaction *trans,
                         const struct mailbox_update *update)
{
    struct mdbox_index_header hdr, new_hdr;
    bool need_resize;

    if (mdbox_read_header(mbox, &hdr, &need_resize) < 0) {
        memset(&hdr, 0, sizeof(hdr));
        need_resize = TRUE;
    }

    new_hdr = hdr;

    if (update != NULL && !guid_128_is_empty(update->mailbox_guid)) {
        memcpy(new_hdr.mailbox_guid, update->mailbox_guid,
               sizeof(new_hdr.mailbox_guid));
    } else if (guid_128_is_empty(new_hdr.mailbox_guid)) {
        guid_128_generate(new_hdr.mailbox_guid);
    }

    new_hdr.map_uid_validity =
        mdbox_map_get_uid_validity(mbox->storage->map);
    if (need_resize) {
        mail_index_ext_resize_hdr(trans, mbox->hdr_ext_id,
                                  sizeof(new_hdr));
    }
    if (memcmp(&hdr, &new_hdr, sizeof(hdr)) != 0) {
        mail_index_update_header_ext(trans, mbox->hdr_ext_id, 0,
                                     &new_hdr, sizeof(new_hdr));
    }
}
예제 #2
0
static void sdbox_update_header(struct sdbox_mailbox *mbox,
				struct mail_index_transaction *trans,
				const struct mailbox_update *update)
{
	struct sdbox_index_header hdr, new_hdr;
	bool need_resize;

	if (sdbox_read_header(mbox, &hdr, TRUE, &need_resize) < 0) {
		i_zero(&hdr);
		need_resize = TRUE;
	}

	new_hdr = hdr;

	if (update != NULL && !guid_128_is_empty(update->mailbox_guid)) {
		memcpy(new_hdr.mailbox_guid, update->mailbox_guid,
		       sizeof(new_hdr.mailbox_guid));
	} else if (guid_128_is_empty(new_hdr.mailbox_guid)) {
		guid_128_generate(new_hdr.mailbox_guid);
	}

	if (need_resize) {
		mail_index_ext_resize_hdr(trans, mbox->hdr_ext_id,
					  sizeof(new_hdr));
	}
	if (memcmp(&hdr, &new_hdr, sizeof(hdr)) != 0) {
		mail_index_update_header_ext(trans, mbox->hdr_ext_id, 0,
					     &new_hdr, sizeof(new_hdr));
	}
	memcpy(mbox->mailbox_guid, new_hdr.mailbox_guid,
	       sizeof(mbox->mailbox_guid));
}