]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-index: Code cleanup: Removed mail_cache.data
authorTimo Sirainen <tss@iki.fi>
Thu, 18 Oct 2012 02:16:54 +0000 (05:16 +0300)
committerTimo Sirainen <tss@iki.fi>
Thu, 18 Oct 2012 02:16:54 +0000 (05:16 +0300)
src/lib-index/mail-cache-lookup.c
src/lib-index/mail-cache-private.h
src/lib-index/mail-cache.c

index 783a3d126c485dc415e09edcf4e2830cf0d05d43..0dea4e215455382de6ba84b948b4dd77a2151ac3 100644 (file)
@@ -272,6 +272,7 @@ int mail_cache_lookup_iter_next(struct mail_cache_lookup_iterate_ctx *ctx,
        field_r->field_idx = field_idx;
        field_r->data = CONST_PTR_OFFSET(ctx->rec, ctx->pos);
        field_r->size = data_size;
+       field_r->offset = ctx->offset + ctx->pos;
 
        /* each record begins from 32bit aligned position */
        ctx->pos += (data_size + sizeof(uint32_t)-1) & ~(sizeof(uint32_t)-1);
@@ -446,8 +447,7 @@ static void header_lines_save(struct header_lookup_context *ctx,
        lines_count = i;
 
        hdr_data = t_new(struct header_lookup_data, 1);
-       hdr_data->offset = (const char *)&lines[lines_count+1] -
-               (const char *)ctx->view->cache->data;
+       hdr_data->offset = field->offset + (lines_count+1) * sizeof(uint32_t);
        hdr_data->data_size = data_size;
 
        for (i = 0; i < lines_count; i++) {
@@ -473,6 +473,7 @@ mail_cache_lookup_headers_real(struct mail_cache_view *view, string_t *dest,
        struct mail_cache_iterate_field field;
        struct header_lookup_context ctx;
        struct header_lookup_line *lines;
+       const void *data;
        const unsigned char *p, *start, *end;
        uint8_t *field_state;
        unsigned int i, count, max_field = 0;
@@ -537,7 +538,10 @@ mail_cache_lookup_headers_real(struct mail_cache_view *view, string_t *dest,
 
        /* then start filling dest buffer from the headers */
        for (i = 0; i < count; i++) {
-               start = CONST_PTR_OFFSET(cache->data, lines[i].data->offset);
+               if (mail_cache_map(cache, lines[i].data->offset,
+                                  lines[i].data->data_size, &data) <= 0)
+                       return -1;
+               start = data;
                end = start + lines[i].data->data_size;
 
                /* find the end of the (multiline) header */
index 0f7e442fe1486eb10cc9ebe60289e57962240c08..2b96cb55b80abd0b9900fd955fa92e103158b30d 100644 (file)
 #define MAIL_CACHE_LOCK_TIMEOUT 10
 #define MAIL_CACHE_LOCK_CHANGE_TIMEOUT 300
 
-#define CACHE_RECORD(cache, offset) \
-       ((const struct mail_cache_record *) \
-        ((const char *) (cache)->data + offset))
-
 #define MAIL_CACHE_IS_UNUSABLE(cache) \
        ((cache)->hdr == NULL)
 
@@ -135,7 +131,6 @@ struct mail_cache {
        dev_t st_dev;
 
        void *mmap_base;
-       const void *data;
        size_t mmap_length;
        struct file_cache *file_cache;
        /* mail_cache_map() increases this always. */
@@ -203,8 +198,9 @@ struct mail_cache_view {
 
 struct mail_cache_iterate_field {
        unsigned int field_idx;
-       const void *data;
        unsigned int size;
+       const void *data;
+       uoff_t offset;
 };
 
 struct mail_cache_lookup_iterate_ctx {
index 70814a4ff98c98149fed4ca9b48ec173a1162ab5..1ea3d1402f12893d691215749bacd65266466ad6 100644 (file)
@@ -59,7 +59,6 @@ void mail_cache_file_close(struct mail_cache *cache)
                file_cache_set_fd(cache->file_cache, -1);
 
        cache->mmap_base = NULL;
-       cache->data = NULL;
        cache->hdr = NULL;
        cache->mmap_length = 0;
        cache->last_field_header_offset = 0;
@@ -214,10 +213,9 @@ static void mail_cache_update_need_compress(struct mail_cache *cache)
                cache->need_compress_file_seq = hdr->file_seq;
 }
 
-static bool mail_cache_verify_header(struct mail_cache *cache)
+static bool mail_cache_verify_header(struct mail_cache *cache,
+                                    const struct mail_cache_header *hdr)
 {
-       const struct mail_cache_header *hdr = cache->data;
-
        /* check that the header is still ok */
        if (cache->mmap_length < sizeof(struct mail_cache_header)) {
                mail_cache_set_corrupted(cache, "File too small");
@@ -278,7 +276,6 @@ int mail_cache_map(struct mail_cache *cache, size_t offset, size_t size,
                size = sizeof(struct mail_cache_header);
 
        if (cache->file_cache != NULL) {
-               cache->data = NULL;
                cache->hdr = NULL;
 
                ret = file_cache_read(cache->file_cache, offset, size);
@@ -295,26 +292,24 @@ int mail_cache_map(struct mail_cache *cache, size_t offset, size_t size,
                        return -1;
                }
 
-               cache->data = file_cache_get_map(cache->file_cache,
-                                                &cache->mmap_length);
+               data = file_cache_get_map(cache->file_cache,
+                                         &cache->mmap_length);
 
                if (offset == 0) {
-                       if (!mail_cache_verify_header(cache)) {
+                       if (!mail_cache_verify_header(cache, data)) {
                                cache->need_compress_file_seq =
                                        !MAIL_CACHE_IS_UNUSABLE(cache) &&
                                        cache->hdr->file_seq != 0 ?
                                        cache->hdr->file_seq : 0;
                                return -1;
                        }
-                       memcpy(&cache->hdr_ro_copy, cache->data,
+                       memcpy(&cache->hdr_ro_copy, data,
                               sizeof(cache->hdr_ro_copy));
                }
                cache->hdr = &cache->hdr_ro_copy;
                if (offset == 0)
                        mail_cache_update_need_compress(cache);
 
-               data = file_cache_get_map(cache->file_cache,
-                                         &cache->mmap_length);
                if (offset > cache->mmap_length) {
                        *data_r = NULL;
                        return 0;
@@ -350,13 +345,11 @@ int mail_cache_map(struct mail_cache *cache, size_t offset, size_t size,
        cache->mmap_base = mmap_ro_file(cache->fd, &cache->mmap_length);
        if (cache->mmap_base == MAP_FAILED) {
                cache->mmap_base = NULL;
-               cache->data = NULL;
                mail_cache_set_syscall_error(cache, "mmap()");
                return -1;
        }
-       cache->data = cache->mmap_base;
 
-       if (!mail_cache_verify_header(cache)) {
+       if (!mail_cache_verify_header(cache, cache->mmap_base)) {
                cache->need_compress_file_seq =
                        !MAIL_CACHE_IS_UNUSABLE(cache) &&
                        cache->hdr->file_seq != 0 ?
@@ -364,7 +357,7 @@ int mail_cache_map(struct mail_cache *cache, size_t offset, size_t size,
                return -1;
        }
 
-       cache->hdr = cache->data;
+       cache->hdr = cache->mmap_base;
        if (offset == 0)
                mail_cache_update_need_compress(cache);
        if (offset > cache->mmap_length) {
@@ -698,13 +691,8 @@ int mail_cache_write(struct mail_cache *cache, const void *data, size_t size,
                return -1;
        }
 
-       if (cache->file_cache != NULL) {
+       if (cache->file_cache != NULL)
                file_cache_write(cache->file_cache, data, size, offset);
-
-               /* data pointer may change if file cache was grown */
-               cache->data = file_cache_get_map(cache->file_cache,
-                                                &cache->mmap_length);
-       }
        return 0;
 }