mail-cache-fields.c revision 6157a322f2ac1ea1332d9003ecb0b11466aa8fe7
c25356d5978632df6203437e1953bcb29e0c736fTimo Sirainen/* Copyright (c) 2004-2007 Dovecot authors, see the included COPYING file */
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen#define CACHE_FIELD_IS_NEWLY_WANTED(cache, field_idx) \
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen ((cache)->field_file_map[field_idx] == (uint32_t)-1 && \
965ed6ea3fc8f7637bd0d159d2fdb283a191ce34Timo Sirainenstatic bool field_has_fixed_size(enum mail_cache_field_type type)
a399486f2d8d5bed51bc6344baba61a7f2b0dcdbTimo Sirainenstatic bool field_decision_is_valid(enum mail_cache_decision_type type)
965ed6ea3fc8f7637bd0d159d2fdb283a191ce34Timo Sirainenstatic int field_type_verify(struct mail_cache *cache, unsigned int idx,
e82af44fe25ca9b88210f313548dc08538e4a677Timo Sirainen enum mail_cache_field_type type, unsigned int size)
b567e0172c73dcf7642462e86962060358dd5f28Timo Sirainen const struct mail_cache_field *field = &cache->fields[idx].field;
f4a19b0cf11cdff437571708d9d788d02a906a00Timo Sirainen "registered field %s type changed", field->name);
10c5fd417af4ee30b68c967f5e7d5a49f4f149b5Timo Sirainen if (field->field_size != size && field_has_fixed_size(type)) {
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen "registered field %s size changed", field->name);
6ef7e31619edfaa17ed044b45861d106a86191efTimo Sirainenvoid mail_cache_register_fields(struct mail_cache *cache,
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen unsigned int new_idx;
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen unsigned int i, j;
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen for (i = 0; i < fields_count; i++) {
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen if (hash_lookup_full(cache->field_name_hash, fields[i].name,
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen i_assert(fields[i].type < MAIL_CACHE_FIELD_COUNT);
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen /* check if the same header is being registered in the
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen same field array */
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen for (j = 0; j < i; j++) {
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen if (strcasecmp(fields[i].name, fields[j].name) == 0) {
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen /* @UNSAFE */
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen cache->fields_count * sizeof(*cache->field_file_map),
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen for (i = 0; i < fields_count; i++) {
0a8926b91a84abf462afdc1ed95def229377d7ffTimo Sirainen /* new index - save it */
0a8926b91a84abf462afdc1ed95def229377d7ffTimo Sirainen name = p_strdup(cache->field_pool, fields[i].name);
0a8926b91a84abf462afdc1ed95def229377d7ffTimo Sirainen if (!field_has_fixed_size(cache->fields[idx].field.type))
0a8926b91a84abf462afdc1ed95def229377d7ffTimo Sirainen cache->fields[idx].field.field_size = (unsigned int)-1;
0a8926b91a84abf462afdc1ed95def229377d7ffTimo Sirainen hash_insert(cache->field_name_hash, name, POINTER_CAST(idx));
965ed6ea3fc8f7637bd0d159d2fdb283a191ce34Timo Sirainenmail_cache_register_lookup(struct mail_cache *cache, const char *name)
965ed6ea3fc8f7637bd0d159d2fdb283a191ce34Timo Sirainen if (hash_lookup_full(cache->field_name_hash, name,
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen return POINTER_CAST_TO(orig_value, unsigned int);
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen return (unsigned int)-1;
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainenmail_cache_register_get_list(struct mail_cache *cache, pool_t pool,
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen unsigned int *count_r)
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen unsigned int i;
965ed6ea3fc8f7637bd0d159d2fdb283a191ce34Timo Sirainen list = p_new(pool, struct mail_cache_field, cache->fields_count);
9f431ccfb6932746db56245c8a3d3415717ef545Timo Sirainenstatic int mail_cache_header_fields_get_offset(struct mail_cache *cache,
965ed6ea3fc8f7637bd0d159d2fdb283a191ce34Timo Sirainen const struct mail_cache_header_fields *field_hdr;
964c86de7158ccafdfe665853579d71232e2634eTimo Sirainen struct mail_cache_header_fields tmp_field_hdr;
965ed6ea3fc8f7637bd0d159d2fdb283a191ce34Timo Sirainen unsigned int next_count = 0;
4261a8b43792dc4db4b39e6910319835b7450e84Timo Sirainen /* find the latest header */
3c9783956dea385b322cd7fa6bf8c98c17a907a0Timo Sirainen next_offset = cache->last_field_header_offset != 0 ?
d1f0acc7fc722e13e8296228703adfe8a884d59eTimo Sirainen mail_index_offset_to_uint32(cache->hdr->field_header_offset);
4261a8b43792dc4db4b39e6910319835b7450e84Timo Sirainen while (next_offset != 0) {
0a8926b91a84abf462afdc1ed95def229377d7ffTimo Sirainen "next_offset in field header loops");
sizeof(*field_hdr)) < 0)
if (ret < 0) {
if (ret == 0) {
next_count++;
if (offset == 0) {
if (map) {
unsigned int new_fields_count;
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;
t_push();
sizeof(uint32_t));
if (ret == 0) {
if (ret == 0) {
t_pop();
if (ret == 0)
return ret;
int ret;
return ret;
unsigned int field;
const char *name;
uint32_t i;
sizeof(uint32_t));
sizeof(uint32_t));
if (*offset_r == 0) {