return "No error occurred";
case NOTMUCH_STATUS_OUT_OF_MEMORY:
return "Out of memory";
- case NOTMUCH_STATUS_READONLY_DATABASE:
- return "The database is read-only";
+ case NOTMUCH_STATUS_READ_ONLY_DATABASE:
+ return "Attempt to write to a read-only database";
case NOTMUCH_STATUS_XAPIAN_EXCEPTION:
return "A Xapian exception occurred";
case NOTMUCH_STATUS_FILE_ERROR:
return notmuch;
}
+notmuch_status_t
+_notmuch_database_ensure_writable (notmuch_database_t *notmuch)
+{
+ if (notmuch->mode == NOTMUCH_DATABASE_MODE_READ_ONLY) {
+ fprintf (stderr, "Cannot write to a read-only database.\n");
+ return NOTMUCH_STATUS_READ_ONLY_DATABASE;
+ }
+
+ return NOTMUCH_STATUS_SUCCESS;
+}
+
notmuch_database_t *
notmuch_database_open (const char *path,
notmuch_database_mode_t mode)
* database path or absolute with initial components identical to
* database path), return a new string (with 'ctx' as the talloc
* owner) suitable for use as a direntry term value.
+ *
+ * The necessary directory documents will be created in the database
+ * as needed.
*/
notmuch_status_t
_notmuch_database_filename_to_direntry (void *ctx,
if (message_ret)
*message_ret = NULL;
+ ret = _notmuch_database_ensure_writable (notmuch);
+ if (ret)
+ return ret;
+
message_file = notmuch_message_file_open (filename);
- if (message_file == NULL) {
- ret = NOTMUCH_STATUS_FILE_ERROR;
- goto DONE;
- }
+ if (message_file == NULL)
+ return NOTMUCH_STATUS_FILE_ERROR;
notmuch_message_file_restrict_headers (message_file,
"date",
Xapian::Document document;
notmuch_status_t status;
- if (notmuch->mode == NOTMUCH_DATABASE_MODE_READ_ONLY) {
- fprintf (stderr, "Attempted to update a read-only database.\n");
- return NOTMUCH_STATUS_READONLY_DATABASE;
- }
+ status = _notmuch_database_ensure_writable (notmuch);
+ if (status)
+ return status;
db = static_cast <Xapian::WritableDatabase *> (notmuch->xapian_db);
strncmp ((*j).c_str (), prefix, strlen (prefix)))
{
db->delete_document (document.get_docid ());
+ status = NOTMUCH_STATUS_SUCCESS;
} else {
db->replace_document (document.get_docid (), document);
+ status = NOTMUCH_STATUS_DUPLICATE_MESSAGE_ID;
}
}
talloc_free (local);
- return NOTMUCH_STATUS_SUCCESS;
+ return status;
}
notmuch_tags_t *