diff src/lib-index/mail-index.c @ 2853:512dd7d76cdc HEAD

Removed cache_offset from mail_index_record and changed it to use extension instead. Added possibility to register sync and expunge handlers for extensions. Changed the way extension resets work: all extension updates which were committed without having seen the reset are ignored.
author Timo Sirainen <tss@iki.fi>
date Sat, 06 Nov 2004 19:20:18 +0200
parents 645b8442b519
children b4a46746eb52
line wrap: on
line diff
--- a/src/lib-index/mail-index.c	Fri Nov 05 17:36:38 2004 +0200
+++ b/src/lib-index/mail-index.c	Sat Nov 06 19:20:18 2004 +0200
@@ -27,6 +27,8 @@
 
 	index->extension_pool = pool_alloconly_create("extension", 256);
 	index->extensions = buffer_create_dynamic(index->extension_pool, 64);
+        index->sync_handlers = buffer_create_dynamic(default_pool, 32);
+        index->expunge_handlers = buffer_create_dynamic(default_pool, 32);
 
 	index->mode = 0600;
 	index->gid = (gid_t)-1;
@@ -38,6 +40,9 @@
 	mail_index_close(index);
 	pool_unref(index->extension_pool);
 
+	buffer_free(index->sync_handlers);
+	buffer_free(index->expunge_handlers);
+
 	i_free(index->error);
 	i_free(index->dir);
 	i_free(index->prefix);
@@ -64,6 +69,9 @@
 	extensions = buffer_get_data(index->extensions, &ext_count);
 	ext_count /= sizeof(*extensions);
 
+	i_assert(index->sync_handlers->used /
+		 sizeof(mail_index_sync_handler_t *) == ext_count);
+
 	/* see if it's already there */
 	for (i = 0; i < ext_count; i++) {
 		if (strcmp(extensions[i].name, name) == 0)
@@ -77,9 +85,26 @@
 	ext.record_align = default_record_align;
 
 	buffer_append(index->extensions, &ext, sizeof(ext));
+	buffer_append_zero(index->sync_handlers,
+			   sizeof(mail_index_sync_handler_t *));
 	return ext_count;
 }
 
+void mail_index_register_expunge_handler(struct mail_index *index,
+					 uint32_t ext_id,
+					 mail_index_expunge_handler_t *cb)
+{
+	buffer_write(index->expunge_handlers, ext_id * sizeof(cb),
+		     &cb, sizeof(cb));
+}
+
+void mail_index_register_sync_handler(struct mail_index *index, uint32_t ext_id,
+				      mail_index_sync_handler_t *cb)
+{
+	buffer_write(index->sync_handlers, ext_id * sizeof(cb),
+		     &cb, sizeof(cb));
+}
+
 static void mail_index_map_init_extbufs(struct mail_index_map *map,
 					unsigned int initial_count)
 {
@@ -125,7 +150,7 @@
 			    struct mail_index_map *map, const char *name,
 			    uint32_t hdr_offset, uint32_t hdr_size,
 			    uint32_t record_offset, uint32_t record_size,
-			    uint32_t record_align)
+			    uint32_t record_align, uint32_t reset_id)
 {
 	struct mail_index_ext *ext;
 	uint32_t idx, ext_id;
@@ -146,6 +171,7 @@
 	ext->record_offset = record_offset;
 	ext->record_size = record_size;
 	ext->record_align = record_align;
+	ext->reset_id = reset_id;
 
 	ext_id = mail_index_ext_register(index, name, hdr_size,
 					 record_size, record_align);
@@ -216,7 +242,8 @@
 					    offset, ext_hdr->hdr_size,
 					    ext_hdr->record_offset,
 					    ext_hdr->record_size,
-					    ext_hdr->record_align);
+					    ext_hdr->record_align,
+					    ext_hdr->reset_id);
 		t_pop();
 
 		offset += MAIL_INDEX_HEADER_SIZE_ALIGN(ext_hdr->hdr_size);
@@ -577,8 +604,15 @@
 		ret = mail_index_map_try_existing(index->map);
 		if (ret != 0)
 			return ret;
+
+		if (index->lock_type == F_WRLCK) {
+			/* we're syncing, don't break the mapping */
+			return 1;
+		}
 	}
 
+	i_assert(index->lock_type != F_WRLCK);
+
 	if (index->map != NULL && index->map->refcount > 1) {
 		/* this map is already used by some views and they may have
 		   pointers into it. leave them and create a new mapping. */