In order for a database to actually be writeable, it must be the case that it
is open, not just the correct type of Xapian object. By explicitely
checking, we are able to provide better error reporting, in particular
for the previously broken test in T566-lib-message.
NOTMUCH_STATUS_DATABASE_EXISTS,
NOTMUCH_STATUS_BAD_QUERY_SYNTAX,
NOTMUCH_STATUS_NO_MAIL_ROOT,
NOTMUCH_STATUS_DATABASE_EXISTS,
NOTMUCH_STATUS_BAD_QUERY_SYNTAX,
NOTMUCH_STATUS_NO_MAIL_ROOT,
+ NOTMUCH_STATUS_CLOSED_DATABASE,
NOTMUCH_STATUS_LAST_STATUS
} notmuch_status_t;
typedef enum {
NOTMUCH_STATUS_LAST_STATUS
} notmuch_status_t;
typedef enum {
return NOTMUCH_STATUS_READ_ONLY_DATABASE;
}
return NOTMUCH_STATUS_READ_ONLY_DATABASE;
}
+ if (! notmuch->open) {
+ _notmuch_database_log (notmuch, "Cannot write to a closed database.\n");
+ return NOTMUCH_STATUS_CLOSED_DATABASE;
+ }
+
return NOTMUCH_STATUS_SUCCESS;
}
return NOTMUCH_STATUS_SUCCESS;
}
notmuch_query_t *query = NULL;
unsigned int count = 0, total = 0;
notmuch_query_t *query = NULL;
unsigned int count = 0, total = 0;
- status = _notmuch_database_ensure_writable (notmuch);
- if (status)
- return status;
+ if (_notmuch_database_mode (notmuch) != NOTMUCH_DATABASE_MODE_READ_WRITE)
+ return NOTMUCH_STATUS_READ_ONLY_DATABASE;
db = notmuch->writable_xapian_db;
db = notmuch->writable_xapian_db;
NOTMUCH_PRIVATE_STATUS_DATABASE_EXISTS = NOTMUCH_STATUS_DATABASE_EXISTS,
NOTMUCH_PRIVATE_STATUS_NO_MAIL_ROOT = NOTMUCH_STATUS_NO_MAIL_ROOT,
NOTMUCH_PRIVATE_STATUS_BAD_QUERY_SYNTAX = NOTMUCH_STATUS_BAD_QUERY_SYNTAX,
NOTMUCH_PRIVATE_STATUS_DATABASE_EXISTS = NOTMUCH_STATUS_DATABASE_EXISTS,
NOTMUCH_PRIVATE_STATUS_NO_MAIL_ROOT = NOTMUCH_STATUS_NO_MAIL_ROOT,
NOTMUCH_PRIVATE_STATUS_BAD_QUERY_SYNTAX = NOTMUCH_STATUS_BAD_QUERY_SYNTAX,
+ NOTMUCH_PRIVATE_STATUS_CLOSED_DATABASE = NOTMUCH_STATUS_CLOSED_DATABASE,
/* Then add our own private values. */
NOTMUCH_PRIVATE_STATUS_TERM_TOO_LONG = NOTMUCH_STATUS_LAST_STATUS,
/* Then add our own private values. */
NOTMUCH_PRIVATE_STATUS_TERM_TOO_LONG = NOTMUCH_STATUS_LAST_STATUS,
* No mail root could be deduced from parameters and environment
*/
NOTMUCH_STATUS_NO_MAIL_ROOT,
* No mail root could be deduced from parameters and environment
*/
NOTMUCH_STATUS_NO_MAIL_ROOT,
+ /**
+ * Database is not fully opened, or has been closed
+ */
+ NOTMUCH_STATUS_CLOSED_DATABASE,
/**
* Not an actual status value. Just a way to find out how many
* valid status values there are.
/**
* Not an actual status value. Just a way to find out how many
* valid status values there are.
const char *path = talloc_asprintf(db, "%s/01:2,", argv[1]);
EXPECT0(notmuch_database_close (db));
stat = notmuch_database_index_file (db, path, NULL, &msg);
const char *path = talloc_asprintf(db, "%s/01:2,", argv[1]);
EXPECT0(notmuch_database_close (db));
stat = notmuch_database_index_file (db, path, NULL, &msg);
- printf ("%d\n", stat == NOTMUCH_STATUS_XAPIAN_EXCEPTION);
+ printf ("%d\n", stat == NOTMUCH_STATUS_CLOSED_DATABASE);
}
EOF
cat <<EOF > EXPECTED
== stdout ==
1
== stderr ==
}
EOF
cat <<EOF > EXPECTED
== stdout ==
1
== stderr ==
-A Xapian exception occurred finding message: Database has been closed.
+Cannot write to a closed database.
EOF
test_expect_equal_file EXPECTED OUTPUT
EOF
test_expect_equal_file EXPECTED OUTPUT
{
EXPECT0(notmuch_database_close (db));
stat = notmuch_database_set_config (db, "foo", "bar");
{
EXPECT0(notmuch_database_close (db));
stat = notmuch_database_set_config (db, "foo", "bar");
- printf("%d\n", stat == NOTMUCH_STATUS_XAPIAN_EXCEPTION);
+ printf("%d\n", stat == NOTMUCH_STATUS_CLOSED_DATABASE);
}
EOF
cat <<EOF > EXPECTED
== stdout ==
1
== stderr ==
}
EOF
cat <<EOF > EXPECTED
== stdout ==
1
== stderr ==
-Error: A Xapian exception occurred setting metadata: Database has been closed
+Cannot write to a closed database.
EOF
test_expect_equal_file EXPECTED OUTPUT
EOF
test_expect_equal_file EXPECTED OUTPUT
cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR}
{
stat = notmuch_directory_delete (dir);
cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR}
{
stat = notmuch_directory_delete (dir);
- printf ("%d\n", stat == NOTMUCH_STATUS_XAPIAN_EXCEPTION);
+ printf ("%d\n", stat == NOTMUCH_STATUS_CLOSED_DATABASE);
}
EOF
cat <<EOF > EXPECTED
== stdout ==
1
== stderr ==
}
EOF
cat <<EOF > EXPECTED
== stdout ==
1
== stderr ==
-A Xapian exception occurred deleting directory entry: Database has been closed.
+Cannot write to a closed database.
EOF
test_expect_equal_file EXPECTED OUTPUT
restore_database
EOF
test_expect_equal_file EXPECTED OUTPUT
restore_database
{
time_t stamp = notmuch_directory_get_mtime (dir);
stat = notmuch_directory_set_mtime (dir, stamp);
{
time_t stamp = notmuch_directory_get_mtime (dir);
stat = notmuch_directory_set_mtime (dir, stamp);
- printf ("%d\n", stat == NOTMUCH_STATUS_XAPIAN_EXCEPTION);
+ printf ("%d\n", stat == NOTMUCH_STATUS_CLOSED_DATABASE);
}
EOF
cat <<EOF > EXPECTED
== stdout ==
1
== stderr ==
}
EOF
cat <<EOF > EXPECTED
== stdout ==
1
== stderr ==
-A Xapian exception occurred setting directory mtime: Database has been closed.
-EOF
-test_expect_equal_file EXPECTED OUTPUT
-restore_database
-
-backup_database
-test_begin_subtest "get/set mtime of directory for a closed db"
-cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR}
- {
- time_t stamp = notmuch_directory_get_mtime (dir);
- stat = notmuch_directory_set_mtime (dir, stamp);
- printf ("%d\n", stat == NOTMUCH_STATUS_XAPIAN_EXCEPTION);
- }
-EOF
-cat <<EOF > EXPECTED
-== stdout ==
-1
-== stderr ==
-A Xapian exception occurred setting directory mtime: Database has been closed.
+Cannot write to a closed database.
EOF
test_expect_equal_file EXPECTED OUTPUT
restore_database
EOF
test_expect_equal_file EXPECTED OUTPUT
restore_database
{
notmuch_status_t status;
status = notmuch_message_add_tag (message, "boom");
{
notmuch_status_t status;
status = notmuch_message_add_tag (message, "boom");
- printf("%d\n%d\n", message != NULL, status == NOTMUCH_STATUS_XAPIAN_EXCEPTION);
+ printf("%d\n%d\n", message != NULL, status == NOTMUCH_STATUS_CLOSED_DATABASE);
}
EOF
cat <<EOF > EXPECTED
}
EOF
cat <<EOF > EXPECTED
{
notmuch_status_t status;
status = notmuch_message_remove_tag (message, "boom");
{
notmuch_status_t status;
status = notmuch_message_remove_tag (message, "boom");
- printf("%d\n%d\n", message != NULL, status == NOTMUCH_STATUS_XAPIAN_EXCEPTION);
+ printf("%d\n%d\n", message != NULL, status == NOTMUCH_STATUS_CLOSED_DATABASE);
}
EOF
cat <<EOF > EXPECTED
}
EOF
cat <<EOF > EXPECTED
{
notmuch_status_t status;
status = notmuch_message_remove_all_tags (message);
{
notmuch_status_t status;
status = notmuch_message_remove_all_tags (message);
- printf("%d\n%d\n", message != NULL, status == NOTMUCH_STATUS_XAPIAN_EXCEPTION);
+ printf("%d\n%d\n", message != NULL, status == NOTMUCH_STATUS_CLOSED_DATABASE);
}
EOF
cat <<EOF > EXPECTED
}
EOF
cat <<EOF > EXPECTED
{
notmuch_status_t status;
status = notmuch_message_freeze (message);
{
notmuch_status_t status;
status = notmuch_message_freeze (message);
- printf("%d\n%d\n", message != NULL, status == NOTMUCH_STATUS_SUCCESS);
+ printf("%d\n%d\n", message != NULL, status == NOTMUCH_STATUS_CLOSED_DATABASE);
}
EOF
cat <<EOF > EXPECTED
}
EOF
cat <<EOF > EXPECTED
{
notmuch_status_t status;
status = notmuch_message_thaw (message);
{
notmuch_status_t status;
status = notmuch_message_thaw (message);
- printf("%d\n%d\n", message != NULL, status == NOTMUCH_STATUS_UNBALANCED_FREEZE_THAW);
+ printf("%d\n%d\n", message != NULL, status == NOTMUCH_STATUS_CLOSED_DATABASE);
}
EOF
cat <<EOF > EXPECTED
}
EOF
cat <<EOF > EXPECTED