X-Git-Url: https://git.notmuchmail.org/git?p=notmuch;a=blobdiff_plain;f=lib%2Fdirectory.cc;h=f576e33673bec51e2c5912c6a78447634416ba71;hp=196f78059ecbace2e347aeb48222c787bf7e4060;hb=67c3bc9db48c9e12d648df4792c706cae723676c;hpb=d807e28f43579ecc91aa40ae3e42760991c2f810 diff --git a/lib/directory.cc b/lib/directory.cc index 196f7805..f576e336 100644 --- a/lib/directory.cc +++ b/lib/directory.cc @@ -52,7 +52,7 @@ _notmuch_filenames_destructor (notmuch_filenames_t *filenames) * iterating over the non-prefixed portion of terms sharing a common * prefix. */ -notmuch_filenames_t * +static notmuch_filenames_t * _notmuch_filenames_create (void *ctx, notmuch_database_t *notmuch, const char *prefix) @@ -79,14 +79,20 @@ _notmuch_filenames_create (void *ctx, } notmuch_bool_t -notmuch_filenames_has_more (notmuch_filenames_t *filenames) +notmuch_filenames_valid (notmuch_filenames_t *filenames) { + if (filenames == NULL) + return NULL; + return (filenames->iterator != filenames->end); } const char * notmuch_filenames_get (notmuch_filenames_t *filenames) { + if (filenames == NULL || filenames->iterator == filenames->end) + return NULL; + if (filenames->filename == NULL) { std::string term = *filenames->iterator; @@ -99,8 +105,11 @@ notmuch_filenames_get (notmuch_filenames_t *filenames) } void -notmuch_filenames_advance (notmuch_filenames_t *filenames) +notmuch_filenames_move_to_next (notmuch_filenames_t *filenames) { + if (filenames == NULL) + return; + if (filenames->filename) { talloc_free (filenames->filename); filenames->filename = NULL; @@ -113,6 +122,9 @@ notmuch_filenames_advance (notmuch_filenames_t *filenames) void notmuch_filenames_destroy (notmuch_filenames_t *filenames) { + if (filenames == NULL) + return; + talloc_free (filenames); } @@ -170,11 +182,8 @@ _notmuch_directory_create (notmuch_database_t *notmuch, path = _notmuch_database_relative_path (notmuch, path); - if (notmuch->mode == NOTMUCH_DATABASE_MODE_READ_ONLY) { - fprintf (stderr, "Attempted to update a read-only database.\n"); - *status_ret = NOTMUCH_STATUS_READONLY_DATABASE; - return NULL; - } + if (notmuch->mode == NOTMUCH_DATABASE_MODE_READ_ONLY) + INTERNAL_ERROR ("Failure to ensure database is writable"); db = static_cast (notmuch->xapian_db); @@ -204,7 +213,7 @@ _notmuch_directory_create (notmuch_database_t *notmuch, Xapian::docid parent_id; char *term = talloc_asprintf (local, "%s%s", _find_prefix ("directory"), db_path); - directory->doc.add_term (term); + directory->doc.add_term (term, 0); directory->doc.set_data (path); @@ -216,13 +225,14 @@ _notmuch_directory_create (notmuch_database_t *notmuch, term = talloc_asprintf (local, "%s%u:%s", _find_prefix ("directory-direntry"), parent_id, basename); - directory->doc.add_term (term); + directory->doc.add_term (term, 0); } directory->doc.add_value (NOTMUCH_VALUE_TIMESTAMP, Xapian::sortable_serialise (0)); - directory->document_id = db->add_document (directory->doc); + directory->document_id = _notmuch_database_generate_doc_id (notmuch); + db->replace_document (directory->document_id, directory->doc); talloc_free (local); } @@ -256,11 +266,11 @@ notmuch_directory_set_mtime (notmuch_directory_t *directory, { notmuch_database_t *notmuch = directory->notmuch; Xapian::WritableDatabase *db; + 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 (notmuch->xapian_db);