Mercurial > dovecot > original-hg > dovecot-1.2
diff src/lib-index/mail-cache-fields.c @ 6443:53313d1e7e4f HEAD
Code cleanups and some minor fixes.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Sat, 22 Sep 2007 11:42:58 +0300 |
parents | 65c69a53a7be |
children | c7742d109a67 |
line wrap: on
line diff
--- a/src/lib-index/mail-cache-fields.c Sat Sep 22 11:11:58 2007 +0300 +++ b/src/lib-index/mail-cache-fields.c Sat Sep 22 11:42:58 2007 +0300 @@ -11,6 +11,10 @@ #define CACHE_HDR_PREFETCH 1024 +#define CACHE_FIELD_IS_NEWLY_WANTED(cache, field_idx) \ + ((cache)->field_file_map[field_idx] == (uint32_t)-1 && \ + (cache)->fields[field_idx].used) + static bool field_has_fixed_size(enum mail_cache_field_type type) { switch (type) { @@ -340,53 +344,61 @@ return 0; } -static void copy_to_buf(struct mail_cache *cache, buffer_t *dest, +static void copy_to_buf(struct mail_cache *cache, buffer_t *dest, bool add_new, size_t offset, size_t size) { const void *data; unsigned int i, field; + /* copy the existing fields */ for (i = 0; i < cache->file_fields_count; i++) { field = cache->file_field_map[i]; data = CONST_PTR_OFFSET(&cache->fields[field], offset); buffer_append(dest, data, size); } + if (!add_new) + return; + + /* copy newly wanted fields */ for (i = 0; i < cache->fields_count; i++) { - if (cache->field_file_map[i] != (uint32_t)-1 || - !cache->fields[i].used) - continue; - data = CONST_PTR_OFFSET(&cache->fields[i], offset); - buffer_append(dest, data, size); + if (CACHE_FIELD_IS_NEWLY_WANTED(cache, i)) { + data = CONST_PTR_OFFSET(&cache->fields[i], offset); + buffer_append(dest, data, size); + } } } static void copy_to_buf_byte(struct mail_cache *cache, buffer_t *dest, - size_t offset) + bool add_new, size_t offset) { const int *data; unsigned int i, field; uint8_t byte; + /* copy the existing fields */ for (i = 0; i < cache->file_fields_count; i++) { field = cache->file_field_map[i]; data = CONST_PTR_OFFSET(&cache->fields[field], offset); byte = (uint8_t)*data; buffer_append(dest, &byte, 1); } + if (!add_new) + return; + + /* copy newly wanted fields */ for (i = 0; i < cache->fields_count; i++) { - if (cache->field_file_map[i] != (uint32_t)-1 || - !cache->fields[i].used) - continue; - data = CONST_PTR_OFFSET(&cache->fields[i], offset); - byte = (uint8_t)*data; - buffer_append(dest, &byte, 1); + if (CACHE_FIELD_IS_NEWLY_WANTED(cache, i)) { + data = CONST_PTR_OFFSET(&cache->fields[i], offset); + byte = (uint8_t)*data; + buffer_append(dest, &byte, 1); + } } } static int mail_cache_header_fields_update_locked(struct mail_cache *cache) { buffer_t *buffer; - uint32_t i, offset; + uint32_t i, offset, dec_offset; int ret = 0; if (mail_cache_header_fields_read(cache) < 0 || @@ -396,21 +408,20 @@ t_push(); buffer = buffer_create_dynamic(pool_datastack_create(), 256); - copy_to_buf(cache, buffer, + copy_to_buf(cache, buffer, FALSE, offsetof(struct mail_cache_field_private, last_used), sizeof(uint32_t)); - ret = mail_cache_write(cache, buffer->data, - sizeof(uint32_t) * cache->file_fields_count, + ret = mail_cache_write(cache, buffer->data, buffer->used, offset + MAIL_CACHE_FIELD_LAST_USED()); if (ret == 0) { buffer_set_used_size(buffer, 0); - copy_to_buf_byte(cache, buffer, + copy_to_buf_byte(cache, buffer, FALSE, offsetof(struct mail_cache_field, decision)); - ret = mail_cache_write(cache, buffer->data, - sizeof(uint8_t) * cache->file_fields_count, offset + - MAIL_CACHE_FIELD_DECISION(cache->file_fields_count)); - + dec_offset = offset + + MAIL_CACHE_FIELD_DECISION(cache->file_fields_count); + ret = mail_cache_write(cache, buffer->data, buffer->used, + dec_offset); if (ret == 0) { for (i = 0; i < cache->file_fields_count; i++) cache->fields[i].decision_dirty = FALSE; @@ -450,41 +461,41 @@ memset(&hdr, 0, sizeof(hdr)); hdr.fields_count = cache->file_fields_count; for (i = 0; i < cache->fields_count; i++) { - if (cache->field_file_map[i] == (uint32_t)-1 && - cache->fields[i].used) + if (CACHE_FIELD_IS_NEWLY_WANTED(cache, i)) hdr.fields_count++; } buffer_append(dest, &hdr, sizeof(hdr)); /* we have to keep the field order for the existing fields. */ - copy_to_buf(cache, dest, + copy_to_buf(cache, dest, TRUE, offsetof(struct mail_cache_field_private, last_used), sizeof(uint32_t)); - copy_to_buf(cache, dest, offsetof(struct mail_cache_field, field_size), + copy_to_buf(cache, dest, TRUE, + offsetof(struct mail_cache_field, field_size), sizeof(uint32_t)); - copy_to_buf_byte(cache, dest, offsetof(struct mail_cache_field, type)); - copy_to_buf_byte(cache, dest, + copy_to_buf_byte(cache, dest, TRUE, + offsetof(struct mail_cache_field, type)); + copy_to_buf_byte(cache, dest, TRUE, offsetof(struct mail_cache_field, decision)); - i_assert(buffer_get_used_size(dest) == sizeof(hdr) + + i_assert(dest->used == sizeof(hdr) + (sizeof(uint32_t)*2 + 2) * hdr.fields_count); - /* add fields' names */ + /* add existing fields' names */ for (i = 0; i < cache->file_fields_count; i++) { field = cache->file_field_map[i]; name = cache->fields[field].field.name; buffer_append(dest, name, strlen(name)+1); } + /* add newly wanted fields' names */ for (i = 0; i < cache->fields_count; i++) { - if (cache->field_file_map[i] != (uint32_t)-1 || - !cache->fields[i].used) - continue; - - name = cache->fields[i].field.name; - buffer_append(dest, name, strlen(name)+1); + if (CACHE_FIELD_IS_NEWLY_WANTED(cache, i)) { + name = cache->fields[i].field.name; + buffer_append(dest, name, strlen(name)+1); + } } - hdr.size = buffer_get_used_size(dest); + hdr.size = dest->used; buffer_write(dest, 0, &hdr, sizeof(hdr)); if ((hdr.size & 3) != 0)