mirror of
https://git.notmuchmail.org/git/notmuch
synced 2024-11-27 21:27:58 +01:00
cli: add --batch option to notmuch count
Add support for reading queries from stdin, one per line, and writing results to stdout, one per line. This will bring considerable performance improvements when utilized in Emacs notmuch-hello, especially so when running remote notmuch.
This commit is contained in:
parent
530b562111
commit
c6265706e8
1 changed files with 50 additions and 2 deletions
|
@ -62,6 +62,27 @@ print_count (notmuch_database_t *notmuch, const char *query_str,
|
||||||
return 0;
|
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
|
int
|
||||||
notmuch_count_command (notmuch_config_t *config, int argc, char *argv[])
|
notmuch_count_command (notmuch_config_t *config, int argc, char *argv[])
|
||||||
{
|
{
|
||||||
|
@ -72,6 +93,9 @@ notmuch_count_command (notmuch_config_t *config, int argc, char *argv[])
|
||||||
int exclude = EXCLUDE_TRUE;
|
int exclude = EXCLUDE_TRUE;
|
||||||
const char **search_exclude_tags = NULL;
|
const char **search_exclude_tags = NULL;
|
||||||
size_t search_exclude_tags_length = 0;
|
size_t search_exclude_tags_length = 0;
|
||||||
|
notmuch_bool_t batch = FALSE;
|
||||||
|
FILE *input = stdin;
|
||||||
|
char *input_file_name = NULL;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
notmuch_opt_desc_t options[] = {
|
notmuch_opt_desc_t options[] = {
|
||||||
|
@ -83,6 +107,8 @@ notmuch_count_command (notmuch_config_t *config, int argc, char *argv[])
|
||||||
(notmuch_keyword_t []){ { "true", EXCLUDE_TRUE },
|
(notmuch_keyword_t []){ { "true", EXCLUDE_TRUE },
|
||||||
{ "false", EXCLUDE_FALSE },
|
{ "false", EXCLUDE_FALSE },
|
||||||
{ 0, 0 } } },
|
{ 0, 0 } } },
|
||||||
|
{ NOTMUCH_OPT_BOOLEAN, &batch, "batch", 0, 0 },
|
||||||
|
{ NOTMUCH_OPT_STRING, &input_file_name, "input", 'i', 0 },
|
||||||
{ 0, 0, 0, 0, 0 }
|
{ 0, 0, 0, 0, 0 }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -92,6 +118,21 @@ notmuch_count_command (notmuch_config_t *config, int argc, char *argv[])
|
||||||
return 1;
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
if (notmuch_database_open (notmuch_config_get_database_path (config),
|
if (notmuch_database_open (notmuch_config_get_database_path (config),
|
||||||
NOTMUCH_DATABASE_MODE_READ_ONLY, ¬much))
|
NOTMUCH_DATABASE_MODE_READ_ONLY, ¬much))
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -107,10 +148,17 @@ notmuch_count_command (notmuch_config_t *config, int argc, char *argv[])
|
||||||
(config, &search_exclude_tags_length);
|
(config, &search_exclude_tags_length);
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = print_count (notmuch, query_str, search_exclude_tags,
|
if (batch)
|
||||||
search_exclude_tags_length, output);
|
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);
|
notmuch_database_destroy (notmuch);
|
||||||
|
|
||||||
|
if (input != stdin)
|
||||||
|
fclose (input);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue