/* 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_reply_format_sprinter(void *ctx, notmuch_config_t *config, notmuch_query_t *query, notmuch_show_params_t *params, notmuch_bool_t reply_all, sprinter_t *sp) { GMimeMessage *reply; notmuch_messages_t *messages; notmuch_message_t *message; mime_node_t *node; unsigned count; notmuch_status_t status; status = notmuch_query_count_messages_st (query, &count); if (print_status_query ("notmuch reply", query, status)) return 1; if (count != 1) { fprintf (stderr, "Error: search term did not match precisely one message.\n"); return 1; } status = notmuch_query_search_messages_st (query, &messages); if (print_status_query ("notmuch reply", query, status)) return 1; message = notmuch_messages_get (messages); if (mime_node_open (ctx, message, &(params->crypto), &node) != NOTMUCH_STATUS_SUCCESS) return 1; reply = create_reply_message (ctx, config, message, reply_all); if (!reply) return 1; sp->begin_map (sp); /* The headers of the reply message we've created */ sp->map_key (sp, "reply-headers"); format_headers_sprinter (sp, reply, TRUE); g_object_unref (G_OBJECT (reply)); reply = NULL; /* Start the original */ sp->map_key (sp, "original"); format_part_sprinter (ctx, sp, node, TRUE, TRUE, FALSE); /* End */ sp->end (sp); notmuch_message_destroy (message); return 0; }
/* Formatted output of single message */ static int do_show_single (void *ctx, notmuch_query_t *query, const notmuch_show_format_t *format, sprinter_t *sp, notmuch_show_params_t *params) { notmuch_messages_t *messages; notmuch_message_t *message; notmuch_status_t status; unsigned int count; status = notmuch_query_count_messages_st (query, &count); if (print_status_query ("notmuch show", query, status)) return 1; if (count != 1) { fprintf (stderr, "Error: search term did not match precisely one message.\n"); return 1; } status = notmuch_query_search_messages_st (query, &messages); if (print_status_query ("notmuch show", query, status)) return 1; message = notmuch_messages_get (messages); if (message == NULL) { fprintf (stderr, "Error: Cannot find matching message.\n"); return 1; } notmuch_message_set_flag (message, NOTMUCH_MESSAGE_FLAG_MATCH, 1); return show_message (ctx, format, sp, message, 0, params) != NOTMUCH_STATUS_SUCCESS; }
static int do_search_messages (search_context_t *ctx) { notmuch_message_t *message; notmuch_messages_t *messages; notmuch_filenames_t *filenames; sprinter_t *format = ctx->format; int i; notmuch_status_t status; if (ctx->offset < 0) { unsigned count; notmuch_status_t status; status = notmuch_query_count_messages_st (ctx->query, &count); if (print_status_query ("notmuch search", ctx->query, status)) return 1; ctx->offset += count; if (ctx->offset < 0) ctx->offset = 0; } status = notmuch_query_search_messages_st (ctx->query, &messages); if (print_status_query ("notmuch search", ctx->query, status)) return 1; format->begin_list (format); for (i = 0; notmuch_messages_valid (messages) && (ctx->limit < 0 || i < ctx->offset + ctx->limit); notmuch_messages_move_to_next (messages), i++) { if (i < ctx->offset) continue; message = notmuch_messages_get (messages); if (ctx->output == OUTPUT_FILES) { int j; filenames = notmuch_message_get_filenames (message); for (j = 1; notmuch_filenames_valid (filenames); notmuch_filenames_move_to_next (filenames), j++) { if (ctx->dupe < 0 || ctx->dupe == j) { format->string (format, notmuch_filenames_get (filenames)); format->separator (format); } } notmuch_filenames_destroy( filenames ); } else if (ctx->output == OUTPUT_MESSAGES) { /* special case 1 for speed */ if (ctx->dupe <= 1 || ctx->dupe <= _count_filenames (message)) { format->set_prefix (format, "id"); format->string (format, notmuch_message_get_message_id (message)); format->separator (format); } } else { if (ctx->output & OUTPUT_SENDER) { const char *addrs; addrs = notmuch_message_get_header (message, "from"); process_address_header (ctx, addrs); } if (ctx->output & OUTPUT_RECIPIENTS) { const char *hdrs[] = { "to", "cc", "bcc" }; const char *addrs; size_t j; for (j = 0; j < ARRAY_SIZE (hdrs); j++) { addrs = notmuch_message_get_header (message, hdrs[j]); process_address_header (ctx, addrs); } } } notmuch_message_destroy (message); } if (ctx->addresses && (ctx->output & OUTPUT_COUNT || ctx->dedup == DEDUP_ADDRESS)) g_hash_table_foreach (ctx->addresses, print_hash_value, ctx); notmuch_messages_destroy (messages); format->end (format); return 0; }