static void apply_exclude_tags(notmuch_query_t *query) { char *buf, *p, *end = NULL, *tag = NULL; if (!NotmuchExcludeTags || !*NotmuchExcludeTags) return; buf = safe_strdup(NotmuchExcludeTags); for (p = buf; p && *p; p++) { if (!tag && isspace(*p)) continue; if (!tag) tag = p; /* begin of the tag */ if (*p == ',' || *p == ' ') end = p; /* terminate the tag */ else if (*(p + 1) == '\0') end = p + 1; /* end of optstr */ if (!tag || !end) continue; if (tag >= end) break; *end = '\0'; dprint(2, (debugfile, "nm: query exclude tag '%s'\n", tag)); notmuch_query_add_tag_exclude(query, tag); end = tag = NULL; } notmuch_query_set_omit_excluded(query, 1); FREE(&buf); }
static int print_count (notmuch_database_t *notmuch, const char *query_str, const char **exclude_tags, size_t exclude_tags_length, int output) { notmuch_query_t *query; size_t i; query = notmuch_query_create (notmuch, query_str); if (query == NULL) { fprintf (stderr, "Out of memory\n"); return 1; } for (i = 0; i < exclude_tags_length; i++) notmuch_query_add_tag_exclude (query, exclude_tags[i]); switch (output) { case OUTPUT_MESSAGES: printf ("%u\n", notmuch_query_count_messages (query)); break; case OUTPUT_THREADS: printf ("%u\n", notmuch_query_count_threads (query)); break; } notmuch_query_destroy (query); return 0; }
/* return 0 on success, -1 on failure */ static int print_count (notmuch_database_t *notmuch, const char *query_str, const char **exclude_tags, size_t exclude_tags_length, int output, int print_lastmod) { notmuch_query_t *query; size_t i; int count; unsigned int ucount; unsigned long revision; const char *uuid; int ret = 0; notmuch_status_t status; query = notmuch_query_create (notmuch, query_str); if (query == NULL) { fprintf (stderr, "Out of memory\n"); return -1; } for (i = 0; i < exclude_tags_length; i++) notmuch_query_add_tag_exclude (query, exclude_tags[i]); switch (output) { case OUTPUT_MESSAGES: status = notmuch_query_count_messages_st (query, &ucount); if (print_status_query ("notmuch count", query, status)) return -1; printf ("%u", ucount); break; case OUTPUT_THREADS: status = notmuch_query_count_threads_st (query, &ucount); if (print_status_query ("notmuch count", query, status)) return -1; printf ("%u", ucount); break; case OUTPUT_FILES: count = count_files (query); if (count >= 0) { printf ("%u", count); } else { ret = -1; goto DONE; } break; } if (print_lastmod) { revision = notmuch_database_get_revision (notmuch, &uuid); printf ("\t%s\t%lu\n", uuid, revision); } else { fputs ("\n", stdout); } DONE: notmuch_query_destroy (query); return ret; }
static int _notmuch_search_prepare (search_context_t *ctx, notmuch_config_t *config, int argc, char *argv[]) { char *query_str; unsigned int i; char *status_string = NULL; switch (ctx->format_sel) { case NOTMUCH_FORMAT_TEXT: ctx->format = sprinter_text_create (config, stdout); break; case NOTMUCH_FORMAT_TEXT0: if (ctx->output == OUTPUT_SUMMARY) { fprintf (stderr, "Error: --format=text0 is not compatible with --output=summary.\n"); return EXIT_FAILURE; } ctx->format = sprinter_text0_create (config, stdout); break; case NOTMUCH_FORMAT_JSON: ctx->format = sprinter_json_create (config, stdout); break; case NOTMUCH_FORMAT_SEXP: ctx->format = sprinter_sexp_create (config, stdout); break; default: /* this should never happen */ INTERNAL_ERROR("no output format selected"); } notmuch_exit_if_unsupported_format (); if (notmuch_database_open_verbose ( notmuch_config_get_database_path (config), NOTMUCH_DATABASE_MODE_READ_ONLY, &ctx->notmuch, &status_string)) { if (status_string) { fputs (status_string, stderr); free (status_string); } return EXIT_FAILURE; } notmuch_exit_if_unmatched_db_uuid (ctx->notmuch); query_str = query_string_from_args (ctx->notmuch, argc, argv); if (query_str == NULL) { fprintf (stderr, "Out of memory.\n"); return EXIT_FAILURE; } if (*query_str == '\0') { fprintf (stderr, "Error: notmuch search requires at least one search term.\n"); return EXIT_FAILURE; } ctx->query = notmuch_query_create (ctx->notmuch, query_str); if (ctx->query == NULL) { fprintf (stderr, "Out of memory\n"); return EXIT_FAILURE; } notmuch_query_set_sort (ctx->query, ctx->sort); if (ctx->exclude == NOTMUCH_EXCLUDE_FLAG && ctx->output != OUTPUT_SUMMARY) { /* If we are not doing summary output there is nowhere to * print the excluded flag so fall back on including the * excluded messages. */ fprintf (stderr, "Warning: this output format cannot flag excluded messages.\n"); ctx->exclude = NOTMUCH_EXCLUDE_FALSE; } if (ctx->exclude != NOTMUCH_EXCLUDE_FALSE) { const char **search_exclude_tags; size_t search_exclude_tags_length; search_exclude_tags = notmuch_config_get_search_exclude_tags (config, &search_exclude_tags_length); for (i = 0; i < search_exclude_tags_length; i++) notmuch_query_add_tag_exclude (ctx->query, search_exclude_tags[i]); notmuch_query_set_omit_excluded (ctx->query, ctx->exclude); } return 0; }