1
/* Copyright (c) 2009-2011 Dovecot authors, see the included COPYING file */
4
#include "mail-storage-private.h"
5
#include "istream-internal.h"
6
#include "istream-mail-stats.h"
8
struct mail_stats_istream {
9
struct istream_private istream;
11
struct mail_private *mail;
12
unsigned int files_read_increased:1;
16
i_stream_mail_stats_read_mail_stats(struct istream_private *stream)
18
struct mail_stats_istream *mstream =
19
(struct mail_stats_istream *)stream;
22
i_stream_seek(stream->parent, stream->parent_start_offset +
23
stream->istream.v_offset);
25
ret = i_stream_read_copy_from_parent(&stream->istream);
27
mstream->mail->stats_files_read_bytes += ret;
28
if (!mstream->files_read_increased) {
29
mstream->files_read_increased = TRUE;
30
mstream->mail->stats_files_read_count++;
37
i_stream_mail_stats_seek(struct istream_private *stream,
38
uoff_t v_offset, bool mark ATTR_UNUSED)
40
stream->istream.v_offset = v_offset;
41
stream->skip = stream->pos = 0;
44
static const struct stat *
45
i_stream_mail_stats_stat(struct istream_private *stream, bool exact)
47
return i_stream_stat(stream->parent, exact);
50
struct istream *i_stream_create_mail_stats_counter(struct mail_private *mail,
51
struct istream *input)
53
struct mail_stats_istream *mstream;
55
mstream = i_new(struct mail_stats_istream, 1);
57
mstream->istream.max_buffer_size = input->real_stream->max_buffer_size;
59
mstream->istream.parent = input;
60
mstream->istream.read = i_stream_mail_stats_read_mail_stats;
61
mstream->istream.seek = i_stream_mail_stats_seek;
62
mstream->istream.stat = i_stream_mail_stats_stat;
64
mstream->istream.istream.blocking = input->blocking;
65
mstream->istream.istream.seekable = input->seekable;
66
return i_stream_create(&mstream->istream, input,
67
i_stream_get_fd(input));