X-Git-Url: https://git.notmuchmail.org/git?p=notmuch;a=blobdiff_plain;f=lib%2Fdatabase.cc;h=b4c76b4ea622e561729deb78a7874689dd766e15;hp=f8c4a7d121d0bdbcd2a631ee65ed9303ab9cd9fa;hb=67ae2377a9ec2da296a2e012352f962664a4d1a8;hpb=7199d22f4394abdf72ab791fc0aba2c697bf1209 diff --git a/lib/database.cc b/lib/database.cc index f8c4a7d1..b4c76b4e 100644 --- a/lib/database.cc +++ b/lib/database.cc @@ -956,7 +956,7 @@ notmuch_database_upgrade (notmuch_database_t *notmuch, document.get_value (NOTMUCH_VALUE_TIMESTAMP)); directory = _notmuch_directory_create (notmuch, term.c_str() + 10, - &status); + NOTMUCH_FIND_CREATE, &status); notmuch_directory_set_mtime (directory, mtime); notmuch_directory_destroy (directory); } @@ -1197,9 +1197,17 @@ _notmuch_database_split_path (void *ctx, return NOTMUCH_STATUS_SUCCESS; } +/* Find the document ID of the specified directory. + * + * If (flags & NOTMUCH_FIND_CREATE), a new directory document will be + * created if one does not exist for 'path'. Otherwise, if the + * directory document does not exist, this sets *directory_id to + * ((unsigned int)-1) and returns NOTMUCH_STATUS_SUCCESS. + */ notmuch_status_t _notmuch_database_find_directory_id (notmuch_database_t *notmuch, const char *path, + notmuch_find_flags_t flags, unsigned int *directory_id) { notmuch_directory_t *directory; @@ -1210,8 +1218,8 @@ _notmuch_database_find_directory_id (notmuch_database_t *notmuch, return NOTMUCH_STATUS_SUCCESS; } - directory = _notmuch_directory_create (notmuch, path, &status); - if (status) { + directory = _notmuch_directory_create (notmuch, path, flags, &status); + if (status || !directory) { *directory_id = -1; return status; } @@ -1240,13 +1248,16 @@ _notmuch_database_get_directory_path (void *ctx, * 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. + * If (flags & NOTMUCH_FIND_CREATE), the necessary directory documents + * will be created in the database as needed. Otherwise, if the + * necessary directory documents do not exist, this sets + * *direntry to NULL and returns NOTMUCH_STATUS_SUCCESS. */ notmuch_status_t _notmuch_database_filename_to_direntry (void *ctx, notmuch_database_t *notmuch, const char *filename, + notmuch_find_flags_t flags, char **direntry) { const char *relative, *directory, *basename; @@ -1260,10 +1271,12 @@ _notmuch_database_filename_to_direntry (void *ctx, if (status) return status; - status = _notmuch_database_find_directory_id (notmuch, directory, + status = _notmuch_database_find_directory_id (notmuch, directory, flags, &directory_id); - if (status) + if (status || directory_id == (unsigned int)-1) { + *direntry = NULL; return status; + } *direntry = talloc_asprintf (ctx, "%u:%s", directory_id, basename); @@ -1320,7 +1333,7 @@ notmuch_database_get_directory (notmuch_database_t *notmuch, return NOTMUCH_STATUS_READ_ONLY_DATABASE; try { - *directory = _notmuch_directory_create (notmuch, path, &status); + *directory = _notmuch_directory_create (notmuch, path, NOTMUCH_FIND_CREATE, &status); } catch (const Xapian::Error &error) { fprintf (stderr, "A Xapian exception occurred getting directory: %s.\n", error.get_msg().c_str()); @@ -1884,8 +1897,8 @@ notmuch_database_find_message_by_filename (notmuch_database_t *notmuch, local = talloc_new (notmuch); try { - status = _notmuch_database_filename_to_direntry (local, notmuch, - filename, &direntry); + status = _notmuch_database_filename_to_direntry ( + local, notmuch, filename, NOTMUCH_FIND_CREATE, &direntry); if (status) goto DONE;