EXCLUDE_FALSE,
};
-static unsigned int
+/* Return the number of files matching the query, or -1 for an error */
+static int
count_files (notmuch_query_t *query)
{
notmuch_messages_t *messages;
notmuch_message_t *message;
notmuch_filenames_t *filenames;
- unsigned int count = 0;
+ notmuch_status_t status;
+ int count = 0;
- messages = notmuch_query_search_messages (query);
- if (messages == NULL)
- return 0;
+ status = notmuch_query_search_messages_st (query, &messages);
+ if (print_status_query ("notmuch count", query, status))
+ return -1;
for (;
notmuch_messages_valid (messages);
{
notmuch_query_t *query;
size_t i;
+ int count;
unsigned long revision;
const char *uuid;
int ret = 0;
printf ("%u", notmuch_query_count_threads (query));
break;
case OUTPUT_FILES:
- printf ("%u", count_files (query));
+ count = count_files (query);
+ if (count >= 0) {
+ printf ("%u", count);
+ } else {
+ ret = -1;
+ goto DONE;
+ }
break;
}
fputs ("\n", stdout);
}
+ DONE:
notmuch_query_destroy (query);
return ret;
notmuch count --output=messages tag:inbox >>EXPECTED
test_expect_equal_file EXPECTED OUTPUT
+backup_database
+test_begin_subtest "error message for database open"
+dd if=/dev/zero of="${MAIL_DIR}/.notmuch/xapian/postlist.DB" count=3
+notmuch count '*' 2>OUTPUT 1>/dev/null
+output=$(sed 's/^\(A Xapian exception [^:]*\):.*$/\1/' OUTPUT)
+test_expect_equal "${output}" "A Xapian exception occurred opening database"
+restore_database
+
+cat <<EOF > count-files.gdb
+set breakpoint pending on
+break count_files
+commands
+shell cp /dev/null ${MAIL_DIR}/.notmuch/xapian/postlist.DB
+continue
+end
+run
+EOF
+
+backup_database
+test_begin_subtest "error message from query_search_messages"
+gdb --batch-silent --return-child-result -x count-files.gdb \
+ --args notmuch count --output=files '*' 2>OUTPUT 1>/dev/null
+cat <<EOF > EXPECTED
+notmuch count: A Xapian exception occurred
+A Xapian exception occurred performing query
+Query string was: *
+EOF
+sed 's/^\(A Xapian exception [^:]*\):.*$/\1/' < OUTPUT > OUTPUT.clean
+test_expect_equal_file EXPECTED OUTPUT.clean
+restore_database
test_done