dovecot: Added mail_get_keyword_indexes()

dovecot at dovecot.org dovecot at dovecot.org
Sun Dec 9 19:59:07 EET 2007


details:   http://hg.dovecot.org/dovecot/rev/58b8daf695bf
changeset: 6985:58b8daf695bf
user:      Timo Sirainen <tss at iki.fi>
date:      Sun Dec 09 19:57:14 2007 +0200
description:
Added mail_get_keyword_indexes()

diffstat:

10 files changed, 39 insertions(+), 24 deletions(-)
src/lib-storage/index/cydir/cydir-mail.c     |    1 
src/lib-storage/index/dbox/dbox-mail.c       |    1 
src/lib-storage/index/index-mail.c           |   44 +++++++++++---------------
src/lib-storage/index/index-mail.h           |    3 +
src/lib-storage/index/maildir/maildir-mail.c |    1 
src/lib-storage/index/mbox/mbox-mail.c       |    1 
src/lib-storage/index/raw/raw-mail.c         |    1 
src/lib-storage/mail-storage-private.h       |    2 +
src/lib-storage/mail-storage.h               |    2 +
src/lib-storage/mail.c                       |    7 ++++

diffs (185 lines):

diff -r 45e07aee9aa2 -r 58b8daf695bf src/lib-storage/index/cydir/cydir-mail.c
--- a/src/lib-storage/index/cydir/cydir-mail.c	Sun Dec 09 19:56:45 2007 +0200
+++ b/src/lib-storage/index/cydir/cydir-mail.c	Sun Dec 09 19:57:14 2007 +0200
@@ -121,6 +121,7 @@ struct mail_vfuncs cydir_mail_vfuncs = {
 
 	index_mail_get_flags,
 	index_mail_get_keywords,
+	index_mail_get_keyword_indexes,
 	index_mail_get_parts,
 	index_mail_get_date,
 	cydir_mail_get_received_date,
diff -r 45e07aee9aa2 -r 58b8daf695bf src/lib-storage/index/dbox/dbox-mail.c
--- a/src/lib-storage/index/dbox/dbox-mail.c	Sun Dec 09 19:56:45 2007 +0200
+++ b/src/lib-storage/index/dbox/dbox-mail.c	Sun Dec 09 19:57:14 2007 +0200
@@ -208,6 +208,7 @@ struct mail_vfuncs dbox_mail_vfuncs = {
 
 	index_mail_get_flags,
 	index_mail_get_keywords,
+	index_mail_get_keyword_indexes,
 	index_mail_get_parts,
 	index_mail_get_date,
 	dbox_mail_get_received_date,
diff -r 45e07aee9aa2 -r 58b8daf695bf src/lib-storage/index/index-mail.c
--- a/src/lib-storage/index/index-mail.c	Sun Dec 09 19:56:45 2007 +0200
+++ b/src/lib-storage/index/index-mail.c	Sun Dec 09 19:57:14 2007 +0200
@@ -127,12 +127,10 @@ enum mail_flags index_mail_get_flags(str
 	return data->flags;
 }
 
-static const char *const *
-index_mail_get_keywords_real(struct index_mail *mail)
-{
-	static const char *const no_keywords[] = { NULL };
-	struct index_mail_data *data = &mail->data;
-	ARRAY_TYPE(keyword_indexes) keyword_indexes_arr;
+const char *const *index_mail_get_keywords(struct mail *_mail)
+{
+	struct index_mail *mail = (struct index_mail *)_mail;
+	struct index_mail_data *data = &mail->data;
 	const char *const *names;
 	const unsigned int *keyword_indexes;
 	unsigned int i, count, names_count;
@@ -140,16 +138,11 @@ index_mail_get_keywords_real(struct inde
 	if (array_is_created(&data->keywords))
 		return array_idx(&data->keywords, 0);
 
-	t_array_init(&keyword_indexes_arr, 128);
-	mail_index_lookup_keywords(mail->ibox->view, mail->data.seq,
-				   &keyword_indexes_arr);
-
-	keyword_indexes = array_get(&keyword_indexes_arr, &count);
-	if (count == 0)
-		return no_keywords;
-
+	(void)index_mail_get_keyword_indexes(_mail);
+
+	keyword_indexes = array_get(&data->keyword_indexes, &count);
 	names = array_get(mail->ibox->keyword_names, &names_count);
-	p_array_init(&data->keywords, mail->data_pool, count);
+	p_array_init(&data->keywords, mail->data_pool, count + 1);
 	for (i = 0; i < count; i++) {
 		const char *name;
 		i_assert(keyword_indexes[i] < names_count);
@@ -163,15 +156,18 @@ index_mail_get_keywords_real(struct inde
 	return array_idx(&data->keywords, 0);
 }
 
-const char *const *index_mail_get_keywords(struct mail *_mail)
-{
-	struct index_mail *mail = (struct index_mail *)_mail;
-	const char *const *ret;
-
-	T_FRAME(
-		ret = index_mail_get_keywords_real(mail);
-	);
-	return ret;
+const ARRAY_TYPE(keyword_indexes) *
+index_mail_get_keyword_indexes(struct mail *_mail)
+{
+	struct index_mail *mail = (struct index_mail *)_mail;
+	struct index_mail_data *data = &mail->data;
+
+	if (!array_is_created(&data->keyword_indexes)) {
+		p_array_init(&data->keyword_indexes, mail->data_pool, 32);
+		mail_index_lookup_keywords(mail->ibox->view, mail->data.seq,
+					   &data->keyword_indexes);
+	}
+	return &data->keyword_indexes;
 }
 
 int index_mail_get_parts(struct mail *_mail,
diff -r 45e07aee9aa2 -r 58b8daf695bf src/lib-storage/index/index-mail.h
--- a/src/lib-storage/index/index-mail.h	Sun Dec 09 19:56:45 2007 +0200
+++ b/src/lib-storage/index/index-mail.h	Sun Dec 09 19:57:14 2007 +0200
@@ -90,6 +90,7 @@ struct index_mail_data {
 	struct message_parser_ctx *parser_ctx;
 	int parsing_count;
 	ARRAY_TYPE(keywords) keywords;
+	ARRAY_TYPE(keyword_indexes) keyword_indexes;
 
 	unsigned int save_sent_date:1;
 	unsigned int sent_date_parsed:1;
@@ -167,6 +168,8 @@ int index_mail_get_header_stream(struct 
 
 enum mail_flags index_mail_get_flags(struct mail *_mail);
 const char *const *index_mail_get_keywords(struct mail *_mail);
+const ARRAY_TYPE(keyword_indexes) *
+index_mail_get_keyword_indexes(struct mail *_mail);
 int index_mail_get_parts(struct mail *_mail,
 			 const struct message_part **parts_r);
 int index_mail_get_received_date(struct mail *_mail, time_t *date_r);
diff -r 45e07aee9aa2 -r 58b8daf695bf src/lib-storage/index/maildir/maildir-mail.c
--- a/src/lib-storage/index/maildir/maildir-mail.c	Sun Dec 09 19:56:45 2007 +0200
+++ b/src/lib-storage/index/maildir/maildir-mail.c	Sun Dec 09 19:57:14 2007 +0200
@@ -419,6 +419,7 @@ struct mail_vfuncs maildir_mail_vfuncs =
 
 	index_mail_get_flags,
 	index_mail_get_keywords,
+	index_mail_get_keyword_indexes,
 	index_mail_get_parts,
 	index_mail_get_date,
 	maildir_mail_get_received_date,
diff -r 45e07aee9aa2 -r 58b8daf695bf src/lib-storage/index/mbox/mbox-mail.c
--- a/src/lib-storage/index/mbox/mbox-mail.c	Sun Dec 09 19:56:45 2007 +0200
+++ b/src/lib-storage/index/mbox/mbox-mail.c	Sun Dec 09 19:57:14 2007 +0200
@@ -271,6 +271,7 @@ struct mail_vfuncs mbox_mail_vfuncs = {
 
 	index_mail_get_flags,
 	index_mail_get_keywords,
+	index_mail_get_keyword_indexes,
 	index_mail_get_parts,
 	index_mail_get_date,
 	mbox_mail_get_received_date,
diff -r 45e07aee9aa2 -r 58b8daf695bf src/lib-storage/index/raw/raw-mail.c
--- a/src/lib-storage/index/raw/raw-mail.c	Sun Dec 09 19:56:45 2007 +0200
+++ b/src/lib-storage/index/raw/raw-mail.c	Sun Dec 09 19:57:14 2007 +0200
@@ -109,6 +109,7 @@ struct mail_vfuncs raw_mail_vfuncs = {
 
 	index_mail_get_flags,
 	index_mail_get_keywords,
+	index_mail_get_keyword_indexes,
 	index_mail_get_parts,
 	index_mail_get_date,
 	raw_mail_get_received_date,
diff -r 45e07aee9aa2 -r 58b8daf695bf src/lib-storage/mail-storage-private.h
--- a/src/lib-storage/mail-storage-private.h	Sun Dec 09 19:56:45 2007 +0200
+++ b/src/lib-storage/mail-storage-private.h	Sun Dec 09 19:57:14 2007 +0200
@@ -208,6 +208,8 @@ struct mail_vfuncs {
 
 	enum mail_flags (*get_flags)(struct mail *mail);
 	const char *const *(*get_keywords)(struct mail *mail);
+	const ARRAY_TYPE(keyword_indexes) *
+		(*get_keyword_indexes)(struct mail *mail);
 
 	int (*get_parts)(struct mail *mail,
 			 const struct message_part **parts_r);
diff -r 45e07aee9aa2 -r 58b8daf695bf src/lib-storage/mail-storage.h
--- a/src/lib-storage/mail-storage.h	Sun Dec 09 19:56:45 2007 +0200
+++ b/src/lib-storage/mail-storage.h	Sun Dec 09 19:57:14 2007 +0200
@@ -412,6 +412,8 @@ enum mail_flags mail_get_flags(struct ma
 enum mail_flags mail_get_flags(struct mail *mail);
 /* Returns message's keywords */
 const char *const *mail_get_keywords(struct mail *mail);
+/* Returns message's keywords */
+const ARRAY_TYPE(keyword_indexes) *mail_get_keyword_indexes(struct mail *mail);
 
 /* Returns message's MIME parts */
 int mail_get_parts(struct mail *mail, const struct message_part **parts_r);
diff -r 45e07aee9aa2 -r 58b8daf695bf src/lib-storage/mail.c
--- a/src/lib-storage/mail.c	Sun Dec 09 19:56:45 2007 +0200
+++ b/src/lib-storage/mail.c	Sun Dec 09 19:57:14 2007 +0200
@@ -45,6 +45,13 @@ const char *const *mail_get_keywords(str
 	struct mail_private *p = (struct mail_private *)mail;
 
 	return p->v.get_keywords(mail);
+}
+
+const ARRAY_TYPE(keyword_indexes) *mail_get_keyword_indexes(struct mail *mail)
+{
+	struct mail_private *p = (struct mail_private *)mail;
+
+	return p->v.get_keyword_indexes(mail);
 }
 
 int mail_get_parts(struct mail *mail, const struct message_part **parts_r)


More information about the dovecot-cvs mailing list