lib: add new status reporting API for notmuch_query_search_{m,t}

This at least allows distinguishing between out of memory and Xapian
exceptions. Adding finer grained status codes would allow different
Xapian exceptions to be preserved.

Adding wrappers allows people to transition gradually to the new API,
at the cost of bloating the library API a bit.
This commit is contained in:
David Bremner 2015-01-20 08:53:41 +01:00
parent a9e0786f72
commit 7a0fc10367
2 changed files with 56 additions and 10 deletions

View file

@ -780,10 +780,18 @@ notmuch_query_add_tag_exclude (notmuch_query_t *query, const char *tag);
* to call it if the query is about to be destroyed). * to call it if the query is about to be destroyed).
* *
* If a Xapian exception occurs this function will return NULL. * If a Xapian exception occurs this function will return NULL.
* For better error reporting, use the _st variant.
*/ */
notmuch_threads_t * notmuch_threads_t *
notmuch_query_search_threads (notmuch_query_t *query); notmuch_query_search_threads (notmuch_query_t *query);
/**
* Like notmuch_query_search_threads, but with a status return.
*/
notmuch_status_t
notmuch_query_search_threads_st (notmuch_query_t *query,
notmuch_threads_t **out);
/** /**
* Execute a query for messages, returning a notmuch_messages_t object * Execute a query for messages, returning a notmuch_messages_t object
* which can be used to iterate over the results. The returned * which can be used to iterate over the results. The returned
@ -822,10 +830,18 @@ notmuch_query_search_threads (notmuch_query_t *query);
* reason to call it if the query is about to be destroyed). * reason to call it if the query is about to be destroyed).
* *
* If a Xapian exception occurs this function will return NULL. * If a Xapian exception occurs this function will return NULL.
* For better error reporting, use the _st variant.
*/ */
notmuch_messages_t * notmuch_messages_t *
notmuch_query_search_messages (notmuch_query_t *query); notmuch_query_search_messages (notmuch_query_t *query);
/**
* Like notmuch_query_search_messages, but with a status return.
*/
notmuch_status_t
notmuch_query_search_messages_st (notmuch_query_t *query,
notmuch_messages_t **out);
/** /**
* Destroy a notmuch_query_t along with any associated resources. * Destroy a notmuch_query_t along with any associated resources.
* *

View file

@ -173,6 +173,19 @@ _notmuch_exclude_tags (notmuch_query_t *query, Xapian::Query xquery)
notmuch_messages_t * notmuch_messages_t *
notmuch_query_search_messages (notmuch_query_t *query) notmuch_query_search_messages (notmuch_query_t *query)
{
notmuch_status_t status;
notmuch_messages_t *messages;
status = notmuch_query_search_messages_st (query, &messages);
if (status)
return NULL;
else
return messages;
}
notmuch_status_t
notmuch_query_search_messages_st (notmuch_query_t *query,
notmuch_messages_t **out)
{ {
notmuch_database_t *notmuch = query->notmuch; notmuch_database_t *notmuch = query->notmuch;
const char *query_string = query->query_string; const char *query_string = query->query_string;
@ -180,7 +193,7 @@ notmuch_query_search_messages (notmuch_query_t *query)
messages = talloc (query, notmuch_mset_messages_t); messages = talloc (query, notmuch_mset_messages_t);
if (unlikely (messages == NULL)) if (unlikely (messages == NULL))
return NULL; return NOTMUCH_STATUS_OUT_OF_MEMORY;
try { try {
@ -279,7 +292,8 @@ notmuch_query_search_messages (notmuch_query_t *query)
messages->iterator = mset.begin (); messages->iterator = mset.begin ();
messages->iterator_end = mset.end (); messages->iterator_end = mset.end ();
return &messages->base; *out = &messages->base;
return NOTMUCH_STATUS_SUCCESS;
} catch (const Xapian::Error &error) { } catch (const Xapian::Error &error) {
fprintf (stderr, "A Xapian exception occurred performing query: %s\n", fprintf (stderr, "A Xapian exception occurred performing query: %s\n",
@ -287,7 +301,7 @@ notmuch_query_search_messages (notmuch_query_t *query)
fprintf (stderr, "Query string was: %s\n", query->query_string); fprintf (stderr, "Query string was: %s\n", query->query_string);
notmuch->exception_reported = TRUE; notmuch->exception_reported = TRUE;
talloc_free (messages); talloc_free (messages);
return NULL; return NOTMUCH_STATUS_XAPIAN_EXCEPTION;
} }
} }
@ -412,24 +426,39 @@ _notmuch_threads_destructor (notmuch_threads_t *threads)
return 0; return 0;
} }
notmuch_threads_t * notmuch_threads_t *
notmuch_query_search_threads (notmuch_query_t *query) notmuch_query_search_threads (notmuch_query_t *query)
{
notmuch_status_t status;
notmuch_threads_t *threads;
status = notmuch_query_search_threads_st (query, &threads);
if (status)
return NULL;
else
return threads;
}
notmuch_status_t
notmuch_query_search_threads_st (notmuch_query_t *query,
notmuch_threads_t **out)
{ {
notmuch_threads_t *threads; notmuch_threads_t *threads;
notmuch_messages_t *messages; notmuch_messages_t *messages;
notmuch_status_t status;
threads = talloc (query, notmuch_threads_t); threads = talloc (query, notmuch_threads_t);
if (threads == NULL) if (threads == NULL)
return NULL; return NOTMUCH_STATUS_OUT_OF_MEMORY;
threads->doc_ids = NULL; threads->doc_ids = NULL;
talloc_set_destructor (threads, _notmuch_threads_destructor); talloc_set_destructor (threads, _notmuch_threads_destructor);
threads->query = query; threads->query = query;
messages = notmuch_query_search_messages (query); status = notmuch_query_search_messages_st (query, &messages);
if (messages == NULL) { if (status) {
talloc_free (threads); talloc_free (threads);
return NULL; return status;
} }
threads->doc_ids = g_array_new (FALSE, FALSE, sizeof (unsigned int)); threads->doc_ids = g_array_new (FALSE, FALSE, sizeof (unsigned int));
@ -445,10 +474,11 @@ notmuch_query_search_threads (notmuch_query_t *query)
if (! _notmuch_doc_id_set_init (threads, &threads->match_set, if (! _notmuch_doc_id_set_init (threads, &threads->match_set,
threads->doc_ids)) { threads->doc_ids)) {
talloc_free (threads); talloc_free (threads);
return NULL; return NOTMUCH_STATUS_OUT_OF_MEMORY;
} }
return threads; *out = threads;
return NOTMUCH_STATUS_SUCCESS;
} }
void void