mirror of
https://git.notmuchmail.org/git/notmuch
synced 2024-11-25 04:18:08 +01:00
lib: Add an API to find a message by filename.
notmuch_database_find_message_by_filename is mostly stolen from notmuch_database_remove_message, so this patch also vastly simplfies the latter using the former. This API is also useful in its own right and will be used in a later patch for eager maildir flag synchronization.
This commit is contained in:
parent
59d2457bcc
commit
7a8046ced8
2 changed files with 56 additions and 37 deletions
|
@ -1747,57 +1747,60 @@ notmuch_status_t
|
||||||
notmuch_database_remove_message (notmuch_database_t *notmuch,
|
notmuch_database_remove_message (notmuch_database_t *notmuch,
|
||||||
const char *filename)
|
const char *filename)
|
||||||
{
|
{
|
||||||
void *local;
|
notmuch_message_t *message =
|
||||||
const char *prefix = _find_prefix ("file-direntry");
|
notmuch_database_find_message_by_filename (notmuch, filename);
|
||||||
char *direntry, *term;
|
notmuch_status_t status = NOTMUCH_STATUS_SUCCESS;
|
||||||
Xapian::PostingIterator i, end;
|
|
||||||
Xapian::Document document;
|
|
||||||
notmuch_status_t status;
|
|
||||||
|
|
||||||
status = _notmuch_database_ensure_writable (notmuch);
|
|
||||||
if (status)
|
|
||||||
return status;
|
|
||||||
|
|
||||||
local = talloc_new (notmuch);
|
|
||||||
|
|
||||||
try {
|
|
||||||
|
|
||||||
status = _notmuch_database_filename_to_direntry (local, notmuch,
|
|
||||||
filename, &direntry);
|
|
||||||
if (status)
|
|
||||||
return status;
|
|
||||||
|
|
||||||
term = talloc_asprintf (local, "%s%s", prefix, direntry);
|
|
||||||
|
|
||||||
find_doc_ids_for_term (notmuch, term, &i, &end);
|
|
||||||
|
|
||||||
for ( ; i != end; i++) {
|
|
||||||
Xapian::TermIterator j;
|
|
||||||
notmuch_message_t *message;
|
|
||||||
notmuch_private_status_t private_status;
|
|
||||||
|
|
||||||
message = _notmuch_message_create (local, notmuch,
|
|
||||||
*i, &private_status);
|
|
||||||
if (message == NULL)
|
|
||||||
return COERCE_STATUS (private_status,
|
|
||||||
"Inconsistent document ID in datbase.");
|
|
||||||
|
|
||||||
|
if (message) {
|
||||||
status = _notmuch_message_remove_filename (message, filename);
|
status = _notmuch_message_remove_filename (message, filename);
|
||||||
if (status == NOTMUCH_STATUS_SUCCESS)
|
if (status == NOTMUCH_STATUS_SUCCESS)
|
||||||
_notmuch_message_delete (message);
|
_notmuch_message_delete (message);
|
||||||
else if (status == NOTMUCH_STATUS_DUPLICATE_MESSAGE_ID)
|
else if (status == NOTMUCH_STATUS_DUPLICATE_MESSAGE_ID)
|
||||||
_notmuch_message_sync (message);
|
_notmuch_message_sync (message);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
notmuch_message_t *
|
||||||
|
notmuch_database_find_message_by_filename (notmuch_database_t *notmuch,
|
||||||
|
const char *filename)
|
||||||
|
{
|
||||||
|
void *local;
|
||||||
|
const char *prefix = _find_prefix ("file-direntry");
|
||||||
|
char *direntry, *term;
|
||||||
|
Xapian::PostingIterator i, end;
|
||||||
|
notmuch_message_t *message = NULL;
|
||||||
|
notmuch_status_t status;
|
||||||
|
|
||||||
|
local = talloc_new (notmuch);
|
||||||
|
|
||||||
|
try {
|
||||||
|
status = _notmuch_database_filename_to_direntry (local, notmuch,
|
||||||
|
filename, &direntry);
|
||||||
|
if (status)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
term = talloc_asprintf (local, "%s%s", prefix, direntry);
|
||||||
|
|
||||||
|
find_doc_ids_for_term (notmuch, term, &i, &end);
|
||||||
|
|
||||||
|
if (i != end) {
|
||||||
|
notmuch_private_status_t private_status;
|
||||||
|
|
||||||
|
message = _notmuch_message_create (notmuch, notmuch,
|
||||||
|
*i, &private_status);
|
||||||
|
}
|
||||||
} catch (const Xapian::Error &error) {
|
} catch (const Xapian::Error &error) {
|
||||||
fprintf (stderr, "Error: A Xapian exception occurred removing message: %s\n",
|
fprintf (stderr, "Error: A Xapian exception occurred finding message by filename: %s\n",
|
||||||
error.get_msg().c_str());
|
error.get_msg().c_str());
|
||||||
notmuch->exception_reported = TRUE;
|
notmuch->exception_reported = TRUE;
|
||||||
status = NOTMUCH_STATUS_XAPIAN_EXCEPTION;
|
message = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
talloc_free (local);
|
talloc_free (local);
|
||||||
|
|
||||||
return status;
|
return message;
|
||||||
}
|
}
|
||||||
|
|
||||||
notmuch_string_list_t *
|
notmuch_string_list_t *
|
||||||
|
|
|
@ -356,6 +356,22 @@ notmuch_message_t *
|
||||||
notmuch_database_find_message (notmuch_database_t *database,
|
notmuch_database_find_message (notmuch_database_t *database,
|
||||||
const char *message_id);
|
const char *message_id);
|
||||||
|
|
||||||
|
/* Find a message with the given filename.
|
||||||
|
*
|
||||||
|
* If the database contains a message with the given filename, then a
|
||||||
|
* new notmuch_message_t object is returned. The caller should call
|
||||||
|
* notmuch_message_destroy when done with the message.
|
||||||
|
*
|
||||||
|
* This function returns NULL in the following situations:
|
||||||
|
*
|
||||||
|
* * No message is found with the given filename
|
||||||
|
* * An out-of-memory situation occurs
|
||||||
|
* * A Xapian exception occurs
|
||||||
|
*/
|
||||||
|
notmuch_message_t *
|
||||||
|
notmuch_database_find_message_by_filename (notmuch_database_t *notmuch,
|
||||||
|
const char *filename);
|
||||||
|
|
||||||
/* Return a list of all tags found in the database.
|
/* Return a list of all tags found in the database.
|
||||||
*
|
*
|
||||||
* This function creates a list of all tags found in the database. The
|
* This function creates a list of all tags found in the database. The
|
||||||
|
|
Loading…
Reference in a new issue