/* Command to manually force a compression/dump of an index file */

#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

#include <ctype.h>
#include <sys/stat.h>
#include <sys/uio.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

#include "e-util/e-msgport.h"
#include "e-util/e-memory.h"

#include "camel/camel-object.h"

#include "camel-text-index.h"

#include <stdio.h>

static void
do_usage(char *argv0)
{
	fprintf(stderr, "Usage: %s [ compress | dump | info ] file(s) ...\n", argv0);
	fprintf(stderr, " compress - compress (an) index file(s)\n");
	fprintf(stderr, " dump - dump (an) index file's content to stdout\n");
	fprintf(stderr, " info - dump summary info to stdout\n");
	exit(1);
}

static int
do_compress(int argc, char **argv)
{
	int i;
	CamelIndex *idx;

	for (i=2;i<argc;i++) {
		printf("Opening index file: %s\n", argv[i]);
		idx = (CamelIndex *)camel_text_index_new(argv[i], O_RDWR);
		if (idx) {
			printf(" Compressing ...\n");
			if (camel_index_compress(idx) == -1) {
				camel_object_unref((CamelObject *)idx);
				return 1;
			}
			camel_object_unref((CamelObject *)idx);
		} else {
			printf(" Failed: %s\n", strerror(errno));
			return 1;
		}
	}
	return 0;
}

static int
do_dump(int argc, char **argv)
{
	int i;
	CamelIndex *idx;

	for (i=2;i<argc;i++) {
		printf("Opening index file: %s\n", argv[i]);
		idx = (CamelIndex *)camel_text_index_new(argv[i], O_RDONLY);
		if (idx) {
			printf(" Dumping ...\n");
			camel_text_index_dump((CamelTextIndex *)idx);
			camel_object_unref((CamelObject *)idx);
		} else {
			printf(" Failed: %s\n", strerror(errno));
			return 1;
		}
	}
	return 0;
}

static int
do_info(int argc, char **argv)
{
	int i;
	CamelIndex *idx;

	for (i=2;i<argc;i++) {
		printf("Opening index file: %s\n", argv[i]);
		idx = (CamelIndex *)camel_text_index_new(argv[i], O_RDONLY);
		if (idx) {
			camel_text_index_info((CamelTextIndex *)idx);
			camel_object_unref((CamelObject *)idx);
		} else {
			printf(" Failed: %s\n", strerror(errno));
			return 0;
		}
	}
	return 1;
}

static int
do_check(int argc, char **argv)
{
	int i;
	CamelIndex *idx;

	for (i=2;i<argc;i++) {
		printf("Opening index file: %s\n", argv[i]);
		idx = (CamelIndex *)camel_text_index_new(argv[i], O_RDONLY);
		if (idx) {
			camel_text_index_validate((CamelTextIndex *)idx);
			camel_object_unref((CamelObject *)idx);
		} else {
			printf(" Failed: %s\n", strerror(errno));
			return 0;
		}
	}
	return 1;
}

static int do_perf(int argc, char **argv);

int main(int argc, char **argv)
{
	if (argc<2)
		do_usage(argv[0]);

	g_thread_init(NULL);
	camel_init(NULL, 0);

	if (!strcmp(argv[1], "compress"))
		return do_compress(argc, argv);
	else if (!strcmp(argv[1], "dump"))
		return do_dump(argc, argv);
	else if (!strcmp(argv[1], "info"))
		return do_info(argc, argv);
	else if (!strcmp(argv[1], "check"))
		return do_check(argc, argv);
	else if (!strcmp(argv[1], "perf"))
		return do_perf(argc, argv);

	do_usage(argv[0]);
	return 1;
}

#include <sys/types.h>
#include <dirent.h>
#include "camel-stream-null.h"
#include "camel-stream-filter.h"
#include "camel-mime-filter-index.h"
#include "camel-stream-fs.h"

static int
do_perf(int argc, char **argv)
{
	CamelIndex *idx;
	DIR *dir;
	char *path = "/home/notzed/evolution/local/Inbox/mbox/cur";
	struct dirent *d;
	CamelStream *null, *filter, *stream;
	CamelMimeFilterIndex *filter_index;
	char *name;
	CamelIndexName *idn;

	dir = opendir(path);
	if (dir == NULL) {
		perror("open dir");
		return 1;
	}

	idx = (CamelIndex *)camel_text_index_new("/tmp/index", O_TRUNC|O_CREAT|O_RDWR);
	if (idx == NULL) {
		perror("open index");
		return 1;
	}

	null = camel_stream_null_new();
	filter = (CamelStream *)camel_stream_filter_new_with_stream(null);
	camel_object_unref((CamelObject *)null);
	filter_index = camel_mime_filter_index_new_index(idx);
	camel_stream_filter_add((CamelStreamFilter *)filter, (CamelMimeFilter *)filter_index);

	while ((d = readdir(dir))) {
		printf("indexing '%s'\n", d->d_name);

		idn = camel_index_add_name(idx, d->d_name);
		camel_mime_filter_index_set_name(filter_index, idn);
		name = g_strdup_printf("%s/%s", path, d->d_name);
		stream = camel_stream_fs_new_with_name(name, O_RDONLY, 0);
		camel_stream_write_to_stream(stream, filter);
		camel_object_unref((CamelObject *)stream);
		g_free(name);

		camel_index_write_name(idx, idn);
		camel_object_unref((CamelObject *)idn);
		camel_mime_filter_index_set_name(filter_index, NULL);
	}

	closedir(dir);

	camel_index_sync(idx);
	camel_object_unref((CamelObject *)idx);

	camel_object_unref((CamelObject *)filter);
	camel_object_unref((CamelObject *)filter_index);

	return 0;
}