/* notmuch - Not much of an email program, (just index and search) * * Copyright © 2009 Carl Worth * Copyright © 2009 Jan Janak * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see http://www.gnu.org/licenses/ . * * Author: Jan Janak */ #include "notmuch-client.h" static void print_tags (notmuch_tags_t *tags) { const char *t; while ((t = notmuch_tags_get (tags))) { printf ("%s\n", t); notmuch_tags_advance (tags); } } int notmuch_search_tags_command (void *ctx, int argc, char *argv[]) { notmuch_messages_t *msgs; notmuch_tags_t *tags; notmuch_config_t *config; notmuch_database_t *db; notmuch_query_t *query; char *query_str; tags = NULL; config = NULL; db = NULL; query = NULL; if ((config = notmuch_config_open (ctx, NULL, NULL)) == NULL) { goto error; } db = notmuch_database_open (notmuch_config_get_database_path (config), NOTMUCH_DATABASE_MODE_READ_ONLY); if (db == NULL) { goto error; } if (argc > 0) { if ((query_str = query_string_from_args (ctx, argc, argv)) == NULL) { fprintf (stderr, "Out of memory.\n"); goto error; } if (*query_str == '\0') { fprintf (stderr, "Error: Invalid search string.\n"); goto error; } if ((query = notmuch_query_create (db, query_str)) == NULL) { fprintf (stderr, "Out of memory\n"); goto error; } msgs = notmuch_query_search_messages (query); if ((tags = notmuch_messages_collect_tags (msgs)) == NULL) goto error; } else { if ((tags = notmuch_database_get_all_tags (db)) == NULL) { fprintf (stderr, "Error while getting tags from the database.\n"); goto error; } } print_tags (tags); notmuch_tags_destroy (tags); if (query) notmuch_query_destroy (query); notmuch_database_close (db); return 0; error: if (tags) notmuch_tags_destroy (tags); if (query) notmuch_query_destroy (query); if (db) notmuch_database_close (db); return 1; } /* TODO: only take headers that match regexp? */ /* TODO: limit the max number of queries? */ void * notmuch_messages_print_headers (notmuch_messages_t *messages, const char *header) { notmuch_tags_t *tags, *msg_tags; notmuch_message_t *msg; GHashTable *htable; GList *keys, *l; const char *tag; const char *msg_header; htable = g_hash_table_new_full (g_str_hash, g_str_equal, free, NULL); while ((msg = notmuch_messages_get (messages))) { msg_header = notmuch_message_get_header (msg, header); g_hash_table_insert (htable, xstrdup (msg_header), NULL); notmuch_message_destroy (msg); notmuch_messages_advance (messages); } keys = g_hash_table_get_keys (htable); /* TODO: sort by alphabetical order? */ for (l = keys; l; l = l->next) { printf("%s\n", (char *)l->data); } g_list_free (keys); g_hash_table_destroy (htable); } int notmuch_search_headers_command (void *ctx, int argc, char *argv[]) { notmuch_messages_t *msgs; notmuch_tags_t *tags; notmuch_config_t *config; notmuch_database_t *db; notmuch_query_t *query; char *query_str; tags = NULL; config = NULL; db = NULL; query = NULL; if ((config = notmuch_config_open (ctx, NULL, NULL)) == NULL) { goto error; } db = notmuch_database_open (notmuch_config_get_database_path (config), NOTMUCH_DATABASE_MODE_READ_ONLY); if (db == NULL) { goto error; } if (argc < 3) { fprintf( stderr, "Wrong number of arguments\n"); fprintf( stderr, "Arguments:
\n"); goto error; } const char *header = argv[0]; const char *regexp = argv[1]; // Ignored for now. if(( query_str = query_string_from_args (ctx, argc-2, &argv[2])) == NULL) { fprintf (stderr, "Out of memory.\n"); goto error; } if (*query_str == '\0') { fprintf (stderr, "Error: Invalid search string.\n"); goto error; } if ((query = notmuch_query_create (db, query_str)) == NULL) { fprintf (stderr, "Out of memory\n"); goto error; } msgs = notmuch_query_search_messages (query); if ((notmuch_messages_print_headers (msgs, header)) == NULL) goto error; notmuch_query_destroy (query); notmuch_database_close (db); return 0; error: if (tags) notmuch_tags_destroy (tags); if (query) notmuch_query_destroy (query); if (db) notmuch_database_close (db); return 1; }