changeset 10327:4267c30ded97 HEAD

Delay initializing mailbox changelog index, so mbox has time to override its path.
author Timo Sirainen <tss@iki.fi>
date Fri, 13 Nov 2009 20:54:50 -0500
parents 38941d54ec5d
children b63fd6156663
files src/lib-storage/mailbox-list.c
diffstat 1 files changed, 22 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-storage/mailbox-list.c	Fri Nov 13 20:52:06 2009 -0500
+++ b/src/lib-storage/mailbox-list.c	Fri Nov 13 20:54:50 2009 -0500
@@ -101,7 +101,6 @@
 {
 	const struct mailbox_list *const *class_p;
 	struct mailbox_list *list;
-	const char *path;
 	unsigned int idx;
 
 	i_assert(ns->list == NULL);
@@ -167,15 +166,8 @@
 			list->set.inbox_path == NULL ?
 			"" : list->set.inbox_path);
 	}
-
 	mail_namespace_finish_list_init(ns, list);
 
-	path = mailbox_list_get_path(list, NULL, MAILBOX_LIST_PATH_TYPE_INDEX);
-	if (path != NULL) {
-		path = t_strconcat(path, "/"MAILBOX_LOG_FILE_NAME, NULL);
-		list->changelog = mailbox_log_alloc(path);
-	}
-
 	if (hook_mailbox_list_created != NULL)
 		hook_mailbox_list_created(list);
 	return 0;
@@ -684,13 +676,33 @@
 					flags_r);
 }
 
+static bool mailbox_list_init_changelog(struct mailbox_list *list)
+{
+	const char *path;
+
+	if (list->changelog != NULL)
+		return TRUE;
+
+	/* don't do this in mailbox_list_create(), because _get_path() might be
+	   overridden by storage (mbox). */
+	path = mailbox_list_get_path(list, NULL, MAILBOX_LIST_PATH_TYPE_INDEX);
+	if (path == NULL)
+		return FALSE;
+	else {
+		path = t_strconcat(path, "/"MAILBOX_LOG_FILE_NAME, NULL);
+		list->changelog = mailbox_log_alloc(path);
+		return TRUE;
+	}
+}
+
 void mailbox_list_add_change(struct mailbox_list *list,
 			     enum mailbox_log_record_type type,
 			     const uint8_t mailbox_guid[MAIL_GUID_128_SIZE])
 {
 	struct mailbox_log_record rec;
 
-	if (list->changelog == NULL || mail_guid_128_is_empty(mailbox_guid))
+	if (!mailbox_list_init_changelog(list) ||
+	    mail_guid_128_is_empty(mailbox_guid))
 		return;
 
 	memset(&rec, 0, sizeof(rec));
@@ -906,7 +918,7 @@
 
 struct mailbox_log *mailbox_list_get_changelog(struct mailbox_list *list)
 {
-	return list->changelog;
+	return !mailbox_list_init_changelog(list) ? NULL : list->changelog;
 }
 
 static int mailbox_list_try_delete(struct mailbox_list *list, const char *dir)