[PATCH 3/5] cli: add --batch option to notmuch count

Tomi Ollila tomi.ollila at iki.fi
Wed Jan 23 05:36:45 PST 2013


On Tue, Jan 15 2013, Jani Nikula <jani at nikula.org> wrote:

> Add support for reading queries from stdin, one per line, and writing
> results to stdin, one per line.

Jani's parts LGTM, except one IMPORTANT part -- results are written
to STDOUT! (hopefully...yes) instead of STDIN! ;)

I don't see a reason why this particular way to get counts could
not be supported in notmuch into foreseeable future; the implementation
is simple and clean.

Next to look Mark's changes...

Tomi

>
> This will bring considerable performance improvements when utilized in
> Emacs notmuch-hello, especially so when running remote notmuch.
> ---
>  notmuch-count.c |   52 ++++++++++++++++++++++++++++++++++++++++++++++++++--
>  1 file changed, 50 insertions(+), 2 deletions(-)
>
> diff --git a/notmuch-count.c b/notmuch-count.c
> index 0e14b48..4bc4215 100644
> --- a/notmuch-count.c
> +++ b/notmuch-count.c
> @@ -62,6 +62,27 @@ print_count (notmuch_database_t *notmuch, const char *query_str,
>      return 0;
>  }
>  
> +static int
> +count_file (notmuch_database_t *notmuch, FILE *input, const char **exclude_tags,
> +	    size_t exclude_tags_length, int output)
> +{
> +    char *line = NULL;
> +    ssize_t line_len;
> +    size_t line_size;
> +    int ret = 0;
> +
> +    while (!ret && (line_len = getline (&line, &line_size, input)) != -1) {
> +	chomp_newline (line);
> +	ret = print_count (notmuch, line, exclude_tags, exclude_tags_length,
> +			   output);
> +    }
> +
> +    if (line)
> +	free (line);
> +
> +    return ret;
> +}
> +
>  int
>  notmuch_count_command (void *ctx, int argc, char *argv[])
>  {
> @@ -73,6 +94,9 @@ notmuch_count_command (void *ctx, int argc, char *argv[])
>      int exclude = EXCLUDE_TRUE;
>      const char **search_exclude_tags = NULL;
>      size_t search_exclude_tags_length = 0;
> +    notmuch_bool_t batch = FALSE;
> +    FILE *input = stdin;
> +    char *input_file_name = NULL;
>      int ret;
>  
>      notmuch_opt_desc_t options[] = {
> @@ -84,6 +108,8 @@ notmuch_count_command (void *ctx, int argc, char *argv[])
>  	  (notmuch_keyword_t []){ { "true", EXCLUDE_TRUE },
>  				  { "false", EXCLUDE_FALSE },
>  				  { 0, 0 } } },
> +	{ NOTMUCH_OPT_BOOLEAN, &batch, "batch", 0, 0 },
> +	{ NOTMUCH_OPT_STRING, &input_file_name, "input", 'i', 0 },
>  	{ 0, 0, 0, 0, 0 }
>      };
>  
> @@ -93,6 +119,21 @@ notmuch_count_command (void *ctx, int argc, char *argv[])
>  	return 1;
>      }
>  
> +    if (input_file_name) {
> +	batch = TRUE;
> +	input = fopen (input_file_name, "r");
> +	if (input == NULL) {
> +	    fprintf (stderr, "Error opening %s for reading: %s\n",
> +		     input_file_name, strerror (errno));
> +	    return 1;
> +	}
> +    }
> +
> +    if (batch && opt_index != argc) {
> +	fprintf (stderr, "--batch and query string are not compatible\n");
> +	return 1;
> +    }
> +
>      config = notmuch_config_open (ctx, NULL, NULL);
>      if (config == NULL)
>  	return 1;
> @@ -112,10 +153,17 @@ notmuch_count_command (void *ctx, int argc, char *argv[])
>  	    (config, &search_exclude_tags_length);
>      }
>  
> -    ret = print_count (notmuch, query_str, search_exclude_tags,
> -		       search_exclude_tags_length, output);
> +    if (batch)
> +	ret = count_file (notmuch, input, search_exclude_tags,
> +			  search_exclude_tags_length, output);
> +    else
> +	ret = print_count (notmuch, query_str, search_exclude_tags,
> +			   search_exclude_tags_length, output);
>  
>      notmuch_database_destroy (notmuch);
>  
> +    if (input != stdin)
> +	fclose (input);
> +
>      return ret;
>  }
> -- 
> 1.7.10.4
>
> _______________________________________________
> notmuch mailing list
> notmuch at notmuchmail.org
> http://notmuchmail.org/mailman/listinfo/notmuch


More information about the notmuch mailing list