From: Timo Sirainen Date: Mon, 13 Jul 2009 17:13:03 +0000 (-0400) Subject: Moved mail_index_seq_array_*() to mail-index-util.c and added its own .h file. X-Git-Tag: 2.0.alpha1~440 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=bc397dfcbe6e22aa1ca2e15a9f3cd42f39e2ec4e;p=thirdparty%2Fdovecot%2Fcore.git Moved mail_index_seq_array_*() to mail-index-util.c and added its own .h file. --HG-- branch : HEAD --- diff --git a/src/lib-index/Makefile.am b/src/lib-index/Makefile.am index 476e895f55..156924f60f 100644 --- a/src/lib-index/Makefile.am +++ b/src/lib-index/Makefile.am @@ -51,6 +51,7 @@ headers = \ mail-index-strmap.h \ mail-index-sync-private.h \ mail-index-transaction-private.h \ + mail-index-util.h \ mail-index-view-private.h \ mail-transaction-log.h \ mail-transaction-log-private.h \ diff --git a/src/lib-index/mail-index-private.h b/src/lib-index/mail-index-private.h index 8395db0829..9904523eac 100644 --- a/src/lib-index/mail-index-private.h +++ b/src/lib-index/mail-index-private.h @@ -3,6 +3,7 @@ #include "file-lock.h" #include "mail-index.h" +#include "mail-index-util.h" #include "mail-index-view-private.h" #include "mail-index-transaction-private.h" @@ -51,8 +52,6 @@ typedef int mail_index_sync_handler_t(struct mail_index_sync_map_ctx *ctx, const void *new_data, void **context); typedef void mail_index_sync_lost_handler_t(struct mail_index *index); -ARRAY_DEFINE_TYPE(seq_array, uint32_t); - #define MAIL_INDEX_HEADER_SIZE_ALIGN(size) \ (((size) + 7) & ~7) @@ -353,12 +352,4 @@ int mail_index_file_set_syscall_error(struct mail_index *index, const char *filepath, const char *function); -uint32_t mail_index_uint32_to_offset(uint32_t offset); -uint32_t mail_index_offset_to_uint32(uint32_t offset); - -#define MAIL_INDEX_PACK_MAX_SIZE ((sizeof(uint32_t) * 8 + 7) / 7) -void mail_index_pack_num(uint8_t **p, uint32_t num); -int mail_index_unpack_num(const uint8_t **p, const uint8_t *end, - uint32_t *num_r); - #endif diff --git a/src/lib-index/mail-index-transaction-private.h b/src/lib-index/mail-index-transaction-private.h index 64cd8f8769..b7b0af6ab4 100644 --- a/src/lib-index/mail-index-transaction-private.h +++ b/src/lib-index/mail-index-transaction-private.h @@ -111,12 +111,6 @@ mail_index_transaction_get_flag_update_pos(struct mail_index_transaction *t, unsigned int right_idx, uint32_t seq); -bool mail_index_seq_array_lookup(const ARRAY_TYPE(seq_array) *array, - uint32_t seq, unsigned int *idx_r); -bool mail_index_seq_array_add(ARRAY_TYPE(seq_array) *array, uint32_t seq, - const void *record, size_t record_size, - void *old_record); - int mail_index_transaction_finish(struct mail_index_transaction *t); void mail_index_transaction_export(struct mail_index_transaction *t, struct mail_transaction_log_append_ctx *append_ctx); diff --git a/src/lib-index/mail-index-transaction.c b/src/lib-index/mail-index-transaction.c index 72d8d311b2..6542a4eea3 100644 --- a/src/lib-index/mail-index-transaction.c +++ b/src/lib-index/mail-index-transaction.c @@ -143,61 +143,6 @@ void mail_index_transaction_unref(struct mail_index_transaction **_t) mail_index_transaction_free(t); } -static int mail_index_seq_record_cmp(const void *key, const void *data) -{ - const uint32_t *seq_p = key; - const uint32_t *data_seq = data; - - return *seq_p - *data_seq; -} - -bool mail_index_seq_array_lookup(const ARRAY_TYPE(seq_array) *array, - uint32_t seq, unsigned int *idx_r) -{ - const void *base; - unsigned int count; - - base = array_get(array, &count); - return bsearch_insert_pos(&seq, base, count, array->arr.element_size, - mail_index_seq_record_cmp, idx_r); -} - -bool mail_index_seq_array_add(ARRAY_TYPE(seq_array) *array, uint32_t seq, - const void *record, size_t record_size, - void *old_record) -{ - void *p; - unsigned int idx, aligned_record_size; - - /* records need to be 32bit aligned */ - aligned_record_size = (record_size + 3) & ~3; - - if (!array_is_created(array)) { - array_create(array, default_pool, - sizeof(seq) + aligned_record_size, - 1024 / (sizeof(seq) + aligned_record_size)); - } - i_assert(array->arr.element_size == sizeof(seq) + aligned_record_size); - - if (mail_index_seq_array_lookup(array, seq, &idx)) { - /* already there, update */ - p = array_idx_modifiable(array, idx); - if (old_record != NULL) { - /* save the old record before overwriting it */ - memcpy(old_record, PTR_OFFSET(p, sizeof(seq)), - record_size); - } - memcpy(PTR_OFFSET(p, sizeof(seq)), record, record_size); - return TRUE; - } else { - /* insert */ - p = array_insert_space(array, idx); - memcpy(p, &seq, sizeof(seq)); - memcpy(PTR_OFFSET(p, sizeof(seq)), record, record_size); - return FALSE; - } -} - uint32_t mail_index_transaction_get_next_uid(struct mail_index_transaction *t) { const struct mail_index_header *head_hdr, *hdr; diff --git a/src/lib-index/mail-index-util.c b/src/lib-index/mail-index-util.c index 2dcaa6b57a..6a61fef412 100644 --- a/src/lib-index/mail-index-util.c +++ b/src/lib-index/mail-index-util.c @@ -1,6 +1,8 @@ /* Copyright (c) 2003-2009 Dovecot authors, see the included COPYING file */ #include "lib.h" +#include "array.h" +#include "bsearch-insert-pos.h" #include "mail-index-private.h" #if WORDS_BIGENDIAN @@ -100,3 +102,58 @@ int mail_index_unpack_num(const uint8_t **p, const uint8_t *end, *num_r = value; return 0; } + +static int mail_index_seq_record_cmp(const void *key, const void *data) +{ + const uint32_t *seq_p = key; + const uint32_t *data_seq = data; + + return *seq_p - *data_seq; +} + +bool mail_index_seq_array_lookup(const ARRAY_TYPE(seq_array) *array, + uint32_t seq, unsigned int *idx_r) +{ + const void *base; + unsigned int count; + + base = array_get(array, &count); + return bsearch_insert_pos(&seq, base, count, array->arr.element_size, + mail_index_seq_record_cmp, idx_r); +} + +bool mail_index_seq_array_add(ARRAY_TYPE(seq_array) *array, uint32_t seq, + const void *record, size_t record_size, + void *old_record) +{ + void *p; + unsigned int idx, aligned_record_size; + + /* records need to be 32bit aligned */ + aligned_record_size = (record_size + 3) & ~3; + + if (!array_is_created(array)) { + array_create(array, default_pool, + sizeof(seq) + aligned_record_size, + 1024 / (sizeof(seq) + aligned_record_size)); + } + i_assert(array->arr.element_size == sizeof(seq) + aligned_record_size); + + if (mail_index_seq_array_lookup(array, seq, &idx)) { + /* already there, update */ + p = array_idx_modifiable(array, idx); + if (old_record != NULL) { + /* save the old record before overwriting it */ + memcpy(old_record, PTR_OFFSET(p, sizeof(seq)), + record_size); + } + memcpy(PTR_OFFSET(p, sizeof(seq)), record, record_size); + return TRUE; + } else { + /* insert */ + p = array_insert_space(array, idx); + memcpy(p, &seq, sizeof(seq)); + memcpy(PTR_OFFSET(p, sizeof(seq)), record, record_size); + return FALSE; + } +} diff --git a/src/lib-index/mail-index-util.h b/src/lib-index/mail-index-util.h new file mode 100644 index 0000000000..5b4b0c9b5b --- /dev/null +++ b/src/lib-index/mail-index-util.h @@ -0,0 +1,20 @@ +#ifndef MAIL_INDEX_UTIL_H +#define MAIL_INDEX_UTIL_H + +ARRAY_DEFINE_TYPE(seq_array, uint32_t); + +uint32_t mail_index_uint32_to_offset(uint32_t offset); +uint32_t mail_index_offset_to_uint32(uint32_t offset); + +#define MAIL_INDEX_PACK_MAX_SIZE ((sizeof(uint32_t) * 8 + 7) / 7) +void mail_index_pack_num(uint8_t **p, uint32_t num); +int mail_index_unpack_num(const uint8_t **p, const uint8_t *end, + uint32_t *num_r); + +bool mail_index_seq_array_lookup(const ARRAY_TYPE(seq_array) *array, + uint32_t seq, unsigned int *idx_r); +bool mail_index_seq_array_add(ARRAY_TYPE(seq_array) *array, uint32_t seq, + const void *record, size_t record_size, + void *old_record); + +#endif