[PATCH v2 5/7] lib: return NOTMUCH_STATUS_OPERATION_INVALIDATED where appropriate

Subject: [PATCH v2 5/7] lib: return NOTMUCH_STATUS_OPERATION_INVALIDATED where appropriate

Date: Sun, 27 Jul 2025 16:11:48 +0200

To: notmuch@notmuchmail.org

Cc:

From: Anton Khirnov


---
 lib/add-message.cc      |  2 +-
 lib/config.cc           |  6 +++---
 lib/database.cc         | 14 +++++++-------
 lib/directory.cc        |  6 +++---
 lib/message-property.cc |  4 ++--
 lib/message.cc          | 16 ++++++++--------
 lib/notmuch-private.h   | 18 ++++++++++++++++++
 lib/parse-sexp.cc       |  2 +-
 lib/query.cc            |  8 ++++----
 9 files changed, 47 insertions(+), 29 deletions(-)

diff --git a/lib/add-message.cc b/lib/add-message.cc
index b16748fd..e10fe9f5 100644
--- a/lib/add-message.cc
+++ b/lib/add-message.cc
@@ -565,7 +565,7 @@ notmuch_database_index_file (notmuch_database_t *notmuch,
 	_notmuch_database_log (notmuch, "A Xapian exception occurred adding message: %s.\n",
 			       error.get_msg ().c_str ());
 	notmuch->exception_reported = true;
-	ret = NOTMUCH_STATUS_XAPIAN_EXCEPTION;
+	ret = _notmuch_xapian_error(error);
 	goto DONE;
     }
 
diff --git a/lib/config.cc b/lib/config.cc
index 6cc59869..4fbe9cc9 100644
--- a/lib/config.cc
+++ b/lib/config.cc
@@ -75,7 +75,7 @@ notmuch_database_set_config (notmuch_database_t *notmuch,
     try {
 	notmuch->writable_xapian_db->set_metadata (CONFIG_PREFIX + key, value);
     } catch (const Xapian::Error &error) {
-	status = NOTMUCH_STATUS_XAPIAN_EXCEPTION;
+	status = _notmuch_xapian_error(error);
 	notmuch->exception_reported = true;
 	_notmuch_database_log (notmuch, "Error: A Xapian exception occurred setting metadata: %s\n",
 			       error.get_msg ().c_str ());
@@ -99,7 +99,7 @@ _metadata_value (notmuch_database_t *notmuch,
     try {
 	value = notmuch->xapian_db->get_metadata (CONFIG_PREFIX + key);
     } catch (const Xapian::Error &error) {
-	status = NOTMUCH_STATUS_XAPIAN_EXCEPTION;
+	status = _notmuch_xapian_error(error);
 	notmuch->exception_reported = true;
 	_notmuch_database_log (notmuch, "Error: A Xapian exception occurred getting metadata: %s\n",
 			       error.get_msg ().c_str ());
@@ -164,7 +164,7 @@ notmuch_database_get_config_list (notmuch_database_t *notmuch,
 			       "A Xapian exception occurred getting metadata iterator: %s.\n",
 			       error.get_msg ().c_str ());
 	notmuch->exception_reported = true;
-	status = NOTMUCH_STATUS_XAPIAN_EXCEPTION;
+	status = _notmuch_xapian_error(error);
     }
 
     *out = list;
diff --git a/lib/database.cc b/lib/database.cc
index 8f687eee..49e4d262 100644
--- a/lib/database.cc
+++ b/lib/database.cc
@@ -468,7 +468,7 @@ notmuch_database_find_message (notmuch_database_t *notmuch,
 			       error.get_msg ().c_str ());
 	notmuch->exception_reported = true;
 	*message_ret = NULL;
-	return NOTMUCH_STATUS_XAPIAN_EXCEPTION;
+	return _notmuch_xapian_error(error);
     }
 }
 
@@ -520,7 +520,7 @@ notmuch_database_close (notmuch_database_t *notmuch)
 	     * transaction, ALL pending changes will be discarded */
 	    notmuch->xapian_db->close ();
 	} catch (const Xapian::Error &error) {
-	    status = NOTMUCH_STATUS_XAPIAN_EXCEPTION;
+	    status = _notmuch_xapian_error(error);
 	    if (! notmuch->exception_reported) {
 		_notmuch_database_log (notmuch,
 				       "Error: A Xapian exception occurred closing database: %s\n",
@@ -689,7 +689,7 @@ notmuch_database_compact_db (notmuch_database_t *notmuch,
 				     compactor);
     } catch (const Xapian::Error &error) {
 	_notmuch_database_log (notmuch, "Error while compacting: %s\n", error.get_msg ().c_str ());
-	ret = NOTMUCH_STATUS_XAPIAN_EXCEPTION;
+	ret = _notmuch_xapian_error(error);
 	goto DONE;
     }
 
@@ -1127,7 +1127,7 @@ notmuch_database_begin_atomic (notmuch_database_t *notmuch)
 	_notmuch_database_log (notmuch, "A Xapian exception occurred beginning transaction: %s.\n",
 			       error.get_msg ().c_str ());
 	notmuch->exception_reported = true;
-	return NOTMUCH_STATUS_XAPIAN_EXCEPTION;
+	return _notmuch_xapian_error(error);
     }
 
   DONE:
@@ -1169,7 +1169,7 @@ notmuch_database_end_atomic (notmuch_database_t *notmuch)
 	_notmuch_database_log (notmuch, "A Xapian exception occurred committing transaction: %s.\n",
 			       error.get_msg ().c_str ());
 	notmuch->exception_reported = true;
-	return NOTMUCH_STATUS_XAPIAN_EXCEPTION;
+	return _notmuch_xapian_error(error);
     }
 
     if (notmuch->atomic_dirty) {
@@ -1417,7 +1417,7 @@ notmuch_database_get_directory (notmuch_database_t *notmuch,
 	_notmuch_database_log (notmuch, "A Xapian exception occurred getting directory: %s.\n",
 			       error.get_msg ().c_str ());
 	notmuch->exception_reported = true;
-	status = NOTMUCH_STATUS_XAPIAN_EXCEPTION;
+	status = _notmuch_xapian_error(error);
     }
     return status;
 }
@@ -1517,7 +1517,7 @@ notmuch_database_find_message_by_filename (notmuch_database_t *notmuch,
 			       "Error: A Xapian exception occurred finding message by filename: %s\n",
 			       error.get_msg ().c_str ());
 	notmuch->exception_reported = true;
-	status = NOTMUCH_STATUS_XAPIAN_EXCEPTION;
+	status = _notmuch_xapian_error(error);
     }
 
   DONE:
diff --git a/lib/directory.cc b/lib/directory.cc
index 5cf64d7f..a7bbd2c9 100644
--- a/lib/directory.cc
+++ b/lib/directory.cc
@@ -206,7 +206,7 @@ _notmuch_directory_find_or_create (notmuch_database_t *notmuch,
 	notmuch->exception_reported = true;
 	notmuch_directory_destroy (directory);
 	directory = NULL;
-	*status_ret = NOTMUCH_STATUS_XAPIAN_EXCEPTION;
+	*status_ret = _notmuch_xapian_error(error);
     }
 
   DONE:
@@ -247,7 +247,7 @@ notmuch_directory_set_mtime (notmuch_directory_t *directory,
 			       "A Xapian exception occurred setting directory mtime: %s.\n",
 			       error.get_msg ().c_str ());
 	notmuch->exception_reported = true;
-	return NOTMUCH_STATUS_XAPIAN_EXCEPTION;
+	return _notmuch_xapian_error(error);
     }
 
     return NOTMUCH_STATUS_SUCCESS;
@@ -321,7 +321,7 @@ notmuch_directory_delete (notmuch_directory_t *directory)
 			       "A Xapian exception occurred deleting directory entry: %s.\n",
 			       error.get_msg ().c_str ());
 	directory->notmuch->exception_reported = true;
-	status = NOTMUCH_STATUS_XAPIAN_EXCEPTION;
+	status = _notmuch_xapian_error(error);
     }
     notmuch_directory_destroy (directory);
 
diff --git a/lib/message-property.cc b/lib/message-property.cc
index 7f520340..5e08498a 100644
--- a/lib/message-property.cc
+++ b/lib/message-property.cc
@@ -104,7 +104,7 @@ _notmuch_message_modify_property (notmuch_message_t *message, const char *key, c
 	    private_status = _notmuch_message_add_term (message, "property", term);
     } catch (Xapian::Error &error) {
 	LOG_XAPIAN_EXCEPTION (message, error);
-	return NOTMUCH_STATUS_XAPIAN_EXCEPTION;
+	return _notmuch_xapian_error(error);
     }
 
     if (private_status)
@@ -153,7 +153,7 @@ _notmuch_message_remove_all_properties (notmuch_message_t *message, const char *
 	_notmuch_message_remove_terms (message, term_prefix);
     } catch (Xapian::Error &error) {
 	LOG_XAPIAN_EXCEPTION (message, error);
-	return NOTMUCH_STATUS_XAPIAN_EXCEPTION;
+	return _notmuch_xapian_error(error);
     }
 
     if (! _notmuch_message_frozen (message))
diff --git a/lib/message.cc b/lib/message.cc
index ea815efe..fb90ecc6 100644
--- a/lib/message.cc
+++ b/lib/message.cc
@@ -297,7 +297,7 @@ _notmuch_message_create_for_message_id (notmuch_database_t *notmuch,
 			       "A Xapian exception occurred creating message: %s\n",
 			       error.get_msg ().c_str ());
 	notmuch->exception_reported = true;
-	*status_ret = NOTMUCH_PRIVATE_STATUS_XAPIAN_EXCEPTION;
+	*status_ret = _notmuch_xapian_errorp(error);
 	return NULL;
     }
 
@@ -1211,7 +1211,7 @@ notmuch_message_get_flag_st (notmuch_message_t *message,
 	    _notmuch_message_ensure_metadata (message, NULL);
     } catch (Xapian::Error &error) {
 	LOG_XAPIAN_EXCEPTION (message, error);
-	return NOTMUCH_STATUS_XAPIAN_EXCEPTION;
+	return _notmuch_xapian_error(error);
     }
 
     *is_set = NOTMUCH_TEST_BIT (message->flags, flag);
@@ -1433,7 +1433,7 @@ _notmuch_message_delete (notmuch_message_t *message)
 	}
     } catch (Xapian::Error &error) {
 	LOG_XAPIAN_EXCEPTION (message, error);
-	return NOTMUCH_STATUS_XAPIAN_EXCEPTION;
+	return _notmuch_xapian_error(error);
     }
     if (count > 0) {
 	/* reintroduce a ghost in its place because there are still
@@ -1464,7 +1464,7 @@ _notmuch_message_delete (notmuch_message_t *message)
 	    }
 	} catch (Xapian::Error &error) {
 	    LOG_XAPIAN_EXCEPTION (message, error);
-	    return NOTMUCH_STATUS_XAPIAN_EXCEPTION;
+	    return _notmuch_xapian_error(error);
 	}
 
     }
@@ -1534,7 +1534,7 @@ _notmuch_message_add_term (notmuch_message_t *message,
 	_notmuch_message_invalidate_metadata (message, prefix_name);
     } catch (Xapian::Error &error) {
 	LOG_XAPIAN_EXCEPTION (message, error);
-	status = NOTMUCH_PRIVATE_STATUS_XAPIAN_EXCEPTION;
+	status = _notmuch_xapian_errorp(error);
     }
 
   DONE:
@@ -1645,7 +1645,7 @@ _notmuch_message_has_term (notmuch_message_t *message,
 	    ! strcmp ((*i).c_str (), term))
 	    out = true;
     } catch (Xapian::Error &error) {
-	status = NOTMUCH_PRIVATE_STATUS_XAPIAN_EXCEPTION;
+	status = _notmuch_xapian_errorp(error);
     }
     talloc_free (term);
 
@@ -1682,7 +1682,7 @@ notmuch_message_add_tag (notmuch_message_t *message, const char *tag)
 
     } catch (Xapian::Error &error) {
 	LOG_XAPIAN_EXCEPTION (message, error);
-	return NOTMUCH_STATUS_XAPIAN_EXCEPTION;
+	return _notmuch_xapian_error(error);
     }
 
     return NOTMUCH_STATUS_SUCCESS;
@@ -1716,7 +1716,7 @@ notmuch_message_remove_tag (notmuch_message_t *message, const char *tag)
 	    _notmuch_message_sync (message);
     } catch (Xapian::Error &error) {
 	LOG_XAPIAN_EXCEPTION (message, error);
-	return NOTMUCH_STATUS_XAPIAN_EXCEPTION;
+	return _notmuch_xapian_error(error);
     }
 
     return NOTMUCH_STATUS_SUCCESS;
diff --git a/lib/notmuch-private.h b/lib/notmuch-private.h
index ebb38a5c..08923e72 100644
--- a/lib/notmuch-private.h
+++ b/lib/notmuch-private.h
@@ -746,6 +746,9 @@ _notmuch_choose_xapian_path (void *ctx, const char *database_path, const char **
 NOTMUCH_END_DECLS
 
 #ifdef __cplusplus
+
+#include <xapian.h>
+
 /* Implicit typecast from 'void *' to 'T *' is okay in C, but not in
  * C++. In talloc_steal, an explicit cast is provided for type safety
  * in some GCC versions. Otherwise, a cast is required. Provide a
@@ -767,6 +770,21 @@ _notmuch_talloc_steal (const void *new_ctx, const T *ptr)
 #else
 #define NODISCARD /**/
 #endif
+
+static inline notmuch_private_status_t
+_notmuch_xapian_errorp (const Xapian::Error &error)
+{
+    const char *type = error.get_type();
+	return (! strcmp (type, "DatabaseModifiedError")) ?
+	    NOTMUCH_PRIVATE_STATUS_OPERATION_INVALIDATED : NOTMUCH_PRIVATE_STATUS_XAPIAN_EXCEPTION;
+}
+
+static inline notmuch_status_t
+_notmuch_xapian_error (const Xapian::Error &error)
+{
+    return COERCE_STATUS(_notmuch_xapian_errorp(error),
+			 "mapping Xapian exception");
+}
 #endif
 
 #endif
diff --git a/lib/parse-sexp.cc b/lib/parse-sexp.cc
index 930888e9..eaff494a 100644
--- a/lib/parse-sexp.cc
+++ b/lib/parse-sexp.cc
@@ -366,7 +366,7 @@ _sexp_parse_infix (notmuch_database_t *notmuch, const sexp_t *sx, Xapian::Query
 					  "Query string was: %s\n",
 					  sx->val);
 	    notmuch->exception_reported = true;
-	    return NOTMUCH_STATUS_XAPIAN_EXCEPTION;
+	    return _notmuch_xapian_error(error);
 	}
     }
     return NOTMUCH_STATUS_SUCCESS;
diff --git a/lib/query.cc b/lib/query.cc
index a1261dd2..f2adb906 100644
--- a/lib/query.cc
+++ b/lib/query.cc
@@ -206,7 +206,7 @@ _notmuch_query_string_to_xapian_query (notmuch_database_t *notmuch,
 	}
 
 	msg = error.get_msg ();
-	return NOTMUCH_STATUS_XAPIAN_EXCEPTION;
+	return _notmuch_xapian_error(error);
     }
     return NOTMUCH_STATUS_SUCCESS;
 }
@@ -465,7 +465,7 @@ _notmuch_query_search_documents (notmuch_query_t *query,
 
 	notmuch->exception_reported = true;
 	talloc_free (messages);
-	return NOTMUCH_STATUS_XAPIAN_EXCEPTION;
+	return _notmuch_xapian_error(error);
     }
 }
 
@@ -789,7 +789,7 @@ _notmuch_query_count_documents (notmuch_query_t *query, const char *type, unsign
 	_notmuch_database_log_append (notmuch,
 				      "Query string was: %s\n",
 				      query->query_string);
-	return NOTMUCH_STATUS_XAPIAN_EXCEPTION;
+	return _notmuch_xapian_error(error);
     }
 
     *count_out = count;
@@ -896,7 +896,7 @@ _notmuch_query_expand (notmuch_database_t *notmuch, const char *field, Xapian::Q
 			       "A Xapian exception occurred expanding query: %s\n",
 			       error.get_msg ().c_str ());
 	msg = error.get_msg ();
-	return NOTMUCH_STATUS_XAPIAN_EXCEPTION;
+	return _notmuch_xapian_error(error);
     }
 
     return NOTMUCH_STATUS_SUCCESS;
-- 
2.39.5

_______________________________________________
notmuch mailing list -- notmuch@notmuchmail.org
To unsubscribe send an email to notmuch-leave@notmuchmail.org

Thread: