changeset 20518:bd0460a29b81

lib-fs: Added fs_metadata_init_or_clear() helper
author Timo Sirainen <timo.sirainen@dovecot.fi>
date Mon, 11 Jul 2016 16:13:28 +0300
parents c4a1368cd868
children 9caf75a53fdb
files src/lib-fs/fs-api-private.h src/lib-fs/fs-api.c
diffstat 2 files changed, 21 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-fs/fs-api-private.h	Mon Jul 11 14:18:36 2016 +0300
+++ b/src/lib-fs/fs-api-private.h	Mon Jul 11 16:13:28 2016 +0300
@@ -164,6 +164,7 @@
 ssize_t fs_read_via_stream(struct fs_file *file, void *buf, size_t size);
 int fs_write_via_stream(struct fs_file *file, const void *data, size_t size);
 void fs_metadata_init(struct fs_file *file);
+void fs_metadata_init_or_clear(struct fs_file *file);
 void fs_default_set_metadata(struct fs_file *file,
 			     const char *key, const char *value);
 int fs_default_copy(struct fs_file *src, struct fs_file *dest);
--- a/src/lib-fs/fs-api.c	Mon Jul 11 14:18:36 2016 +0300
+++ b/src/lib-fs/fs-api.c	Mon Jul 11 16:13:28 2016 +0300
@@ -288,11 +288,31 @@
 void fs_metadata_init(struct fs_file *file)
 {
 	if (file->metadata_pool == NULL) {
+		i_assert(!array_is_created(&file->metadata));
 		file->metadata_pool = pool_alloconly_create("fs metadata", 1024);
 		p_array_init(&file->metadata, file->metadata_pool, 8);
 	}
 }
 
+void fs_metadata_init_or_clear(struct fs_file *file)
+{
+	if (file->metadata_pool == NULL)
+		fs_metadata_init(file);
+	else T_BEGIN {
+		const struct fs_metadata *md;
+		ARRAY_TYPE(fs_metadata) internal_metadata;
+
+		t_array_init(&internal_metadata, 4);
+		array_foreach(&file->metadata, md) {
+			if (strncmp(md->key, FS_METADATA_INTERNAL_PREFIX,
+				    strlen(FS_METADATA_INTERNAL_PREFIX)) == 0)
+				array_append(&internal_metadata, md, 1);
+		}
+		array_clear(&file->metadata);
+		array_append_array(&file->metadata, &internal_metadata);
+	} T_END;
+}
+
 void fs_default_set_metadata(struct fs_file *file,
 			     const char *key, const char *value)
 {