mail-cache-fields.c revision a75d470c9223a75801418fcdda258885c36317e0
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen/* Copyright (c) 2004-2012 Dovecot authors, see the included COPYING file */
01230de017cd273de41143d88e9c18df1243ae8aTimo Sirainen#define CACHE_FIELD_IS_NEWLY_WANTED(cache, field_idx) \
047c00cd3f7f403672f81569413669238df8c15aTimo Sirainen ((cache)->field_file_map[field_idx] == (uint32_t)-1 && \
cf0ad1a0bddb0787f3d7b408a96d721a8b2a98a3Timo Sirainenstatic bool field_has_fixed_size(enum mail_cache_field_type type)
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainenstatic bool field_decision_is_valid(enum mail_cache_decision_type type)
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainenstatic int field_type_verify(struct mail_cache *cache, unsigned int idx,
4d4d6d4745682790c20d759ba93dbea46b812c5dTimo Sirainen enum mail_cache_field_type type, unsigned int size)
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen const struct mail_cache_field *field = &cache->fields[idx].field;
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen "registered field %s type changed", field->name);
578ef2538ccf42e2a48234c24a8b709397101d88Timo Sirainen if (field->field_size != size && field_has_fixed_size(type)) {
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen "registered field %s size changed", field->name);
d5eb47a791ec56149fd711cd8e44efc8babeaae5Timo Sirainenmail_cache_field_update(struct mail_cache *cache,
e0740628f6ca05f4bc79a9d8a90b650f4d38d4d0Timo Sirainen i_assert(newfield->type < MAIL_CACHE_FIELD_COUNT);
3f603ef00e35fca21605afa0ad8d76e94fee2b96Timo Sirainen if (newfield->decision != MAIL_CACHE_DECISION_NO &&
86791365b10f45982c88e70f2eb94fd6c3fea151Timo Sirainen if (orig->field.last_used < newfield->last_used) {
6fdfa4d4cf14d1d7764d7faa8258f112e39c8dbeTimo Sirainenvoid mail_cache_register_fields(struct mail_cache *cache,
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen unsigned int new_idx;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen unsigned int i, j;
1ffb2afe6d7e8860a2231a4827078cf2ef9c22cdTimo Sirainen for (i = 0; i < fields_count; i++) {
1ffb2afe6d7e8860a2231a4827078cf2ef9c22cdTimo Sirainen if (hash_table_lookup_full(cache->field_name_hash,
0161376aac025266d8654577c4b9ce371ffc87eaTimo Sirainen fields[i].idx = POINTER_CAST_TO(value, unsigned int);
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen /* check if the same header is being registered in the
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen same field array */
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen for (j = 0; j < i; j++) {
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen if (strcasecmp(fields[i].name, fields[j].name) == 0) {
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen /* @UNSAFE */
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen cache->fields_count * sizeof(*cache->field_file_map),
275385a2ecc58e41dc7df3ce3cd943caaa58c4d1Timo Sirainen for (i = 0; i < fields_count; i++) {
db693bf6fcae96d834567f1782257517b7207655Timo Sirainen /* new index - save it */
db693bf6fcae96d834567f1782257517b7207655Timo Sirainen name = p_strdup(cache->field_pool, fields[i].name);
21e6b4fd844fd074583b17f09e1f27b9835ee238Timo Sirainen cache->fields[idx].field.last_used = fields[i].last_used;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen if (!field_has_fixed_size(cache->fields[idx].field.type))
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen cache->fields[idx].field.field_size = (unsigned int)-1;
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen hash_table_insert(cache->field_name_hash, name,
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainenmail_cache_register_lookup(struct mail_cache *cache, const char *name)
char *key;
void *value;
const struct mail_cache_field *
const struct mail_cache_field *
unsigned int *count_r)
return list;
unsigned int next_count = 0;
int ret;
*offset_r = 0;
offset = 0;
while (next_offset != 0) {
sizeof(*field_hdr)) < 0)
if (ret < 0) {
if (ret == 0) {
next_count++;
if (offset == 0) {
if (map) {
char *orig_key;
void *orig_value;
if (offset == 0) {
if (new_fields_count != 0) {
new_fields_count * sizeof(unsigned int));
decisions[i];
const void *data;
unsigned int i, field;
if (!add_new)
const int *data;
unsigned int i, field;
if (!add_new)
int ret = 0;
sizeof(uint32_t));
if (ret == 0) {
if (ret == 0) {
if (ret == 0)
return ret;
int ret;
T_BEGIN {
} T_END;
return ret;
T_BEGIN {
} T_END;
return ret;
unsigned int field;
const char *name;
uint32_t i;
sizeof(uint32_t));
sizeof(uint32_t));
if (*offset_r == 0) {