/* Command to manually force a compression/dump of an index file * * This library is free software: you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library. If not, see . * */ #ifdef HAVE_CONFIG_H #include #endif #include #include #include #include #include #include #include #include #include #include "camel-object.h" #include "camel-text-index.h" extern gint camel_init (const gchar *certdb_dir, gboolean nss_init); G_GNUC_NORETURN static void do_usage (gchar *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 gint do_compress (gint argc, gchar **argv) { gint 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) { g_object_unref (idx); return 1; } g_object_unref (idx); } else { printf (" Failed: %s\n", g_strerror (errno)); return 1; } } return 0; } static gint do_dump (gint argc, gchar **argv) { gint 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); g_object_unref (idx); } else { printf (" Failed: %s\n", g_strerror (errno)); return 1; } } return 0; } static gint do_info (gint argc, gchar **argv) { gint 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); g_object_unref (idx); } else { printf (" Failed: %s\n", g_strerror (errno)); return 0; } } return 1; } static gint do_check (gint argc, gchar **argv) { gint 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); g_object_unref (idx); } else { printf (" Failed: %s\n", g_strerror (errno)); return 0; } } return 1; } static gint do_perf (gint argc, gchar **argv); gint main (gint argc, gchar **argv) { if (argc < 2) do_usage (argv[0]); 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 #include "camel-stream-null.h" #include "camel-stream-filter.h" #include "camel-mime-filter-index.h" #include "camel-stream-fs.h" static gint do_perf (gint argc, gchar **argv) { CamelIndex *idx; DIR *dir; const gchar *path = "/home/notzed/evolution/local/Inbox/mbox/cur"; struct dirent *d; CamelStream *null, *filter, *stream; CamelMimeFilter *filter_index; gchar *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"); closedir (dir); return 1; } null = camel_stream_null_new (); filter = camel_stream_filter_new (null); g_object_unref (null); filter_index = camel_mime_filter_index_new (idx); camel_stream_filter_add ((CamelStreamFilter *) filter, 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 ( CAMEL_MIME_FILTER_INDEX (filter_index), idn); name = g_strdup_printf ("%s/%s", path, d->d_name); stream = camel_stream_fs_new_with_name (name, O_RDONLY, 0, NULL); camel_stream_write_to_stream (stream, filter, NULL, NULL); g_object_unref (stream); g_free (name); camel_index_write_name (idx, idn); g_object_unref (idn); camel_mime_filter_index_set_name ( CAMEL_MIME_FILTER_INDEX (filter_index), NULL); } closedir (dir); camel_index_sync (idx); g_object_unref (idx); g_object_unref (filter); g_object_unref (filter_index); return 0; }