Mercurial > dovecot > core-2.2
view src/lib-storage/proxy-mailbox.c @ 2327:7d02e2a7672d HEAD
Header caching redesigned. New design allows caching decisions per field, so
they can be divided to temporary/permanent. Cached headers are now always
returned in original order, old code didn't guarantee it. Some other caching
changes. (still missing code to store changes in caching decisions)
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Sun, 18 Jul 2004 05:25:06 +0300 |
parents | aae574ed7f4c |
children | 47e1e05cede0 |
line wrap: on
line source
/* Copyright (C) 2003 Timo Sirainen */ #include "lib.h" #include "proxy-mailbox.h" static int _is_readonly(struct mailbox *box) { struct proxy_mailbox *p = (struct proxy_mailbox *) box; return p->box->is_readonly(p->box); } static int _allow_new_keywords(struct mailbox *box) { struct proxy_mailbox *p = (struct proxy_mailbox *) box; return p->box->allow_new_keywords(p->box); } static int _close(struct mailbox *box) { struct proxy_mailbox *p = (struct proxy_mailbox *) box; return p->box->close(p->box); } static int _get_status(struct mailbox *box, enum mailbox_status_items items, struct mailbox_status *status) { struct proxy_mailbox *p = (struct proxy_mailbox *) box; return p->box->get_status(p->box, items, status); } static struct mailbox_sync_context * _sync_init(struct mailbox *box, enum mailbox_sync_flags flags) { struct proxy_mailbox *p = (struct proxy_mailbox *) box; return p->box->sync_init(p->box, flags); } static void _notify_changes(struct mailbox *box, unsigned int min_interval, mailbox_notify_callback_t *callback, void *context) { struct proxy_mailbox *p = (struct proxy_mailbox *) box; return p->box->notify_changes(box, min_interval, callback, context); } static struct mail *_fetch(struct mailbox_transaction_context *t, uint32_t seq, enum mail_fetch_field wanted_fields) { struct proxy_mailbox_transaction_context *pt = (struct proxy_mailbox_transaction_context *)t; struct proxy_mailbox *pbox = (struct proxy_mailbox *)t->box; return pbox->box->fetch(pt->ctx, seq, wanted_fields); } static int _get_uids(struct mailbox *box, uint32_t uid1, uint32_t uid2, uint32_t *seq1_r, uint32_t *seq2_r) { struct proxy_mailbox *p = (struct proxy_mailbox *) box; return p->box->get_uids(p->box, uid1, uid2, seq1_r, seq2_r); } static struct mailbox_header_lookup_ctx * _header_lookup_init(struct mailbox *box, const char *const headers[]) { struct proxy_mailbox *p = (struct proxy_mailbox *) box; return p->box->header_lookup_init(p->box, headers); } static int _search_get_sorting(struct mailbox *box, enum mail_sort_type *sort_program) { struct proxy_mailbox *p = (struct proxy_mailbox *) box; return p->box->search_get_sorting(p->box, sort_program); } static struct mail_search_context * _search_init(struct mailbox_transaction_context *t, const char *charset, struct mail_search_arg *args, const enum mail_sort_type *sort_program, enum mail_fetch_field wanted_fields, struct mailbox_header_lookup_ctx *wanted_headers) { struct proxy_mailbox_transaction_context *pt = (struct proxy_mailbox_transaction_context *)t; struct proxy_mailbox *pbox = (struct proxy_mailbox *)t->box; return pbox->box->search_init(pt->ctx, charset, args, sort_program, wanted_fields, wanted_headers); } static int _transaction_commit(struct mailbox_transaction_context *t) { struct proxy_mailbox_transaction_context *pt = (struct proxy_mailbox_transaction_context *)t; struct proxy_mailbox *pbox = (struct proxy_mailbox *)t->box; return pbox->box->transaction_commit(pt->ctx); } static void _transaction_rollback(struct mailbox_transaction_context *t) { struct proxy_mailbox_transaction_context *pt = (struct proxy_mailbox_transaction_context *)t; struct proxy_mailbox *pbox = (struct proxy_mailbox *)t->box; pbox->box->transaction_rollback(pt->ctx); } static int _save(struct mailbox_transaction_context *t, const struct mail_full_flags *flags, time_t received_date, int timezone_offset, const char *from_envelope, struct istream *data, struct mail **mail_r) { struct proxy_mailbox_transaction_context *pt = (struct proxy_mailbox_transaction_context *)t; struct proxy_mailbox *pbox = (struct proxy_mailbox *)t->box; return pbox->box->save(pt->ctx, flags, received_date, timezone_offset, from_envelope, data, mail_r); } static int _copy(struct mailbox_transaction_context *t, struct mail *mail, struct mail **dest_mail_r) { struct proxy_mailbox_transaction_context *pt = (struct proxy_mailbox_transaction_context *)t; struct proxy_mailbox *pbox = (struct proxy_mailbox *)t->box; return pbox->box->copy(pt->ctx, mail, dest_mail_r); } static int _is_inconsistent(struct mailbox *box) { struct proxy_mailbox *p = (struct proxy_mailbox *) box; return p->box->is_inconsistent(p->box); } void proxy_mailbox_init(struct proxy_mailbox *proxy, struct mailbox *box) { struct mailbox *pb = &proxy->proxy_box; proxy->box = box; pb->name = box->name; pb->storage = box->storage; pb->is_readonly = _is_readonly; pb->allow_new_keywords = _allow_new_keywords; pb->close = _close; pb->get_status = _get_status; pb->sync_init = _sync_init; pb->sync_next = box->sync_next; pb->sync_deinit = box->sync_deinit; pb->notify_changes = _notify_changes; pb->fetch = _fetch; pb->get_uids = _get_uids; pb->header_lookup_init = _header_lookup_init; pb->search_get_sorting = _search_get_sorting; pb->search_init = _search_init; pb->search_next = box->search_next; pb->search_deinit = box->search_deinit; pb->transaction_begin = NULL; /* must be implemented */ pb->transaction_commit = _transaction_commit; pb->transaction_rollback = _transaction_rollback; pb->save = _save; pb->copy = _copy; pb->is_inconsistent = _is_inconsistent; } void proxy_transaction_init(struct proxy_mailbox *proxy_box, struct proxy_mailbox_transaction_context *proxy_ctx, struct mailbox_transaction_context *ctx) { proxy_ctx->proxy_ctx.box = &proxy_box->proxy_box; proxy_ctx->ctx = ctx; }