Mercurial > dovecot > core-2.2
changeset 18516:5f43c88e2c87
mail-storage: Moved mailbox attributes API to separate module.
author | Stephan Bosch <stephan@rename-it.nl> |
---|---|
date | Mon, 04 May 2015 19:53:53 +0300 |
parents | 6403ccd2f5f9 |
children | 986cbdfb887d |
files | src/lib-storage/Makefile.am src/lib-storage/mail-storage-private.h src/lib-storage/mail-storage.c src/lib-storage/mail-storage.h src/lib-storage/mailbox-attribute-private.h src/lib-storage/mailbox-attribute.c src/lib-storage/mailbox-attribute.h |
diffstat | 7 files changed, 202 insertions(+), 170 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib-storage/Makefile.am Mon May 04 19:15:10 2015 +0300 +++ b/src/lib-storage/Makefile.am Mon May 04 19:53:53 2015 +0300 @@ -43,6 +43,7 @@ mail-storage-settings.c \ mail-thread.c \ mail-user.c \ + mailbox-attribute.c \ mailbox-get.c \ mailbox-guid-cache.c \ mailbox-header.c \ @@ -70,6 +71,8 @@ mail-storage-service.h \ mail-storage-settings.h \ mail-user.h \ + mailbox-attribute.h \ + mailbox-attribute-private.h \ mailbox-guid-cache.h \ mailbox-list.h \ mailbox-list-iter.h \
--- a/src/lib-storage/mail-storage-private.h Mon May 04 19:15:10 2015 +0300 +++ b/src/lib-storage/mail-storage-private.h Mon May 04 19:53:53 2015 +0300 @@ -7,6 +7,7 @@ #include "mail-storage.h" #include "mail-storage-hooks.h" #include "mail-storage-settings.h" +#include "mailbox-attribute-private.h" #include "mail-index-private.h" /* Default prefix for indexes */ @@ -602,10 +603,6 @@ unsigned int *idx; }; -struct mailbox_attribute_iter { - struct mailbox *box; -}; - /* Modules should use do "my_id = mail_storage_module_id++" and use objects' module_contexts[id] for their own purposes. */ extern struct mail_storage_module_register mail_storage_module_register; @@ -678,9 +675,6 @@ unsigned int mail_storage_get_lock_timeout(struct mail_storage *storage, unsigned int secs); void mail_storage_free_binary_cache(struct mail_storage *storage); -int mailbox_attribute_value_to_string(struct mail_storage *storage, - const struct mail_attribute_value *value, - const char **str_r); enum mail_index_open_flags mail_storage_settings_to_index_flags(const struct mail_storage_settings *set);
--- a/src/lib-storage/mail-storage.c Mon May 04 19:15:10 2015 +0300 +++ b/src/lib-storage/mail-storage.c Mon May 04 19:53:53 2015 +0300 @@ -1633,103 +1633,6 @@ return 0; } -int mailbox_attribute_set(struct mailbox_transaction_context *t, - enum mail_attribute_type type, const char *key, - const struct mail_attribute_value *value) -{ - return t->box->v.attribute_set(t, type, key, value); -} - -int mailbox_attribute_unset(struct mailbox_transaction_context *t, - enum mail_attribute_type type, const char *key) -{ - struct mail_attribute_value value; - - memset(&value, 0, sizeof(value)); - return t->box->v.attribute_set(t, type, key, &value); -} - -int mailbox_attribute_value_to_string(struct mail_storage *storage, - const struct mail_attribute_value *value, - const char **str_r) -{ - string_t *str; - const unsigned char *data; - size_t size; - - if (value->value_stream == NULL) { - *str_r = value->value; - return 0; - } - str = t_str_new(128); - i_stream_seek(value->value_stream, 0); - while (i_stream_read_data(value->value_stream, &data, &size, 0) > 0) { - if (memchr(data, '\0', size) != NULL) { - mail_storage_set_error(storage, MAIL_ERROR_PARAMS, - "Attribute string value has NULs"); - return -1; - } - str_append_n(str, data, size); - i_stream_skip(value->value_stream, size); - } - if (value->value_stream->stream_errno != 0) { - mail_storage_set_critical(storage, "read(%s) failed: %s", - i_stream_get_name(value->value_stream), - i_stream_get_error(value->value_stream)); - return -1; - } - i_assert(value->value_stream->eof); - *str_r = str_c(str); - return 0; -} - -int mailbox_attribute_get(struct mailbox_transaction_context *t, - enum mail_attribute_type type, const char *key, - struct mail_attribute_value *value_r) -{ - int ret; - - memset(value_r, 0, sizeof(*value_r)); - if ((ret = t->box->v.attribute_get(t, type, key, value_r)) <= 0) - return ret; - i_assert(value_r->value != NULL); - return 1; -} - -int mailbox_attribute_get_stream(struct mailbox_transaction_context *t, - enum mail_attribute_type type, const char *key, - struct mail_attribute_value *value_r) -{ - int ret; - - memset(value_r, 0, sizeof(*value_r)); - value_r->flags |= MAIL_ATTRIBUTE_VALUE_FLAG_INT_STREAMS; - if ((ret = t->box->v.attribute_get(t, type, key, value_r)) <= 0) - return ret; - i_assert(value_r->value != NULL || value_r->value_stream != NULL); - return 1; -} - -struct mailbox_attribute_iter * -mailbox_attribute_iter_init(struct mailbox *box, enum mail_attribute_type type, - const char *prefix) -{ - return box->v.attribute_iter_init(box, type, prefix); -} - -const char *mailbox_attribute_iter_next(struct mailbox_attribute_iter *iter) -{ - return iter->box->v.attribute_iter_next(iter); -} - -int mailbox_attribute_iter_deinit(struct mailbox_attribute_iter **_iter) -{ - struct mailbox_attribute_iter *iter = *_iter; - - *_iter = NULL; - return iter->box->v.attribute_iter_deinit(iter); -} - struct mailbox_sync_context * mailbox_sync_init(struct mailbox *box, enum mailbox_sync_flags flags) {
--- a/src/lib-storage/mail-storage.h Mon May 04 19:15:10 2015 +0300 +++ b/src/lib-storage/mail-storage.h Mon May 04 19:53:53 2015 +0300 @@ -10,6 +10,7 @@ #include "mail-error.h" #include "mail-namespace.h" #include "mailbox-list.h" +#include "mailbox-attribute.h" /* If some operation is taking long, call notify_ok every n seconds. */ #define MAIL_STORAGE_STAYALIVE_SECS 15 @@ -205,42 +206,6 @@ MAILBOX_SYNC_TYPE_MODSEQ = 0x04 }; -/* RFC 5464 specifies that this is vendor/<vendor-token>/. The registered - vendor-tokens always begin with "vendor." so there's some redundancy.. */ -#define MAILBOX_ATTRIBUTE_PREFIX_DOVECOT "vendor/vendor.dovecot/" -/* Prefix used for attributes reserved for Dovecot's internal use. Normal - users cannot access these in any way. */ -#define MAILBOX_ATTRIBUTE_PREFIX_DOVECOT_PVT \ - MAILBOX_ATTRIBUTE_PREFIX_DOVECOT"pvt/" -/* Prefix used for server attributes in INBOX. INBOX deletion won't delete - any attributes under this prefix. */ -#define MAILBOX_ATTRIBUTE_PREFIX_DOVECOT_PVT_SERVER \ - MAILBOX_ATTRIBUTE_PREFIX_DOVECOT_PVT"server/" - -enum mail_attribute_type { - MAIL_ATTRIBUTE_TYPE_PRIVATE, - MAIL_ATTRIBUTE_TYPE_SHARED -}; -enum mail_attribute_value_flags { - MAIL_ATTRIBUTE_VALUE_FLAG_READONLY = 0x01, - MAIL_ATTRIBUTE_VALUE_FLAG_INT_STREAMS = 0x02 -}; - -struct mail_attribute_value { - /* mailbox_attribute_set() can set either value or value_stream. - mailbox_attribute_get() returns only values, but - mailbox_attribute_get_stream() may return either value or - value_stream. The caller must unreference the returned streams. */ - const char *value; - struct istream *value_stream; - - /* Last time the attribute was changed (0 = unknown). This may be - returned even for values that don't exist anymore. */ - time_t last_change; - - enum mail_attribute_value_flags flags; -}; - struct message_part; struct mail_namespace; struct mail_storage; @@ -583,36 +548,6 @@ (as opposed to flags shared between users). */ enum mail_flags mailbox_get_private_flags_mask(struct mailbox *box); -/* Set mailbox attribute key to value. The key should be compatible with - IMAP METADATA, so for Dovecot-specific keys use - MAILBOX_ATTRIBUTE_PREFIX_DOVECOT. */ -int mailbox_attribute_set(struct mailbox_transaction_context *t, - enum mail_attribute_type type, const char *key, - const struct mail_attribute_value *value); -/* Delete mailbox attribute key. This is just a wrapper to - mailbox_attribute_set() with value->value=NULL. */ -int mailbox_attribute_unset(struct mailbox_transaction_context *t, - enum mail_attribute_type type, const char *key); -/* Returns value for mailbox attribute key. Returns 1 if value was returned, - 0 if value wasn't found (set to NULL), -1 if error */ -int mailbox_attribute_get(struct mailbox_transaction_context *t, - enum mail_attribute_type type, const char *key, - struct mail_attribute_value *value_r); -/* Same as mailbox_attribute_get(), but the returned value may be either an - input stream or a string. */ -int mailbox_attribute_get_stream(struct mailbox_transaction_context *t, - enum mail_attribute_type type, const char *key, - struct mail_attribute_value *value_r); - -/* Iterate through mailbox attributes of the given type. The prefix can be used - to restrict what attributes are returned. */ -struct mailbox_attribute_iter * -mailbox_attribute_iter_init(struct mailbox *box, enum mail_attribute_type type, - const char *prefix); -/* Returns the attribute key or NULL if there are no more attributes. */ -const char *mailbox_attribute_iter_next(struct mailbox_attribute_iter *iter); -int mailbox_attribute_iter_deinit(struct mailbox_attribute_iter **iter); - /* Synchronize the mailbox. */ struct mailbox_sync_context * mailbox_sync_init(struct mailbox *box, enum mailbox_sync_flags flags);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/lib-storage/mailbox-attribute-private.h Mon May 04 19:53:53 2015 +0300 @@ -0,0 +1,12 @@ +#ifndef MAILBOX_ATTRIBUTE_PRIVATE_H +#define MAILBOX_ATTRIBUTE_PRIVATE_H + +struct mailbox_attribute_iter { + struct mailbox *box; +}; + +int mailbox_attribute_value_to_string(struct mail_storage *storage, + const struct mail_attribute_value *value, + const char **str_r); + +#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/lib-storage/mailbox-attribute.c Mon May 04 19:53:53 2015 +0300 @@ -0,0 +1,108 @@ +/* Copyright (c) 2003-2015 Dovecot authors, see the included COPYING file */ + +#include "lib.h" +#include "str.h" +#include "istream.h" +#include "mail-storage-private.h" + +/* + * Attribute API + */ + +int mailbox_attribute_set(struct mailbox_transaction_context *t, + enum mail_attribute_type type, const char *key, + const struct mail_attribute_value *value) +{ + return t->box->v.attribute_set(t, type, key, value); +} + +int mailbox_attribute_unset(struct mailbox_transaction_context *t, + enum mail_attribute_type type, const char *key) +{ + struct mail_attribute_value value; + + memset(&value, 0, sizeof(value)); + return t->box->v.attribute_set(t, type, key, &value); +} + +int mailbox_attribute_value_to_string(struct mail_storage *storage, + const struct mail_attribute_value *value, + const char **str_r) +{ + string_t *str; + const unsigned char *data; + size_t size; + + if (value->value_stream == NULL) { + *str_r = value->value; + return 0; + } + str = t_str_new(128); + i_stream_seek(value->value_stream, 0); + while (i_stream_read_data(value->value_stream, &data, &size, 0) > 0) { + if (memchr(data, '\0', size) != NULL) { + mail_storage_set_error(storage, MAIL_ERROR_PARAMS, + "Attribute string value has NULs"); + return -1; + } + str_append_n(str, data, size); + i_stream_skip(value->value_stream, size); + } + if (value->value_stream->stream_errno != 0) { + mail_storage_set_critical(storage, "read(%s) failed: %s", + i_stream_get_name(value->value_stream), + i_stream_get_error(value->value_stream)); + return -1; + } + i_assert(value->value_stream->eof); + *str_r = str_c(str); + return 0; +} + +int mailbox_attribute_get(struct mailbox_transaction_context *t, + enum mail_attribute_type type, const char *key, + struct mail_attribute_value *value_r) +{ + int ret; + + memset(value_r, 0, sizeof(*value_r)); + if ((ret = t->box->v.attribute_get(t, type, key, value_r)) <= 0) + return ret; + i_assert(value_r->value != NULL); + return 1; +} + +int mailbox_attribute_get_stream(struct mailbox_transaction_context *t, + enum mail_attribute_type type, const char *key, + struct mail_attribute_value *value_r) +{ + int ret; + + memset(value_r, 0, sizeof(*value_r)); + value_r->flags |= MAIL_ATTRIBUTE_VALUE_FLAG_INT_STREAMS; + if ((ret = t->box->v.attribute_get(t, type, key, value_r)) <= 0) + return ret; + i_assert(value_r->value != NULL || value_r->value_stream != NULL); + return 1; +} + +struct mailbox_attribute_iter * +mailbox_attribute_iter_init(struct mailbox *box, enum mail_attribute_type type, + const char *prefix) +{ + return box->v.attribute_iter_init(box, type, prefix); +} + +const char *mailbox_attribute_iter_next(struct mailbox_attribute_iter *iter) +{ + return iter->box->v.attribute_iter_next(iter); +} + +int mailbox_attribute_iter_deinit(struct mailbox_attribute_iter **_iter) +{ + struct mailbox_attribute_iter *iter = *_iter; + + *_iter = NULL; + return iter->box->v.attribute_iter_deinit(iter); +} +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/lib-storage/mailbox-attribute.h Mon May 04 19:53:53 2015 +0300 @@ -0,0 +1,77 @@ +#ifndef MAILBOX_ATTRIBUTE_H +#define MAILBOX_ATTRIBUTE_H + +struct mailbox; +struct mailbox_transaction_context; + +/* RFC 5464 specifies that this is vendor/<vendor-token>/. The registered + vendor-tokens always begin with "vendor." so there's some redundancy.. */ +#define MAILBOX_ATTRIBUTE_PREFIX_DOVECOT "vendor/vendor.dovecot/" +/* Prefix used for attributes reserved for Dovecot's internal use. Normal + users cannot access these in any way. */ +#define MAILBOX_ATTRIBUTE_PREFIX_DOVECOT_PVT \ + MAILBOX_ATTRIBUTE_PREFIX_DOVECOT"pvt/" +/* Prefix used for server attributes in INBOX. INBOX deletion won't delete + any attributes under this prefix. */ +#define MAILBOX_ATTRIBUTE_PREFIX_DOVECOT_PVT_SERVER \ + MAILBOX_ATTRIBUTE_PREFIX_DOVECOT_PVT"server/" + +enum mail_attribute_type { + MAIL_ATTRIBUTE_TYPE_PRIVATE, + MAIL_ATTRIBUTE_TYPE_SHARED +}; +enum mail_attribute_value_flags { + MAIL_ATTRIBUTE_VALUE_FLAG_READONLY = 0x01, + MAIL_ATTRIBUTE_VALUE_FLAG_INT_STREAMS = 0x02 +}; + +struct mail_attribute_value { + /* mailbox_attribute_set() can set either value or value_stream. + mailbox_attribute_get() returns only values, but + mailbox_attribute_get_stream() may return either value or + value_stream. The caller must unreference the returned streams. */ + const char *value; + struct istream *value_stream; + + /* Last time the attribute was changed (0 = unknown). This may be + returned even for values that don't exist anymore. */ + time_t last_change; + + enum mail_attribute_value_flags flags; +}; + +/* + * Attribute API + */ + +/* Set mailbox attribute key to value. The key should be compatible with + IMAP METADATA, so for Dovecot-specific keys use + MAILBOX_ATTRIBUTE_PREFIX_DOVECOT. */ +int mailbox_attribute_set(struct mailbox_transaction_context *t, + enum mail_attribute_type type, const char *key, + const struct mail_attribute_value *value); +/* Delete mailbox attribute key. This is just a wrapper to + mailbox_attribute_set() with value->value=NULL. */ +int mailbox_attribute_unset(struct mailbox_transaction_context *t, + enum mail_attribute_type type, const char *key); +/* Returns value for mailbox attribute key. Returns 1 if value was returned, + 0 if value wasn't found (set to NULL), -1 if error */ +int mailbox_attribute_get(struct mailbox_transaction_context *t, + enum mail_attribute_type type, const char *key, + struct mail_attribute_value *value_r); +/* Same as mailbox_attribute_get(), but the returned value may be either an + input stream or a string. */ +int mailbox_attribute_get_stream(struct mailbox_transaction_context *t, + enum mail_attribute_type type, const char *key, + struct mail_attribute_value *value_r); + +/* Iterate through mailbox attributes of the given type. The prefix can be used + to restrict what attributes are returned. */ +struct mailbox_attribute_iter * +mailbox_attribute_iter_init(struct mailbox *box, enum mail_attribute_type type, + const char *prefix); +/* Returns the attribute key or NULL if there are no more attributes. */ +const char *mailbox_attribute_iter_next(struct mailbox_attribute_iter *iter); +int mailbox_attribute_iter_deinit(struct mailbox_attribute_iter **iter); + +#endif