aboutsummaryrefslogtreecommitdiff
path: root/lib/query.cc
diff options
context:
space:
mode:
authorDavid Bremner <david@tethera.net>2015-01-20 08:53:41 +0100
committerDavid Bremner <david@tethera.net>2015-03-01 08:49:14 +0100
commit7a0fc103678ea1b1da2df561d222c08db04c5af2 (patch)
treed7ecaa6545e8035ddd1c0086488334153519a39f /lib/query.cc
parenta9e0786f72bd01186b58b739986e7ac0680ff7c0 (diff)
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.
Diffstat (limited to 'lib/query.cc')
-rw-r--r--lib/query.cc50
1 files changed, 40 insertions, 10 deletions
diff --git a/lib/query.cc b/lib/query.cc
index 60ff8bd9..9279915d 100644
--- a/lib/query.cc
+++ b/lib/query.cc
@@ -174,13 +174,26 @@ _notmuch_exclude_tags (notmuch_query_t *query, Xapian::Query xquery)
notmuch_messages_t *
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;
const char *query_string = query->query_string;
notmuch_mset_messages_t *messages;
messages = talloc (query, notmuch_mset_messages_t);
if (unlikely (messages == NULL))
- return NULL;
+ return NOTMUCH_STATUS_OUT_OF_MEMORY;
try {
@@ -279,7 +292,8 @@ notmuch_query_search_messages (notmuch_query_t *query)
messages->iterator = mset.begin ();
messages->iterator_end = mset.end ();
- return &messages->base;
+ *out = &messages->base;
+ return NOTMUCH_STATUS_SUCCESS;
} catch (const Xapian::Error &error) {
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);
notmuch->exception_reported = TRUE;
talloc_free (messages);
- return NULL;
+ return NOTMUCH_STATUS_XAPIAN_EXCEPTION;
}
}
@@ -412,24 +426,39 @@ _notmuch_threads_destructor (notmuch_threads_t *threads)
return 0;
}
+
notmuch_threads_t *
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_messages_t *messages;
+ notmuch_status_t status;
threads = talloc (query, notmuch_threads_t);
if (threads == NULL)
- return NULL;
+ return NOTMUCH_STATUS_OUT_OF_MEMORY;
threads->doc_ids = NULL;
talloc_set_destructor (threads, _notmuch_threads_destructor);
threads->query = query;
- messages = notmuch_query_search_messages (query);
- if (messages == NULL) {
- talloc_free (threads);
- return NULL;
+ status = notmuch_query_search_messages_st (query, &messages);
+ if (status) {
+ talloc_free (threads);
+ return status;
}
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,
threads->doc_ids)) {
talloc_free (threads);
- return NULL;
+ return NOTMUCH_STATUS_OUT_OF_MEMORY;
}
- return threads;
+ *out = threads;
+ return NOTMUCH_STATUS_SUCCESS;
}
void