[dovecot-cvs] dovecot/src/lib-storage/index index-fetch.c, 1.53,
1.54 index-mail-headers.c, 1.19, 1.20 index-mail.c, 1.34,
1.35 index-search.c, 1.89, 1.90 index-storage.c, 1.52,
1.53 index-storage.h, 1.67, 1.68 index-transaction.c, 1.3, 1.4
cras at procontrol.fi
cras at procontrol.fi
Tue Jun 22 10:36:36 EEST 2004
Update of /home/cvs/dovecot/src/lib-storage/index
In directory talvi:/tmp/cvs-serv17660/lib-storage/index
Modified Files:
index-fetch.c index-mail-headers.c index-mail.c index-search.c
index-storage.c index-storage.h index-transaction.c
Log Message:
Added mail_index_transaction_get_updated_view() which can be used to access
uncommitted messages.
Index: index-fetch.c
===================================================================
RCS file: /home/cvs/dovecot/src/lib-storage/index/index-fetch.c,v
retrieving revision 1.53
retrieving revision 1.54
diff -u -d -r1.53 -r1.54
--- index-fetch.c 27 Apr 2004 20:25:54 -0000 1.53
+++ index-fetch.c 22 Jun 2004 07:36:33 -0000 1.54
@@ -12,7 +12,7 @@
(struct index_transaction_context *)_t;
const struct mail_index_record *rec;
- if (mail_index_lookup(t->ibox->view, seq, &rec) < 0) {
+ if (mail_index_lookup(t->trans_view, seq, &rec) < 0) {
mail_storage_set_index_error(t->ibox);
return NULL;
}
Index: index-mail-headers.c
===================================================================
RCS file: /home/cvs/dovecot/src/lib-storage/index/index-mail-headers.c,v
retrieving revision 1.19
retrieving revision 1.20
diff -u -d -r1.19 -r1.20
--- index-mail-headers.c 17 Jun 2004 21:28:23 -0000 1.19
+++ index-mail-headers.c 22 Jun 2004 07:36:33 -0000 1.20
@@ -186,7 +186,7 @@
{
int idx;
- idx = find_wanted_headers(mail->ibox->cache_view, wanted_headers);
+ idx = find_wanted_headers(mail->trans->cache_view, wanted_headers);
if (idx < 0)
return -1;
@@ -434,7 +434,7 @@
data->header_stream = istream;
} else {
str = mail_cache_lookup_string_field(
- mail->ibox->cache_view, data->seq,
+ mail->trans->cache_view, data->seq,
mail_cache_header_fields[idx]);
if (str == NULL) {
/* broken - we expected the header to exist */
@@ -447,7 +447,7 @@
str, strlen(str));
}
- idx_headers = mail_cache_get_header_fields(mail->ibox->cache_view,
+ idx_headers = mail_cache_get_header_fields(mail->trans->cache_view,
idx);
if (idx_headers == NULL) {
mail_cache_set_corrupted(mail->ibox->cache,
@@ -511,7 +511,7 @@
idx = data->header_data_cached; max = idx-1;
for (; idx < MAIL_CACHE_HEADERS_COUNT; idx++) {
str = mail_cache_lookup_string_field(
- mail->ibox->cache_view, mail->data.seq,
+ mail->trans->cache_view, mail->data.seq,
mail_cache_header_fields[idx]);
if (str == NULL)
continue;
@@ -526,7 +526,7 @@
/* make sure we cache everything */
for (idx = MAIL_CACHE_HEADERS_COUNT-1; idx >= 0; idx--) {
headers = mail_cache_get_header_fields(
- mail->ibox->cache_view, idx);
+ mail->trans->cache_view, idx);
if (headers != NULL)
break;
}
@@ -655,7 +655,7 @@
}
for (i = data->header_data_cached; i <= idx; i++) {
str = mail_cache_lookup_string_field(
- mail->ibox->cache_view, data->seq,
+ mail->trans->cache_view, data->seq,
mail_cache_header_fields[i]);
if (str == NULL)
continue;
@@ -687,7 +687,7 @@
void index_mail_headers_init(struct index_mail *mail)
{
- struct mail_cache_view *cache_view = mail->ibox->cache_view;
+ struct mail_cache_view *cache_view = mail->trans->cache_view;
int idx = -2, idx2 = -2;
if (mail->wanted_headers != NULL && *mail->wanted_headers != NULL)
@@ -769,7 +769,7 @@
accessing headers from same message. index_mails should probably be
shared.. */
headers = cached_header_get_names(mail);
- idx = find_wanted_headers(mail->ibox->cache_view, headers);
+ idx = find_wanted_headers(mail->trans->cache_view, headers);
if (idx >= 0) {
/* all headers found */
if (idx != mail->data.header_save_idx) {
@@ -779,7 +779,7 @@
}
} else {
/* there's some new headers */
- idx = find_unused_header_idx(mail->ibox->cache_view);
+ idx = find_unused_header_idx(mail->trans->cache_view);
if (idx < 0)
return;
Index: index-mail.c
===================================================================
RCS file: /home/cvs/dovecot/src/lib-storage/index/index-mail.c,v
retrieving revision 1.34
retrieving revision 1.35
diff -u -d -r1.34 -r1.35
--- index-mail.c 20 Jun 2004 08:05:41 -0000 1.34
+++ index-mail.c 22 Jun 2004 07:36:33 -0000 1.35
@@ -23,12 +23,12 @@
size_t part_size;
if ((mail->data.cached_fields & MAIL_CACHE_MESSAGEPART) == 0) {
- mail_cache_mark_missing(mail->ibox->cache_view,
+ mail_cache_mark_missing(mail->trans->cache_view,
MAIL_CACHE_MESSAGEPART);
return NULL;
}
- if (!mail_cache_lookup_field(mail->ibox->cache_view, mail->data.seq,
+ if (!mail_cache_lookup_field(mail->trans->cache_view, mail->data.seq,
MAIL_CACHE_MESSAGEPART,
&part_data, &part_size)) {
/* unexpected - must be an error */
@@ -61,11 +61,11 @@
const char *ret;
if ((mail->data.cached_fields & field) == 0) {
- mail_cache_mark_missing(mail->ibox->cache_view, field);
+ mail_cache_mark_missing(mail->trans->cache_view, field);
return NULL;
}
- ret = mail_cache_lookup_string_field(mail->ibox->cache_view,
+ ret = mail_cache_lookup_string_field(mail->trans->cache_view,
mail->data.seq, field);
return p_strdup(mail->pool, ret);
}
@@ -75,9 +75,10 @@
{
uoff_t uoff;
- if (!mail_cache_copy_fixed_field(mail->ibox->cache_view, mail->data.seq,
- field, &uoff, sizeof(uoff))) {
- mail_cache_mark_missing(mail->ibox->cache_view, field);
+ if (!mail_cache_copy_fixed_field(mail->trans->cache_view,
+ mail->data.seq, field,
+ &uoff, sizeof(uoff))) {
+ mail_cache_mark_missing(mail->trans->cache_view, field);
uoff = (uoff_t)-1;
}
@@ -93,10 +94,11 @@
{
time_t t;
- if (!mail_cache_copy_fixed_field(mail->ibox->cache_view, mail->data.seq,
+ if (!mail_cache_copy_fixed_field(mail->trans->cache_view,
+ mail->data.seq,
MAIL_CACHE_RECEIVED_DATE,
&t, sizeof(t))) {
- mail_cache_mark_missing(mail->ibox->cache_view,
+ mail_cache_mark_missing(mail->trans->cache_view,
MAIL_CACHE_RECEIVED_DATE);
t = (time_t)-1;
}
@@ -107,10 +109,11 @@
static void get_cached_sent_date(struct index_mail *mail,
struct mail_sent_date *sent_date)
{
- if (!mail_cache_copy_fixed_field(mail->ibox->cache_view, mail->data.seq,
+ if (!mail_cache_copy_fixed_field(mail->trans->cache_view,
+ mail->data.seq,
MAIL_CACHE_SENT_DATE,
sent_date, sizeof(*sent_date))) {
- mail_cache_mark_missing(mail->ibox->cache_view,
+ mail_cache_mark_missing(mail->trans->cache_view,
MAIL_CACHE_SENT_DATE);
sent_date->time = (time_t)-1;
@@ -123,13 +126,13 @@
if (mail->trans->cache_trans != NULL)
return TRUE;
- if (mail_cache_transaction_begin(mail->ibox->cache_view, TRUE,
+ if (mail_cache_transaction_begin(mail->trans->cache_view, TRUE,
mail->trans->trans,
&mail->trans->cache_trans) <= 0)
return FALSE;
- mail->data.cached_fields = mail_cache_get_fields(mail->ibox->cache_view,
- mail->data.seq);
+ mail->data.cached_fields =
+ mail_cache_get_fields(mail->trans->cache_view, mail->data.seq);
return TRUE;
}
@@ -351,14 +354,14 @@
return;
/* update cache_flags */
- cache_flags = mail_cache_get_record_flags(mail->ibox->cache_view,
+ cache_flags = mail_cache_get_record_flags(mail->trans->cache_view,
mail->data.seq);
if (mail->mail.has_nuls)
cache_flags |= MAIL_INDEX_FLAG_HAS_NULS;
else
cache_flags |= MAIL_INDEX_FLAG_HAS_NO_NULS;
- if (!mail_cache_update_record_flags(mail->ibox->cache_view,
+ if (!mail_cache_update_record_flags(mail->trans->cache_view,
mail->data.seq, cache_flags))
return;
@@ -542,9 +545,9 @@
p_clear(mail->pool);
data->cached_fields =
- mail_cache_get_fields(mail->ibox->cache_view, seq);
+ mail_cache_get_fields(mail->trans->cache_view, seq);
cache_flags = (data->cached_fields & MAIL_CACHE_INDEX_FLAGS) == 0 ? 0 :
- mail_cache_get_record_flags(mail->ibox->cache_view, seq);
+ mail_cache_get_record_flags(mail->trans->cache_view, seq);
mail->mail.seq = seq;
mail->mail.uid = rec->uid;
Index: index-search.c
===================================================================
RCS file: /home/cvs/dovecot/src/lib-storage/index/index-search.c,v
retrieving revision 1.89
retrieving revision 1.90
diff -u -d -r1.89 -r1.90
--- index-search.c 20 Jun 2004 03:25:33 -0000 1.89
+++ index-search.c 22 Jun 2004 07:36:33 -0000 1.90
@@ -21,7 +21,7 @@
struct index_search_context {
struct mail_search_context mail_ctx;
- struct index_transaction_context *trans;
+ struct mail_index_view *view;
struct index_mailbox *ibox;
char *charset;
struct mail_search_arg *args;
@@ -601,7 +601,7 @@
return 0;
}
-static int search_limit_lowwater(struct index_mailbox *ibox,
+static int search_limit_lowwater(struct index_search_context *ctx,
uint32_t uid_lowwater, uint32_t *first_seq)
{
uint32_t seq1, seq2;
@@ -609,9 +609,9 @@
if (uid_lowwater == 0)
return 0;
- if (mail_index_lookup_uid_range(ibox->view, uid_lowwater, (uint32_t)-1,
- &seq1, &seq2) < 0) {
- mail_storage_set_index_error(ibox);
+ if (mail_index_lookup_uid_range(ctx->view, uid_lowwater,
+ (uint32_t)-1, &seq1, &seq2) < 0) {
+ mail_storage_set_index_error(ctx->ibox);
return -1;
}
@@ -620,7 +620,7 @@
return 0;
}
-static int search_limit_by_flags(struct index_mailbox *ibox,
+static int search_limit_by_flags(struct index_search_context *ctx,
const struct mail_index_header *hdr,
struct mail_search_arg *args,
uint32_t *seq1, uint32_t *seq2)
@@ -640,7 +640,7 @@
args->match_always = TRUE;
} else if (args->not) {
/* UNSEEN with lowwater limiting */
- if (search_limit_lowwater(ibox,
+ if (search_limit_lowwater(ctx,
hdr->first_unseen_uid_lowwater,
seq1) < 0)
return -1;
@@ -662,7 +662,7 @@
args->match_always = TRUE;
} else if (!args->not) {
/* DELETED with lowwater limiting */
- if (search_limit_lowwater(ibox,
+ if (search_limit_lowwater(ctx,
hdr->first_deleted_uid_lowwater,
seq1) < 0)
return -1;
@@ -678,7 +678,7 @@
{
const struct mail_index_header *hdr;
- if (mail_index_get_header(ctx->ibox->view, &hdr) < 0) {
+ if (mail_index_get_header(ctx->view, &hdr) < 0) {
mail_storage_set_index_error(ctx->ibox);
return -1;
}
@@ -701,7 +701,7 @@
i_assert(ctx->seq1 <= ctx->seq2);
/* UNSEEN and DELETED in root search level may limit the range */
- if (search_limit_by_flags(ctx->ibox, hdr, args,
+ if (search_limit_by_flags(ctx, hdr, args,
&ctx->seq1, &ctx->seq2) < 0)
return -1;
return 0;
@@ -733,8 +733,8 @@
ctx = i_new(struct index_search_context, 1);
ctx->mail_ctx.box = &t->ibox->box;
- ctx->trans = t;
ctx->ibox = t->ibox;
+ ctx->view = t->trans_view;
ctx->charset = i_strdup(charset);
ctx->args = args;
@@ -815,7 +815,7 @@
ret = 0;
while (ctx->seq1 <= ctx->seq2) {
- if (mail_index_lookup(ctx->ibox->view, ctx->seq1, &rec) < 0) {
+ if (mail_index_lookup(ctx->view, ctx->seq1, &rec) < 0) {
ctx->failed = TRUE;
mail_storage_set_index_error(ctx->ibox);
return NULL;
Index: index-storage.c
===================================================================
RCS file: /home/cvs/dovecot/src/lib-storage/index/index-storage.c,v
retrieving revision 1.52
retrieving revision 1.53
diff -u -d -r1.52 -r1.53
--- index-storage.c 20 Jun 2004 08:05:41 -0000 1.52
+++ index-storage.c 22 Jun 2004 07:36:33 -0000 1.53
@@ -350,8 +350,6 @@
}
ibox->view = mail_index_view_open(index);
- ibox->cache_view =
- mail_cache_view_open(ibox->cache, ibox->view);
return ibox;
} while (0);
@@ -364,8 +362,6 @@
{
struct index_mailbox *ibox = (struct index_mailbox *) box;
- if (ibox->cache_view != NULL)
- mail_cache_view_close(ibox->cache_view);
if (ibox->view != NULL)
mail_index_view_close(ibox->view);
Index: index-storage.h
===================================================================
RCS file: /home/cvs/dovecot/src/lib-storage/index/index-storage.h,v
retrieving revision 1.67
retrieving revision 1.68
diff -u -d -r1.67 -r1.68
--- index-storage.h 20 Jun 2004 11:17:53 -0000 1.67
+++ index-storage.h 22 Jun 2004 07:36:33 -0000 1.68
@@ -58,7 +58,6 @@
struct mail_index *index;
struct mail_index_view *view;
struct mail_cache *cache;
- struct mail_cache_view *cache_view;
struct mail *mail_interface;
uint32_t (*get_recent_count)(struct index_mailbox *ibox);
@@ -112,7 +111,10 @@
struct index_transaction_context {
struct mailbox_transaction_context mailbox_ctx;
struct index_mailbox *ibox;
+
struct mail_index_transaction *trans;
+ struct mail_index_view *trans_view;
+ struct mail_cache_view *cache_view;
struct mail_cache_transaction_ctx *cache_trans;
struct index_mail fetch_mail; /* for index_storage_fetch() */
@@ -182,8 +184,8 @@
int index_storage_search_deinit(struct mail_search_context *ctx);
struct mail *index_storage_search_next(struct mail_search_context *ctx);
-struct mailbox_transaction_context *
-index_transaction_begin(struct mailbox *box);
+void index_transaction_init(struct index_transaction_context *t,
+ struct index_mailbox *ibox, int hide);
int index_transaction_commit(struct mailbox_transaction_context *t);
void index_transaction_rollback(struct mailbox_transaction_context *t);
Index: index-transaction.c
===================================================================
RCS file: /home/cvs/dovecot/src/lib-storage/index/index-transaction.c,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -d -r1.3 -r1.4
--- index-transaction.c 20 Jun 2004 08:05:41 -0000 1.3
+++ index-transaction.c 22 Jun 2004 07:36:33 -0000 1.4
@@ -3,8 +3,22 @@
#include "lib.h"
#include "index-storage.h"
+void index_transaction_init(struct index_transaction_context *t,
+ struct index_mailbox *ibox, int hide)
+{
+ t->mailbox_ctx.box = &ibox->box;
+ t->ibox = ibox;
+ t->trans = mail_index_transaction_begin(ibox->view, hide);
+ t->trans_view = mail_index_transaction_get_updated_view(t->trans);
+ t->cache_view = mail_cache_view_open(ibox->cache, t->trans_view);
+}
+
static void index_transaction_free(struct index_transaction_context *t)
{
+ if (t->cache_trans != NULL)
+ (void)mail_cache_transaction_end(t->cache_trans);
+
+ mail_cache_view_close(t->cache_view);
mail_index_view_unlock(t->ibox->view);
if (t->fetch_mail.pool != NULL)
@@ -20,11 +34,8 @@
uoff_t offset;
int ret;
- if (t->cache_trans != NULL) {
+ if (t->cache_trans != NULL)
(void)mail_cache_transaction_commit(t->cache_trans);
- (void)mail_cache_transaction_end(t->cache_trans);
- t->cache_trans = NULL;
- }
ret = mail_index_transaction_commit(t->trans, &seq, &offset);
if (ret < 0)
More information about the dovecot-cvs
mailing list